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 new file mode 100644 index 00000000000..88147215258 --- /dev/null +++ b/.env.beta @@ -0,0 +1,6 @@ +VITE_BYPASS_LOGIN=0 +VITE_BYPASS_TUTORIAL=0 +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 new file mode 100644 index 00000000000..65dc7875902 --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +VITE_BYPASS_LOGIN=0 +VITE_BYPASS_TUTORIAL=0 +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/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..644fdcbe563 --- /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: User data 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: Session 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/pull_request_template.md b/.github/pull_request_template.md index d3130a73ab8..e4f1fa5ebf5 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -25,10 +25,12 @@ ## 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? - [ ] 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 new file mode 100644 index 00000000000..3af48b400af --- /dev/null +++ b/.github/workflows/deploy-beta.yml @@ -0,0 +1,32 @@ +name: Deploy Beta + +on: + push: + branches: + - beta + +jobs: + deploy: + if: github.repository == 'pagefaultgames/pokerogue' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "20" + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build:beta + env: + NODE_ENV: production + - name: Set up SSH + run: | + mkdir ~/.ssh + echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub + echo "${{ secrets.BETA_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 + chmod 600 ~/.ssh/* + ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts + - name: Deploy build on server + 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..9068f1ae9a2 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/eslint.yml @@ -6,9 +6,11 @@ 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 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..3b7617c45f4 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -7,6 +7,7 @@ on: pull_request: branches: - main + - beta jobs: pages: @@ -52,7 +53,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..9ce1d1c5038 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,9 +6,11 @@ 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 jobs: run-tests: # Define a job named "run-tests" 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..ade4adc2c59 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 @@ -56,6 +56,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - 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 @@ -111,6 +112,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/docs/enemy-ai.md b/docs/enemy-ai.md new file mode 100644 index 00000000000..f53a8511893 --- /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 `StatChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to + + $\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$ + + where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score). + +- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score. + + $\text{TBS}=\text{getTargetBenefitScore(StatChangeAttr)}-\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. \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index d04b7a7176d..de63fbac82e 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,12 +27,12 @@ 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 diff --git a/index.css b/index.css index 30e7c63d954..be480ab6c78 100644 --- a/index.css +++ b/index.css @@ -19,9 +19,21 @@ html { body { margin: 0; + display:flex; + flex-direction: column; + align-items: center; background: #484050; } +#links { + width: 90%; + text-align: center; + position: fixed; + bottom: 0; + display: flex; + justify-content: space-around; +} + #app { display: flex; justify-content: center; @@ -195,6 +207,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..ebe5b063c52 100644 --- a/index.html +++ b/index.html @@ -39,6 +39,7 @@ + - \ 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 29a956f19c6..dc851e05c92 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,12 @@ "start": "vite", "start:dev": "vite --mode development", "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", "eslint": "eslint --fix .", "eslint-ci": "eslint .", "docs": "typedoc", @@ -20,34 +21,29 @@ }, "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/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/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/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/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/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/images/items.json b/public/images/items.json index 33dcf8f5e9a..86792e23cc0 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": 423, + "h": 423 }, "scale": 1, "frames": [ @@ -72,6 +72,90 @@ "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_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": "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 +171,8 @@ "h": 31 }, "frame": { - "x": 29, - "y": 27, + "x": 0, + "y": 86, "w": 22, "h": 31 } @@ -109,7 +193,7 @@ }, "frame": { "x": 0, - "y": 58, + "y": 117, "w": 22, "h": 31 } @@ -151,7 +235,7 @@ }, "frame": { "x": 0, - "y": 89, + "y": 148, "w": 22, "h": 31 } @@ -171,8 +255,8 @@ "h": 31 }, "frame": { - "x": 22, - "y": 58, + "x": 0, + "y": 179, "w": 22, "h": 31 } @@ -193,11 +277,137 @@ }, "frame": { "x": 0, - "y": 120, + "y": 210, "w": 22, "h": 31 } }, + { + "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": 241, + "w": 22, + "h": 29 + } + }, + { + "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": 241, + "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": 270, + "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": 270, + "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": 299, + "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": 299, + "w": 22, + "h": 29 + } + }, { "filename": "cornerstone_mask", "rotated": false, @@ -219,6 +429,132 @@ "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": 328, + "w": 22, + "h": 28 + } + }, + { + "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": 328, + "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": 356, + "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": 356, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon-gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 384, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 384, + "w": 22, + "h": 28 + } + }, { "filename": "ability_charm", "rotated": false, @@ -387,132 +723,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, @@ -577,7 +787,7 @@ } }, { - "filename": "blank_plate", + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -585,162 +795,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, "y": 4, - "w": 24, + "w": 16, "h": 24 }, "frame": { - "x": 0, - "y": 212, - "w": 24, - "h": 24 - } - }, - { - "filename": "choice_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 236, - "w": 24, - "h": 24 - } - }, - { - "filename": "draco_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 260, - "w": 24, - "h": 24 - } - }, - { - "filename": "dread_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 284, - "w": 24, - "h": 24 - } - }, - { - "filename": "earth_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 308, - "w": 24, - "h": 24 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 332, - "w": 24, - "h": 24 - } - }, - { - "filename": "flame_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 356, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 380, - "w": 24, + "x": 407, + "y": 0, + "w": 16, "h": 24 } }, @@ -760,13 +823,370 @@ }, "frame": { "x": 0, - "y": 404, + "y": 412, "w": 15, "h": 11 } }, { - "filename": "calcium", + "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-gen8", + "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": 209, + "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": 237, + "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": 262, + "w": 23, + "h": 24 + } + }, + { + "filename": "blank_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 22, + "y": 286, + "w": 24, + "h": 24 + } + }, + { + "filename": "choice_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 22, + "y": 310, + "w": 24, + "h": 24 + } + }, + { + "filename": "draco_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 22, + "y": 334, + "w": 24, + "h": 24 + } + }, + { + "filename": "dread_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 22, + "y": 358, + "w": 24, + "h": 24 + } + }, + { + "filename": "earth_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 22, + "y": 382, + "w": 24, + "h": 24 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 22, + "y": 406, + "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": 45, + "y": 406, + "w": 23, + "h": 17 + } + }, + { + "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": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 29, + "y": 55, + "w": 24, + "h": 18 + } + }, + { + "filename": "carbos", "rotated": false, "trimmed": true, "sourceSize": { @@ -780,12 +1200,138 @@ "h": 24 }, "frame": { - "x": 51, + "x": 59, "y": 27, "w": 16, "h": 24 } }, + { + "filename": "fist_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 75, + "y": 26, + "w": 24, + "h": 24 + } + }, + { + "filename": "flame_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 99, + "y": 26, + "w": 24, + "h": 24 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 123, + "y": 26, + "w": 12, + "h": 17 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 135, + "y": 36, + "w": 24, + "h": 23 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 159, + "y": 22, + "w": 21, + "h": 24 + } + }, + { + "filename": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 180, + "y": 21, + "w": 24, + "h": 24 + } + }, { "filename": "golden_punch", "rotated": false, @@ -801,8 +1347,8 @@ "h": 24 }, "frame": { - "x": 67, - "y": 26, + "x": 204, + "y": 21, "w": 24, "h": 24 } @@ -822,33 +1368,12 @@ "h": 24 }, "frame": { - "x": 91, - "y": 26, + "x": 228, + "y": 21, "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, @@ -864,117 +1389,12 @@ "h": 24 }, "frame": { - "x": 136, - "y": 22, + "x": 252, + "y": 21, "w": 24, "h": 24 } }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 44, - "y": 58, - "w": 16, - "h": 24 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 89, - "w": 18, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 113, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 137, - "w": 18, - "h": 24 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 39, - "y": 161, - "w": 24, - "h": 15 - } - }, { "filename": "icicle_plate", "rotated": false, @@ -990,8 +1410,8 @@ "h": 24 }, "frame": { - "x": 40, - "y": 176, + "x": 276, + "y": 21, "w": 24, "h": 24 } @@ -1011,621 +1431,12 @@ "h": 24 }, "frame": { - "x": 24, - "y": 200, - "w": 24, - "h": 24 - } - }, - { - "filename": "iron_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 224, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 248, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 272, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 296, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_ultra", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 320, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 344, - "w": 24, - "h": 24 - } - }, - { - "filename": "meadow_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 24, - "y": 368, - "w": 24, - "h": 24 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 24, - "y": 392, - "w": 24, - "h": 23 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 48, - "y": 200, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 48, - "y": 224, - "w": 16, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 48, - "y": 248, - "w": 23, - "h": 24 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 272, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 296, - "w": 24, - "h": 24 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 320, - "w": 24, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 344, - "w": 24, - "h": 24 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 48, - "y": 368, - "w": 24, - "h": 24 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 48, - "y": 392, - "w": 24, - "h": 23 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 136, - "y": 46, - "w": 24, - "h": 14 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 160, - "y": 22, - "w": 17, - "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, + "x": 300, "y": 21, "w": 24, "h": 24 } }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 201, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "splash_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 225, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 249, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 273, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 297, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 321, - "y": 21, - "w": 18, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 339, - "y": 20, - "w": 24, - "h": 24 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 363, - "y": 20, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 387, - "y": 20, - "w": 22, - "h": 24 - } - }, { "filename": "adamant_crystal", "rotated": false, @@ -1641,14 +1452,14 @@ "h": 21 }, "frame": { - "x": 160, + "x": 159, "y": 46, "w": 23, "h": 21 } }, { - "filename": "exp_balance", + "filename": "coin_case", "rotated": false, "trimmed": true, "sourceSize": { @@ -1659,34 +1470,13 @@ "x": 4, "y": 5, "w": 24, - "h": 22 + "h": 23 }, "frame": { - "x": 183, + "x": 182, "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 + "h": 23 } }, { @@ -1704,7 +1494,7 @@ "h": 23 }, "frame": { - "x": 231, + "x": 206, "y": 45, "w": 24, "h": 23 @@ -1725,12 +1515,411 @@ "h": 23 }, "frame": { - "x": 255, + "x": 230, "y": 45, "w": 24, "h": 23 } }, + { + "filename": "iron_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 254, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 278, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 302, + "y": 45, + "w": 23, + "h": 24 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 324, + "y": 21, + "w": 18, + "h": 24 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 342, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 366, + "y": 20, + "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": 390, + "y": 20, + "w": 17, + "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": 407, + "y": 24, + "w": 16, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 325, + "y": 45, + "w": 18, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 343, + "y": 44, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 367, + "y": 44, + "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": 391, + "y": 44, + "w": 16, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 407, + "y": 48, + "w": 16, + "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": 75, + "y": 50, + "w": 24, + "h": 18 + } + }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 99, + "y": 50, + "w": 24, + "h": 22 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 53, + "y": 55, + "w": 22, + "h": 23 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 75, + "y": 68, + "w": 24, + "h": 22 + } + }, + { + "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": 99, + "y": 72, + "w": 24, + "h": 20 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 123, + "y": 59, + "w": 24, + "h": 24 + } + }, { "filename": "leppa_berry", "rotated": false, @@ -1746,12 +1935,264 @@ "h": 23 }, "frame": { - "x": 279, - "y": 45, + "x": 123, + "y": 83, "w": 24, "h": 23 } }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 147, + "y": 67, + "w": 24, + "h": 24 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 147, + "y": 91, + "w": 24, + "h": 20 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 171, + "y": 68, + "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": 195, + "y": 68, + "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": 219, + "y": 68, + "w": 24, + "h": 24 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 171, + "y": 92, + "w": 24, + "h": 22 + } + }, + { + "filename": "scanner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 195, + "y": 92, + "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": 219, + "y": 92, + "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": 243, + "y": 69, + "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": 267, + "y": 69, + "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": 291, + "y": 69, + "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": 315, + "y": 69, + "w": 24, + "h": 24 + } + }, { "filename": "scope_lens", "rotated": false, @@ -1767,14 +2208,14 @@ "h": 23 }, "frame": { - "x": 303, - "y": 45, + "x": 243, + "y": 93, "w": 24, "h": 23 } }, { - "filename": "berry_pouch", + "filename": "sun_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -1783,15 +2224,78 @@ }, "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": 267, + "y": 93, + "w": 24, + "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": 291, + "y": 93, + "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": 315, + "y": 93, + "w": 24, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 339, + "y": 69, + "w": 18, + "h": 24 } }, { @@ -1809,8 +2313,8 @@ "h": 24 }, "frame": { - "x": 350, - "y": 44, + "x": 357, + "y": 68, "w": 23, "h": 24 } @@ -1830,77 +2334,56 @@ "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, + "x": 380, "y": 68, + "w": 24, + "h": 23 + } + }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 404, + "y": 72, + "w": 19, + "h": 22 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 339, + "y": 93, "w": 18, "h": 24 } }, { - "filename": "dragon_scale", + "filename": "berry_pouch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1909,61 +2392,19 @@ }, "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, + "w": 23, "h": 23 }, "frame": { - "x": 115, - "y": 50, - "w": 21, + "x": 357, + "y": 92, + "w": 23, "h": 23 } }, { - "filename": "metal_powder", + "filename": "quick_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -1977,14 +2418,35 @@ "h": 20 }, "frame": { - "x": 136, - "y": 60, + "x": 380, + "y": 91, "w": 24, "h": 20 } }, { - "filename": "peat_block", + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 404, + "y": 94, + "w": 19, + "h": 22 + } + }, + { + "filename": "rusted_shield", "rotated": false, "trimmed": true, "sourceSize": { @@ -1993,15 +2455,99 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 6, "w": 24, - "h": 22 + "h": 20 }, "frame": { - "x": 160, - "y": 67, + "x": 380, + "y": 111, "w": 24, - "h": 22 + "h": 20 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 404, + "y": 116, + "w": 19, + "h": 21 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 357, + "y": 115, + "w": 23, + "h": 21 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 380, + "y": 131, + "w": 24, + "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": 404, + "y": 137, + "w": 19, + "h": 21 } }, { @@ -2019,8 +2565,8 @@ "h": 23 }, "frame": { - "x": 184, - "y": 67, + "x": 39, + "y": 78, "w": 23, "h": 23 } @@ -2040,35 +2586,14 @@ "h": 23 }, "frame": { - "x": 207, - "y": 67, + "x": 39, + "y": 101, "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": "leek", "rotated": false, "trimmed": true, "sourceSize": { @@ -2082,56 +2607,14 @@ "h": 23 }, "frame": { - "x": 253, - "y": 68, + "x": 39, + "y": 124, "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", + "filename": "max_revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -2142,13 +2625,13 @@ "x": 5, "y": 4, "w": 22, - "h": 23 + "h": 24 }, "frame": { - "x": 322, - "y": 68, + "x": 39, + "y": 147, "w": 22, - "h": 23 + "h": 24 } }, { @@ -2166,14 +2649,14 @@ "h": 23 }, "frame": { - "x": 344, - "y": 68, + "x": 39, + "y": 171, "w": 22, "h": 23 } }, { - "filename": "quick_powder", + "filename": "silver_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -2182,267 +2665,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 6, + "y": 11, "w": 24, - "h": 20 + "h": 15 }, "frame": { - "x": 60, - "y": 68, + "x": 39, + "y": 194, "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, - "h": 24 + "h": 15 } }, { @@ -2460,8 +2691,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 181, + "x": 44, + "y": 209, "w": 21, "h": 24 } @@ -2481,159 +2712,12 @@ "h": 24 }, "frame": { - "x": 86, - "y": 205, + "x": 44, + "y": 233, "w": 21, "h": 24 } }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 86, - "y": 229, - "w": 23, - "h": 21 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 71, - "y": 245, - "w": 15, - "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", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 108, - "y": 73, - "w": 24, - "h": 20 - } - }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 101, - "y": 93, - "w": 22, - "h": 23 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 101, - "y": 116, - "w": 22, - "h": 20 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 102, - "y": 136, - "w": 22, - "h": 21 - } - }, { "filename": "red_orb", "rotated": false, @@ -2649,14 +2733,14 @@ "h": 24 }, "frame": { - "x": 103, - "y": 157, + "x": 45, + "y": 257, "w": 20, "h": 24 } }, { - "filename": "max_repel", + "filename": "dark_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2664,16 +2748,205 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 6, "y": 4, - "w": 16, - "h": 24 + "w": 22, + "h": 23 }, "frame": { - "x": 107, - "y": 181, - "w": 16, - "h": 24 + "x": 46, + "y": 281, + "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": 46, + "y": 304, + "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": 46, + "y": 327, + "w": 22, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 46, + "y": 350, + "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": 46, + "y": 373, + "w": 22, + "h": 23 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 62, + "y": 90, + "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": 62, + "y": 113, + "w": 23, + "h": 23 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 62, + "y": 136, + "w": 23, + "h": 21 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 157, + "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": 85, + "y": 92, + "w": 22, + "h": 23 } }, { @@ -2692,34 +2965,13 @@ }, "frame": { "x": 107, - "y": 205, + "y": 92, "w": 16, "h": 24 } }, { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 109, - "y": 229, - "w": 16, - "h": 24 - } - }, - { - "filename": "apicot_berry", + "filename": "flying_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2728,19 +2980,19 @@ }, "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": 85, + "y": 115, + "w": 22, + "h": 23 } }, { - "filename": "protein", + "filename": "binding_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -2748,20 +3000,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 5, + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 123, - "y": 93, - "w": 16, - "h": 24 + "x": 85, + "y": 138, + "w": 23, + "h": 20 } }, { - "filename": "lansat_berry", + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 83, + "y": 158, + "w": 23, + "h": 22 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 107, + "y": 116, + "w": 18, + "h": 22 + } + }, + { + "filename": "focus_sash", "rotated": false, "trimmed": true, "sourceSize": { @@ -2771,13 +3065,13 @@ "spriteSourceSize": { "x": 5, "y": 4, - "w": 21, + "w": 22, "h": 23 }, "frame": { - "x": 139, - "y": 80, - "w": 21, + "x": 125, + "y": 106, + "w": 22, "h": 23 } }, @@ -2796,8 +3090,8 @@ "h": 20 }, "frame": { - "x": 160, - "y": 89, + "x": 147, + "y": 111, "w": 24, "h": 20 } @@ -2817,12 +3111,54 @@ "h": 20 }, "frame": { - "x": 184, - "y": 90, + "x": 171, + "y": 114, "w": 24, "h": 20 } }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 195, + "y": 116, + "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": 218, + "y": 116, + "w": 23, + "h": 19 + } + }, { "filename": "moon_stone", "rotated": false, @@ -2838,33 +3174,12 @@ "h": 21 }, "frame": { - "x": 208, - "y": 90, + "x": 241, + "y": 116, "w": 23, "h": 21 } }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 231, - "y": 90, - "w": 22, - "h": 22 - } - }, { "filename": "n_lunarizer", "rotated": false, @@ -2880,8 +3195,8 @@ "h": 21 }, "frame": { - "x": 253, - "y": 91, + "x": 264, + "y": 117, "w": 23, "h": 21 } @@ -2901,8 +3216,8 @@ "h": 21 }, "frame": { - "x": 276, - "y": 91, + "x": 287, + "y": 117, "w": 23, "h": 21 } @@ -2922,12 +3237,54 @@ "h": 22 }, "frame": { - "x": 299, - "y": 91, + "x": 310, + "y": 117, "w": 23, "h": 22 } }, + { + "filename": "blank_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 333, + "y": 117, + "w": 22, + "h": 22 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 108, + "y": 138, + "w": 19, + "h": 20 + } + }, { "filename": "bug_memory", "rotated": false, @@ -2943,411 +3300,12 @@ "h": 22 }, "frame": { - "x": 322, - "y": 91, + "x": 106, + "y": 158, "w": 22, "h": 22 } }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 344, - "y": 91, - "w": 22, - "h": 22 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 139, - "y": 103, - "w": 21, - "h": 21 - } - }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 123, - "y": 117, - "w": 16, - "h": 18 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 160, - "y": 109, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 183, - "y": 110, - "w": 23, - "h": 17 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 366, - "y": 85, - "w": 22, - "h": 23 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 206, - "y": 111, - "w": 23, - "h": 17 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 229, - "y": 112, - "w": 23, - "h": 17 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 252, - "y": 112, - "w": 23, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 275, - "y": 112, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 298, - "y": 113, - "w": 23, - "h": 19 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 321, - "y": 113, - "w": 23, - "h": 20 - } - }, - { - "filename": "dark_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 344, - "y": 113, - "w": 22, - "h": 22 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 366, - "y": 108, - "w": 22, - "h": 23 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 124, - "y": 135, - "w": 18, - "h": 22 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 123, - "y": 157, - "w": 22, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 123, - "y": 180, - "w": 22, - "h": 23 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 123, - "y": 203, - "w": 22, - "h": 23 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 125, - "y": 226, - "w": 21, - "h": 23 - } - }, { "filename": "mystic_water", "rotated": false, @@ -3363,75 +3321,12 @@ "h": 23 }, "frame": { - "x": 128, - "y": 249, + "x": 127, + "y": 129, "w": 20, "h": 23 } }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 388, - "y": 92, - "w": 22, - "h": 23 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 388, - "y": 115, - "w": 22, - "h": 19 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 142, - "y": 124, - "w": 18, - "h": 23 - } - }, { "filename": "wellspring_mask", "rotated": false, @@ -3447,14 +3342,77 @@ "h": 21 }, "frame": { - "x": 160, - "y": 126, + "x": 147, + "y": 131, "w": 23, "h": 21 } }, { - "filename": "shell_bell", + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 170, + "y": 134, + "w": 23, + "h": 19 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 128, + "y": 152, + "w": 22, + "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": 150, + "y": 152, + "w": 20, + "h": 22 + } + }, + { + "filename": "charcoal", "rotated": false, "trimmed": true, "sourceSize": { @@ -3463,17 +3421,101 @@ }, "spriteSourceSize": { "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 170, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, "y": 7, "w": 23, + "h": 19 + }, + "frame": { + "x": 193, + "y": 135, + "w": 23, + "h": 19 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 192, + "y": 154, + "w": 22, + "h": 22 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, "h": 20 }, "frame": { - "x": 183, - "y": 127, + "x": 216, + "y": 135, "w": 23, "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": 214, + "y": 155, + "w": 22, + "h": 21 + } + }, { "filename": "relic_crown", "rotated": false, @@ -3489,54 +3531,12 @@ "h": 18 }, "frame": { - "x": 206, - "y": 128, + "x": 239, + "y": 137, "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, @@ -3552,12 +3552,33 @@ "h": 22 }, "frame": { - "x": 275, - "y": 131, + "x": 236, + "y": 155, "w": 22, "h": 22 } }, + { + "filename": "chill_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 262, + "y": 138, + "w": 23, + "h": 17 + } + }, { "filename": "dna_splicers", "rotated": false, @@ -3573,12 +3594,33 @@ "h": 22 }, "frame": { - "x": 297, - "y": 132, + "x": 258, + "y": 155, "w": 22, "h": 22 } }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 285, + "y": 138, + "w": 23, + "h": 17 + } + }, { "filename": "dragon_memory", "rotated": false, @@ -3594,12 +3636,201 @@ "h": 22 }, "frame": { - "x": 319, - "y": 133, + "x": 280, + "y": 155, "w": 22, "h": 22 } }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 308, + "y": 139, + "w": 23, + "h": 20 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 331, + "y": 139, + "w": 22, + "h": 20 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 302, + "y": 159, + "w": 22, + "h": 19 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 324, + "y": 159, + "w": 22, + "h": 19 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 63, + "y": 180, + "w": 22, + "h": 23 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 85, + "y": 180, + "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": 107, + "y": 180, + "w": 21, + "h": 23 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 128, + "y": 175, + "w": 22, + "h": 23 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 150, + "y": 174, + "w": 20, + "h": 22 + } + }, { "filename": "electirizer", "rotated": false, @@ -3615,201 +3846,12 @@ "h": 22 }, "frame": { - "x": 341, - "y": 135, + "x": 170, + "y": 175, "w": 22, "h": 22 } }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 145, - "y": 147, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 167, - "y": 147, - "w": 22, - "h": 23 - } - }, - { - "filename": "psychic_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 145, - "y": 170, - "w": 22, - "h": 23 - } - }, - { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 145, - "y": 193, - "w": 22, - "h": 23 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 167, - "y": 170, - "w": 22, - "h": 23 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 167, - "y": 193, - "w": 22, - "h": 23 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 189, - "y": 147, - "w": 17, - "h": 24 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 206, - "y": 146, - "w": 22, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 228, - "y": 146, - "w": 22, - "h": 23 - } - }, { "filename": "electric_memory", "rotated": false, @@ -3825,54 +3867,12 @@ "h": 22 }, "frame": { - "x": 250, - "y": 148, + "x": 192, + "y": 176, "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,8 +3888,8 @@ "h": 22 }, "frame": { - "x": 228, - "y": 169, + "x": 214, + "y": 176, "w": 22, "h": 22 } @@ -3909,8 +3909,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 170, + "x": 236, + "y": 177, "w": 22, "h": 22 } @@ -3930,8 +3930,8 @@ "h": 22 }, "frame": { - "x": 272, - "y": 153, + "x": 258, + "y": 177, "w": 22, "h": 22 } @@ -3951,54 +3951,12 @@ "h": 22 }, "frame": { - "x": 294, - "y": 154, + "x": 280, + "y": 177, "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 +3972,8 @@ "h": 22 }, "frame": { - "x": 316, - "y": 155, + "x": 302, + "y": 178, "w": 22, "h": 22 } @@ -4035,12 +3993,306 @@ "h": 22 }, "frame": { - "x": 316, - "y": 177, + "x": 324, + "y": 178, "w": 22, "h": 22 } }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 203, + "w": 22, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 87, + "y": 203, + "w": 22, + "h": 23 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 226, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 87, + "y": 226, + "w": 22, + "h": 23 + } + }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 65, + "y": 249, + "w": 22, + "h": 23 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 87, + "y": 249, + "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": 109, + "y": 203, + "w": 21, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 109, + "y": 226, + "w": 21, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 109, + "y": 249, + "w": 22, + "h": 23 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 130, + "y": 198, + "w": 21, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 130, + "y": 221, + "w": 22, + "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": 151, + "y": 196, + "w": 18, + "h": 24 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 169, + "y": 197, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 152, + "y": 220, + "w": 22, + "h": 23 + } + }, { "filename": "ghost_memory", "rotated": false, @@ -4056,12 +4308,33 @@ "h": 22 }, "frame": { - "x": 338, - "y": 157, + "x": 191, + "y": 198, "w": 22, "h": 22 } }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 174, + "y": 220, + "w": 22, + "h": 23 + } + }, { "filename": "grass_memory", "rotated": false, @@ -4077,8 +4350,8 @@ "h": 22 }, "frame": { - "x": 338, - "y": 179, + "x": 213, + "y": 198, "w": 22, "h": 22 } @@ -4098,33 +4371,12 @@ "h": 22 }, "frame": { - "x": 189, - "y": 194, + "x": 196, + "y": 220, "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,8 +4392,8 @@ "h": 22 }, "frame": { - "x": 228, - "y": 191, + "x": 235, + "y": 199, "w": 22, "h": 22 } @@ -4161,8 +4413,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 192, + "x": 257, + "y": 199, "w": 22, "h": 22 } @@ -4182,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 272, - "y": 194, + "x": 279, + "y": 199, "w": 22, "h": 22 } @@ -4203,8 +4455,8 @@ "h": 21 }, "frame": { - "x": 294, - "y": 196, + "x": 301, + "y": 200, "w": 22, "h": 21 } @@ -4224,14 +4476,14 @@ "h": 22 }, "frame": { - "x": 316, - "y": 199, + "x": 323, + "y": 200, "w": 22, "h": 22 } }, { - "filename": "malicious_armor", + "filename": "hyper_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -4239,16 +4491,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 338, - "y": 201, - "w": 22, - "h": 20 + "x": 218, + "y": 220, + "w": 17, + "h": 23 } }, { @@ -4266,8 +4518,8 @@ "h": 22 }, "frame": { - "x": 146, - "y": 216, + "x": 235, + "y": 221, "w": 22, "h": 22 } @@ -4287,8 +4539,8 @@ "h": 22 }, "frame": { - "x": 168, - "y": 216, + "x": 257, + "y": 221, "w": 22, "h": 22 } @@ -4308,33 +4560,12 @@ "h": 22 }, "frame": { - "x": 190, - "y": 216, + "x": 279, + "y": 221, "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,8 +4581,8 @@ "h": 22 }, "frame": { - "x": 228, - "y": 213, + "x": 301, + "y": 221, "w": 22, "h": 22 } @@ -4371,134 +4602,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 214, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 272, - "y": 216, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 294, - "y": 217, - "w": 22, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 316, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 338, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 148, - "y": 238, - "w": 21, - "h": 23 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 169, - "y": 238, + "x": 323, + "y": 222, "w": 22, "h": 22 } @@ -4518,14 +4623,14 @@ "h": 23 }, "frame": { - "x": 191, - "y": 238, + "x": 131, + "y": 244, "w": 21, "h": 23 } }, { - "filename": "hard_meteorite", + "filename": "scroll_of_darkness", "rotated": false, "trimmed": true, "sourceSize": { @@ -4533,20 +4638,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 5, "y": 5, - "w": 20, + "w": 22, "h": 22 }, "frame": { - "x": 212, - "y": 239, - "w": 20, + "x": 152, + "y": 243, + "w": 22, "h": 22 } }, { - "filename": "super_potion", + "filename": "scroll_of_waters", "rotated": false, "trimmed": true, "sourceSize": { @@ -4554,16 +4659,79 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 5, "y": 5, - "w": 17, - "h": 23 + "w": 22, + "h": 22 }, "frame": { - "x": 232, - "y": 235, - "w": 17, - "h": 23 + "x": 174, + "y": 243, + "w": 22, + "h": 22 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 196, + "y": 242, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 218, + "y": 243, + "w": 22, + "h": 22 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 240, + "y": 243, + "w": 22, + "h": 22 } }, { @@ -4581,73 +4749,10 @@ "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, + "x": 262, "y": 243, "w": 22, - "h": 21 + "h": 22 } }, { @@ -4665,14 +4770,14 @@ "h": 22 }, "frame": { - "x": 337, + "x": 284, "y": 243, "w": 22, "h": 22 } }, { - "filename": "masterpiece_teacup", + "filename": "max_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -4680,37 +4785,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 + "x": 8, + "y": 4, + "w": 17, + "h": 24 }, "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 + "x": 306, + "y": 243, + "w": 17, + "h": 24 } }, { @@ -4728,33 +4812,12 @@ "h": 22 }, "frame": { - "x": 191, - "y": 261, + "x": 323, + "y": 244, "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, @@ -4770,33 +4833,12 @@ "h": 22 }, "frame": { - "x": 232, - "y": 258, + "x": 68, + "y": 272, "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, @@ -4812,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 271, - "y": 259, + "x": 68, + "y": 294, "w": 22, "h": 22 } @@ -4833,8 +4875,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 260, + "x": 90, + "y": 272, "w": 22, "h": 22 } @@ -4854,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 315, - "y": 264, + "x": 68, + "y": 316, "w": 22, "h": 22 } @@ -4875,8 +4917,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 265, + "x": 90, + "y": 294, "w": 22, "h": 22 } @@ -4896,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 366, - "y": 131, + "x": 68, + "y": 338, "w": 22, "h": 22 } @@ -4917,54 +4959,12 @@ "h": 22 }, "frame": { - "x": 388, - "y": 134, + "x": 90, + "y": 316, "w": 22, "h": 22 } }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 128, - "y": 272, - "w": 20, - "h": 20 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 148, - "y": 279, - "w": 21, - "h": 19 - } - }, { "filename": "tm_ghost", "rotated": false, @@ -4980,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 169, - "y": 280, + "x": 68, + "y": 360, "w": 22, "h": 22 } @@ -5001,33 +5001,12 @@ "h": 22 }, "frame": { - "x": 191, - "y": 283, + "x": 90, + "y": 338, "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,14 +5022,77 @@ "h": 22 }, "frame": { - "x": 232, - "y": 280, + "x": 90, + "y": 360, "w": 22, "h": 22 } }, { - "filename": "soothe_bell", + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 112, + "y": 272, + "w": 18, + "h": 24 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 112, + "y": 296, + "w": 18, + "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": 112, + "y": 319, + "w": 17, + "h": 24 + } + }, + { + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5061,17 +5103,17 @@ "x": 8, "y": 5, "w": 17, - "h": 22 + "h": 23 }, "frame": { - "x": 254, - "y": 280, + "x": 112, + "y": 343, "w": 17, - "h": 22 + "h": 23 } }, { - "filename": "tm_ice", + "filename": "shock_drive", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,209 +5121,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 8, + "w": 23, + "h": 17 }, "frame": { - "x": 271, - "y": 281, - "w": 22, - "h": 22 + "x": 68, + "y": 382, + "w": 23, + "h": 17 } }, { - "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", + "filename": "pp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -5290,19 +5143,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 15, - "h": 22 + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 94, - "y": 270, - "w": 15, - "h": 22 + "x": 68, + "y": 399, + "w": 16, + "h": 24 } }, { - "filename": "big_mushroom", + "filename": "protein", "rotated": false, "trimmed": true, "sourceSize": { @@ -5310,20 +5163,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 109, - "y": 273, - "w": 19, - "h": 19 + "x": 84, + "y": 399, + "w": 16, + "h": 24 } }, { - "filename": "x_attack", + "filename": "wise_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -5331,20 +5184,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 8, + "w": 23, + "h": 17 }, "frame": { - "x": 94, - "y": 292, - "w": 22, - "h": 22 + "x": 91, + "y": 382, + "w": 23, + "h": 17 } }, { - "filename": "x_defense", + "filename": "repel", "rotated": false, "trimmed": true, "sourceSize": { @@ -5352,167 +5205,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 116, - "y": 292, - "w": 22, - "h": 22 + "x": 100, + "y": 399, + "w": 16, + "h": 24 } }, { - "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, - "w": 22, - "h": 22 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 94, - "y": 358, - "w": 21, - "h": 21 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 116, - "y": 336, - "w": 21, - "h": 21 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 94, - "y": 379, - "w": 20, - "h": 22 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 138, - "y": 298, - "w": 21, - "h": 21 - } - }, - { - "filename": "sharp_meteorite", + "filename": "mega_bracelet", "rotated": false, "trimmed": true, "sourceSize": { @@ -5522,77 +5228,14 @@ "spriteSourceSize": { "x": 6, "y": 8, - "w": 21, - "h": 18 + "w": 20, + "h": 16 }, "frame": { - "x": 138, - "y": 319, - "w": 21, - "h": 18 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 137, - "y": 337, - "w": 22, - "h": 19 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, + "x": 112, + "y": 366, "w": 20, - "h": 21 - }, - "frame": { - "x": 159, - "y": 302, - "w": 20, - "h": 21 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 159, - "y": 323, - "w": 20, - "h": 20 + "h": 16 } }, { @@ -5610,33 +5253,12 @@ "h": 17 }, "frame": { - "x": 159, - "y": 343, + "x": 114, + "y": 382, "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, @@ -5652,33 +5274,12 @@ "h": 24 }, "frame": { - "x": 179, - "y": 319, + "x": 116, + "y": 399, "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, @@ -5694,8 +5295,8 @@ "h": 24 }, "frame": { - "x": 360, - "y": 157, + "x": 132, + "y": 399, "w": 16, "h": 24 } @@ -5715,14 +5316,56 @@ "h": 24 }, "frame": { - "x": 360, - "y": 181, + "x": 346, + "y": 159, "w": 16, "h": 24 } }, { - "filename": "quick_claw", + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 362, + "y": 136, + "w": 18, + "h": 18 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 362, + "y": 154, + "w": 17, + "h": 23 + } + }, + { + "filename": "big_mushroom", "rotated": false, "trimmed": true, "sourceSize": { @@ -5733,13 +5376,181 @@ "x": 6, "y": 6, "w": 19, - "h": 21 + "h": 19 }, "frame": { - "x": 360, - "y": 205, + "x": 346, + "y": 183, "w": 19, - "h": 21 + "h": 19 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 345, + "y": 202, + "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": 345, + "y": 224, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 345, + "y": 246, + "w": 22, + "h": 20 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 365, + "y": 177, + "w": 15, + "h": 23 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 367, + "y": 200, + "w": 15, + "h": 22 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 367, + "y": 222, + "w": 17, + "h": 22 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 367, + "y": 244, + "w": 17, + "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": 382, + "y": 151, + "w": 22, + "h": 20 } }, { @@ -5757,12 +5568,642 @@ "h": 20 }, "frame": { - "x": 360, - "y": 226, + "x": 404, + "y": 158, "w": 19, "h": 20 } }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 380, + "y": 171, + "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": 402, + "y": 178, + "w": 21, + "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": 382, + "y": 193, + "w": 20, + "h": 21 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 402, + "y": 199, + "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": 384, + "y": 214, + "w": 18, + "h": 20 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 402, + "y": 220, + "w": 21, + "h": 21 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 384, + "y": 234, + "w": 18, + "h": 19 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 402, + "y": 241, + "w": 21, + "h": 21 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 384, + "y": 253, + "w": 18, + "h": 18 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 402, + "y": 262, + "w": 21, + "h": 19 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 131, + "y": 267, + "w": 21, + "h": 18 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 130, + "y": 285, + "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": 152, + "y": 265, + "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": 174, + "y": 265, + "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": 196, + "y": 264, + "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": 218, + "y": 265, + "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": 240, + "y": 265, + "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": 262, + "y": 265, + "w": 22, + "h": 21 + } + }, + { + "filename": "water_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 284, + "y": 265, + "w": 22, + "h": 22 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 152, + "y": 287, + "w": 22, + "h": 20 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 174, + "y": 287, + "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": 196, + "y": 286, + "w": 22, + "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": 218, + "y": 286, + "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": 240, + "y": 286, + "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": 262, + "y": 286, + "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": 284, + "y": 287, + "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": 306, + "y": 267, + "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": 306, + "y": 289, + "w": 22, + "h": 19 + } + }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 328, + "y": 266, + "w": 20, + "h": 20 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 348, + "y": 266, + "w": 20, + "h": 20 + } + }, { "filename": "gb", "rotated": false, @@ -5778,8 +6219,8 @@ "h": 20 }, "frame": { - "x": 359, - "y": 246, + "x": 328, + "y": 286, "w": 20, "h": 20 } @@ -5799,12 +6240,159 @@ "h": 20 }, "frame": { - "x": 359, - "y": 266, + "x": 348, + "y": 286, "w": 20, "h": 20 } }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 368, + "y": 266, + "w": 16, + "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": 384, + "y": 271, + "w": 18, + "h": 18 + } + }, + { + "filename": "sharp_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 21, + "h": 18 + }, + "frame": { + "x": 402, + "y": 281, + "w": 21, + "h": 18 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 368, + "y": 284, + "w": 16, + "h": 16 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 384, + "y": 289, + "w": 18, + "h": 18 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 402, + "y": 299, + "w": 21, + "h": 18 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 130, + "y": 307, + "w": 20, + "h": 19 + } + }, { "filename": "mb", "rotated": false, @@ -5820,8 +6408,8 @@ "h": 20 }, "frame": { - "x": 359, - "y": 286, + "x": 129, + "y": 326, "w": 20, "h": 20 } @@ -5841,33 +6429,12 @@ "h": 20 }, "frame": { - "x": 376, - "y": 156, + "x": 129, + "y": 346, "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, @@ -5883,12 +6450,222 @@ "h": 20 }, "frame": { - "x": 376, - "y": 176, + "x": 150, + "y": 307, "w": 20, "h": 20 } }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 149, + "y": 327, + "w": 20, + "h": 20 + } + }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 149, + "y": 347, + "w": 20, + "h": 19 + } + }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 132, + "y": 366, + "w": 17, + "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": 149, + "y": 366, + "w": 20, + "h": 19 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 170, + "y": 309, + "w": 20, + "h": 20 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 169, + "y": 329, + "w": 20, + "h": 20 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 169, + "y": 349, + "w": 20, + "h": 20 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 169, + "y": 369, + "w": 20, + "h": 19 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 134, + "y": 382, + "w": 15, + "h": 15 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 149, + "y": 385, + "w": 20, + "h": 18 + } + }, { "filename": "hard_stone", "rotated": false, @@ -5904,8 +6681,8 @@ "h": 20 }, "frame": { - "x": 396, - "y": 177, + "x": 148, + "y": 403, "w": 19, "h": 20 } @@ -5925,56 +6702,14 @@ "h": 20 }, "frame": { - "x": 379, - "y": 196, + "x": 167, + "y": 403, "w": 17, "h": 20 } }, { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 396, - "y": 197, - "w": 19, - "h": 19 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 216, - "w": 20, - "h": 20 - } - }, - { - "filename": "abomasite", + "filename": "candy_overlay", "rotated": false, "trimmed": true, "sourceSize": { @@ -5983,330 +6718,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 12, "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 216, - "w": 16, - "h": 16 - } - }, - { - "filename": "smooth_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 236, - "w": 20, - "h": 20 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 232, - "w": 16, - "h": 16 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 248, - "w": 16, - "h": 16 - } - }, - { - "filename": "strange_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 256, - "w": 20, - "h": 20 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 264, - "w": 16, - "h": 16 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 276, - "w": 20, - "h": 20 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 280, - "w": 16, - "h": 16 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 379, - "y": 296, - "w": 21, - "h": 18 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, "h": 15 }, "frame": { - "x": 400, - "y": 296, - "w": 15, - "h": 15 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 400, - "y": 311, - "w": 15, - "h": 15 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 359, - "y": 306, - "w": 20, - "h": 19 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 379, - "y": 314, - "w": 20, - "h": 16 - } - }, - { - "filename": "altarianite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, + "x": 169, + "y": 388, "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 + "h": 15 } }, { @@ -6324,14 +6744,56 @@ "h": 20 }, "frame": { - "x": 215, - "y": 305, + "x": 184, + "y": 403, "w": 17, "h": 20 } }, { - "filename": "razor_fang", + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 185, + "y": 388, + "w": 15, + "h": 15 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 368, + "y": 300, + "w": 16, + "h": 16 + } + }, + { + "filename": "light_ball", "rotated": false, "trimmed": true, "sourceSize": { @@ -6340,35 +6802,14 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, + "y": 7, "w": 18, - "h": 20 - }, - "frame": { - "x": 232, - "y": 302, - "w": 18, - "h": 20 - } - }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, "h": 18 }, "frame": { - "x": 250, - "y": 302, - "w": 20, + "x": 384, + "y": 307, + "w": 18, "h": 18 } }, @@ -6387,12 +6828,33 @@ "h": 18 }, "frame": { - "x": 270, - "y": 303, + "x": 402, + "y": 317, "w": 20, "h": 18 } }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 190, + "y": 309, + "w": 19, + "h": 19 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -6408,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 213, - "y": 325, + "x": 209, + "y": 308, "w": 20, "h": 18 } @@ -6429,33 +6891,12 @@ "h": 18 }, "frame": { - "x": 197, - "y": 343, + "x": 229, + "y": 308, "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 +6912,12 @@ "h": 18 }, "frame": { - "x": 290, - "y": 304, + "x": 249, + "y": 308, "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 +6933,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 321, + "x": 328, + "y": 306, "w": 20, "h": 18 } @@ -6555,12 +6954,33 @@ "h": 18 }, "frame": { - "x": 289, - "y": 322, + "x": 348, + "y": 306, "w": 20, "h": 18 } }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 368, + "y": 316, + "w": 16, + "h": 16 + } + }, { "filename": "light_stone", "rotated": false, @@ -6576,33 +6996,12 @@ "h": 18 }, "frame": { - "x": 235, - "y": 340, + "x": 384, + "y": 325, "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 +7017,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 339, + "x": 402, + "y": 335, "w": 20, "h": 18 } @@ -6639,12 +7038,33 @@ "h": 18 }, "frame": { - "x": 289, - "y": 340, + "x": 269, + "y": 309, "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": 289, + "y": 309, + "w": 18, + "h": 18 + } + }, { "filename": "wl_full_restore", "rotated": false, @@ -6660,7 +7080,7 @@ "h": 18 }, "frame": { - "x": 310, + "x": 307, "y": 308, "w": 20, "h": 18 @@ -6681,7 +7101,7 @@ "h": 18 }, "frame": { - "x": 309, + "x": 209, "y": 326, "w": 20, "h": 18 @@ -6702,8 +7122,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 344, + "x": 229, + "y": 326, "w": 20, "h": 18 } @@ -6723,8 +7143,8 @@ "h": 18 }, "frame": { - "x": 330, - "y": 309, + "x": 249, + "y": 326, "w": 20, "h": 18 } @@ -6744,7 +7164,7 @@ "h": 18 }, "frame": { - "x": 329, + "x": 269, "y": 327, "w": 20, "h": 18 @@ -6765,33 +7185,12 @@ "h": 18 }, "frame": { - "x": 329, - "y": 345, + "x": 289, + "y": 327, "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 +7206,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 357, + "x": 309, + "y": 326, "w": 20, "h": 18 } @@ -6828,8 +7227,8 @@ "h": 18 }, "frame": { - "x": 289, - "y": 358, + "x": 329, + "y": 324, "w": 20, "h": 18 } @@ -6849,8 +7248,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 362, + "x": 189, + "y": 329, "w": 20, "h": 18 } @@ -6870,54 +7269,12 @@ "h": 18 }, "frame": { - "x": 329, - "y": 363, + "x": 189, + "y": 347, "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 +7290,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 375, + "x": 209, + "y": 344, "w": 20, "h": 18 } @@ -6954,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 289, - "y": 376, + "x": 189, + "y": 365, "w": 20, "h": 18 } @@ -6975,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 380, + "x": 229, + "y": 344, "w": 20, "h": 18 } @@ -6996,8 +7353,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 381, + "x": 249, + "y": 344, "w": 20, "h": 18 } @@ -7017,14 +7374,14 @@ "h": 18 }, "frame": { - "x": 116, - "y": 357, + "x": 209, + "y": 362, "w": 20, "h": 18 } }, { - "filename": "relic_band", + "filename": "aggronite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7032,15 +7389,120 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, + "x": 8, + "y": 8, + "w": 16, "h": 16 }, "frame": { - "x": 115, - "y": 375, - "w": 17, + "x": 349, + "y": 324, + "w": 16, + "h": 16 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 269, + "y": 345, + "w": 16, + "h": 16 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 229, + "y": 362, + "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": 285, + "y": 345, + "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": 245, + "y": 362, + "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": 301, + "y": 345, + "w": 16, "h": 16 } }, @@ -7059,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 114, - "y": 391, + "x": 317, + "y": 344, "w": 16, "h": 16 } @@ -7080,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 130, - "y": 399, + "x": 333, + "y": 342, "w": 16, "h": 16 } @@ -7101,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 146, - "y": 399, + "x": 349, + "y": 340, "w": 16, "h": 16 } @@ -7122,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 162, - "y": 399, + "x": 365, + "y": 332, "w": 16, "h": 16 } @@ -7143,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 178, - "y": 399, + "x": 261, + "y": 362, "w": 16, "h": 16 } @@ -7164,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 194, - "y": 399, + "x": 277, + "y": 361, "w": 16, "h": 16 } @@ -7185,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 210, - "y": 399, + "x": 293, + "y": 361, "w": 16, "h": 16 } @@ -7206,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 226, - "y": 399, + "x": 365, + "y": 348, "w": 16, "h": 16 } @@ -7227,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 242, - "y": 399, + "x": 381, + "y": 343, "w": 16, "h": 16 } @@ -7248,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 258, - "y": 399, + "x": 349, + "y": 356, "w": 16, "h": 16 } @@ -7269,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 274, - "y": 399, + "x": 333, + "y": 358, "w": 16, "h": 16 } @@ -7290,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 290, - "y": 399, + "x": 317, + "y": 360, "w": 16, "h": 16 } @@ -7311,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 399, + "x": 365, + "y": 364, "w": 16, "h": 16 } @@ -7332,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 399, + "x": 381, + "y": 359, "w": 16, "h": 16 } @@ -7353,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 399, + "x": 397, + "y": 353, "w": 16, "h": 16 } @@ -7374,33 +7836,12 @@ "h": 16 }, "frame": { - "x": 132, - "y": 375, + "x": 349, + "y": 372, "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 +7857,8 @@ "h": 16 }, "frame": { - "x": 152, - "y": 360, + "x": 333, + "y": 374, "w": 16, "h": 16 } @@ -7437,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 148, - "y": 376, + "x": 365, + "y": 380, "w": 16, "h": 16 } @@ -7458,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 168, - "y": 361, + "x": 381, + "y": 375, "w": 16, "h": 16 } @@ -7479,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 184, - "y": 361, + "x": 397, + "y": 369, "w": 16, "h": 16 } @@ -7500,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 200, - "y": 361, + "x": 349, + "y": 388, "w": 16, "h": 16 } @@ -7521,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 216, - "y": 361, + "x": 365, + "y": 396, "w": 16, "h": 16 } @@ -7542,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 164, - "y": 377, + "x": 381, + "y": 391, "w": 16, "h": 16 } @@ -7563,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 180, - "y": 377, + "x": 381, + "y": 407, "w": 16, "h": 16 } @@ -7584,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 196, - "y": 377, + "x": 397, + "y": 385, "w": 16, "h": 16 } @@ -7605,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 212, - "y": 377, + "x": 397, + "y": 401, "w": 16, "h": 16 } @@ -7626,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 228, - "y": 377, + "x": 200, + "y": 383, "w": 16, "h": 16 } @@ -7647,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 327, + "x": 201, + "y": 399, "w": 16, "h": 16 } @@ -7668,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 343, + "x": 216, + "y": 380, "w": 16, "h": 16 } @@ -7689,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 359, + "x": 232, + "y": 378, "w": 16, "h": 16 } @@ -7710,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 375, + "x": 248, + "y": 378, "w": 16, "h": 16 } @@ -7731,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 391, + "x": 264, + "y": 378, "w": 16, "h": 16 } @@ -7752,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 330, + "x": 280, + "y": 377, "w": 16, "h": 16 } @@ -7773,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 330, + "x": 296, + "y": 377, "w": 16, "h": 16 } @@ -7794,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 346, + "x": 217, + "y": 396, "w": 16, "h": 16 } @@ -7815,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 362, + "x": 233, + "y": 394, "w": 16, "h": 16 } @@ -7836,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 346, + "x": 249, + "y": 394, "w": 16, "h": 16 } @@ -7857,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 362, + "x": 265, + "y": 394, "w": 16, "h": 16 } @@ -7878,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 342, + "x": 281, + "y": 393, "w": 16, "h": 16 } @@ -7899,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 358, + "x": 297, + "y": 393, "w": 16, "h": 16 } @@ -7920,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 374, + "x": 312, + "y": 376, "w": 16, "h": 16 } @@ -7941,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 378, + "x": 313, + "y": 392, "w": 16, "h": 16 } @@ -7953,6 +8394,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:60db8f4653a650759cd9189e91c38a40:439307cbef9c000f6c45603b2d82d107:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:b317e2cd3502364fcdae296cd439ac4d:ae80196191516a8cb098a8467c6faa2f:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 6d9434d0454..831576e45af 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/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/power_herb.png b/public/images/items/power_herb.png new file mode 100644 index 00000000000..8e68b62278f 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/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/white_herb.png b/public/images/items/white_herb.png new file mode 100644 index 00000000000..25cfc652109 Binary files /dev/null and b/public/images/items/white_herb.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/682.png b/public/images/pokemon/exp/682.png index 68cbd664364..35ab3a5c315 100644 Binary files a/public/images/pokemon/exp/682.png and b/public/images/pokemon/exp/682.png differ diff --git a/public/images/pokemon/exp/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/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/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/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/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/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/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/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/4555.json b/public/images/pokemon/exp/back/shiny/4555.json index 23306700045..24b0847bc3c 100644 --- a/public/images/pokemon/exp/back/shiny/4555.json +++ b/public/images/pokemon/exp/back/shiny/4555.json @@ -1,1091 +1,230 @@ -{ - "textures": [ - { - "image": "4555.png", - "format": "RGBA8888", - "size": { - "w": 159, - "h": 159 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 40, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 38 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 40, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 38 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 41, - "h": 39 - }, - "frame": { - "x": 80, - "y": 0, - "w": 41, - "h": 39 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 39, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 39, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 39, - "h": 40 - }, - "frame": { - "x": 120, - "y": 39, - "w": 39, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 39, - "h": 40 - }, - "frame": { - "x": 0, - "y": 77, - "w": 39, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 39, - "h": 40 - }, - "frame": { - "x": 119, - "y": 79, - "w": 39, - "h": 40 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 119, - "w": 41, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 119, - "w": 41, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 42, - "h": 40 - }, - "frame": { - "x": 41, - "y": 119, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 42, - "h": 40 - }, - "frame": { - "x": 83, - "y": 119, - "w": 42, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3a0b5f67665759f212123a47de22e79d:d133311823cafabf0f343822a0a0197f:b1fe411cd93ff8f39d0ba407d084a2a9$" - } -} +{ + "textures": [ + { + "image": "4555.png", + "format": "RGBA8888", + "size": { + "w": 162, + "h": 162 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 66 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 66 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 54, + "h": 64 + }, + "frame": { + "x": 108, + "y": 0, + "w": 54, + "h": 64 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 54, + "h": 64 + }, + "frame": { + "x": 108, + "y": 0, + "w": 54, + "h": 64 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 63 + }, + "frame": { + "x": 108, + "y": 64, + "w": 54, + "h": 63 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 63 + }, + "frame": { + "x": 108, + "y": 64, + "w": 54, + "h": 63 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 62 + }, + "frame": { + "x": 0, + "y": 66, + "w": 54, + "h": 62 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 62 + }, + "frame": { + "x": 0, + "y": 66, + "w": 54, + "h": 62 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 54, + "h": 61 + }, + "frame": { + "x": 54, + "y": 66, + "w": 54, + "h": 61 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ebbf6c9db863403fcc56899bb963c8fe:60a7f95a9e0afed849e5735b36d1ca41:b1fe411cd93ff8f39d0ba407d084a2a9$" + } +} diff --git a/public/images/pokemon/exp/back/shiny/4555.png b/public/images/pokemon/exp/back/shiny/4555.png index 1b06edcaada..3ce57019abe 100644 Binary files a/public/images/pokemon/exp/back/shiny/4555.png and b/public/images/pokemon/exp/back/shiny/4555.png differ diff --git a/public/images/pokemon/exp/back/shiny/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/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/female/916.json b/public/images/pokemon/exp/female/916.json deleted file mode 100644 index e937dadda95..00000000000 --- a/public/images/pokemon/exp/female/916.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "916.png", - "format": "RGBA8888", - "size": { - "w": 250, - "h": 250 - }, - "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 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 60, - "h": 81 - }, - "frame": { - "x": 180, - "y": 83, - "w": 60, - "h": 81 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 59, - "h": 81 - }, - "frame": { - "x": 180, - "y": 164, - "w": 59, - "h": 81 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08f91248c91e426c4993be4e9988fc0d:215799a2235190ac587b1617d8e7e8b9:72483d103fb6b8e5c1889150025102c8$" - } -} 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/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/4555.json b/public/images/pokemon/exp/shiny/4555.json index f6f5dae33e7..8a1e2934687 100644 --- a/public/images/pokemon/exp/shiny/4555.json +++ b/public/images/pokemon/exp/shiny/4555.json @@ -1,1427 +1,272 @@ -{ - "textures": [ - { - "image": "4555.png", - "format": "RGBA8888", - "size": { - "w": 167, - "h": 167 - }, - "scale": 1, - "frames": [ - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 45, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 42 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 45, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 45, - "h": 41 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 41 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 45, - "h": 41 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 44, - "h": 40 - }, - "frame": { - "x": 45, - "y": 41, - "w": 44, - "h": 40 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 89, - "y": 41, - "w": 43, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 89, - "y": 41, - "w": 43, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 42 - }, - "frame": { - "x": 127, - "y": 81, - "w": 40, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 42 - }, - "frame": { - "x": 43, - "y": 122, - "w": 41, - "h": 42 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 41, - "h": 42 - }, - "frame": { - "x": 84, - "y": 122, - "w": 41, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 41, - "h": 41 - }, - "frame": { - "x": 125, - "y": 123, - "w": 41, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:265fdf7e226496ba08465dfaf7110126:d3c7e5104ff35ad1a1d1e07ba8a2af96:b1fe411cd93ff8f39d0ba407d084a2a9$" - } -} +{ + "textures": [ + { + "image": "4555.png", + "format": "RGBA8888", + "size": { + "w": 218, + "h": 218 + }, + "scale": 1, + "frames": [ + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 58, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 58, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 57, + "h": 75 + }, + "frame": { + "x": 60, + "y": 0, + "w": 57, + "h": 75 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 117, + "y": 0, + "w": 59, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 117, + "y": 0, + "w": 59, + "h": 74 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 117, + "y": 74, + "w": 59, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 117, + "y": 74, + "w": 59, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 59, + "h": 71 + }, + "frame": { + "x": 116, + "y": 147, + "w": 59, + "h": 71 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:8c03d5a85bd38061e1546639fec46360:c82e507fba00c56a331f2f65db25d979:b1fe411cd93ff8f39d0ba407d084a2a9$" + } +} diff --git a/public/images/pokemon/exp/shiny/4555.png b/public/images/pokemon/exp/shiny/4555.png index c5da9b8ec1e..1fc84012eed 100644 Binary files a/public/images/pokemon/exp/shiny/4555.png and b/public/images/pokemon/exp/shiny/4555.png differ diff --git a/public/images/pokemon/exp/shiny/682.png b/public/images/pokemon/exp/shiny/682.png index ea4c71bdcda..099176ee625 100644 Binary files a/public/images/pokemon/exp/shiny/682.png and b/public/images/pokemon/exp/shiny/682.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/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/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/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.json b/public/images/pokemon/female/916.json deleted file mode 100644 index e174d4b2d1c..00000000000 --- a/public/images/pokemon/female/916.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "916.png", - "format": "RGBA8888", - "size": { - "w": 251, - "h": 251 - }, - "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 - }, - "spriteSourceSize": { - "x": 15, - "y": 15, - "w": 61, - "h": 81 - }, - "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 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 60, - "h": 81 - }, - "frame": { - "x": 182, - "y": 86, - "w": 60, - "h": 81 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 16, - "y": 16, - "w": 60, - "h": 80 - }, - "frame": { - "x": 182, - "y": 167, - "w": 60, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f1919e76120351b77d053dd0b1048890:6cc484548a07e592b87dcc37f6c74a39:72483d103fb6b8e5c1889150025102c8$" - } -} 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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.json b/public/images/pokemon/variant/563_3.json deleted file mode 100644 index 9f6a43a4a97..00000000000 --- a/public/images/pokemon/variant/563_3.json +++ /dev/null @@ -1,3485 +0,0 @@ -{ - "textures": [ - { - "image": "563_3.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_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/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.json b/public/images/pokemon/variant/623_1.json deleted file mode 100644 index 3a12266f102..00000000000 --- a/public/images/pokemon/variant/623_1.json +++ /dev/null @@ -1,3590 +0,0 @@ -{ - "textures": [ - { - "image": "623_1.png", - "format": "RGBA8888", - "size": { - "w": 401, - "h": 401 - }, - "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 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0068.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": "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 - } - }, - { - "filename": "0147.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": "0148.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": "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 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0014.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": "0021.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": "0022.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": "0047.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": "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 - } - }, - { - "filename": "0149.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": "0150.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": "0157.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": "0158.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": "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 - } - }, - { - "filename": "0155.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": "0156.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": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:76e8001e2d30637bbf46d66a3c01cc86:32d4799151bd0a494e1cc16c07cc1afb:869abf8e0bcb859d5abfb33d03e5db07$" - } -} \ No newline at end of file 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/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/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 0c48fed625b..d03d8d7f1f5 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -125,12 +125,12 @@ 1 ], "41": [ - 1, + 0, 1, 1 ], "42": [ - 1, + 0, 1, 1 ], @@ -364,6 +364,11 @@ 1, 1 ], + "133-partner": [ + 0, + 1, + 1 + ], "134": [ 0, 1, @@ -480,7 +485,7 @@ 2 ], "169": [ - 1, + 0, 1, 1 ], @@ -1721,8 +1726,8 @@ ], "563": [ 0, - 2, - 2 + 1, + 1 ], "568": [ 0, @@ -1895,12 +1900,12 @@ 1 ], "622": [ - 1, + 0, 1, 1 ], "623": [ - 2, + 0, 1, 1 ], @@ -1939,36 +1944,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, @@ -3265,6 +3240,11 @@ 1, 1 ], + "123": [ + 1, + 1, + 1 + ], "129": [ 0, 1, @@ -3285,6 +3265,11 @@ 1, 1 ], + "217": [ + 1, + 1, + 1 + ], "229": [ 0, 1, @@ -3295,6 +3280,11 @@ 1, 1 ], + "307": [ + 0, + 1, + 1 + ], "308": [ 0, 1, @@ -3379,6 +3369,11 @@ 1, 1, 1 + ], + "6215": [ + 0, + 1, + 1 ] }, "back": { @@ -3508,12 +3503,12 @@ 1 ], "41": [ - 1, + 0, 1, 1 ], "42": [ - 1, + 0, 1, 1 ], @@ -3747,6 +3742,11 @@ 1, 1 ], + "133-partner": [ + 0, + 1, + 1 + ], "134": [ 0, 1, @@ -3830,7 +3830,7 @@ "150-mega-y": [ 0, 1, - 0 + 1 ], "150": [ 0, @@ -3863,7 +3863,7 @@ 1 ], "169": [ - 1, + 0, 1, 1 ], @@ -5278,12 +5278,12 @@ 1 ], "622": [ - 1, + 0, 1, 1 ], "623": [ - 2, + 0, 1, 1 ], @@ -6638,6 +6638,11 @@ 1, 1 ], + "123": [ + 1, + 1, + 1 + ], "129": [ 0, 1, @@ -6658,6 +6663,11 @@ 1, 1 ], + "217": [ + 1, + 1, + 1 + ], "229": [ 0, 1, @@ -6668,6 +6678,11 @@ 1, 1 ], + "307": [ + 0, + 1, + 1 + ], "308": [ 0, 1, @@ -6752,6 +6767,11 @@ 1, 1, 1 + ], + "6215": [ + 0, + 1, + 1 ] } }, 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/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/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/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/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/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/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/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.json b/public/images/pokemon/variant/back/623_1.json deleted file mode 100644 index 893fe66c597..00000000000 --- a/public/images/pokemon/variant/back/623_1.json +++ /dev/null @@ -1,3590 +0,0 @@ -{ - "textures": [ - { - "image": "623_1.png", - "format": "RGBA8888", - "size": { - "w": 392, - "h": 392 - }, - "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 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0010.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": "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, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0106.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": "0133.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": "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 - } - }, - { - "filename": "0057.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": "0058.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": "0079.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": "0080.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": "0091.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": "0092.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": "0147.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": "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, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 221, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 221, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 296, - "y": 160, - "w": 72, - "h": 80 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 296, - "y": 160, - "w": 72, - "h": 80 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 71, - "h": 80 - }, - "frame": { - "x": 293, - "y": 240, - "w": 71, - "h": 80 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 71, - "h": 80 - }, - "frame": { - "x": 293, - "y": 240, - "w": 71, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d2a0b4f8d67951bad9facc61ed8ecd29:029ea763f8f267a92908e8da6c5b70c9:869abf8e0bcb859d5abfb33d03e5db07$" - } -} \ No newline at end of file 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/back/female/123.json b/public/images/pokemon/variant/back/female/123.json new file mode 100644 index 00000000000..049e6e23435 --- /dev/null +++ b/public/images/pokemon/variant/back/female/123.json @@ -0,0 +1,47 @@ +{ + "0": { + "425a21": "632929", + "bde673": "e67373", + "e6d6ad": "b5b5ce", + "9c8c31": "632929", + "8cce73": "f76b6b", + "101010": "101010", + "fff7d6": "ffffff", + "5a9c4a": "d63a3a", + "bdbdbd": "bdbdbd", + "c5a573": "b5b5ce", + "dedede": "dedede", + "ffffff": "ffffff", + "737373": "737373" + }, + "1": { + "425a21": "484e75", + "bde673": "bdbdbd", + "e6d6ad": "e6d6ad", + "9c8c31": "9c8c31", + "8cce73": "92b0db", + "101010": "101010", + "fff7d6": "fff7d6", + "5a9c4a": "7b94d6", + "bdbdbd": "ffffff", + "c5a573": "9cc5ff", + "dedede": "dedede", + "ffffff": "ffffff", + "737373": "737373" + }, + "2": { + "425a21": "8f3907", + "bde673": "f8f581", + "e6d6ad": "e6d6ad", + "9c8c31": "9c8c31", + "8cce73": "f0c947", + "101010": "101010", + "fff7d6": "fff7d6", + "5a9c4a": "e6a027", + "bdbdbd": "bdbdbd", + "c5a573": "c5a573", + "dedede": "dedede", + "ffffff": "ffffff", + "737373": "737373" + } +} \ 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/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/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/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/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/123.json b/public/images/pokemon/variant/female/123.json new file mode 100644 index 00000000000..5fbefd72224 --- /dev/null +++ b/public/images/pokemon/variant/female/123.json @@ -0,0 +1,44 @@ +{ + "0": { + "425a21": "632929", + "bde673": "f76b6b", + "101010": "101010", + "9c8c31": "9494a5", + "fff7d6": "ffffff", + "8cce73": "d63a3a", + "e6d6ad": "b5b5ce", + "5a9c4a": "a52929", + "ffffff": "ffffff", + "dedede": "dedede", + "bdbdbd": "bdbdbd", + "737373": "737373" + }, + "1": { + "425a21": "484e75", + "bde673": "7c9ac5", + "101010": "101010", + "9c8c31": "9c8c31", + "fff7d6": "fff7d6", + "8cce73": "92b0db", + "e6d6ad": "e6d6ad", + "5a9c4a": "7b94d6", + "ffffff": "ffffff", + "dedede": "dedede", + "bdbdbd": "bdbdbd", + "737373": "737373" + }, + "2": { + "425a21": "8f3907", + "bde673": "f8f581", + "101010": "101010", + "9c8c31": "9c8c31", + "fff7d6": "fff7d6", + "8cce73": "f0c947", + "e6d6ad": "e6d6ad", + "5a9c4a": "e6a027", + "ffffff": "ffffff", + "dedede": "f0c947", + "bdbdbd": "bdbdbd", + "737373": "737373" + } +} \ 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/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/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/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/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_4.json b/public/images/pokemon_icons_4.json index baa804fa2a0..bc32a16f02c 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,20 +1509,20 @@ "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 } }, { - "filename": "450", + "filename": "450-f", "rotated": false, "trimmed": true, "sourceSize": { @@ -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, @@ -1732,7 +1690,7 @@ } }, { - "filename": "411", + "filename": "462", "rotated": false, "trimmed": true, "sourceSize": { @@ -1740,37 +1698,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 +2068,7 @@ } }, { - "filename": "411s", + "filename": "411", "rotated": false, "trimmed": true, "sourceSize": { @@ -2215,7 +2152,7 @@ } }, { - "filename": "479-mow", + "filename": "462s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2223,62 +2160,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 +2183,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 +2250,8 @@ "h": 23 }, "frame": { - "x": 53, - "y": 402, + "x": 28, + "y": 501, "w": 27, "h": 23 } @@ -2376,119 +2271,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 +2287,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 +2488,7 @@ } }, { - "filename": "471", + "filename": "479-wash", "rotated": false, "trimmed": true, "sourceSize": { @@ -2643,58 +2496,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 +2523,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,19 +2560,187 @@ }, "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": "450-f", + "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", "rotated": false, "trimmed": true, "sourceSize": { @@ -2761,448 +2761,7 @@ } }, { - "filename": "464s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 81, - "y": 308, - "w": 27, - "h": 22 - } - }, - { - "filename": "466s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 81, - "y": 330, - "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": 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, - "h": 21 - } - }, - { - "filename": "437s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 21 - }, - "frame": { - "x": 53, - "y": 448, - "w": 27, - "h": 21 - } - }, - { - "filename": "450s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 52, - "y": 469, - "w": 28, - "h": 20 - } - }, - { - "filename": "430", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 462, - "w": 26, - "h": 22 - } - }, - { - "filename": "430s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 51, - "y": 489, - "w": 26, - "h": 22 - } - }, - { - "filename": "431", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 51, - "y": 511, - "w": 26, - "h": 22 - } - }, - { - "filename": "479-fan", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 51, - "y": 533, - "w": 26, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 72, - "y": 577, - "w": 19, - "h": 28 - } - }, - { - "filename": "391s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 23 - }, - "frame": { - "x": 76, - "y": 554, - "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", + "filename": "395s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3212,13 +2771,76 @@ "spriteSourceSize": { "x": 10, "y": 3, - "w": 22, + "w": 23, "h": 25 }, "frame": { - "x": 76, - "y": 624, - "w": 22, + "x": 81, + "y": 308, + "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 } }, @@ -3244,7 +2866,7 @@ } }, { - "filename": "431s", + "filename": "413-sandy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3252,15 +2874,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 + "x": 9, + "y": 5, + "w": 24, + "h": 23 }, "frame": { "x": 226, - "y": 190, - "w": 26, + "y": 192, + "w": 24, + "h": 23 + } + }, + { + "filename": "450s", + "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 } }, @@ -3279,159 +2943,12 @@ "h": 19 }, "frame": { - "x": 197, - "y": 210, + "x": 194, + "y": 230, "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 91, - "y": 577, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 77, - "y": 503, - "w": 26, - "h": 22 - } - }, - { - "filename": "480s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 77, - "y": 525, - "w": 26, - "h": 22 - } - }, { "filename": "468s", "rotated": false, @@ -3447,14 +2964,77 @@ "h": 19 }, "frame": { - "x": 112, - "y": 285, + "x": 222, + "y": 237, "w": 28, "h": 19 } }, { - "filename": "479s-fan", + "filename": "437", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 21 + }, + "frame": { + "x": 193, + "y": 249, + "w": 27, + "h": 21 + } + }, + { + "filename": "437s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 21 + }, + "frame": { + "x": 220, + "y": 256, + "w": 27, + "h": 21 + } + }, + { + "filename": "416s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 26, + "h": 21 + }, + "frame": { + "x": 188, + "y": 270, + "w": 26, + "h": 21 + } + }, + { + "filename": "428s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3463,19 +3043,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 7, + "y": 6, "w": 26, - "h": 21 + "h": 22 }, "frame": { - "x": 140, - "y": 284, + "x": 214, + "y": 277, "w": 26, - "h": 21 + "h": 22 } }, { - "filename": "414", + "filename": "475", "rotated": false, "trimmed": true, "sourceSize": { @@ -3484,57 +3064,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 25, - "h": 20 + "y": 3, + "w": 22, + "h": 25 }, "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 + "x": 104, + "y": 308, + "w": 22, + "h": 25 } }, { @@ -3552,12 +3090,243 @@ "h": 23 }, "frame": { - "x": 107, - "y": 342, + "x": 112, + "y": 285, "w": 24, "h": 23 } }, + { + "filename": "430", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 136, + "y": 285, + "w": 26, + "h": 22 + } + }, + { + "filename": "430s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 162, + "y": 285, + "w": 26, + "h": 22 + } + }, + { + "filename": "431", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 188, + "y": 291, + "w": 26, + "h": 22 + } + }, + { + "filename": "388", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 106, + "y": 333, + "w": 22, + "h": 21 + } + }, + { + "filename": "429s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 19, + "h": 28 + }, + "frame": { + "x": 105, + "y": 354, + "w": 19, + "h": 28 + } + }, + { + "filename": "388s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 105, + "y": 382, + "w": 22, + "h": 21 + } + }, + { + "filename": "431s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 214, + "y": 299, + "w": 26, + "h": 22 + } + }, + { + "filename": "475s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 126, + "y": 308, + "w": 22, + "h": 25 + } + }, + { + "filename": "480", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "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, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 124, + "y": 356, + "w": 26, + "h": 22 + } + }, { "filename": "476", "rotated": false, @@ -3573,138 +3342,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 +3363,8 @@ "h": 23 }, "frame": { - "x": 106, - "y": 431, + "x": 150, + "y": 352, "w": 24, "h": 23 } @@ -3741,8 +3384,8 @@ "h": 23 }, "frame": { - "x": 106, - "y": 454, + "x": 127, + "y": 378, "w": 23, "h": 23 } @@ -3762,12 +3405,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 +3636,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 +3651,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 +3673,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 +3699,8 @@ "h": 23 }, "frame": { - "x": 137, - "y": 569, + "x": 129, + "y": 401, "w": 22, "h": 23 } @@ -3993,14 +3720,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 +3735,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 +3798,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 +3825,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 +3846,8 @@ "h": 22 }, "frame": { - "x": 190, - "y": 265, + "x": 78, + "y": 466, "w": 23, "h": 22 } @@ -4287,33 +3867,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 +3888,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 +3903,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 +3924,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 +3951,8 @@ "h": 23 }, "frame": { - "x": 156, - "y": 345, + "x": 55, + "y": 511, "w": 22, "h": 23 } @@ -4476,12 +3972,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 +4014,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 +4035,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 +4056,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 +4098,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 +4177,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 +4203,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 +4224,8 @@ "h": 23 }, "frame": { - "x": 200, - "y": 348, + "x": 99, + "y": 556, "w": 21, "h": 23 } @@ -4749,12 +4245,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 +4371,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 +4392,8 @@ "h": 22 }, "frame": { - "x": 150, - "y": 433, + "x": 120, + "y": 562, "w": 21, "h": 22 } @@ -5085,14 +4413,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 +4492,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 +4512,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 +4555,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 +4581,8 @@ "h": 20 }, "frame": { - "x": 171, - "y": 436, + "x": 115, + "y": 645, "w": 22, "h": 20 } @@ -5211,14 +4602,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 +4617,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 +4639,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 +4770,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 +4791,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 +4829,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 +4848,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 +4875,8 @@ "h": 22 }, "frame": { - "x": 234, - "y": 446, + "x": 155, + "y": 513, "w": 18, "h": 22 } @@ -5589,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 182, - "y": 498, + "x": 157, + "y": 535, "w": 17, "h": 22 } @@ -5610,14 +4917,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 +4955,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 +4974,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 +4996,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 +5016,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-f", "rotated": false, "trimmed": true, "sourceSize": { @@ -5751,15 +5037,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 +5064,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", + "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-f", + "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", + "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 +5442,8 @@ "h": 18 }, "frame": { - "x": 234, - "y": 468, + "x": 177, + "y": 411, "w": 18, "h": 18 } @@ -5820,12 +5463,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 +5589,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 +5925,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 +5940,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 +5967,8 @@ "h": 18 }, "frame": { - "x": 233, - "y": 522, + "x": 231, + "y": 554, "w": 19, "h": 18 } @@ -5925,12 +5988,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 +6051,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 +6093,8 @@ "h": 17 }, "frame": { - "x": 198, - "y": 574, + "x": 228, + "y": 588, "w": 20, "h": 17 } @@ -5988,96 +6114,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 +6135,8 @@ "h": 17 }, "frame": { - "x": 232, - "y": 558, + "x": 200, + "y": 622, "w": 17, "h": 17 } @@ -6114,8 +6156,8 @@ "h": 17 }, "frame": { - "x": 232, - "y": 575, + "x": 220, + "y": 605, "w": 17, "h": 17 } @@ -6135,14 +6177,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 +6192,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 +6219,8 @@ "h": 18 }, "frame": { - "x": 231, - "y": 598, + "x": 200, + "y": 639, "w": 12, "h": 18 } @@ -6273,6 +6231,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d81cce65ebf0d5fbab1f9b7dbc080d4a:2eeffac5a7c6cd09ee563c646d89e345:3f74c54ad2b3085ce7282c3466535f4a$" + "smartupdate": "$TexturePacker:SmartUpdate:840d25653028f4586676114238d98794:576800da918eeca99e7b1b1a0d84af42:3f74c54ad2b3085ce7282c3466535f4a$" } } diff --git a/public/images/pokemon_icons_4.png b/public/images/pokemon_icons_4.png index 5dcfffb5579..9a3fb2cefa9 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..44bced3adc7 100644 --- a/public/images/pokemon_icons_4v.json +++ b/public/images/pokemon_icons_4v.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_4v.png", "format": "RGBA8888", "size": { - "w": 124, - "h": 660 + "w": 123, + "h": 656 }, "scale": 1, "frames": [ @@ -135,6 +135,27 @@ "h": 25 } }, + { + "filename": "445_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 94, + "y": 0, + "w": 29, + "h": 22 + } + }, { "filename": "445-mega_3", "rotated": false, @@ -150,12 +171,33 @@ "h": 25 }, "frame": { - "x": 94, - "y": 0, + "x": 0, + "y": 81, "w": 30, "h": 25 } }, + { + "filename": "445_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 94, + "y": 22, + "w": 29, + "h": 22 + } + }, { "filename": "487-altered_2", "rotated": false, @@ -171,12 +213,33 @@ "h": 24 }, "frame": { - "x": 0, - "y": 81, + "x": 64, + "y": 25, "w": 30, "h": 24 } }, + { + "filename": "445_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 94, + "y": 44, + "w": 29, + "h": 22 + } + }, { "filename": "487-altered_3", "rotated": false, @@ -193,53 +256,11 @@ }, "frame": { "x": 0, - "y": 105, + "y": 106, "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, @@ -256,7 +277,7 @@ }, "frame": { "x": 0, - "y": 129, + "y": 130, "w": 28, "h": 25 } @@ -277,7 +298,7 @@ }, "frame": { "x": 0, - "y": 154, + "y": 155, "w": 28, "h": 25 } @@ -298,7 +319,7 @@ }, "frame": { "x": 0, - "y": 179, + "y": 180, "w": 28, "h": 23 } @@ -319,7 +340,7 @@ }, "frame": { "x": 0, - "y": 202, + "y": 203, "w": 28, "h": 23 } @@ -340,7 +361,7 @@ }, "frame": { "x": 0, - "y": 225, + "y": 226, "w": 25, "h": 26 } @@ -361,7 +382,7 @@ }, "frame": { "x": 0, - "y": 251, + "y": 252, "w": 25, "h": 26 } @@ -382,7 +403,7 @@ }, "frame": { "x": 0, - "y": 277, + "y": 278, "w": 25, "h": 26 } @@ -403,7 +424,7 @@ }, "frame": { "x": 0, - "y": 303, + "y": 304, "w": 25, "h": 26 } @@ -424,7 +445,7 @@ }, "frame": { "x": 0, - "y": 329, + "y": 330, "w": 26, "h": 24 } @@ -445,7 +466,7 @@ }, "frame": { "x": 0, - "y": 353, + "y": 354, "w": 26, "h": 24 } @@ -466,7 +487,7 @@ }, "frame": { "x": 0, - "y": 377, + "y": 378, "w": 26, "h": 24 } @@ -487,7 +508,7 @@ }, "frame": { "x": 0, - "y": 401, + "y": 402, "w": 26, "h": 24 } @@ -508,7 +529,7 @@ }, "frame": { "x": 0, - "y": 425, + "y": 426, "w": 26, "h": 24 } @@ -529,7 +550,7 @@ }, "frame": { "x": 0, - "y": 449, + "y": 450, "w": 26, "h": 23 } @@ -550,7 +571,7 @@ }, "frame": { "x": 0, - "y": 472, + "y": 473, "w": 26, "h": 23 } @@ -571,7 +592,7 @@ }, "frame": { "x": 0, - "y": 495, + "y": 496, "w": 26, "h": 23 } @@ -592,7 +613,7 @@ }, "frame": { "x": 0, - "y": 518, + "y": 519, "w": 27, "h": 23 } @@ -613,7 +634,7 @@ }, "frame": { "x": 0, - "y": 541, + "y": 542, "w": 27, "h": 23 } @@ -634,13 +655,55 @@ }, "frame": { "x": 0, - "y": 564, + "y": 565, "w": 27, "h": 23 } }, { - "filename": "445_2", + "filename": "464_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 0, + "y": 588, + "w": 27, + "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": 0, + "y": 610, + "w": 27, + "h": 22 + } + }, + { + "filename": "426_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -649,19 +712,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 29, - "h": 22 + "y": 4, + "w": 24, + "h": 24 }, "frame": { "x": 0, - "y": 587, - "w": 29, - "h": 22 + "y": 632, + "w": 24, + "h": 24 } }, { - "filename": "445_3", + "filename": "426_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -670,36 +733,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 29, - "h": 22 + "y": 4, + "w": 24, + "h": 24 }, "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 + "x": 24, + "y": 632, + "w": 24, + "h": 24 } }, { @@ -724,49 +766,7 @@ } }, { - "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", + "filename": "472_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -786,6 +786,69 @@ "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": 90, + "w": 31, + "h": 22 + } + }, + { + "filename": "485_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 33, + "h": 20 + }, + "frame": { + "x": 30, + "y": 112, + "w": 33, + "h": 20 + } + }, + { + "filename": "465_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 28, + "y": 132, + "w": 29, + "h": 22 + } + }, { "filename": "465_3", "rotated": false, @@ -801,8 +864,8 @@ "h": 22 }, "frame": { - "x": 30, - "y": 90, + "x": 28, + "y": 154, "w": 29, "h": 22 } @@ -822,8 +885,8 @@ "h": 22 }, "frame": { - "x": 30, - "y": 112, + "x": 28, + "y": 176, "w": 29, "h": 22 } @@ -844,7 +907,7 @@ }, "frame": { "x": 28, - "y": 134, + "y": 198, "w": 29, "h": 22 } @@ -864,558 +927,12 @@ "h": 22 }, "frame": { - "x": 28, - "y": 156, + "x": 64, + "y": 49, "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, @@ -1431,8 +948,50 @@ "h": 22 }, "frame": { - "x": 59, - "y": 105, + "x": 61, + "y": 71, + "w": 26, + "h": 22 + } + }, + { + "filename": "468_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 28, + "h": 19 + }, + "frame": { + "x": 61, + "y": 93, + "w": 28, + "h": 19 + } + }, + { + "filename": "428_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 63, + "y": 112, "w": 26, "h": 22 } @@ -1452,8 +1011,8 @@ "h": 21 }, "frame": { - "x": 89, - "y": 88, + "x": 57, + "y": 134, "w": 27, "h": 21 } @@ -1473,54 +1032,12 @@ "h": 21 }, "frame": { - "x": 85, - "y": 109, + "x": 57, + "y": 155, "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, @@ -1537,7 +1054,7 @@ }, "frame": { "x": 57, - "y": 149, + "y": 176, "w": 26, "h": 22 } @@ -1557,12 +1074,54 @@ "h": 22 }, "frame": { - "x": 85, - "y": 130, + "x": 57, + "y": 198, "w": 26, "h": 22 } }, + { + "filename": "468_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 28, + "h": 19 + }, + "frame": { + "x": 28, + "y": 220, + "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": 56, + "y": 220, + "w": 28, + "h": 19 + } + }, { "filename": "480_3", "rotated": false, @@ -1578,14 +1137,14 @@ "h": 22 }, "frame": { - "x": 83, - "y": 152, + "x": 25, + "y": 239, "w": 26, "h": 22 } }, { - "filename": "412-sandy_1", + "filename": "413-sandy_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -1593,20 +1152,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, + "x": 9, "y": 5, - "w": 15, + "w": 24, "h": 23 }, "frame": { - "x": 109, - "y": 152, - "w": 15, + "x": 25, + "y": 261, + "w": 24, "h": 23 } }, { - "filename": "406_3", + "filename": "413-sandy_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -1614,20 +1173,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 + "x": 9, + "y": 5, + "w": 24, + "h": 23 }, "frame": { - "x": 112, - "y": 127, - "w": 12, - "h": 18 + "x": 25, + "y": 284, + "w": 24, + "h": 23 } }, { - "filename": "414_3", + "filename": "413-sandy_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 25, + "y": 307, + "w": 24, + "h": 23 + } + }, + { + "filename": "429_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -1636,15 +1216,57 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 25, - "h": 20 + "y": 2, + "w": 19, + "h": 28 }, "frame": { - "x": 57, - "y": 171, - "w": 25, - "h": 20 + "x": 26, + "y": 330, + "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": 26, + "y": 358, + "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": 26, + "y": 386, + "w": 19, + "h": 28 } }, { @@ -1662,33 +1284,12 @@ "h": 22 }, "frame": { - "x": 82, - "y": 174, + "x": 51, + "y": 239, "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, @@ -1704,8 +1305,8 @@ "h": 22 }, "frame": { - "x": 55, - "y": 191, + "x": 49, + "y": 261, "w": 25, "h": 22 } @@ -1725,14 +1326,14 @@ "h": 22 }, "frame": { - "x": 80, - "y": 196, + "x": 49, + "y": 283, "w": 25, "h": 22 } }, { - "filename": "461_2", + "filename": "475_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -1741,19 +1342,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 19, - "h": 22 + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 105, - "y": 197, - "w": 19, - "h": 22 + "x": 49, + "y": 305, + "w": 22, + "h": 25 } }, { - "filename": "401_3", + "filename": "475_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -1761,16 +1362,163 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 + "x": 10, + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 63, - "y": 213, - "w": 17, - "h": 22 + "x": 45, + "y": 330, + "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": 45, + "y": 355, + "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": 45, + "y": 378, + "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": 26, + "y": 414, + "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": 26, + "y": 438, + "w": 20, + "h": 24 + } + }, + { + "filename": "413-plant_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 26, + "y": 462, + "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": 26, + "y": 485, + "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": 27, + "y": 508, + "w": 23, + "h": 23 } }, { @@ -1788,96 +1536,12 @@ "h": 23 }, "frame": { - "x": 63, - "y": 235, + "x": 27, + "y": 531, "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, @@ -1893,54 +1557,12 @@ "h": 22 }, "frame": { - "x": 63, - "y": 258, + "x": 27, + "y": 554, "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, @@ -1956,138 +1578,12 @@ "h": 22 }, "frame": { - "x": 63, - "y": 280, + "x": 27, + "y": 576, "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, @@ -2103,117 +1599,12 @@ "h": 22 }, "frame": { - "x": 50, - "y": 302, + "x": 27, + "y": 598, "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, @@ -2229,8 +1620,8 @@ "h": 22 }, "frame": { - "x": 73, - "y": 325, + "x": 87, + "y": 71, "w": 18, "h": 22 } @@ -2250,14 +1641,119 @@ "h": 22 }, "frame": { - "x": 73, - "y": 347, + "x": 105, + "y": 66, "w": 18, "h": 22 } }, { - "filename": "388_3", + "filename": "427_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 105, + "y": 88, + "w": 18, + "h": 22 + } + }, + { + "filename": "412-trash_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 89, + "y": 93, + "w": 16, + "h": 23 + } + }, + { + "filename": "427_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 105, + "y": 110, + "w": 18, + "h": 22 + } + }, + { + "filename": "412-trash_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 89, + "y": 116, + "w": 16, + "h": 23 + } + }, + { + "filename": "447_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 105, + "y": 132, + "w": 18, + "h": 18 + } + }, + { + "filename": "454_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2266,40 +1762,19 @@ }, "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, + "w": 21, "h": 22 }, "frame": { - "x": 72, - "y": 390, - "w": 22, + "x": 84, + "y": 139, + "w": 21, "h": 22 } }, { - "filename": "440_1", + "filename": "447_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2307,16 +1782,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 + "x": 12, + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 89, - "y": 301, - "w": 14, - "h": 19 + "x": 105, + "y": 150, + "w": 18, + "h": 18 } }, { @@ -2334,12 +1809,390 @@ "h": 20 }, "frame": { - "x": 103, - "y": 307, + "x": 84, + "y": 161, "w": 21, "h": 20 } }, + { + "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": 168, + "w": 18, + "h": 18 + } + }, + { + "filename": "400_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 83, + "y": 181, + "w": 22, + "h": 22 + } + }, + { + "filename": "492-land_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 105, + "y": 186, + "w": 18, + "h": 16 + } + }, + { + "filename": "489_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 83, + "y": 203, + "w": 23, + "h": 17 + } + }, + { + "filename": "401_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 202, + "w": 17, + "h": 22 + } + }, + { + "filename": "388_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 84, + "y": 220, + "w": 22, + "h": 21 + } + }, + { + "filename": "401_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 224, + "w": 17, + "h": 22 + } + }, + { + "filename": "414_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 76, + "y": 241, + "w": 25, + "h": 20 + } + }, + { + "filename": "400_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 101, + "y": 246, + "w": 22, + "h": 22 + } + }, + { + "filename": "414_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 74, + "y": 261, + "w": 25, + "h": 20 + } + }, + { + "filename": "423-west_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 74, + "y": 281, + "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": 99, + "y": 268, + "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": 97, + "y": 290, + "w": 23, + "h": 22 + } + }, + { + "filename": "433_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 74, + "y": 303, + "w": 23, + "h": 19 + } + }, + { + "filename": "433_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 97, + "y": 312, + "w": 23, + "h": 19 + } + }, + { + "filename": "448-mega_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 46, + "y": 401, + "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": 46, + "y": 425, + "w": 19, + "h": 24 + } + }, + { + "filename": "433_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 71, + "y": 322, + "w": 23, + "h": 19 + } + }, { "filename": "444_1", "rotated": false, @@ -2355,8 +2208,8 @@ "h": 21 }, "frame": { - "x": 63, - "y": 412, + "x": 67, + "y": 341, "w": 23, "h": 21 } @@ -2376,8 +2229,8 @@ "h": 21 }, "frame": { - "x": 63, - "y": 433, + "x": 67, + "y": 362, "w": 23, "h": 21 } @@ -2397,14 +2250,35 @@ "h": 21 }, "frame": { - "x": 91, - "y": 327, + "x": 67, + "y": 383, "w": 23, "h": 21 } }, { - "filename": "433_1", + "filename": "388_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 65, + "y": 404, + "w": 22, + "h": 21 + } + }, + { + "filename": "448-mega_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2413,15 +2287,36 @@ }, "spriteSourceSize": { "x": 12, - "y": 9, - "w": 23, - "h": 19 + "y": 4, + "w": 19, + "h": 24 }, "frame": { - "x": 91, - "y": 348, - "w": 23, - "h": 19 + "x": 65, + "y": 425, + "w": 19, + "h": 24 + } + }, + { + "filename": "454_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 48, + "y": 449, + "w": 21, + "h": 22 } }, { @@ -2439,14 +2334,14 @@ "h": 22 }, "frame": { - "x": 95, - "y": 367, + "x": 69, + "y": 449, "w": 20, "h": 22 } }, { - "filename": "407_3", + "filename": "489_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2454,18 +2349,102 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 94, + "y": 331, + "w": 23, + "h": 17 + } + }, + { + "filename": "492-sky_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 6, - "w": 20, + "w": 21, "h": 22 }, "frame": { - "x": 86, - "y": 412, - "w": 20, + "x": 90, + "y": 348, + "w": 21, "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": 90, + "y": 370, + "w": 21, + "h": 22 + } + }, + { + "filename": "406_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 348, + "w": 12, + "h": 18 + } + }, + { + "filename": "406_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 366, + "w": 12, + "h": 18 + } + }, { "filename": "442_3", "rotated": false, @@ -2481,14 +2460,14 @@ "h": 20 }, "frame": { - "x": 86, - "y": 434, + "x": 90, + "y": 392, "w": 21, "h": 20 } }, { - "filename": "425_2", + "filename": "489_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2496,121 +2475,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 + "x": 11, + "y": 11, + "w": 23, + "h": 17 }, "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, + "x": 87, "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 + "h": 17 } }, { @@ -2628,12 +2502,117 @@ "h": 20 }, "frame": { - "x": 87, - "y": 454, + "x": 84, + "y": 429, "w": 22, "h": 20 } }, + { + "filename": "412-plant_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 429, + "w": 17, + "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": 89, + "y": 449, + "w": 17, + "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": 106, + "y": 451, + "w": 17, + "h": 22 + } + }, + { + "filename": "436_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 13, + "h": 16 + }, + "frame": { + "x": 110, + "y": 412, + "w": 13, + "h": 16 + } + }, + { + "filename": "407_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 49, + "y": 471, + "w": 20, + "h": 22 + } + }, { "filename": "490_2", "rotated": false, @@ -2649,12 +2628,75 @@ "h": 20 }, "frame": { - "x": 64, - "y": 492, + "x": 69, + "y": 471, "w": 22, "h": 20 } }, + { + "filename": "412-sandy_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 91, + "y": 471, + "w": 15, + "h": 23 + } + }, + { + "filename": "422-west_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 106, + "y": 473, + "w": 17, + "h": 20 + } + }, + { + "filename": "422-west_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 106, + "y": 493, + "w": 17, + "h": 20 + } + }, { "filename": "490_3", "rotated": false, @@ -2670,14 +2712,14 @@ "h": 20 }, "frame": { - "x": 87, - "y": 474, + "x": 69, + "y": 491, "w": 22, "h": 20 } }, { - "filename": "489_2", + "filename": "412-sandy_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2685,20 +2727,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 + "x": 13, + "y": 5, + "w": 15, + "h": 23 }, "frame": { - "x": 86, + "x": 91, "y": 494, - "w": 23, - "h": 17 + "w": 15, + "h": 23 } }, { - "filename": "440_2", + "filename": "461_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2706,104 +2748,20 @@ "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, + "x": 10, + "y": 6, "w": 19, - "h": 20 + "h": 22 }, "frame": { - "x": 87, - "y": 511, + "x": 50, + "y": 493, "w": 19, - "h": 20 + "h": 22 } }, { - "filename": "427_3", + "filename": "422-west_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2812,36 +2770,15 @@ }, "spriteSourceSize": { "x": 12, - "y": 6, - "w": 18, - "h": 22 + "y": 8, + "w": 17, + "h": 20 }, "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 + "y": 513, + "w": 17, + "h": 20 } }, { @@ -2859,14 +2796,35 @@ "h": 22 }, "frame": { - "x": 47, - "y": 535, + "x": 50, + "y": 515, "w": 19, "h": 22 } }, { - "filename": "494_2", + "filename": "412-trash_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 69, + "y": 511, + "w": 16, + "h": 23 + } + }, + { + "filename": "422-east_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -2875,15 +2833,15 @@ }, "spriteSourceSize": { "x": 11, - "y": 6, - "w": 18, - "h": 22 + "y": 8, + "w": 19, + "h": 20 }, "frame": { - "x": 66, - "y": 529, - "w": 18, - "h": 22 + "x": 50, + "y": 537, + "w": 19, + "h": 20 } }, { @@ -2901,8 +2859,8 @@ "h": 20 }, "frame": { - "x": 84, - "y": 531, + "x": 50, + "y": 557, "w": 19, "h": 20 } @@ -2922,14 +2880,14 @@ "h": 20 }, "frame": { - "x": 103, - "y": 533, + "x": 50, + "y": 577, "w": 19, "h": 20 } }, { - "filename": "494_3", + "filename": "412-sandy_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2937,16 +2895,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 + "x": 13, + "y": 5, + "w": 15, + "h": 23 }, "frame": { - "x": 49, - "y": 557, - "w": 18, - "h": 22 + "x": 69, + "y": 534, + "w": 15, + "h": 23 } }, { @@ -2964,14 +2922,14 @@ "h": 19 }, "frame": { - "x": 67, - "y": 551, + "x": 50, + "y": 597, "w": 19, "h": 19 } }, { - "filename": "422-west_2", + "filename": "425_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2979,16 +2937,58 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 + "x": 13, + "y": 7, + "w": 15, + "h": 22 }, "frame": { - "x": 86, - "y": 551, - "w": 17, - "h": 20 + "x": 69, + "y": 557, + "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": 69, + "y": 579, + "w": 15, + "h": 22 + } + }, + { + "filename": "458_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 20, + "h": 17 + }, + "frame": { + "x": 85, + "y": 517, + "w": 20, + "h": 17 } }, { @@ -3006,7 +3006,28 @@ "h": 19 }, "frame": { - "x": 103, + "x": 84, + "y": 534, + "w": 19, + "h": 19 + } + }, + { + "filename": "443_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 19 + }, + "frame": { + "x": 84, "y": 553, "w": 19, "h": 19 @@ -3027,14 +3048,14 @@ "h": 22 }, "frame": { - "x": 51, - "y": 579, + "x": 84, + "y": 572, "w": 16, "h": 22 } }, { - "filename": "443_3", + "filename": "458_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -3042,79 +3063,16 @@ "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, + "x": 10, "y": 10, - "w": 18, - "h": 18 + "w": 20, + "h": 17 }, "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 + "y": 534, + "w": 20, + "h": 17 } }, { @@ -3132,14 +3090,35 @@ "h": 16 }, "frame": { - "x": 85, - "y": 591, + "x": 103, + "y": 551, "w": 20, "h": 16 } }, { - "filename": "447_3", + "filename": "399_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 103, + "y": 567, + "w": 20, + "h": 16 + } + }, + { + "filename": "448_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -3148,36 +3127,15 @@ }, "spriteSourceSize": { "x": 12, - "y": 10, - "w": 18, - "h": 18 + "y": 7, + "w": 16, + "h": 21 }, "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, + "x": 69, "y": 601, - "w": 13, - "h": 16 + "w": 16, + "h": 21 } }, { @@ -3195,8 +3153,8 @@ "h": 22 }, "frame": { - "x": 52, - "y": 617, + "x": 85, + "y": 594, "w": 16, "h": 22 } @@ -3216,8 +3174,8 @@ "h": 21 }, "frame": { - "x": 52, - "y": 639, + "x": 101, + "y": 583, "w": 16, "h": 21 } @@ -3237,14 +3195,14 @@ "h": 21 }, "frame": { - "x": 68, - "y": 607, + "x": 101, + "y": 604, "w": 16, "h": 21 } }, { - "filename": "458_2", + "filename": "492-land_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -3252,37 +3210,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 17 + "x": 12, + "y": 12, + "w": 18, + "h": 16 }, "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 + "x": 50, + "y": 616, + "w": 18, + "h": 16 } }, { @@ -3300,8 +3237,8 @@ "h": 17 }, "frame": { - "x": 68, - "y": 628, + "x": 48, + "y": 632, "w": 17, "h": 17 } @@ -3321,14 +3258,14 @@ "h": 17 }, "frame": { - "x": 85, - "y": 624, + "x": 68, + "y": 622, "w": 17, "h": 17 } }, { - "filename": "399_3", + "filename": "440_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -3336,41 +3273,20 @@ "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 + "x": 13, + "y": 9, + "w": 14, + "h": 19 }, "frame": { "x": 85, - "y": 641, - "w": 18, - "h": 16 + "y": 616, + "w": 14, + "h": 19 } }, { - "filename": "492-land_3", + "filename": "440_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -3378,15 +3294,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 99, + "y": 625, + "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": 85, + "y": 635, + "w": 14, + "h": 19 + } + }, + { + "filename": "436_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, "y": 12, - "w": 18, + "w": 13, "h": 16 }, "frame": { - "x": 103, - "y": 641, - "w": 18, + "x": 65, + "y": 639, + "w": 13, "h": 16 } } @@ -3396,6 +3354,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8d567785b198c5a2f6892242773436c5:1a0706846c40b2345d9ac32977f8c2e5:ebc3f8ec5b2480b298192d752b6e57dc$" + "smartupdate": "$TexturePacker:SmartUpdate:ff9a4f796b02d3e2c7977d3c3d76a7b8:eabe987f61ff488162814a018b9b9c12:ebc3f8ec5b2480b298192d752b6e57dc$" } } diff --git a/public/images/pokemon_icons_4v.png b/public/images/pokemon_icons_4v.png index eaf8d009ca8..9f2a9ac1f19 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..685ce770889 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": 245, + "h": 713 }, "scale": 1, "frames": [ @@ -324,6 +324,27 @@ "h": 27 } }, + { + "filename": "640", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, + "h": 26 + }, + "frame": { + "x": 224, + "y": 0, + "w": 21, + "h": 26 + } + }, { "filename": "644s", "rotated": false, @@ -345,27 +366,6 @@ "h": 27 } }, - { - "filename": "645-incarnate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 224, - "y": 0, - "w": 31, - "h": 26 - } - }, { "filename": "641-incarnate", "rotated": false, @@ -409,7 +409,7 @@ } }, { - "filename": "645s-incarnate", + "filename": "645-incarnate", "rotated": false, "trimmed": true, "sourceSize": { @@ -430,7 +430,7 @@ } }, { - "filename": "646", + "filename": "645s-incarnate", "rotated": false, "trimmed": true, "sourceSize": { @@ -451,7 +451,7 @@ } }, { - "filename": "646s", + "filename": "646", "rotated": false, "trimmed": true, "sourceSize": { @@ -471,6 +471,27 @@ "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": 352, + "w": 31, + "h": 26 + } + }, { "filename": "534", "rotated": false, @@ -487,7 +508,7 @@ }, "frame": { "x": 0, - "y": 352, + "y": 378, "w": 31, "h": 25 } @@ -508,7 +529,7 @@ }, "frame": { "x": 0, - "y": 377, + "y": 403, "w": 31, "h": 25 } @@ -529,7 +550,7 @@ }, "frame": { "x": 0, - "y": 402, + "y": 428, "w": 30, "h": 25 } @@ -550,7 +571,7 @@ }, "frame": { "x": 0, - "y": 427, + "y": 453, "w": 30, "h": 25 } @@ -571,7 +592,7 @@ }, "frame": { "x": 0, - "y": 452, + "y": 478, "w": 30, "h": 25 } @@ -592,7 +613,7 @@ }, "frame": { "x": 0, - "y": 477, + "y": 503, "w": 30, "h": 25 } @@ -613,7 +634,7 @@ }, "frame": { "x": 0, - "y": 502, + "y": 528, "w": 27, "h": 28 } @@ -634,7 +655,7 @@ }, "frame": { "x": 0, - "y": 530, + "y": 556, "w": 27, "h": 28 } @@ -655,7 +676,7 @@ }, "frame": { "x": 0, - "y": 558, + "y": 584, "w": 28, "h": 25 } @@ -676,7 +697,7 @@ }, "frame": { "x": 0, - "y": 583, + "y": 609, "w": 28, "h": 25 } @@ -697,7 +718,7 @@ }, "frame": { "x": 0, - "y": 608, + "y": 634, "w": 29, "h": 25 } @@ -718,13 +739,13 @@ }, "frame": { "x": 0, - "y": 633, + "y": 659, "w": 29, "h": 25 } }, { - "filename": "503", + "filename": "635", "rotated": false, "trimmed": true, "sourceSize": { @@ -732,20 +753,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 31, - "h": 23 + "x": 6, + "y": 3, + "w": 29, + "h": 25 }, "frame": { "x": 0, - "y": 658, - "w": 31, - "h": 23 + "y": 684, + "w": 29, + "h": 25 } }, { - "filename": "503s", + "filename": "640s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, + "h": 26 + }, + "frame": { + "x": 224, + "y": 26, + "w": 21, + "h": 26 + } + }, + { + "filename": "503", "rotated": false, "trimmed": true, "sourceSize": { @@ -766,7 +808,7 @@ } }, { - "filename": "569", + "filename": "503s", "rotated": false, "trimmed": true, "sourceSize": { @@ -775,36 +817,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, - "w": 30, - "h": 22 + "y": 5, + "w": 31, + "h": 23 }, "frame": { "x": 33, "y": 81, - "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 + "w": 31, + "h": 23 } }, { @@ -823,11 +844,32 @@ }, "frame": { "x": 32, - "y": 128, + "y": 104, "w": 29, "h": 25 } }, + { + "filename": "609", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 29, + "h": 23 + }, + "frame": { + "x": 32, + "y": 129, + "w": 29, + "h": 23 + } + }, { "filename": "530", "rotated": false, @@ -844,11 +886,32 @@ }, "frame": { "x": 32, - "y": 153, + "y": 152, "w": 29, "h": 22 } }, + { + "filename": "569", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 30, + "y": 174, + "w": 30, + "h": 22 + } + }, { "filename": "569s", "rotated": false, @@ -865,7 +928,7 @@ }, "frame": { "x": 30, - "y": 175, + "y": 196, "w": 30, "h": 22 } @@ -886,7 +949,7 @@ }, "frame": { "x": 30, - "y": 197, + "y": 218, "w": 30, "h": 22 } @@ -907,53 +970,11 @@ }, "frame": { "x": 30, - "y": 219, + "y": 240, "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, @@ -970,7 +991,7 @@ }, "frame": { "x": 31, - "y": 286, + "y": 262, "w": 29, "h": 23 } @@ -991,7 +1012,7 @@ }, "frame": { "x": 31, - "y": 309, + "y": 285, "w": 29, "h": 22 } @@ -1012,7 +1033,7 @@ }, "frame": { "x": 31, - "y": 331, + "y": 307, "w": 27, "h": 24 } @@ -1033,11 +1054,53 @@ }, "frame": { "x": 31, - "y": 355, + "y": 331, "w": 27, "h": 24 } }, + { + "filename": "623", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 31, + "y": 355, + "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": 31, + "y": 380, + "w": 26, + "h": 25 + } + }, { "filename": "508", "rotated": false, @@ -1054,7 +1117,7 @@ }, "frame": { "x": 31, - "y": 379, + "y": 405, "w": 27, "h": 23 } @@ -1075,7 +1138,7 @@ }, "frame": { "x": 30, - "y": 402, + "y": 428, "w": 28, "h": 23 } @@ -1096,7 +1159,7 @@ }, "frame": { "x": 30, - "y": 425, + "y": 451, "w": 28, "h": 23 } @@ -1117,7 +1180,7 @@ }, "frame": { "x": 30, - "y": 448, + "y": 474, "w": 28, "h": 23 } @@ -1138,7 +1201,7 @@ }, "frame": { "x": 30, - "y": 471, + "y": 497, "w": 28, "h": 23 } @@ -1159,13 +1222,13 @@ }, "frame": { "x": 30, - "y": 494, + "y": 520, "w": 28, "h": 22 } }, { - "filename": "598s", + "filename": "598", "rotated": false, "trimmed": true, "sourceSize": { @@ -1180,7 +1243,7 @@ }, "frame": { "x": 27, - "y": 516, + "y": 542, "w": 30, "h": 22 } @@ -1201,13 +1264,13 @@ }, "frame": { "x": 27, - "y": 538, + "y": 564, "w": 29, "h": 20 } }, { - "filename": "623", + "filename": "497s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1216,19 +1279,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 3, - "w": 26, - "h": 25 + "y": 6, + "w": 28, + "h": 22 }, "frame": { "x": 28, - "y": 558, - "w": 26, - "h": 25 + "y": 584, + "w": 28, + "h": 22 } }, { - "filename": "623s", + "filename": "508s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1236,16 +1299,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 26, - "h": 25 + "x": 7, + "y": 5, + "w": 27, + "h": 23 }, "frame": { "x": 28, - "y": 583, - "w": 26, - "h": 25 + "y": 606, + "w": 27, + "h": 23 } }, { @@ -1264,7 +1327,7 @@ }, "frame": { "x": 29, - "y": 608, + "y": 629, "w": 25, "h": 25 } @@ -1285,13 +1348,13 @@ }, "frame": { "x": 29, - "y": 633, + "y": 654, "w": 25, "h": 25 } }, { - "filename": "508s", + "filename": "586-autumn", "rotated": false, "trimmed": true, "sourceSize": { @@ -1300,15 +1363,15 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, - "w": 27, - "h": 23 + "y": 3, + "w": 25, + "h": 25 }, "frame": { - "x": 31, - "y": 658, - "w": 27, - "h": 23 + "x": 29, + "y": 679, + "w": 25, + "h": 25 } }, { @@ -1354,7 +1417,7 @@ } }, { - "filename": "604", + "filename": "598s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1375,7 +1438,7 @@ } }, { - "filename": "604s", + "filename": "604", "rotated": false, "trimmed": true, "sourceSize": { @@ -1396,7 +1459,7 @@ } }, { - "filename": "647-resolute", + "filename": "604s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1405,7 +1468,7 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 7, "w": 30, "h": 22 }, @@ -1417,7 +1480,7 @@ } }, { - "filename": "647s-resolute", + "filename": "647-resolute", "rotated": false, "trimmed": true, "sourceSize": { @@ -1437,6 +1500,27 @@ "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": 101, + "y": 49, + "w": 30, + "h": 22 + } + }, { "filename": "545", "rotated": false, @@ -1452,7 +1536,7 @@ "h": 22 }, "frame": { - "x": 101, + "x": 131, "y": 49, "w": 29, "h": 22 @@ -1473,7 +1557,7 @@ "h": 22 }, "frame": { - "x": 130, + "x": 160, "y": 49, "w": 29, "h": 22 @@ -1494,12 +1578,33 @@ "h": 22 }, "frame": { - "x": 159, + "x": 189, "y": 49, "w": 29, "h": 22 } }, + { + "filename": "523", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 27, + "h": 23 + }, + "frame": { + "x": 218, + "y": 52, + "w": 27, + "h": 23 + } + }, { "filename": "571s", "rotated": false, @@ -1515,35 +1620,14 @@ "h": 22 }, "frame": { - "x": 188, - "y": 49, + "x": 99, + "y": 71, "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", + "filename": "593", "rotated": false, "trimmed": true, "sourceSize": { @@ -1564,7 +1648,7 @@ } }, { - "filename": "593", + "filename": "593s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1585,7 +1669,7 @@ } }, { - "filename": "593s", + "filename": "596", "rotated": false, "trimmed": true, "sourceSize": { @@ -1605,6 +1689,27 @@ "h": 22 } }, + { + "filename": "639s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 29, + "h": 20 + }, + "frame": { + "x": 212, + "y": 75, + "w": 29, + "h": 20 + } + }, { "filename": "537", "rotated": false, @@ -1621,7 +1726,7 @@ }, "frame": { "x": 98, - "y": 91, + "y": 93, "w": 28, "h": 21 } @@ -1648,7 +1753,7 @@ } }, { - "filename": "596", + "filename": "596s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1669,7 +1774,7 @@ } }, { - "filename": "596s", + "filename": "523s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1677,16 +1782,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 + "x": 7, + "y": 5, + "w": 27, + "h": 23 }, "frame": { "x": 182, "y": 93, - "w": 28, - "h": 22 + "w": 27, + "h": 23 } }, { @@ -1704,8 +1809,8 @@ "h": 20 }, "frame": { - "x": 224, - "y": 26, + "x": 209, + "y": 95, "w": 28, "h": 20 } @@ -1725,75 +1830,12 @@ "h": 20 }, "frame": { - "x": 222, - "y": 46, + "x": 64, + "y": 98, "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 58, - "y": 383, - "w": 25, - "h": 25 - } - }, { "filename": "586s-autumn", "rotated": false, @@ -1809,8 +1851,8 @@ "h": 25 }, "frame": { - "x": 58, - "y": 408, + "x": 61, + "y": 118, "w": 25, "h": 25 } @@ -1830,29 +1872,8 @@ "h": 24 }, "frame": { - "x": 58, - "y": 433, - "w": 26, - "h": 24 - } - }, - { - "filename": "612s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 58, - "y": 457, + "x": 61, + "y": 143, "w": 26, "h": 24 } @@ -1872,12 +1893,33 @@ "h": 23 }, "frame": { - "x": 58, - "y": 481, + "x": 61, + "y": 167, "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": 60, + "y": 190, + "w": 26, + "h": 24 + } + }, { "filename": "510s", "rotated": false, @@ -1893,138 +1935,12 @@ "h": 23 }, "frame": { - "x": 58, - "y": 504, + "x": 60, + "y": 214, "w": 26, "h": 23 } }, - { - "filename": "523", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 57, - "y": 527, - "w": 27, - "h": 23 - } - }, - { - "filename": "631", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 56, - "y": 550, - "w": 28, - "h": 20 - } - }, - { - "filename": "523s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 54, - "y": 570, - "w": 27, - "h": 23 - } - }, - { - "filename": "621", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 54, - "y": 593, - "w": 27, - "h": 23 - } - }, - { - "filename": "621s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 54, - "y": 616, - "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 +1956,12 @@ "h": 23 }, "frame": { - "x": 58, - "y": 658, + "x": 60, + "y": 237, "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, @@ -2146,13 +1978,13 @@ }, "frame": { "x": 60, - "y": 175, + "y": 260, "w": 26, "h": 23 } }, { - "filename": "514", + "filename": "621", "rotated": false, "trimmed": true, "sourceSize": { @@ -2160,20 +1992,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 + "x": 6, + "y": 5, + "w": 27, + "h": 23 }, "frame": { "x": 60, - "y": 198, - "w": 26, - "h": 22 + "y": 283, + "w": 27, + "h": 23 } }, { - "filename": "514s", + "filename": "638", "rotated": false, "trimmed": true, "sourceSize": { @@ -2181,16 +2013,79 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 + "x": 10, + "y": 3, + "w": 20, + "h": 25 }, "frame": { - "x": 60, - "y": 220, - "w": 26, - "h": 22 + "x": 86, + "y": 118, + "w": 20, + "h": 25 + } + }, + { + "filename": "621s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 27, + "h": 23 + }, + "frame": { + "x": 106, + "y": 114, + "w": 27, + "h": 23 + } + }, + { + "filename": "531-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 87, + "y": 143, + "w": 22, + "h": 26 + } + }, + { + "filename": "561", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 133, + "y": 114, + "w": 21, + "h": 23 } }, { @@ -2208,8 +2103,8 @@ "h": 22 }, "frame": { - "x": 60, - "y": 242, + "x": 154, + "y": 115, "w": 27, "h": 22 } @@ -2229,119 +2124,14 @@ "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 - } - }, - { - "filename": "556s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 60, - "y": 308, - "w": 23, - "h": 23 - } - }, - { - "filename": "631s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 98, - "y": 112, - "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, + "x": 181, "y": 116, - "w": 16, + "w": 27, "h": 22 } }, { - "filename": "567", + "filename": "499", "rotated": false, "trimmed": true, "sourceSize": { @@ -2349,20 +2139,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, + "x": 10, "y": 7, - "w": 26, + "w": 23, "h": 21 }, "frame": { - "x": 153, - "y": 115, - "w": 26, + "x": 87, + "y": 169, + "w": 23, "h": 21 } }, { - "filename": "567s", + "filename": "531s-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -2370,78 +2160,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 179, - "y": 115, - "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, + "x": 10, "y": 2, - "w": 21, + "w": 22, "h": 26 }, "frame": { "x": 86, - "y": 175, - "w": 21, + "y": 190, + "w": 22, "h": 26 } }, @@ -2461,13 +2188,13 @@ }, "frame": { "x": 86, - "y": 201, + "y": 216, "w": 23, "h": 24 } }, { - "filename": "528", + "filename": "586-summer", "rotated": false, "trimmed": true, "sourceSize": { @@ -2475,20 +2202,104 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 8, + "x": 8, + "y": 4, "w": 23, - "h": 20 + "h": 24 }, "frame": { - "x": 100, - "y": 132, + "x": 86, + "y": 240, "w": 23, - "h": 20 + "h": 24 } }, { - "filename": "521", + "filename": "532", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 24, + "h": 19 + }, + "frame": { + "x": 86, + "y": 264, + "w": 24, + "h": 19 + } + }, + { + "filename": "556", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 87, + "y": 283, + "w": 23, + "h": 23 + } + }, + { + "filename": "514", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 109, + "y": 137, + "w": 26, + "h": 22 + } + }, + { + "filename": "514s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 135, + "y": 137, + "w": 26, + "h": 22 + } + }, + { + "filename": "505", "rotated": false, "trimmed": true, "sourceSize": { @@ -2497,19 +2308,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 5, + "y": 6, "w": 20, - "h": 23 + "h": 22 }, "frame": { - "x": 103, - "y": 152, + "x": 161, + "y": 137, "w": 20, - "h": 23 + "h": 22 } }, { - "filename": "634s", + "filename": "567", "rotated": false, "trimmed": true, "sourceSize": { @@ -2517,16 +2328,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, + "x": 8, + "y": 7, "w": 26, - "h": 22 + "h": 21 }, "frame": { - "x": 123, - "y": 133, + "x": 181, + "y": 138, "w": 26, - "h": 22 + "h": 21 + } + }, + { + "filename": "631", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 110, + "y": 159, + "w": 28, + "h": 20 + } + }, + { + "filename": "631s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 138, + "y": 159, + "w": 28, + "h": 20 + } + }, + { + "filename": "567s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 166, + "y": 159, + "w": 26, + "h": 21 + } + }, + { + "filename": "600", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 27, + "h": 19 + }, + "frame": { + "x": 110, + "y": 179, + "w": 27, + "h": 19 + } + }, + { + "filename": "600s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 27, + "h": 19 + }, + "frame": { + "x": 137, + "y": 179, + "w": 27, + "h": 19 } }, { @@ -2544,14 +2460,14 @@ "h": 21 }, "frame": { - "x": 123, - "y": 155, + "x": 164, + "y": 180, "w": 26, "h": 21 } }, { - "filename": "637", + "filename": "568", "rotated": false, "trimmed": true, "sourceSize": { @@ -2559,20 +2475,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 + "x": 9, + "y": 10, + "w": 21, + "h": 18 }, "frame": { - "x": 149, - "y": 136, - "w": 26, - "h": 22 + "x": 108, + "y": 198, + "w": 21, + "h": 18 } }, { - "filename": "637s", + "filename": "638s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 109, + "y": 216, + "w": 20, + "h": 25 + } + }, + { + "filename": "634", "rotated": false, "trimmed": true, "sourceSize": { @@ -2586,8 +2523,8 @@ "h": 22 }, "frame": { - "x": 175, - "y": 136, + "x": 129, + "y": 198, "w": 26, "h": 22 } @@ -2607,14 +2544,14 @@ "h": 21 }, "frame": { - "x": 149, - "y": 158, + "x": 129, + "y": 220, "w": 26, "h": 21 } }, { - "filename": "552", + "filename": "634s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2622,100 +2559,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 + "x": 7, + "y": 6, + "w": 26, + "h": 22 }, "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 + "x": 109, + "y": 241, + "w": 26, + "h": 22 } }, { @@ -2733,35 +2586,14 @@ "h": 22 }, "frame": { - "x": 83, - "y": 308, + "x": 110, + "y": 263, "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", + "filename": "552", "rotated": false, "trimmed": true, "sourceSize": { @@ -2775,180 +2607,12 @@ "h": 21 }, "frame": { - "x": 123, - "y": 176, + "x": 110, + "y": 285, "w": 25, "h": 21 } }, - { - "filename": "565s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 109, - "y": 197, - "w": 25, - "h": 22 - } - }, - { - "filename": "611", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 148, - "y": 179, - "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": 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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 107, - "y": 238, - "w": 23, - "h": 24 - } - }, { "filename": "586-winter", "rotated": false, @@ -2964,222 +2628,12 @@ "h": 24 }, "frame": { - "x": 109, - "y": 262, + "x": 135, + "y": 241, "w": 23, "h": 24 } }, - { - "filename": "518", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 109, - "y": 286, - "w": 23, - "h": 22 - } - }, - { - "filename": "647-ordinary", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 108, - "y": 308, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 173, - "y": 222, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 148, - "y": 241, - "w": 24, - "h": 21 - } - }, - { - "filename": "516s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 172, - "y": 244, - "w": 24, - "h": 21 - } - }, - { - "filename": "648-pirouette", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 132, - "y": 261, - "w": 15, - "h": 23 - } - }, - { - "filename": "518s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 147, - "y": 262, - "w": 23, - "h": 22 - } - }, { "filename": "586s-spring", "rotated": false, @@ -3195,14 +2649,56 @@ "h": 24 }, "frame": { - "x": 132, - "y": 284, + "x": 135, + "y": 265, "w": 23, "h": 24 } }, { - "filename": "531", + "filename": "499s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 135, + "y": 289, + "w": 23, + "h": 21 + } + }, + { + "filename": "637", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 155, + "y": 201, + "w": 26, + "h": 22 + } + }, + { + "filename": "568s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3211,78 +2707,15 @@ }, "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 + "y": 10, + "w": 21, + "h": 18 }, "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 + "y": 223, + "w": 21, + "h": 18 } }, { @@ -3300,8 +2733,8 @@ "h": 24 }, "frame": { - "x": 155, - "y": 307, + "x": 158, + "y": 241, "w": 23, "h": 24 } @@ -3321,14 +2754,98 @@ "h": 24 }, "frame": { - "x": 178, - "y": 307, + "x": 158, + "y": 265, "w": 23, "h": 24 } }, { - "filename": "638s", + "filename": "516", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 158, + "y": 289, + "w": 24, + "h": 21 + } + }, + { + "filename": "494", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 192, + "y": 159, + "w": 18, + "h": 22 + } + }, + { + "filename": "496", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 190, + "y": 181, + "w": 22, + "h": 20 + } + }, + { + "filename": "637s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 181, + "y": 201, + "w": 26, + "h": 22 + } + }, + { + "filename": "504", "rotated": false, "trimmed": true, "sourceSize": { @@ -3337,15 +2854,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 3, + "y": 10, "w": 20, - "h": 25 + "h": 18 }, "frame": { - "x": 81, - "y": 570, + "x": 176, + "y": 223, "w": 20, - "h": 25 + "h": 18 } }, { @@ -3363,8 +2880,8 @@ "h": 24 }, "frame": { - "x": 81, - "y": 595, + "x": 181, + "y": 241, "w": 23, "h": 24 } @@ -3384,14 +2901,161 @@ "h": 24 }, "frame": { - "x": 81, - "y": 619, + "x": 181, + "y": 265, "w": 23, "h": 24 } }, { - "filename": "564", + "filename": "516s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 182, + "y": 289, + "w": 24, + "h": 21 + } + }, + { + "filename": "498", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 196, + "y": 223, + "w": 18, + "h": 18 + } + }, + { + "filename": "494s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 207, + "y": 201, + "w": 18, + "h": 22 + } + }, + { + "filename": "521", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 225, + "y": 115, + "w": 20, + "h": 23 + } + }, + { + "filename": "522", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 208, + "y": 116, + "w": 17, + "h": 22 + } + }, + { + "filename": "552s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 207, + "y": 138, + "w": 25, + "h": 21 + } + }, + { + "filename": "594", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 6, + "w": 13, + "h": 22 + }, + "frame": { + "x": 232, + "y": 138, + "w": 13, + "h": 22 + } + }, + { + "filename": "531", "rotated": false, "trimmed": true, "sourceSize": { @@ -3400,19 +3064,103 @@ }, "spriteSourceSize": { "x": 9, - "y": 13, - "w": 23, - "h": 15 + "y": 6, + "w": 22, + "h": 22 }, "frame": { - "x": 81, - "y": 643, - "w": 23, - "h": 15 + "x": 210, + "y": 159, + "w": 22, + "h": 22 } }, { - "filename": "561", + "filename": "594s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 6, + "w": 13, + "h": 22 + }, + "frame": { + "x": 232, + "y": 160, + "w": 13, + "h": 22 + } + }, + { + "filename": "513", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 212, + "y": 181, + "w": 20, + "h": 20 + } + }, + { + "filename": "521s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 225, + "y": 201, + "w": 20, + "h": 23 + } + }, + { + "filename": "605", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 232, + "y": 182, + "w": 13, + "h": 19 + } + }, + { + "filename": "625", "rotated": false, "trimmed": true, "sourceSize": { @@ -3422,18 +3170,123 @@ "spriteSourceSize": { "x": 9, "y": 5, - "w": 21, + "w": 22, + "h": 24 + }, + "frame": { + "x": 204, + "y": 241, + "w": 22, + "h": 24 + } + }, + { + "filename": "502", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 19, "h": 23 }, "frame": { - "x": 84, - "y": 658, - "w": 21, + "x": 226, + "y": 224, + "w": 19, "h": 23 } }, { - "filename": "505", + "filename": "502s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 19, + "h": 23 + }, + "frame": { + "x": 226, + "y": 247, + "w": 19, + "h": 23 + } + }, + { + "filename": "625s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 204, + "y": 265, + "w": 22, + "h": 24 + } + }, + { + "filename": "520", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 270, + "w": 19, + "h": 20 + } + }, + { + "filename": "588", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 11, + "w": 12, + "h": 17 + }, + "frame": { + "x": 214, + "y": 224, + "w": 12, + "h": 17 + } + }, + { + "filename": "505s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3447,14 +3300,77 @@ "h": 22 }, "frame": { - "x": 212, - "y": 71, + "x": 206, + "y": 289, "w": 20, "h": 22 } }, { - "filename": "573", + "filename": "520s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 290, + "w": 19, + "h": 20 + } + }, + { + "filename": "592-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 310, + "w": 19, + "h": 20 + } + }, + { + "filename": "565s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 60, + "y": 306, + "w": 25, + "h": 22 + } + }, + { + "filename": "620", "rotated": false, "trimmed": true, "sourceSize": { @@ -3463,19 +3379,124 @@ }, "spriteSourceSize": { "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 85, + "y": 306, + "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": 110, + "y": 306, + "w": 25, + "h": 22 + } + }, + { + "filename": "647-ordinary", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 58, + "y": 328, + "w": 25, + "h": 22 + } + }, + { + "filename": "647s-ordinary", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 83, + "y": 328, + "w": 25, + "h": 22 + } + }, + { + "filename": "611", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, "y": 7, - "w": 24, + "w": 25, "h": 21 }, "frame": { - "x": 232, - "y": 66, - "w": 24, + "x": 108, + "y": 328, + "w": 25, "h": 21 } }, { - "filename": "573s", + "filename": "611s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 135, + "y": 310, + "w": 25, + "h": 21 + } + }, + { + "filename": "525", "rotated": false, "trimmed": true, "sourceSize": { @@ -3489,8 +3510,8 @@ "h": 21 }, "frame": { - "x": 232, - "y": 87, + "x": 160, + "y": 310, "w": 24, "h": 21 } @@ -3510,14 +3531,14 @@ "h": 22 }, "frame": { - "x": 210, - "y": 93, + "x": 184, + "y": 310, "w": 22, "h": 22 } }, { - "filename": "532", + "filename": "511", "rotated": false, "trimmed": true, "sourceSize": { @@ -3525,20 +3546,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 24, - "h": 19 + "x": 11, + "y": 7, + "w": 20, + "h": 21 }, "frame": { - "x": 232, - "y": 108, - "w": 24, - "h": 19 + "x": 206, + "y": 311, + "w": 20, + "h": 21 } }, { - "filename": "499s", + "filename": "592", "rotated": false, "trimmed": true, "sourceSize": { @@ -3547,122 +3568,143 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 205, - "y": 115, - "w": 23, - "h": 21 - } - }, - { - "filename": "555", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 201, - "y": 136, - "w": 23, - "h": 22 - } - }, - { - "filename": "555s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 200, - "y": 158, - "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, + "w": 19, "h": 20 }, "frame": { - "x": 198, - "y": 228, - "w": 22, + "x": 226, + "y": 330, + "w": 19, "h": 20 } }, + { + "filename": "628", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 25, + "h": 19 + }, + "frame": { + "x": 133, + "y": 331, + "w": 25, + "h": 19 + } + }, + { + "filename": "628s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 25, + "h": 19 + }, + "frame": { + "x": 158, + "y": 331, + "w": 25, + "h": 19 + } + }, + { + "filename": "525s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 183, + "y": 332, + "w": 24, + "h": 21 + } + }, + { + "filename": "592s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 207, + "y": 332, + "w": 19, + "h": 20 + } + }, + { + "filename": "592s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 350, + "w": 19, + "h": 20 + } + }, + { + "filename": "608", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 207, + "y": 352, + "w": 19, + "h": 18 + } + }, { "filename": "532s", "rotated": false, @@ -3678,14 +3720,14 @@ "h": 19 }, "frame": { - "x": 196, - "y": 248, + "x": 58, + "y": 350, "w": 24, "h": 19 } }, { - "filename": "649", + "filename": "556s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3695,18 +3737,18 @@ "spriteSourceSize": { "x": 8, "y": 5, - "w": 22, - "h": 24 + "w": 23, + "h": 23 }, "frame": { - "x": 194, - "y": 267, - "w": 22, - "h": 24 + "x": 57, + "y": 369, + "w": 23, + "h": 23 } }, { - "filename": "544", + "filename": "573", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,16 +3756,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 + "x": 8, + "y": 7, + "w": 24, + "h": 21 }, "frame": { - "x": 194, - "y": 291, - "w": 22, - "h": 16 + "x": 82, + "y": 350, + "w": 24, + "h": 21 + } + }, + { + "filename": "573s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 80, + "y": 371, + "w": 24, + "h": 21 } }, { @@ -3741,75 +3804,12 @@ "h": 24 }, "frame": { - "x": 201, - "y": 307, + "x": 58, + "y": 392, "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, @@ -3825,33 +3825,12 @@ "h": 24 }, "frame": { - "x": 220, - "y": 181, + "x": 58, + "y": 416, "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, @@ -3867,33 +3846,12 @@ "h": 24 }, "frame": { - "x": 220, - "y": 205, + "x": 80, + "y": 392, "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, @@ -3909,98 +3867,14 @@ "h": 24 }, "frame": { - "x": 220, - "y": 229, + "x": 58, + "y": 440, "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", + "filename": "649", "rotated": false, "trimmed": true, "sourceSize": { @@ -4014,117 +3888,12 @@ "h": 24 }, "frame": { - "x": 216, - "y": 275, + "x": 80, + "y": 416, "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 +3909,8 @@ "h": 24 }, "frame": { - "x": 80, - "y": 331, + "x": 58, + "y": 464, "w": 22, "h": 24 } @@ -4162,7 +3931,7 @@ }, "frame": { "x": 80, - "y": 355, + "y": 440, "w": 22, "h": 24 } @@ -4182,8 +3951,8 @@ "h": 24 }, "frame": { - "x": 102, - "y": 330, + "x": 58, + "y": 488, "w": 22, "h": 24 } @@ -4203,12 +3972,180 @@ "h": 24 }, "frame": { - "x": 124, - "y": 330, + "x": 80, + "y": 464, "w": 22, "h": 24 } }, + { + "filename": "649s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 58, + "y": 512, + "w": 22, + "h": 24 + } + }, + { + "filename": "518", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 488, + "w": 23, + "h": 22 + } + }, + { + "filename": "518s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 510, + "w": 23, + "h": 22 + } + }, + { + "filename": "496s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 58, + "y": 536, + "w": 22, + "h": 20 + } + }, + { + "filename": "555", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 532, + "w": 23, + "h": 22 + } + }, + { + "filename": "528", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 57, + "y": 556, + "w": 23, + "h": 20 + } + }, + { + "filename": "555s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 554, + "w": 23, + "h": 22 + } + }, + { + "filename": "614", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 56, + "y": 576, + "w": 23, + "h": 22 + } + }, { "filename": "614s", "rotated": false, @@ -4224,14 +4161,35 @@ "h": 22 }, "frame": { - "x": 102, - "y": 354, + "x": 79, + "y": 576, "w": 23, "h": 22 } }, { - "filename": "507", + "filename": "632", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 56, + "y": 598, + "w": 24, + "h": 16 + } + }, + { + "filename": "528s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4240,59 +4198,59 @@ }, "spriteSourceSize": { "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 80, + "y": 598, + "w": 23, + "h": 20 + } + }, + { + "filename": "632s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 55, + "y": 614, + "w": 24, + "h": 16 + } + }, + { + "filename": "539", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 6, - "w": 21, + "w": 22, "h": 22 }, "frame": { - "x": 125, - "y": 354, - "w": 21, + "x": 54, + "y": 630, + "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 83, - "y": 402, - "w": 21, - "h": 23 - } - }, { "filename": "539s", "rotated": false, @@ -4308,12 +4266,96 @@ "h": 22 }, "frame": { - "x": 103, - "y": 376, + "x": 54, + "y": 652, "w": 22, "h": 22 } }, + { + "filename": "561s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 54, + "y": 674, + "w": 21, + "h": 23 + } + }, + { + "filename": "544", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 54, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "564", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 13, + "w": 23, + "h": 15 + }, + "frame": { + "x": 79, + "y": 618, + "w": 23, + "h": 15 + } + }, + { + "filename": "507", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 76, + "y": 633, + "w": 21, + "h": 22 + } + }, { "filename": "507s", "rotated": false, @@ -4329,12 +4371,159 @@ "h": 22 }, "frame": { - "x": 125, - "y": 376, + "x": 76, + "y": 655, "w": 21, "h": 22 } }, + { + "filename": "575", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 75, + "y": 677, + "w": 22, + "h": 20 + } + }, + { + "filename": "544s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 76, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "648-pirouette", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 97, + "y": 633, + "w": 15, + "h": 23 + } + }, + { + "filename": "648s-pirouette", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 97, + "y": 656, + "w": 15, + "h": 23 + } + }, + { + "filename": "498s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 97, + "y": 679, + "w": 18, + "h": 18 + } + }, + { + "filename": "551", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 22, + "h": 16 + }, + "frame": { + "x": 98, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "527", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 102, + "y": 618, + "w": 20, + "h": 15 + } + }, { "filename": "509", "rotated": false, @@ -4350,8 +4539,8 @@ "h": 22 }, "frame": { - "x": 104, - "y": 398, + "x": 112, + "y": 633, "w": 21, "h": 22 } @@ -4371,14 +4560,14 @@ "h": 22 }, "frame": { - "x": 125, - "y": 398, + "x": 112, + "y": 655, "w": 21, "h": 22 } }, { - "filename": "505s", + "filename": "513s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4386,20 +4575,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 6, + "x": 11, + "y": 8, "w": 20, - "h": 22 + "h": 20 }, "frame": { - "x": 84, - "y": 425, + "x": 115, + "y": 677, "w": 20, - "h": 22 + "h": 20 } }, { - "filename": "528s", + "filename": "551s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4407,16 +4596,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 + "x": 8, + "y": 13, + "w": 22, + "h": 16 }, "frame": { - "x": 104, - "y": 420, - "w": 23, - "h": 20 + "x": 120, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "522s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 102, + "y": 392, + "w": 17, + "h": 22 } }, { @@ -4434,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 84, - "y": 447, + "x": 102, + "y": 414, "w": 21, "h": 22 } @@ -4455,8 +4665,8 @@ "h": 22 }, "frame": { - "x": 84, - "y": 469, + "x": 102, + "y": 436, "w": 21, "h": 22 } @@ -4476,12 +4686,33 @@ "h": 21 }, "frame": { - "x": 84, - "y": 491, + "x": 102, + "y": 458, "w": 21, "h": 21 } }, + { + "filename": "511s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 104, + "y": 371, + "w": 20, + "h": 21 + } + }, { "filename": "515s", "rotated": false, @@ -4497,138 +4728,12 @@ "h": 21 }, "frame": { - "x": 84, - "y": 512, + "x": 106, + "y": 350, "w": 21, "h": 21 } }, - { - "filename": "576", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 84, - "y": 533, - "w": 20, - "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", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 105, - "y": 440, - "w": 22, - "h": 20 - } - }, - { - "filename": "575s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 105, - "y": 460, - "w": 22, - "h": 20 - } - }, - { - "filename": "576s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 127, - "y": 441, - "w": 20, - "h": 22 - } - }, { "filename": "587", "rotated": false, @@ -4644,8 +4749,8 @@ "h": 20 }, "frame": { - "x": 105, - "y": 480, + "x": 127, + "y": 350, "w": 23, "h": 20 } @@ -4665,14 +4770,14 @@ "h": 20 }, "frame": { - "x": 105, - "y": 500, + "x": 150, + "y": 350, "w": 23, "h": 20 } }, { - "filename": "495", + "filename": "576", "rotated": false, "trimmed": true, "sourceSize": { @@ -4681,15 +4786,36 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, + "y": 6, "w": 20, - "h": 17 + "h": 22 }, "frame": { - "x": 127, - "y": 463, + "x": 103, + "y": 479, "w": 20, - "h": 17 + "h": 22 + } + }, + { + "filename": "576s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 103, + "y": 501, + "w": 20, + "h": 22 } }, { @@ -4707,180 +4833,12 @@ "h": 22 }, "frame": { - "x": 128, - "y": 480, + "x": 103, + "y": 523, "w": 20, "h": 22 } }, - { - "filename": "504", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 128, - "y": 502, - "w": 20, - "h": 18 - } - }, - { - "filename": "564s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 13, - "w": 23, - "h": 15 - }, - "frame": { - "x": 105, - "y": 520, - "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", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 101, - "y": 575, - "w": 20, - "h": 20 - } - }, - { - "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, @@ -4896,14 +4854,14 @@ "h": 22 }, "frame": { - "x": 105, - "y": 658, + "x": 103, + "y": 545, "w": 20, "h": 22 } }, { - "filename": "495s", + "filename": "585-autumn", "rotated": false, "trimmed": true, "sourceSize": { @@ -4912,99 +4870,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 20, - "h": 17 + "y": 6, + "w": 18, + "h": 22 }, "frame": { - "x": 128, - "y": 520, - "w": 20, - "h": 17 - } - }, - { - "filename": "511s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 127, - "y": 537, - "w": 20, - "h": 21 - } - }, - { - "filename": "504s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 127, - "y": 558, - "w": 20, - "h": 18 - } - }, - { - "filename": "560", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 121, - "y": 576, - "w": 20, - "h": 21 - } - }, - { - "filename": "560s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 121, - "y": 597, - "w": 20, - "h": 21 + "x": 119, + "y": 392, + "w": 18, + "h": 22 } }, { @@ -5022,14 +4896,14 @@ "h": 21 }, "frame": { - "x": 121, - "y": 618, + "x": 124, + "y": 371, "w": 18, "h": 21 } }, { - "filename": "513s", + "filename": "617", "rotated": false, "trimmed": true, "sourceSize": { @@ -5037,18 +4911,81 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 9, "y": 8, - "w": 20, + "w": 23, "h": 20 }, "frame": { - "x": 126, - "y": 639, - "w": 20, + "x": 142, + "y": 370, + "w": 23, "h": 20 } }, + { + "filename": "585-spring", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 123, + "y": 414, + "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": 123, + "y": 436, + "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": 123, + "y": 458, + "w": 18, + "h": 22 + } + }, { "filename": "585s-autumn", "rotated": false, @@ -5064,8 +5001,8 @@ "h": 22 }, "frame": { - "x": 125, - "y": 659, + "x": 123, + "y": 480, "w": 18, "h": 22 } @@ -5085,12 +5022,432 @@ "h": 22 }, "frame": { - "x": 143, - "y": 659, + "x": 123, + "y": 502, "w": 18, "h": 22 } }, + { + "filename": "585s-summer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 123, + "y": 524, + "w": 18, + "h": 22 + } + }, + { + "filename": "521s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 18, + "h": 21 + }, + "frame": { + "x": 123, + "y": 546, + "w": 18, + "h": 21 + } + }, + { + "filename": "564s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 13, + "w": 23, + "h": 15 + }, + "frame": { + "x": 103, + "y": 567, + "w": 23, + "h": 15 + } + }, + { + "filename": "562", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 102, + "y": 582, + "w": 22, + "h": 16 + } + }, + { + "filename": "575s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 103, + "y": 598, + "w": 22, + "h": 20 + } + }, + { + "filename": "585s-winter", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 137, + "y": 392, + "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": 141, + "y": 414, + "w": 15, + "h": 22 + } + }, + { + "filename": "606s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 141, + "y": 436, + "w": 15, + "h": 22 + } + }, + { + "filename": "630", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 141, + "y": 458, + "w": 16, + "h": 22 + } + }, + { + "filename": "630s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 141, + "y": 480, + "w": 16, + "h": 22 + } + }, + { + "filename": "549", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 141, + "y": 502, + "w": 17, + "h": 21 + } + }, + { + "filename": "549s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 141, + "y": 523, + "w": 17, + "h": 21 + } + }, + { + "filename": "560", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 141, + "y": 544, + "w": 20, + "h": 21 + } + }, + { + "filename": "495", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 20, + "h": 17 + }, + "frame": { + "x": 126, + "y": 567, + "w": 20, + "h": 17 + } + }, + { + "filename": "546", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 124, + "y": 584, + "w": 21, + "h": 14 + } + }, + { + "filename": "560s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 125, + "y": 598, + "w": 20, + "h": 21 + } + }, + { + "filename": "546s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 122, + "y": 619, + "w": 21, + "h": 14 + } + }, + { + "filename": "572", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 146, + "y": 565, + "w": 22, + "h": 19 + } + }, + { + "filename": "617s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 145, + "y": 584, + "w": 23, + "h": 20 + } + }, + { + "filename": "562s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 145, + "y": 604, + "w": 22, + "h": 16 + } + }, { "filename": "572s", "rotated": false, @@ -5106,8 +5463,8 @@ "h": 19 }, "frame": { - "x": 146, - "y": 331, + "x": 143, + "y": 620, "w": 22, "h": 19 } @@ -5127,8 +5484,8 @@ "h": 19 }, "frame": { - "x": 146, - "y": 350, + "x": 133, + "y": 639, "w": 22, "h": 19 } @@ -5148,14 +5505,14 @@ "h": 19 }, "frame": { - "x": 168, - "y": 331, + "x": 133, + "y": 658, "w": 22, "h": 19 } }, { - "filename": "585s-summer", + "filename": "615", "rotated": false, "trimmed": true, "sourceSize": { @@ -5164,19 +5521,61 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 18, - "h": 22 + "y": 8, + "w": 19, + "h": 20 }, "frame": { - "x": 146, - "y": 369, - "w": 18, - "h": 22 + "x": 135, + "y": 677, + "w": 19, + "h": 20 } }, { - "filename": "585s-winter", + "filename": "599", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 22, + "h": 16 + }, + "frame": { + "x": 142, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "542", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 155, + "y": 639, + "w": 14, + "h": 21 + } + }, + { + "filename": "495s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5185,15 +5584,141 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 18, - "h": 22 + "y": 11, + "w": 20, + "h": 17 }, "frame": { - "x": 146, - "y": 391, + "x": 155, + "y": 660, + "w": 20, + "h": 17 + } + }, + { + "filename": "615s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 154, + "y": 677, + "w": 19, + "h": 20 + } + }, + { + "filename": "599s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 22, + "h": 16 + }, + "frame": { + "x": 164, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "529", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 21, + "h": 17 + }, + "frame": { + "x": 186, + "y": 353, + "w": 21, + "h": 17 + } + }, + { + "filename": "605s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 173, + "y": 353, + "w": 13, + "h": 19 + } + }, + { + "filename": "610", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, "w": 18, - "h": 22 + "h": 20 + }, + "frame": { + "x": 173, + "y": 677, + "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": 186, + "y": 697, + "w": 21, + "h": 16 } }, { @@ -5211,8 +5736,8 @@ "h": 19 }, "frame": { - "x": 190, - "y": 331, + "x": 165, + "y": 372, "w": 21, "h": 19 } @@ -5232,621 +5757,12 @@ "h": 19 }, "frame": { - "x": 168, - "y": 350, + "x": 186, + "y": 370, "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 409, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 429, - "w": 19, - "h": 20 - } - }, - { - "filename": "627", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 147, - "y": 455, - "w": 17, - "h": 21 - } - }, - { - "filename": "592s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 449, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 147, - "y": 537, - "w": 19, - "h": 20 - } - }, - { - "filename": "615", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 147, - "y": 557, - "w": 19, - "h": 20 - } - }, - { - "filename": "568s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 141, - "y": 577, - "w": 21, - "h": 18 - } - }, - { - "filename": "615s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 141, - "y": 595, - "w": 19, - "h": 20 - } - }, - { - "filename": "583s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 15, - "h": 21 - }, - "frame": { - "x": 139, - "y": 618, - "w": 15, - "h": 21 - } - }, - { - "filename": "610", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "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 - } - }, - { - "filename": "619", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 183, - "y": 432, - "w": 18, - "h": 19 - } - }, - { - "filename": "506", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 183, - "y": 451, - "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, @@ -5862,14 +5778,14 @@ "h": 19 }, "frame": { - "x": 163, - "y": 485, + "x": 207, + "y": 370, "w": 20, "h": 19 } }, { - "filename": "527s", + "filename": "610s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,37 +5793,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 20, - "h": 15 + "x": 11, + "y": 8, + "w": 18, + "h": 20 }, "frame": { - "x": 163, - "y": 504, - "w": 20, - "h": 15 - } - }, - { - "filename": "619s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, + "x": 227, + "y": 370, "w": 18, - "h": 19 - }, - "frame": { - "x": 166, - "y": 519, - "w": 18, - "h": 19 + "h": 20 } }, { @@ -5925,12 +5820,180 @@ "h": 19 }, "frame": { - "x": 166, - "y": 538, + "x": 155, + "y": 391, "w": 20, "h": 19 } }, + { + "filename": "627", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 156, + "y": 410, + "w": 17, + "h": 21 + } + }, + { + "filename": "627s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 156, + "y": 431, + "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": 175, + "y": 391, + "w": 14, + "h": 21 + } + }, + { + "filename": "504s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 20, + "h": 18 + }, + "frame": { + "x": 189, + "y": 389, + "w": 20, + "h": 18 + } + }, + { + "filename": "506", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 209, + "y": 389, + "w": 18, + "h": 18 + } + }, + { + "filename": "619", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 227, + "y": 390, + "w": 18, + "h": 19 + } + }, + { + "filename": "583", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 15, + "h": 21 + }, + "frame": { + "x": 173, + "y": 412, + "w": 15, + "h": 21 + } + }, + { + "filename": "578", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 173, + "y": 433, + "w": 16, + "h": 19 + } + }, { "filename": "529s", "rotated": false, @@ -5946,75 +6009,12 @@ "h": 17 }, "frame": { - "x": 166, - "y": 557, + "x": 157, + "y": 452, "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", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "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, - "h": 14 - }, - "frame": { - "x": 183, - "y": 505, - "w": 21, - "h": 14 - } - }, { "filename": "555-zen", "rotated": false, @@ -6030,323 +6030,8 @@ "h": 17 }, "frame": { - "x": 184, - "y": 519, - "w": 20, - "h": 17 - } - }, - { - "filename": "506s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 186, - "y": 536, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 200, - "y": 388, - "w": 16, - "h": 19 - } - }, - { - "filename": "551", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 - }, - "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 - } - }, - { - "filename": "536", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 216, - "y": 381, - "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 407, - "w": 16, - "h": 19 - } - }, - { - "filename": "580", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 426, - "w": 16, - "h": 19 - } - }, - { - "filename": "580s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 445, - "w": 16, - "h": 19 - } - }, - { - "filename": "501s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 202, - "y": 464, - "w": 16, - "h": 18 - } - }, - { - "filename": "536s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 202, - "y": 482, - "w": 18, - "h": 18 - } - }, - { - "filename": "608s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "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, + "x": 157, + "y": 469, "w": 20, "h": 17 } @@ -6366,12 +6051,222 @@ "h": 16 }, "frame": { - "x": 204, - "y": 535, + "x": 157, + "y": 486, "w": 20, "h": 16 } }, + { + "filename": "608s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 158, + "y": 502, + "w": 19, + "h": 18 + } + }, + { + "filename": "619s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 158, + "y": 520, + "w": 18, + "h": 19 + } + }, + { + "filename": "583s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 15, + "h": 21 + }, + "frame": { + "x": 161, + "y": 539, + "w": 15, + "h": 21 + } + }, + { + "filename": "501", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 16, + "h": 18 + }, + "frame": { + "x": 178, + "y": 452, + "w": 16, + "h": 18 + } + }, + { + "filename": "633", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 177, + "y": 470, + "w": 16, + "h": 20 + } + }, + { + "filename": "633s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 177, + "y": 490, + "w": 16, + "h": 20 + } + }, + { + "filename": "501s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 16, + "h": 18 + }, + "frame": { + "x": 177, + "y": 510, + "w": 16, + "h": 18 + } + }, + { + "filename": "506s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 176, + "y": 528, + "w": 18, + "h": 18 + } + }, + { + "filename": "527s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 176, + "y": 546, + "w": 20, + "h": 15 + } + }, + { + "filename": "566", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 21, + "h": 15 + }, + "frame": { + "x": 189, + "y": 407, + "w": 21, + "h": 15 + } + }, { "filename": "554", "rotated": false, @@ -6387,35 +6282,14 @@ "h": 15 }, "frame": { - "x": 217, - "y": 399, + "x": 210, + "y": 407, "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", + "filename": "536", "rotated": false, "trimmed": true, "sourceSize": { @@ -6424,19 +6298,19 @@ }, "spriteSourceSize": { "x": 11, - "y": 13, - "w": 17, - "h": 15 + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 217, - "y": 414, - "w": 17, - "h": 15 + "x": 227, + "y": 409, + "w": 18, + "h": 18 } }, { - "filename": "599s", + "filename": "555s-zen", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,20 +6318,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 10, "y": 11, - "w": 22, - "h": 16 + "w": 20, + "h": 17 }, "frame": { - "x": 234, - "y": 416, - "w": 22, - "h": 16 + "x": 189, + "y": 422, + "w": 20, + "h": 17 } }, { - "filename": "570", + "filename": "536s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6465,16 +6339,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 + "x": 11, + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 217, - "y": 429, - "w": 16, - "h": 17 + "x": 209, + "y": 422, + "w": 18, + "h": 18 } }, { @@ -6492,14 +6366,14 @@ "h": 18 }, "frame": { - "x": 217, - "y": 446, + "x": 227, + "y": 427, "w": 18, "h": 18 } }, { - "filename": "595", + "filename": "535", "rotated": false, "trimmed": true, "sourceSize": { @@ -6507,20 +6381,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 + "x": 13, + "y": 15, + "w": 14, + "h": 13 }, "frame": { - "x": 235, - "y": 432, - "w": 21, - "h": 16 + "x": 189, + "y": 439, + "w": 14, + "h": 13 } }, { - "filename": "595s", + "filename": "548", "rotated": false, "trimmed": true, "sourceSize": { @@ -6528,15 +6402,78 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 194, + "y": 452, + "w": 12, + "h": 18 + } + }, + { + "filename": "648-aria", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 193, + "y": 470, + "w": 14, + "h": 21 + } + }, + { + "filename": "648s-aria", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 193, + "y": 491, + "w": 14, + "h": 21 + } + }, + { + "filename": "519", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 12, - "w": 21, + "w": 16, "h": 16 }, "frame": { - "x": 235, - "y": 448, - "w": 21, + "x": 193, + "y": 512, + "w": 16, "h": 16 } }, @@ -6555,14 +6492,14 @@ "h": 18 }, "frame": { - "x": 218, - "y": 464, + "x": 194, + "y": 528, "w": 18, "h": 18 } }, { - "filename": "541s", + "filename": "519s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6570,15 +6507,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 12, "y": 12, - "w": 20, + "w": 16, "h": 16 }, "frame": { - "x": 236, - "y": 464, - "w": 20, + "x": 196, + "y": 546, + "w": 16, + "h": 16 + } + }, + { + "filename": "595s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 206, + "y": 440, + "w": 21, + "h": 16 + } + }, + { + "filename": "550-blue-striped", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 227, + "y": 445, + "w": 18, "h": 16 } }, @@ -6597,96 +6576,12 @@ "h": 14 }, "frame": { - "x": 236, - "y": 480, + "x": 206, + "y": 456, "w": 20, "h": 14 } }, - { - "filename": "570s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 220, - "y": 482, - "w": 16, - "h": 17 - } - }, - { - "filename": "618s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 20, - "h": 14 - }, - "frame": { - "x": 236, - "y": 494, - "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, @@ -6702,8 +6597,8 @@ "h": 17 }, "frame": { - "x": 237, - "y": 508, + "x": 226, + "y": 461, "w": 19, "h": 17 } @@ -6723,56 +6618,14 @@ "h": 17 }, "frame": { - "x": 237, - "y": 525, + "x": 207, + "y": 470, "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", + "filename": "541s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6781,98 +6634,14 @@ }, "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, + "w": 20, "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, + "x": 207, + "y": 487, + "w": 20, "h": 16 } }, @@ -6891,8 +6660,8 @@ "h": 16 }, "frame": { - "x": 183, - "y": 590, + "x": 227, + "y": 478, "w": 18, "h": 16 } @@ -6912,33 +6681,12 @@ "h": 16 }, "frame": { - "x": 181, - "y": 606, + "x": 227, + "y": 494, "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 +6702,8 @@ "h": 16 }, "frame": { - "x": 204, - "y": 551, + "x": 209, + "y": 503, "w": 18, "h": 16 } @@ -6975,8 +6723,8 @@ "h": 16 }, "frame": { - "x": 203, - "y": 567, + "x": 227, + "y": 510, "w": 18, "h": 16 } @@ -6996,8 +6744,8 @@ "h": 17 }, "frame": { - "x": 222, - "y": 555, + "x": 212, + "y": 519, "w": 15, "h": 17 } @@ -7017,75 +6765,12 @@ "h": 16 }, "frame": { - "x": 237, - "y": 556, + "x": 227, + "y": 526, "w": 18, "h": 16 } }, - { - "filename": "616", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 18, - "h": 15 - }, - "frame": { - "x": 221, - "y": 572, - "w": 18, - "h": 15 - } - }, - { - "filename": "519s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 239, - "y": 572, - "w": 16, - "h": 16 - } - }, - { - "filename": "616s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 18, - "h": 15 - }, - "frame": { - "x": 203, - "y": 583, - "w": 18, - "h": 15 - } - }, { "filename": "540s", "rotated": false, @@ -7101,12 +6786,138 @@ "h": 17 }, "frame": { - "x": 221, - "y": 587, + "x": 212, + "y": 536, "w": 15, "h": 17 } }, + { + "filename": "616", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 18, + "h": 15 + }, + "frame": { + "x": 227, + "y": 542, + "w": 18, + "h": 15 + } + }, + { + "filename": "517", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 212, + "y": 553, + "w": 15, + "h": 14 + } + }, + { + "filename": "616s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 18, + "h": 15 + }, + "frame": { + "x": 227, + "y": 557, + "w": 18, + "h": 15 + } + }, + { + "filename": "578s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 165, + "y": 620, + "w": 16, + "h": 19 + } + }, + { + "filename": "624", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 169, + "y": 639, + "w": 14, + "h": 20 + } + }, + { + "filename": "574", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 14, + "h": 18 + }, + "frame": { + "x": 175, + "y": 659, + "w": 14, + "h": 18 + } + }, { "filename": "559", "rotated": false, @@ -7122,12 +6933,327 @@ "h": 16 }, "frame": { - "x": 236, - "y": 588, + "x": 167, + "y": 604, "w": 15, "h": 16 } }, + { + "filename": "566s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 21, + "h": 15 + }, + "frame": { + "x": 168, + "y": 561, + "w": 21, + "h": 15 + } + }, + { + "filename": "580", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 168, + "y": 576, + "w": 16, + "h": 19 + } + }, + { + "filename": "618s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 20, + "h": 14 + }, + "frame": { + "x": 189, + "y": 562, + "w": 20, + "h": 14 + } + }, + { + "filename": "580s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 184, + "y": 576, + "w": 16, + "h": 19 + } + }, + { + "filename": "543", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 14, + "w": 18, + "h": 14 + }, + "frame": { + "x": 209, + "y": 567, + "w": 18, + "h": 14 + } + }, + { + "filename": "543s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 14, + "w": 18, + "h": 14 + }, + "frame": { + "x": 227, + "y": 572, + "w": 18, + "h": 14 + } + }, + { + "filename": "624s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 182, + "y": 595, + "w": 14, + "h": 20 + } + }, + { + "filename": "548s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 196, + "y": 595, + "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": 200, + "y": 581, + "w": 15, + "h": 14 + } + }, + { + "filename": "582", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 12, + "w": 12, + "h": 16 + }, + "frame": { + "x": 215, + "y": 581, + "w": 12, + "h": 16 + } + }, + { + "filename": "554s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 13, + "w": 17, + "h": 15 + }, + "frame": { + "x": 227, + "y": 586, + "w": 17, + "h": 15 + } + }, + { + "filename": "570", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 16, + "h": 17 + }, + "frame": { + "x": 208, + "y": 597, + "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": 224, + "y": 601, + "w": 16, + "h": 17 + } + }, + { + "filename": "535s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 15, + "w": 14, + "h": 13 + }, + "frame": { + "x": 182, + "y": 615, + "w": 14, + "h": 13 + } + }, + { + "filename": "582s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 12, + "w": 12, + "h": 16 + }, + "frame": { + "x": 196, + "y": 613, + "w": 12, + "h": 16 + } + }, { "filename": "559s", "rotated": false, @@ -7143,8 +7269,8 @@ "h": 16 }, "frame": { - "x": 201, - "y": 598, + "x": 208, + "y": 614, "w": 15, "h": 16 } @@ -7164,73 +7290,31 @@ "h": 14 }, "frame": { - "x": 199, - "y": 614, - "w": 15, - "h": 14 - } - }, - { - "filename": "577s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 216, - "y": 604, - "w": 15, - "h": 14 - } - }, - { - "filename": "597", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 231, - "y": 604, - "w": 15, - "h": 16 - } - }, - { - "filename": "597s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 214, + "x": 223, "y": 618, "w": 15, - "h": 16 + "h": 14 + } + }, + { + "filename": "602", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 181, + "y": 628, + "w": 14, + "h": 11 } }, { @@ -7248,12 +7332,33 @@ "h": 18 }, "frame": { - "x": 229, - "y": 620, + "x": 183, + "y": 639, "w": 14, "h": 18 } }, + { + "filename": "607", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 13, + "h": 18 + }, + "frame": { + "x": 189, + "y": 657, + "w": 13, + "h": 18 + } + }, { "filename": "607s", "rotated": false, @@ -7269,12 +7374,96 @@ "h": 18 }, "frame": { - "x": 243, - "y": 620, + "x": 191, + "y": 675, "w": 13, "h": 18 } }, + { + "filename": "524", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 15, + "y": 11, + "w": 11, + "h": 17 + }, + "frame": { + "x": 197, + "y": 629, + "w": 11, + "h": 17 + } + }, + { + "filename": "597", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 15, + "h": 16 + }, + "frame": { + "x": 208, + "y": 630, + "w": 15, + "h": 16 + } + }, + { + "filename": "602s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 197, + "y": 646, + "w": 14, + "h": 11 + } + }, + { + "filename": "577s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 223, + "y": 632, + "w": 15, + "h": 14 + } + }, { "filename": "613", "rotated": false, @@ -7290,8 +7479,8 @@ "h": 18 }, "frame": { - "x": 176, - "y": 634, + "x": 202, + "y": 657, "w": 14, "h": 18 } @@ -7311,180 +7500,12 @@ "h": 18 }, "frame": { - "x": 174, - "y": 652, + "x": 204, + "y": 675, "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, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 15, - "w": 14, - "h": 13 - }, - "frame": { - "x": 228, - "y": 638, - "w": 14, - "h": 13 - } - }, - { - "filename": "590", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 14, - "h": 17 - }, - "frame": { - "x": 242, - "y": 638, - "w": 14, - "h": 17 - } - }, { "filename": "524s", "rotated": false, @@ -7500,12 +7521,75 @@ "h": 17 }, "frame": { - "x": 199, - "y": 651, + "x": 207, + "y": 693, "w": 11, "h": 17 } }, + { + "filename": "590", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 14, + "h": 17 + }, + "frame": { + "x": 216, + "y": 646, + "w": 14, + "h": 17 + } + }, + { + "filename": "597s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 15, + "h": 16 + }, + "frame": { + "x": 230, + "y": 646, + "w": 15, + "h": 16 + } + }, + { + "filename": "588s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 11, + "w": 12, + "h": 17 + }, + "frame": { + "x": 218, + "y": 663, + "w": 12, + "h": 17 + } + }, { "filename": "590s", "rotated": false, @@ -7521,53 +7605,11 @@ "h": 17 }, "frame": { - "x": 210, - "y": 647, + "x": 230, + "y": 662, "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:8a278d997d5726b88e2aaa301eb4e4e8:c33243967aadc5b2250e95b079396b1d:20fe181c46701b46ac8f250d40b1bbc1$" } } diff --git a/public/images/pokemon_icons_5.png b/public/images/pokemon_icons_5.png index e0a4ebef303..264120c7499 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..111cc3ab6ab 100644 --- a/public/images/pokemon_icons_5v.json +++ b/public/images/pokemon_icons_5v.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_5v.png", "format": "RGBA8888", "size": { - "w": 127, - "h": 668 + "w": 123, + "h": 696 }, "scale": 1, "frames": [ @@ -135,6 +135,27 @@ "h": 26 } }, + { + "filename": "635_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 94, + "y": 0, + "w": 29, + "h": 25 + } + }, { "filename": "534_2", "rotated": false, @@ -171,8 +192,8 @@ "h": 25 }, "frame": { - "x": 94, - "y": 0, + "x": 0, + "y": 109, "w": 31, "h": 25 } @@ -214,7 +235,7 @@ }, "frame": { "x": 0, - "y": 109, + "y": 134, "w": 30, "h": 25 } @@ -235,11 +256,32 @@ }, "frame": { "x": 0, - "y": 134, + "y": 159, "w": 30, "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": 94, + "y": 25, + "w": 29, + "h": 25 + } + }, { "filename": "645-therian_1", "rotated": false, @@ -256,137 +298,11 @@ }, "frame": { "x": 0, - "y": 159, + "y": 184, "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, @@ -403,7 +319,7 @@ }, "frame": { "x": 0, - "y": 327, + "y": 212, "w": 27, "h": 24 } @@ -424,7 +340,7 @@ }, "frame": { "x": 0, - "y": 351, + "y": 236, "w": 27, "h": 24 } @@ -445,7 +361,7 @@ }, "frame": { "x": 0, - "y": 375, + "y": 260, "w": 26, "h": 25 } @@ -466,7 +382,7 @@ }, "frame": { "x": 0, - "y": 400, + "y": 285, "w": 26, "h": 25 } @@ -487,7 +403,7 @@ }, "frame": { "x": 0, - "y": 425, + "y": 310, "w": 25, "h": 25 } @@ -508,7 +424,7 @@ }, "frame": { "x": 0, - "y": 450, + "y": 335, "w": 26, "h": 24 } @@ -529,7 +445,7 @@ }, "frame": { "x": 0, - "y": 474, + "y": 359, "w": 26, "h": 24 } @@ -550,7 +466,7 @@ }, "frame": { "x": 0, - "y": 498, + "y": 383, "w": 28, "h": 23 } @@ -571,13 +487,55 @@ }, "frame": { "x": 0, - "y": 521, + "y": 406, "w": 28, "h": 23 } }, { - "filename": "497_2", + "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": 429, + "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": 452, + "w": 29, + "h": 23 + } + }, + { + "filename": "530_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -587,18 +545,18 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 28, + "w": 29, "h": 22 }, "frame": { "x": 0, - "y": 544, - "w": 28, + "y": 475, + "w": 29, "h": 22 } }, { - "filename": "497_3", + "filename": "530_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -608,13 +566,13 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 28, + "w": 29, "h": 22 }, "frame": { "x": 0, - "y": 566, - "w": 28, + "y": 497, + "w": 29, "h": 22 } }, @@ -634,7 +592,7 @@ }, "frame": { "x": 0, - "y": 588, + "y": 519, "w": 29, "h": 22 } @@ -655,7 +613,7 @@ }, "frame": { "x": 0, - "y": 610, + "y": 541, "w": 29, "h": 22 } @@ -676,53 +634,11 @@ }, "frame": { "x": 0, - "y": 632, + "y": 563, "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, @@ -738,33 +654,12 @@ "h": 22 }, "frame": { - "x": 32, - "y": 80, + "x": 0, + "y": 585, "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, @@ -780,96 +675,12 @@ "h": 22 }, "frame": { - "x": 30, - "y": 123, + "x": 0, + "y": 607, "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, @@ -885,8 +696,8 @@ "h": 22 }, "frame": { - "x": 29, - "y": 231, + "x": 0, + "y": 629, "w": 30, "h": 22 } @@ -906,12 +717,75 @@ "h": 22 }, "frame": { - "x": 29, - "y": 253, + "x": 0, + "y": 651, "w": 30, "h": 22 } }, + { + "filename": "648-pirouette_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 0, + "y": 673, + "w": 15, + "h": 23 + } + }, + { + "filename": "648-pirouette_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 15, + "y": 673, + "w": 15, + "h": 23 + } + }, + { + "filename": "579_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 21 + }, + "frame": { + "x": 32, + "y": 80, + "w": 30, + "h": 21 + } + }, { "filename": "647-resolute_3", "rotated": false, @@ -927,14 +801,98 @@ "h": 22 }, "frame": { - "x": 29, - "y": 275, + "x": 31, + "y": 101, "w": 30, "h": 22 } }, { - "filename": "593_2", + "filename": "579_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 30, + "h": 21 + }, + "frame": { + "x": 31, + "y": 123, + "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": 30, + "y": 144, + "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": 30, + "y": 166, + "w": 29, + "h": 22 + } + }, + { + "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": 188, + "w": 30, + "h": 21 + } + }, + { + "filename": "497_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -948,8 +906,29 @@ "h": 22 }, "frame": { - "x": 29, - "y": 297, + "x": 27, + "y": 209, + "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": 27, + "y": 231, "w": 28, "h": 22 } @@ -969,14 +948,14 @@ "h": 20 }, "frame": { - "x": 29, - "y": 319, + "x": 27, + "y": 253, "w": 28, "h": 20 } }, { - "filename": "593_3", + "filename": "593_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -990,8 +969,8 @@ "h": 22 }, "frame": { - "x": 27, - "y": 339, + "x": 26, + "y": 273, "w": 28, "h": 22 } @@ -1011,14 +990,14 @@ "h": 20 }, "frame": { - "x": 27, - "y": 361, + "x": 26, + "y": 295, "w": 28, "h": 20 } }, { - "filename": "596_2", + "filename": "496_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -1026,58 +1005,16 @@ "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 + "x": 9, + "y": 8, + "w": 22, + "h": 20 }, "frame": { "x": 25, - "y": 425, - "w": 27, - "h": 22 + "y": 315, + "w": 22, + "h": 20 } }, { @@ -1096,13 +1033,13 @@ }, "frame": { "x": 26, - "y": 447, + "y": 335, "w": 22, "h": 26 } }, { - "filename": "586-spring_1", + "filename": "518_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -1111,15 +1048,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 4, + "y": 6, "w": 23, - "h": 24 + "h": 22 }, "frame": { "x": 26, - "y": 473, + "y": 361, "w": 23, - "h": 24 + "h": 22 } }, { @@ -1138,11 +1075,32 @@ }, "frame": { "x": 28, - "y": 497, + "y": 383, "w": 22, "h": 26 } }, + { + "filename": "496_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 28, + "y": 409, + "w": 22, + "h": 20 + } + }, { "filename": "640_2", "rotated": false, @@ -1158,8 +1116,8 @@ "h": 26 }, "frame": { - "x": 28, - "y": 523, + "x": 29, + "y": 429, "w": 21, "h": 26 } @@ -1179,12 +1137,33 @@ "h": 26 }, "frame": { - "x": 28, - "y": 549, + "x": 29, + "y": 455, "w": 21, "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": 29, + "y": 481, + "w": 23, + "h": 24 + } + }, { "filename": "586-summer_1", "rotated": false, @@ -1201,7 +1180,7 @@ }, "frame": { "x": 29, - "y": 575, + "y": 505, "w": 23, "h": 24 } @@ -1222,7 +1201,7 @@ }, "frame": { "x": 29, - "y": 599, + "y": 529, "w": 23, "h": 24 } @@ -1243,263 +1222,11 @@ }, "frame": { "x": 30, - "y": 623, + "y": 553, "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, @@ -1515,8 +1242,8 @@ "h": 24 }, "frame": { - "x": 59, - "y": 243, + "x": 30, + "y": 577, "w": 22, "h": 24 } @@ -1536,8 +1263,8 @@ "h": 24 }, "frame": { - "x": 59, - "y": 267, + "x": 30, + "y": 601, "w": 22, "h": 24 } @@ -1557,138 +1284,12 @@ "h": 24 }, "frame": { - "x": 88, - "y": 48, + "x": 30, + "y": 625, "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, @@ -1704,56 +1305,14 @@ "h": 24 }, "frame": { - "x": 85, - "y": 136, + "x": 30, + "y": 649, "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", + "filename": "518_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -1762,15 +1321,456 @@ }, "spriteSourceSize": { "x": 9, - "y": 8, - "w": 22, - "h": 20 + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 85, - "y": 160, + "x": 30, + "y": 673, + "w": 23, + "h": 22 + } + }, + { + "filename": "593_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 63, + "y": 26, + "w": 28, + "h": 22 + } + }, + { + "filename": "596_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 28, + "h": 22 + }, + "frame": { + "x": 62, + "y": 48, + "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": 62, + "y": 70, + "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": 90, + "y": 50, + "w": 27, + "h": 22 + } + }, + { + "filename": "593-f_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 90, + "y": 72, + "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": 62, + "y": 92, + "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": 61, + "y": 114, + "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": 89, + "y": 94, + "w": 26, + "h": 22 + } + }, + { + "filename": "552_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 87, + "y": 116, + "w": 25, + "h": 21 + } + }, + { + "filename": "552_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 61, + "y": 136, + "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": 59, + "y": 157, + "w": 25, + "h": 22 + } + }, + { + "filename": "611_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 86, + "y": 137, + "w": 25, + "h": 21 + } + }, + { + "filename": "611_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 84, + "y": 158, + "w": 25, + "h": 21 + } + }, + { + "filename": "542_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 109, + "y": 158, + "w": 14, + "h": 21 + } + }, + { + "filename": "548_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 137, + "w": 12, + "h": 18 + } + }, + { + "filename": "620_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 59, + "y": 179, + "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": 84, + "y": 179, + "w": 25, + "h": 22 + } + }, + { + "filename": "542_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 109, + "y": 179, + "w": 14, + "h": 21 + } + }, + { + "filename": "648-aria_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 109, + "y": 200, + "w": 14, + "h": 21 + } + }, + { + "filename": "647-ordinary_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 57, + "y": 201, + "w": 25, + "h": 22 + } + }, + { + "filename": "531_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, "w": 22, - "h": 20 + "h": 22 + }, + "frame": { + "x": 82, + "y": 201, + "w": 22, + "h": 22 } }, { @@ -1788,8 +1788,8 @@ "h": 24 }, "frame": { - "x": 83, - "y": 180, + "x": 55, + "y": 223, "w": 22, "h": 24 } @@ -1809,54 +1809,12 @@ "h": 24 }, "frame": { - "x": 105, - "y": 180, + "x": 55, + "y": 247, "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, @@ -1872,33 +1830,12 @@ "h": 24 }, "frame": { - "x": 84, - "y": 220, + "x": 77, + "y": 223, "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, @@ -1914,8 +1851,8 @@ "h": 24 }, "frame": { - "x": 81, - "y": 244, + "x": 77, + "y": 247, "w": 22, "h": 24 } @@ -1935,8 +1872,8 @@ "h": 19 }, "frame": { - "x": 103, - "y": 247, + "x": 99, + "y": 223, "w": 24, "h": 19 } @@ -1956,12 +1893,54 @@ "h": 19 }, "frame": { - "x": 103, - "y": 266, + "x": 99, + "y": 242, "w": 24, "h": 19 } }, + { + "filename": "632_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 99, + "y": 261, + "w": 24, + "h": 16 + } + }, + { + "filename": "592-f_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 47, + "y": 315, + "w": 19, + "h": 20 + } + }, { "filename": "649_3", "rotated": false, @@ -1977,75 +1956,12 @@ "h": 24 }, "frame": { - "x": 81, - "y": 268, + "x": 48, + "y": 335, "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, @@ -2061,8 +1977,8 @@ "h": 22 }, "frame": { - "x": 81, - "y": 292, + "x": 49, + "y": 359, "w": 22, "h": 22 } @@ -2082,8 +1998,8 @@ "h": 22 }, "frame": { - "x": 57, - "y": 313, + "x": 50, + "y": 381, "w": 22, "h": 22 } @@ -2103,14 +2019,14 @@ "h": 22 }, "frame": { - "x": 79, - "y": 314, + "x": 50, + "y": 403, "w": 22, "h": 22 } }, { - "filename": "544_2", + "filename": "547_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2119,57 +2035,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 12, - "w": 22, - "h": 16 + "y": 6, + "w": 21, + "h": 22 }, "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 + "x": 50, + "y": 425, + "w": 21, + "h": 22 } }, { @@ -2187,14 +2061,14 @@ "h": 22 }, "frame": { - "x": 55, - "y": 351, + "x": 50, + "y": 447, "w": 21, "h": 22 } }, { - "filename": "551_2", + "filename": "494_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2202,20 +2076,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 + "x": 11, + "y": 6, + "w": 18, + "h": 22 }, "frame": { - "x": 79, - "y": 336, - "w": 22, - "h": 16 + "x": 52, + "y": 469, + "w": 18, + "h": 22 } }, { - "filename": "551_3", + "filename": "494_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2223,41 +2097,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 + "x": 11, + "y": 6, + "w": 18, + "h": 22 }, "frame": { - "x": 101, - "y": 336, - "w": 22, - "h": 16 + "x": 52, + "y": 491, + "w": 18, + "h": 22 } }, { - "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", + "filename": "585-autumn_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -2266,78 +2119,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 9, - "w": 21, - "h": 19 + "y": 6, + "w": 18, + "h": 22 }, "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 + "x": 52, + "y": 513, + "w": 18, + "h": 22 } }, { @@ -2355,8 +2145,8 @@ "h": 22 }, "frame": { - "x": 54, - "y": 390, + "x": 52, + "y": 535, "w": 18, "h": 22 } @@ -2376,96 +2166,12 @@ "h": 22 }, "frame": { - "x": 72, - "y": 390, + "x": 52, + "y": 557, "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, @@ -2481,14 +2187,14 @@ "h": 22 }, "frame": { - "x": 90, - "y": 390, + "x": 52, + "y": 579, "w": 18, "h": 22 } }, { - "filename": "592-f_1", + "filename": "560_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -2497,15 +2203,57 @@ }, "spriteSourceSize": { "x": 10, - "y": 8, - "w": 19, - "h": 20 + "y": 7, + "w": 20, + "h": 21 }, "frame": { - "x": 108, - "y": 389, - "w": 19, - "h": 20 + "x": 52, + "y": 601, + "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": 52, + "y": 622, + "w": 20, + "h": 21 + } + }, + { + "filename": "560_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 52, + "y": 643, + "w": 20, + "h": 21 } }, { @@ -2523,14 +2271,14 @@ "h": 20 }, "frame": { - "x": 108, - "y": 409, + "x": 53, + "y": 664, "w": 19, "h": 20 } }, { - "filename": "548_1", + "filename": "632_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2538,20 +2286,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 + "x": 8, + "y": 12, + "w": 24, + "h": 16 }, "frame": { - "x": 96, - "y": 412, - "w": 12, - "h": 18 + "x": 55, + "y": 271, + "w": 24, + "h": 16 } }, { - "filename": "592-f_3", + "filename": "495_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2560,19 +2308,103 @@ }, "spriteSourceSize": { "x": 10, - "y": 8, - "w": 19, - "h": 20 + "y": 11, + "w": 20, + "h": 17 }, "frame": { - "x": 108, - "y": 429, - "w": 19, - "h": 20 + "x": 79, + "y": 271, + "w": 20, + "h": 17 } }, { - "filename": "542_2", + "filename": "572_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 54, + "y": 287, + "w": 22, + "h": 19 + } + }, + { + "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": 288, + "w": 22, + "h": 19 + } + }, + { + "filename": "544_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 99, + "y": 277, + "w": 22, + "h": 16 + } + }, + { + "filename": "544_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 98, + "y": 293, + "w": 22, + "h": 16 + } + }, + { + "filename": "602_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2581,141 +2413,15 @@ }, "spriteSourceSize": { "x": 13, - "y": 7, + "y": 17, "w": 14, - "h": 21 + "h": 11 }, "frame": { - "x": 94, - "y": 430, + "x": 53, + "y": 684, "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 + "h": 11 } }, { @@ -2733,8 +2439,197 @@ "h": 22 }, "frame": { - "x": 49, - "y": 470, + "x": 71, + "y": 425, + "w": 15, + "h": 22 + } + }, + { + "filename": "606_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 71, + "y": 447, + "w": 15, + "h": 22 + } + }, + { + "filename": "549_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 70, + "y": 469, + "w": 17, + "h": 21 + } + }, + { + "filename": "549_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 70, + "y": 490, + "w": 17, + "h": 21 + } + }, + { + "filename": "592-f_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 70, + "y": 511, + "w": 19, + "h": 20 + } + }, + { + "filename": "592_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 70, + "y": 531, + "w": 19, + "h": 20 + } + }, + { + "filename": "592_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 70, + "y": 551, + "w": 19, + "h": 20 + } + }, + { + "filename": "603_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 21, + "h": 19 + }, + "frame": { + "x": 70, + "y": 571, + "w": 21, + "h": 19 + } + }, + { + "filename": "602_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 70, + "y": 590, + "w": 14, + "h": 11 + } + }, + { + "filename": "606_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 72, + "y": 601, "w": 15, "h": 22 } @@ -2754,180 +2649,12 @@ "h": 20 }, "frame": { - "x": 64, - "y": 466, + "x": 72, + "y": 623, "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, @@ -2943,12 +2670,138 @@ "h": 20 }, "frame": { - "x": 49, - "y": 531, + "x": 72, + "y": 643, "w": 18, "h": 20 } }, + { + "filename": "603_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 9, + "w": 21, + "h": 19 + }, + "frame": { + "x": 72, + "y": 663, + "w": 21, + "h": 19 + } + }, + { + "filename": "546_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 72, + "y": 682, + "w": 21, + "h": 14 + } + }, + { + "filename": "568_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 66, + "y": 307, + "w": 21, + "h": 18 + } + }, + { + "filename": "551_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 22, + "h": 16 + }, + "frame": { + "x": 87, + "y": 309, + "w": 22, + "h": 16 + } + }, + { + "filename": "648-aria_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 109, + "y": 309, + "w": 14, + "h": 21 + } + }, + { + "filename": "568_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 70, + "y": 325, + "w": 21, + "h": 18 + } + }, { "filename": "619_2", "rotated": false, @@ -2964,159 +2817,12 @@ "h": 19 }, "frame": { - "x": 49, - "y": 551, + "x": 91, + "y": 325, "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, @@ -3132,14 +2838,14 @@ "h": 16 }, "frame": { - "x": 102, - "y": 521, + "x": 70, + "y": 343, "w": 21, "h": 16 } }, { - "filename": "570_2", + "filename": "495_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -3147,36 +2853,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 10, "y": 11, - "w": 16, + "w": 20, "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, + "x": 71, + "y": 359, + "w": 20, "h": 17 } }, @@ -3195,159 +2880,12 @@ "h": 19 }, "frame": { - "x": 67, - "y": 544, + "x": 91, + "y": 344, "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, @@ -3363,12 +2901,96 @@ "h": 19 }, "frame": { - "x": 67, - "y": 647, + "x": 109, + "y": 330, "w": 13, "h": 19 } }, + { + "filename": "608_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 72, + "y": 376, + "w": 19, + "h": 18 + } + }, + { + "filename": "608_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 72, + "y": 394, + "w": 19, + "h": 18 + } + }, + { + "filename": "622_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 91, + "y": 363, + "w": 18, + "h": 18 + } + }, + { + "filename": "622_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 91, + "y": 381, + "w": 18, + "h": 18 + } + }, { "filename": "605_2", "rotated": false, @@ -3384,33 +3006,12 @@ "h": 19 }, "frame": { - "x": 80, - "y": 646, + "x": 109, + "y": 349, "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, @@ -3426,12 +3027,327 @@ "h": 19 }, "frame": { - "x": 93, - "y": 646, + "x": 109, + "y": 368, "w": 13, "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": 91, + "y": 399, + "w": 21, + "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": 86, + "y": 416, + "w": 21, + "h": 17 + } + }, + { + "filename": "633_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 107, + "y": 416, + "w": 16, + "h": 20 + } + }, + { + "filename": "595_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 86, + "y": 433, + "w": 21, + "h": 16 + } + }, + { + "filename": "633_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 107, + "y": 436, + "w": 16, + "h": 20 + } + }, + { + "filename": "546_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 86, + "y": 449, + "w": 21, + "h": 14 + } + }, + { + "filename": "578_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 107, + "y": 456, + "w": 16, + "h": 19 + } + }, + { + "filename": "541_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 87, + "y": 463, + "w": 20, + "h": 16 + } + }, + { + "filename": "578_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 107, + "y": 475, + "w": 16, + "h": 19 + } + }, + { + "filename": "541_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 87, + "y": 479, + "w": 20, + "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": 87, + "y": 495, + "w": 22, + "h": 16 + } + }, + { + "filename": "562_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 89, + "y": 511, + "w": 22, + "h": 16 + } + }, + { + "filename": "562_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 89, + "y": 527, + "w": 22, + "h": 16 + } + }, + { + "filename": "578_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 89, + "y": 543, + "w": 16, + "h": 19 + } + }, + { + "filename": "543_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 14, + "w": 18, + "h": 14 + }, + "frame": { + "x": 105, + "y": 543, + "w": 18, + "h": 14 + } + }, { "filename": "543_3", "rotated": false, @@ -3447,12 +3363,54 @@ "h": 14 }, "frame": { - "x": 102, - "y": 551, + "x": 105, + "y": 557, "w": 18, "h": 14 } }, + { + "filename": "548_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 494, + "w": 12, + "h": 18 + } + }, + { + "filename": "548_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 512, + "w": 12, + "h": 18 + } + }, { "filename": "607_2", "rotated": false, @@ -3468,14 +3426,14 @@ "h": 18 }, "frame": { - "x": 89, - "y": 554, + "x": 91, + "y": 562, "w": 13, "h": 18 } }, { - "filename": "517_2", + "filename": "570_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -3483,16 +3441,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 + "x": 12, + "y": 11, + "w": 16, + "h": 17 }, "frame": { - "x": 102, - "y": 565, - "w": 15, - "h": 14 + "x": 104, + "y": 571, + "w": 16, + "h": 17 } }, { @@ -3510,12 +3468,117 @@ "h": 18 }, "frame": { - "x": 88, - "y": 572, + "x": 91, + "y": 580, "w": 13, "h": 18 } }, + { + "filename": "570_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 16, + "h": 17 + }, + "frame": { + "x": 87, + "y": 598, + "w": 16, + "h": 17 + } + }, + { + "filename": "517_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 104, + "y": 588, + "w": 15, + "h": 14 + } + }, + { + "filename": "517_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 103, + "y": 602, + "w": 15, + "h": 14 + } + }, + { + "filename": "540_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 15, + "h": 17 + }, + "frame": { + "x": 90, + "y": 616, + "w": 15, + "h": 17 + } + }, + { + "filename": "540_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 15, + "h": 17 + }, + "frame": { + "x": 90, + "y": 633, + "w": 15, + "h": 17 + } + }, { "filename": "559_1", "rotated": false, @@ -3531,8 +3594,8 @@ "h": 16 }, "frame": { - "x": 88, - "y": 590, + "x": 105, + "y": 616, "w": 15, "h": 16 } @@ -3552,8 +3615,8 @@ "h": 16 }, "frame": { - "x": 89, - "y": 606, + "x": 105, + "y": 632, "w": 15, "h": 16 } @@ -3573,33 +3636,12 @@ "h": 16 }, "frame": { - "x": 103, - "y": 579, + "x": 105, + "y": 648, "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, @@ -3615,8 +3657,8 @@ "h": 14 }, "frame": { - "x": 104, - "y": 609, + "x": 93, + "y": 664, "w": 15, "h": 14 } @@ -3636,8 +3678,8 @@ "h": 14 }, "frame": { - "x": 100, - "y": 623, + "x": 108, + "y": 664, "w": 15, "h": 14 } @@ -3657,8 +3699,8 @@ "h": 14 }, "frame": { - "x": 106, - "y": 637, + "x": 93, + "y": 678, "w": 15, "h": 14 } @@ -3669,6 +3711,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:018cb8e5f06a9ed9edd0bdc8721daa73:985d20f8fcceb349f1b7fba26ba674e8:f1931bc28ee7f32dba7543723757cf2a$" + "smartupdate": "$TexturePacker:SmartUpdate:982d6d8f8bd84ab35fcc0559c4fe5188:e14c2b4fa19e2d528ab6fda3d5a817e6:f1931bc28ee7f32dba7543723757cf2a$" } } diff --git a/public/images/pokemon_icons_5v.png b/public/images/pokemon_icons_5v.png index 0f4099b575f..d82ea5cc881 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_7v.json b/public/images/pokemon_icons_7v.json index ceb7a0b991f..cf34740925a 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1096,7 +1096,7 @@ }, "frame": { "x": 96, - "y": 445, + "y": 446, "w": 17, "h": 22 } diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 822f7950f3e..308e405525d 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/trainer/aqua_admin_f.json b/public/images/trainer/aqua_admin_f.json new file mode 100644 index 00000000000..35e6e43edc3 --- /dev/null +++ b/public/images/trainer/aqua_admin_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aqua_admin_f.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:efd07ff3ed1e610150a4b8ca18974343:d9b85b9eb11182e9e4669e2bd8b08694:72b7b50231708a9486d5f315824e4df1$" + } +} diff --git a/public/images/trainer/aqua_admin_f.png b/public/images/trainer/aqua_admin_f.png new file mode 100644 index 00000000000..505dce1b110 Binary files /dev/null and b/public/images/trainer/aqua_admin_f.png differ diff --git a/public/images/trainer/aqua_admin_m.json b/public/images/trainer/aqua_admin_m.json new file mode 100644 index 00000000000..f52412623cc --- /dev/null +++ b/public/images/trainer/aqua_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aqua_admin_m.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$" + } +} \ No newline at end of file diff --git a/public/images/trainer/aqua_admin_m.png b/public/images/trainer/aqua_admin_m.png new file mode 100644 index 00000000000..a4f7893e565 Binary files /dev/null and b/public/images/trainer/aqua_admin_m.png differ diff --git a/public/images/trainer/flare_admin_f.json b/public/images/trainer/flare_admin_f.json new file mode 100644 index 00000000000..1e39a3fcb03 --- /dev/null +++ b/public/images/trainer/flare_admin_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "flare_admin_f.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$" + } +} \ No newline at end of file diff --git a/public/images/trainer/flare_admin_f.png b/public/images/trainer/flare_admin_f.png new file mode 100644 index 00000000000..14d8abdaa39 Binary files /dev/null and b/public/images/trainer/flare_admin_f.png differ diff --git a/public/images/trainer/flare_admin_m.json b/public/images/trainer/flare_admin_m.json new file mode 100644 index 00000000000..4228fac6af0 --- /dev/null +++ b/public/images/trainer/flare_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "flare_admin_m.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:c30bf82452209a923f4becf13d275a9a:a6355b09f92c9c0388d0b919010f587f:0638dbf213f8a974eb5af76eb1e5ddeb$" + } +} diff --git a/public/images/trainer/flare_admin_m.png b/public/images/trainer/flare_admin_m.png new file mode 100644 index 00000000000..f431c20a479 Binary files /dev/null and b/public/images/trainer/flare_admin_m.png differ diff --git a/public/images/trainer/galactic_admin_f.json b/public/images/trainer/galactic_admin_f.json new file mode 100644 index 00000000000..eae1da8fff1 --- /dev/null +++ b/public/images/trainer/galactic_admin_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "galactic_admin_f.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$" + } +} \ No newline at end of file diff --git a/public/images/trainer/galactic_admin_f.png b/public/images/trainer/galactic_admin_f.png new file mode 100644 index 00000000000..ca7af064bc8 Binary files /dev/null and b/public/images/trainer/galactic_admin_f.png differ diff --git a/public/images/trainer/galactic_admin_m.json b/public/images/trainer/galactic_admin_m.json new file mode 100644 index 00000000000..f404c2247e9 --- /dev/null +++ b/public/images/trainer/galactic_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "galactic_admin_m.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:3012867f03f02c4ee67a8ab3ad5a000e:77a5f60f1adc158664b3b2ee17bf30fe:7e8259b5177c0a76e5d02d6bdc66affe$" + } +} diff --git a/public/images/trainer/galactic_admin_m.png b/public/images/trainer/galactic_admin_m.png new file mode 100644 index 00000000000..cb59227c7a7 Binary files /dev/null and b/public/images/trainer/galactic_admin_m.png differ diff --git a/public/images/trainer/magma_admin_f.json b/public/images/trainer/magma_admin_f.json new file mode 100644 index 00000000000..95e00803df4 --- /dev/null +++ b/public/images/trainer/magma_admin_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "magma_admin_f.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$" + } +} \ No newline at end of file diff --git a/public/images/trainer/magma_admin_f.png b/public/images/trainer/magma_admin_f.png new file mode 100644 index 00000000000..979fe6ae837 Binary files /dev/null and b/public/images/trainer/magma_admin_f.png differ diff --git a/public/images/trainer/magma_admin_m.json b/public/images/trainer/magma_admin_m.json new file mode 100644 index 00000000000..977e911eb69 --- /dev/null +++ b/public/images/trainer/magma_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "magma_admin_m.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "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:f63ad48affc076f60fae78992c96a2bf:80928b32710abcb28c07c6fc5a425d99:3b961d8852b62aaf24ceb2030c036515$" + } +} diff --git a/public/images/trainer/magma_admin_m.png b/public/images/trainer/magma_admin_m.png new file mode 100644 index 00000000000..93e3a17539d Binary files /dev/null and b/public/images/trainer/magma_admin_m.png differ diff --git a/public/images/trainer/plasma_sage.json b/public/images/trainer/plasma_sage.json new file mode 100644 index 00000000000..05e75141ec0 --- /dev/null +++ b/public/images/trainer/plasma_sage.json @@ -0,0 +1,2120 @@ +{ + "textures": [ + { + "image": "plasma_sage.png", + "format": "RGBA8888", + "size": { + "w": 250, + "h": 250 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 13, + "y": 2, + "w": 55, + "h": 78 + }, + "frame": { + "x": 1, + "y": 82, + "w": 55, + "h": 78 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 2, + "w": 54, + "h": 78 + }, + "frame": { + "x": 59, + "y": 1, + "w": 54, + "h": 78 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 2, + "w": 54, + "h": 78 + }, + "frame": { + "x": 59, + "y": 1, + "w": 54, + "h": 78 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 3, + "w": 53, + "h": 77 + }, + "frame": { + "x": 1, + "y": 162, + "w": 53, + "h": 77 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 3, + "w": 49, + "h": 77 + }, + "frame": { + "x": 170, + "y": 1, + "w": 49, + "h": 77 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 2, + "w": 47, + "h": 78 + }, + "frame": { + "x": 58, + "y": 82, + "w": 47, + "h": 78 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 56, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 56, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 107, + "y": 81, + "w": 46, + "h": 80 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 104, + "y": 163, + "w": 46, + "h": 80 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 203, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 203, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 152, + "y": 163, + "w": 46, + "h": 80 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:98df2be457c75de554b8ce6c2f5ff582:93e2cb242dc211e2485f87e4db93af88:0c38bc008e5ede7b6331c02b8220846f$" + } +} \ No newline at end of file diff --git a/public/images/trainer/plasma_sage.png b/public/images/trainer/plasma_sage.png new file mode 100644 index 00000000000..6c866562989 Binary files /dev/null and b/public/images/trainer/plasma_sage.png differ diff --git a/public/images/trainer/rocket_admin_f.json b/public/images/trainer/rocket_admin_f.json new file mode 100644 index 00000000000..7c154785ba3 --- /dev/null +++ b/public/images/trainer/rocket_admin_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rocket_admin_f.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$" + } +} \ No newline at end of file diff --git a/public/images/trainer/rocket_admin_f.png b/public/images/trainer/rocket_admin_f.png new file mode 100644 index 00000000000..0244538d91e Binary files /dev/null and b/public/images/trainer/rocket_admin_f.png differ diff --git a/public/images/trainer/rocket_admin_m.json b/public/images/trainer/rocket_admin_m.json new file mode 100644 index 00000000000..a1ad82dd9a2 --- /dev/null +++ b/public/images/trainer/rocket_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rocket_admin_m.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/rocket_admin_m.png b/public/images/trainer/rocket_admin_m.png new file mode 100644 index 00000000000..5dcc4ff286e Binary files /dev/null and b/public/images/trainer/rocket_admin_m.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/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/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/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/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/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/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/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/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/i18next.d.ts b/src/@types/i18next.d.ts index f3a63d6f4ec..a1cf70d91d5 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,4 +1,4 @@ -import { enConfig } from "#app/locales/en/config.js"; +import { type enConfig } from "#app/locales/en/config.js"; // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { diff --git a/src/account.ts b/src/account.ts index 4d19513908f..7fd1d208496 100644 --- a/src/account.ts +++ b/src/account.ts @@ -4,6 +4,8 @@ import * as Utils from "./utils"; export interface UserInfo { username: string; lastSessionSlot: integer; + discordId: string; + googleId: string; } export let loggedInUser: UserInfo = null; @@ -11,13 +13,13 @@ export let loggedInUser: UserInfo = null; export const clientSessionId = Utils.randomString(32); export function initLoggedInUser(): void { - loggedInUser = { username: "Guest", lastSessionSlot: -1 }; + loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: ""}; } 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: "" }; let lastSessionSlot = -1; for (let s = 0; s < 5; s++) { if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) { diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 1b1d1fde83f..93b05a39ecb 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,6 +1,6 @@ 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 { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase, SummonPhase, ToggleDoublePositionPhase } from "./phases"; import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; import { Constructor } from "#app/utils"; @@ -14,7 +14,7 @@ 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 { allAbilities } from "./data/ability"; @@ -49,11 +49,11 @@ 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 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"; @@ -66,6 +66,10 @@ 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 i18next from "i18next"; +import {TrainerType} from "#enums/trainer-type"; +import { battleSpecDialogue } from "./data/dialogue"; +import { LoadingScene } from "./loading-scene"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -178,11 +182,16 @@ 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; public field: Phaser.GameObjects.Container; @@ -222,6 +231,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; @@ -309,6 +321,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 +372,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 +380,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 +479,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); @@ -1045,6 +1061,10 @@ export default class BattleScene extends SceneBase { this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, 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); this.field.add(newTrainer); @@ -1064,11 +1084,11 @@ export default class BattleScene extends SceneBase { 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; } @@ -1118,8 +1138,8 @@ 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 @@ -1132,7 +1152,7 @@ export default class BattleScene extends SceneBase { applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } - this.unshiftPhase(new ShowTrainerPhase(this)); + this.pushPhase(new ShowTrainerPhase(this)); } for (const pokemon of this.getParty()) { @@ -1226,6 +1246,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: @@ -1421,19 +1442,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, @@ -1886,7 +1917,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 @@ -1941,6 +1972,7 @@ export default class BattleScene extends SceneBase { return this.standbyPhase; } + /** * Adds a phase to the conditional queue and ensures it is executed only when the specified condition is met. * @@ -1955,11 +1987,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 +2008,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; @@ -1997,7 +2051,7 @@ export default class BattleScene extends SceneBase { } 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(); @@ -2008,8 +2062,8 @@ export default class BattleScene extends SceneBase { 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]); + // If the condition is met, add the phase to the phase queue + this.pushPhase(conditionalPhase[1]); } else { // If the condition is not met, re-add the phase back to the front of the conditional queue this.conditionalQueue.unshift(conditionalPhase); @@ -2064,15 +2118,46 @@ export default class BattleScene extends SceneBase { } } + /** + * 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, prompt?: boolean, promptDelay?: integer, defer?: boolean) { 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); @@ -2540,4 +2625,33 @@ export default class BattleScene extends SceneBase { }; (window as any).gameInfo = gameInfo; } + + /** + * 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, null, () => { + this.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, 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..e8a1323fc4c 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -13,6 +13,7 @@ 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, @@ -156,7 +157,7 @@ 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; ret.pokemonId = null; return ret; @@ -173,7 +174,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, null, true); scene.currentBattle.moneyScattered = 0; } @@ -290,10 +294,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) { @@ -410,7 +425,13 @@ export class FixedBattleConfig { } } -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) + * @returns the generated trainer + */ +function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], randomGender: boolean = false): GetTrainerFunc { return (scene: BattleScene) => { const rand = Utils.randSeedInt(trainerPool.length); const trainerTypes: TrainerType[] = []; @@ -420,11 +441,20 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get : trainerPoolEntry; trainerTypes.push(trainerType); } - // 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); + let trainerGender = TrainerVariant.DEFAULT; + if (randomGender) { + trainerGender = (Utils.randInt(2) === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; } - return new Trainer(scene, trainerTypes[rand], 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], trainerGender); }; } @@ -434,7 +464,8 @@ export interface FixedBattleConfigs { /** * 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,21 +478,21 @@ 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 ], 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 ], 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 ], 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.ROCKET_ADMIN, TrainerType.MAGMA_ADMIN, TrainerType.AQUA_ADMIN, TrainerType.GALACTIC_ADMIN, TrainerType.PLASMA_SAGE, TrainerType.FLARE_ADMIN ], 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 ], 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.ROCKET_ADMIN, TrainerType.MAGMA_ADMIN, TrainerType.AQUA_ADMIN, TrainerType.GALACTIC_ADMIN, TrainerType.PLASMA_SAGE, TrainerType.FLARE_ADMIN ], true)), [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) diff --git a/src/data/ability.ts b/src/data/ability.ts index b1f0d2b197c..491a14ba621 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,10 +1,10 @@ -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 { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; @@ -266,7 +266,7 @@ export class PreDefendFormChangeAbAttr extends PreDefendAbAttr { } 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() && + 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 pokemon.addTag(BattlerTagType.STURDY, 1); @@ -284,7 +284,10 @@ export class BlockItemTheftAbAttr extends AbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents item theft!`); + return i18next.t("abilityTriggers:blockItemTheft", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName + }); } } @@ -361,13 +364,13 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { /** * 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 { // Field moves should ignore immunity @@ -397,12 +400,12 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); if (ret) { - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { 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)); + Math.max(Math.floor(pokemon.getMaxHp() / 4), 1), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); } } return true; @@ -480,7 +483,10 @@ 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 + }); } } @@ -501,7 +507,7 @@ export class PostDefendDisguiseAbAttr extends PostDefendAbAttr { } pokemon.damageAndUpdate(recoilDamage, HitResult.OTHER); pokemon.turnData.damageTaken += recoilDamage; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s disguise was busted!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendDisguise", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -573,7 +579,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) }); } } @@ -637,7 +643,7 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr { */ applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.hasAttr(HitHealAttr)) { - pokemon.scene.queueMessage(getPokemonMessage(attacker, " sucked up the liquid ooze!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); return true; } return false; @@ -746,7 +752,7 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr { if (this.condition(pokemon, attacker, move)) { if (!pokemon.getTag(this.tagType)) { 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; } @@ -769,7 +775,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]]}`) + }); } } @@ -879,7 +889,7 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { } applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { + if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); attacker.turnData.damageTaken += Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)); return true; @@ -889,7 +899,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 + }); } } /** @@ -961,7 +974,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) }); } } @@ -984,7 +997,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 + }); } } @@ -1014,7 +1030,10 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(this.attacker, `'s ${this.move.name}\nwas disabled!`); + return i18next.t("abilityTriggers:postDefendMoveDisable", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.attacker), + moveName: this.move.name, + }); } } @@ -1064,7 +1083,8 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * [1]: {@linkcode Moves } Move used by the ability user. */ apply(pokemon: Pokemon, passive: 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; } @@ -1227,7 +1247,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]}`), + }); } } @@ -1296,6 +1319,7 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { const multiplier = args[2] as Utils.NumberHolder; if (this.canApplyPreAttack(move, numTargets)) { + this.showAbility = !!hitCount?.value; if (!!hitCount?.value) { hitCount.value *= 2; } @@ -1446,7 +1470,7 @@ export class FieldMovePowerBoostAbAttr extends AbAttr { * Boosts the power of a specific type of move. * @extends FieldMovePowerBoostAbAttr */ -export class FieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostAbAttr { +export class PreAttackFieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostAbAttr { /** * @param boostedType - The type of move that will receive the power boost. * @param powerMultiplier - The multiplier to apply to the move's power, defaults to 1.5 if not provided. @@ -1456,6 +1480,18 @@ export class FieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostAbAttr { } } +/** + * Boosts the power of a specific type of move for all Pokemon in the field. + * @extends PreAttackFieldMoveTypePowerBoostAbAttr + */ +export class FieldMoveTypePowerBoostAbAttr extends PreAttackFieldMoveTypePowerBoostAbAttr { } + +/** + * Boosts the power of a specific type of move for the user and its allies. + * @extends PreAttackFieldMoveTypePowerBoostAbAttr + */ +export class UserFieldMoveTypePowerBoostAbAttr extends PreAttackFieldMoveTypePowerBoostAbAttr { } + /** * Boosts the power of moves in specified categories. * @extends FieldMovePowerBoostAbAttr @@ -1495,29 +1531,56 @@ export class BattleStatMultiplierAbAttr extends AbAttr { } export class PostAttackAbAttr extends AbAttr { + 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, defender: Pokemon, move: Move, hitResult: HitResult, 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, 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, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { return false; } } export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { - private condition: PokemonAttackCondition; + private stealCondition: PokemonAttackCondition; - constructor(condition?: PokemonAttackCondition) { + constructor(stealCondition?: PokemonAttackCondition) { super(); - this.condition = condition; + this.stealCondition = stealCondition; } - applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: 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 (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); }); @@ -1530,7 +1593,7 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { 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[]; } } @@ -1547,7 +1610,7 @@ 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, 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) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; @@ -1578,7 +1641,7 @@ 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, 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)]; @@ -1601,12 +1664,12 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: 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)); + 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); }); @@ -1619,7 +1682,7 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { 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[]; } } @@ -1705,7 +1768,7 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { applyPostKnockOut(pokemon: Pokemon, passive: 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!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); return true; } @@ -1758,7 +1821,10 @@ export class IntimidateImmunityAbAttr extends AbAttr { } 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 + }); } } @@ -1924,7 +1990,7 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { 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)); + Math.max(Math.floor(pokemon.getMaxHp() / this.healRatio), 1), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); return true; } @@ -1952,7 +2018,7 @@ export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr { target.summonData.battleStats[s] = 0; } - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere removed!")); + target.scene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); return true; } @@ -2108,6 +2174,49 @@ 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, 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; + } + + for (const pokemon of allowedParty) { + if (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 { @@ -2167,7 +2276,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { pokemon.loadAssets(false).then(() => pokemon.playAnim()); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` transformed\ninto ${target.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); return true; } @@ -2243,7 +2352,7 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - if (pokemon.getHpRatio() < 1 ) { + if (!pokemon.isFullHp()) { const healAmount = Math.floor(pokemon.getMaxHp() * 0.33); pokemon.heal(healAmount); pokemon.updateInfo(); @@ -2312,7 +2421,11 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : "stats"}!`); + return i18next.t("abilityTriggers:protectStat", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + statName: this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : i18next.t("battle:stats") + }); } } @@ -2328,7 +2441,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; } /** @@ -2341,7 +2455,7 @@ 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, 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); } @@ -2355,17 +2469,33 @@ export class PreSetStatusAbAttr extends AbAttr { } } -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; } + /** + * 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, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.immuneEffects.length || this.immuneEffects.indexOf(effect) > -1) { + if (this.immuneEffects.length < 1 || this.immuneEffects.includes(effect)) { cancelled.value = true; return true; } @@ -2374,18 +2504,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 { 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(); @@ -2396,6 +2551,7 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (tag.tagType === this.immuneTagType) { cancelled.value = true; + this.battlerTag = tag; return true; } @@ -2403,10 +2559,26 @@ 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 { (args[0] as Utils.BooleanHolder).value = true; @@ -2707,7 +2879,7 @@ export class ForewarnAbAttr extends PostSummonAbAttr { } } } - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was forewarned about " + maxMove + "!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:forewarn", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: maxMove })); return true; } } @@ -2719,7 +2891,7 @@ export class FriskAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { for (const opponent of pokemon.getOpponents()) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "'s " + opponent.getAbility().name + "!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:frisk", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), opponentName: opponent.name, opponentAbilityName: opponent.getAbility().name })); setAbilityRevealed(opponent); } return true; @@ -2783,11 +2955,11 @@ export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { } applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { + 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)); + Math.max(Math.floor(pokemon.getMaxHp() / (16 / this.healFactor)), 1), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); return true; } @@ -2806,8 +2978,11 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { const scene = pokemon.scene; + if (pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + return false; + } const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); + scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); return true; } @@ -2877,11 +3052,11 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { */ applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { if (this.effects.includes(pokemon.status?.effect)) { - if (pokemon.getMaxHp() !== pokemon.hp) { + 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() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: pokemon.name, abilityName: abilityName}), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); return true; } } @@ -2910,7 +3085,7 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { } if (this.target?.status) { - this.target.scene.queueMessage(getPokemonMessage(this.target, getStatusEffectHealText(this.target.status?.effect))); + this.target.scene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); this.target.resetStatus(false); this.target.updateInfo(); return true; @@ -2974,12 +3149,17 @@ 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; @@ -3030,11 +3210,11 @@ export class PostTurnStatChangeAbAttr extends PostTurnAbAttr { export class PostTurnHealAbAttr extends PostTurnAbAttr { applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { + 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), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 16), 1), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); return true; } @@ -3078,7 +3258,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { applyPostTurn(pokemon: Pokemon, passive: 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)) { + if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER); pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: getPokemonNameWithAffix(opp)})); hadEffect = true; @@ -3110,7 +3290,7 @@ export class FetchBallAbAttr extends PostTurnAbAttr { 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; @@ -3286,7 +3466,7 @@ export class HealFromBerryUseAbAttr extends AbAttr { pokemon.scene, pokemon.getBattlerIndex(), Math.max(Math.floor(pokemon.getMaxHp() * this.healPercent), 1), - getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP!`), + i18next.t("abilityTriggers:healFromBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true ) ); @@ -3361,7 +3541,7 @@ 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 }); } } @@ -3390,7 +3570,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { const randItem = Utils.randSeedItem(postBattleLoot); if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { 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; } } @@ -3467,7 +3647,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { 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) { + if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { return false; } attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); @@ -3479,7 +3659,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 }); } } @@ -3499,7 +3679,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { } 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 }); } } @@ -3857,7 +4037,7 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt * @returns {string} - The trigger message. */ getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: pokemon.name, abilityName: abilityName }); + return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }); } } @@ -3909,47 +4089,42 @@ 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 => { +async function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon, + applyFunc: AbAttrApplyFunc, + args: any[], + showAbilityInstant: boolean = false, + quiet: boolean = false, +) { + for (const passive of [false, true]) { if (!pokemon.canApplyAbility(passive)) { - if (!passive) { - return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - } else { - return resolve(); - } + 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)) { pokemon.battleData.abilitiesApplied.push(ability.id); } + if (attr.showAbility && !quiet) { if (showAbilityInstant) { pokemon.scene.abilityBar.showAbility(pokemon, passive); @@ -3957,34 +4132,18 @@ function applyAbAttrsInternal(attrType: Constructor queueShowAbility(pokemon, passive); } } + if (!quiet) { - const message = attr.getTriggerMessage(pokemon, (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name, args); + const message = attr.getTriggerMessage(pokemon, ability.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); - } + 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(); } - }; - applyNextAbAttr(); - }); + } + + pokemon.scene.clearPhaseQueueSplice(); + } } export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { @@ -3999,7 +4158,7 @@ export function applyPostBattleInitAbAttrs(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); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, simulated); } export function applyPostDefendAbAttrs(attrType: Constructor, @@ -4059,7 +4218,7 @@ export function applyPostSummonAbAttrs(attrType: Constructor, export function applyPreSwitchOutAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, false, true); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, true); } export function applyPreStatChangeAbAttrs(attrType: Constructor, @@ -4075,7 +4234,7 @@ export function applyPostStatChangeAbAttrs(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); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, !simulated); } export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, @@ -4085,7 +4244,7 @@ export function applyPreApplyBattlerTagAbAttrs(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); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, true); } export function applyPostTurnAbAttrs(attrType: Constructor, @@ -4110,7 +4269,7 @@ export function applyPostTerrainChangeAbAttrs(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); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args); } export function applyPostBattleAbAttrs(attrType: Constructor, @@ -4123,11 +4282,6 @@ export function applyPostFaintAbAttrs(attrType: Constructor, 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); -} - function queueShowAbility(pokemon: Pokemon, passive: boolean): void { pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); pokemon.scene.clearPhaseQueueSplice(); @@ -4149,7 +4303,7 @@ 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), @@ -4189,7 +4343,8 @@ export function initAbilities() { .attr(IntimidateImmunityAbAttr) .ignorable(), new Ability(Abilities.CLOUD_NINE, 3) - .attr(SuppressWeatherEffectAbAttr, true), + .attr(SuppressWeatherEffectAbAttr, true) + .attr(PostSummonUnnamedMessageAbAttr, "The effects of the weather disappeared."), new Ability(Abilities.COMPOUND_EYES, 3) .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.3), new Ability(Abilities.INSOMNIA, 3) @@ -4298,7 +4453,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) @@ -4321,7 +4476,7 @@ export function initAbilities() { new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) - .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5, (user, target, move) => move.category === MoveCategory.PHYSICAL) + .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5) .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category === MoveCategory.PHYSICAL), new Ability(Abilities.CUTE_CHARM, 3) .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), @@ -4467,7 +4622,7 @@ export function initAbilities() { new Ability(Abilities.KLUTZ, 4) .unimplemented(), new Ability(Abilities.MOLD_BREAKER, 4) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " breaks the mold!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonMoldBreaker", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.SUPER_LUCK, 4) .attr(BonusCritAbAttr) @@ -4476,7 +4631,7 @@ export function initAbilities() { .attr(PostFaintContactDamageAbAttr,4) .bypassFaint(), new Ability(Abilities.ANTICIPATION, 4) - .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " shuddered!")), + .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAnticipation", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.FOREWARN, 4) .attr(ForewarnAbAttr), new Ability(Abilities.UNAWARE, 4) @@ -4562,7 +4717,7 @@ 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), @@ -4651,10 +4806,10 @@ export function initAbilities() { .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.1) .partial(), new Ability(Abilities.TURBOBLAZE, 5) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a blazing aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => 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() @@ -4683,17 +4838,17 @@ export function initAbilities() { new Ability(Abilities.REFRIGERATE, 6) .attr(MoveTypeChangeAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL), 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(IncrementMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && move.type === Type.FLYING), new Ability(Abilities.MEGA_LAUNCHER, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PULSE_MOVE), 1.5), new Ability(Abilities.GRASS_PELT, 6) @@ -4712,10 +4867,10 @@ export function initAbilities() { 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() @@ -4898,7 +5053,7 @@ 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), new Ability(Abilities.NEUROFORCE, 7) @@ -4964,8 +5119,7 @@ export function initAbilities() { new Ability(Abilities.SCREEN_CLEANER, 8) .attr(PostSummonRemoveArenaTagAbAttr, [ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT]), new Ability(Abilities.STEELY_SPIRIT, 8) - .attr(MoveTypePowerBoostAbAttr, Type.STEEL) - .partial(), + .attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL), new Ability(Abilities.PERISH_BODY, 8) .attr(PostDefendPerishSongAbAttr, 4), new Ability(Abilities.WANDERING_SPIRIT, 8) @@ -4979,10 +5133,11 @@ 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) @@ -5007,14 +5162,14 @@ export function initAbilities() { new Ability(Abilities.GRIM_NEIGH, 8) .attr(PostVictoryStatChangeAbAttr, BattleStat.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(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(UncopiableAbilityAbAttr) @@ -5087,19 +5242,19 @@ export function initAbilities() { .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(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(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(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(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(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonTabletsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(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(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.SPDEF) })) .ignorable(), new Ability(Abilities.ORICHALCUM_PULSE, 9) .attr(PostSummonWeatherChangeAbAttr, WeatherType.SUNNY) 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..fd72ab21026 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -2,7 +2,7 @@ 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 { getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; @@ -46,7 +46,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() })); } } @@ -77,14 +77,14 @@ export class MistTag extends ArenaTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(getPokemonMessage(source, "'s team became\nshrouded in mist!")); + arena.scene.queueMessage(i18next.t("arenaTag:mistOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); } } 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 +144,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 +160,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,7 +176,7 @@ 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" : ""}`)); } } } @@ -198,7 +198,7 @@ abstract class ConditionalProtectTag extends ArenaTag { } 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 @@ -223,7 +223,7 @@ abstract class ConditionalProtectTag extends ArenaTag { && 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, "!")}`); + arena.scene.queueMessage(i18next.t("arenaTag:conditionalProtectApply", { moveName: super.getMoveName(), pokemonNameWithAffix: getPokemonNameWithAffix(target) })); return true; } return false; @@ -281,7 +281,7 @@ class MatBlockTag extends ConditionalProtectTag { 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!")); + arena.scene.queueMessage(i18next.t("arenaTag:matBlockOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); } } @@ -319,7 +319,7 @@ class WishTag extends ArenaTag { onAdd(arena: Arena): void { const user = arena.scene.getPokemonById(this.sourceId); this.battlerIndex = user.getBattlerIndex(); - this.triggerMessage = getPokemonMessage(user, "'s wish\ncame true!"); + this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user) }); this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1); } @@ -373,11 +373,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 +391,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")); } } @@ -463,7 +463,7 @@ class SpikesTag extends ArenaTrapTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); + arena.scene.queueMessage(i18next.t("arenaTag:spikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -476,7 +476,7 @@ class SpikesTag extends ArenaTrapTag { const damageHpRatio = 1 / (10 - 2 * this.layers); const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is hurt\nby the spikes!")); + pokemon.scene.queueMessage(i18next.t("arenaTag:spikesActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -508,7 +508,7 @@ class ToxicSpikesTag extends ArenaTrapTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); + arena.scene.queueMessage(i18next.t("arenaTag:toxicSpikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -523,12 +523,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; } } @@ -590,7 +590,7 @@ class StealthRockTag extends ArenaTrapTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`Pointed stones float in the air\naround ${source.getOpponentDescriptor()}!`); + arena.scene.queueMessage(i18next.t("arenaTag:stealthRockOnAdd", { opponentDesc: source.getOpponentDescriptor() })); } } @@ -635,7 +635,7 @@ class StealthRockTag extends ArenaTrapTag { if (damageHpRatio) { const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(`Pointed stones dug into\n${pokemon.name}!`); + pokemon.scene.queueMessage(i18next.t("arenaTag:stealthRockActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -663,12 +663,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!`); + arena.scene.queueMessage(i18next.t("arenaTag:stickyWebOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -677,7 +674,7 @@ 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!`); + pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); const statLevels = new Utils.NumberHolder(-1); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value)); } @@ -705,11 +702,11 @@ export class TrickRoomTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(getPokemonMessage(arena.scene.getPokemonById(this.sourceId), " twisted\nthe dimensions!")); + arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(arena.scene.getPokemonById(this.sourceId)) })); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The twisted dimensions\nreturned to normal!"); + arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnRemove")); } } @@ -724,7 +721,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 +730,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,7 +746,7 @@ 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); @@ -759,7 +756,7 @@ class TailwindTag extends ArenaTag { // 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)) { @@ -771,7 +768,7 @@ class TailwindTag extends ArenaTag { 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,11 +783,11 @@ 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")); } } diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 7dccd4f8a7c..d70e6655f8c 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -1,4 +1,4 @@ -import i18next from "i18next"; +import i18next, { ParseKeys } from "i18next"; export enum BattleStat { ATK, @@ -32,7 +32,7 @@ export function getBattleStatName(stat: BattleStat) { } } -export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean) { +export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: number = 1) { const stringKey = (() => { if (up) { switch (levels) { @@ -64,6 +64,5 @@ export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string } } })(); - - return i18next.t(stringKey, { pokemonNameWithAffix, stats }); + return i18next.t(stringKey as ParseKeys, { pokemonNameWithAffix, stats, count }); } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 015b8b44984..94df265ff5e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,6 +1,6 @@ import { CommonAnim, CommonBattleAnim } from "./battle-anims"; -import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangeCallback, StatChangePhase } from "../phases"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import { Stat, getStatName } from "./pokemon-stat"; import { StatusEffect } from "./status-effect"; @@ -31,14 +31,14 @@ 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; - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId?: integer) { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove: Moves, sourceId?: number) { this.tagType = tagType; - this.lapseType = lapseType; + this.lapseTypes = Array.isArray(lapseType) ? lapseType : [ lapseType ]; this.turnCount = turnCount; this.sourceMove = sourceMove; this.sourceId = sourceId; @@ -92,30 +92,34 @@ export interface TerrainBattlerTag { terrainTypes: TerrainType[]; } +/** + * 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); - - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.getMoveQueue().shift(); - - return true; + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + pokemon.getMoveQueue().shift(); + } + return super.lapse(pokemon, lapseType); } } export class TrappedTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId: integer) { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) { super(tagType, lapseType, turnCount, sourceMove, sourceId); } @@ -142,7 +146,7 @@ export class TrappedTag extends BattlerTag { } getDescriptor(): string { - return "trapping"; + return i18next.t("battlerTags:trappedDesc"); } isSourceLinked(): boolean { @@ -154,9 +158,12 @@ export class TrappedTag extends BattlerTag { } } +/** + * 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 +176,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("battle:battlerTagsFlinchedLapse", { 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,17 +213,16 @@ 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) { + constructor(turnCount: number, sourceMove: Moves) { super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove); } @@ -260,7 +272,7 @@ export class ConfusedTag extends BattlerTag { } getDescriptor(): string { - return "confusion"; + return i18next.t("battlerTags:confusedDesc"); } } @@ -270,7 +282,7 @@ export class ConfusedTag extends BattlerTag { * @see {@linkcode apply} */ export class DestinyBondTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { + constructor(sourceMove: Moves, sourceId: number) { super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId); } @@ -313,7 +325,7 @@ 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); } @@ -327,7 +339,7 @@ export class InfatuatedTag extends BattlerTag { pokemon.scene.queueMessage( i18next.t("battle:battlerTagsInfatuatedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) }) ); } @@ -345,7 +357,7 @@ export class InfatuatedTag extends BattlerTag { pokemon.scene.queueMessage( i18next.t("battle:battlerTagsInfatuatedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) }) ); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); @@ -370,14 +382,14 @@ 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) { + constructor(sourceId: number) { super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, Moves.LEECH_SEED, sourceId); } @@ -427,7 +439,7 @@ export class SeedTag extends BattlerTag { } getDescriptor(): string { - return "seeding"; + return i18next.t("battlerTags:seedDesc"); } } @@ -467,32 +479,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); } @@ -565,7 +573,7 @@ export class EncoreTag extends BattlerTag { } export class HelpingHandTag extends BattlerTag { - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.HELPING_HAND, BattlerTagLapseType.TURN_END, 1, Moves.HELPING_HAND, sourceId); } @@ -573,7 +581,7 @@ export class HelpingHandTag extends BattlerTag { pokemon.scene.queueMessage( i18next.t("battle:battlerTagsHelpingHandOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), - pokemonName: pokemon.name + pokemonName: getPokemonNameWithAffix(pokemon) }) ); } @@ -584,7 +592,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); } @@ -622,7 +630,32 @@ export class IngrainTag extends TrappedTag { } 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 StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], -1)); + return true; + } + + return false; } } @@ -648,7 +681,7 @@ export class AquaRingTag extends BattlerTag { Math.floor(pokemon.getMaxHp() / 16), i18next.t("battle:battlerTagsAquaRingLapse", { moveName: this.getMoveName(), - pokemonName: pokemon.name + pokemonName: getPokemonNameWithAffix(pokemon) }), true)); } @@ -709,14 +742,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; @@ -760,34 +793,34 @@ 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", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name, + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), 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", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) }); } } 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); } @@ -797,32 +830,32 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } 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, + 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); } @@ -835,7 +868,7 @@ 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); } @@ -845,7 +878,7 @@ export class MagmaStormTag extends DamagingTrapTag { } 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); } @@ -855,7 +888,7 @@ export class SnapTrapTag extends DamagingTrapTag { } 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); } @@ -868,7 +901,7 @@ export class ThunderCageTag extends DamagingTrapTag { } export class InfestationTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.INFESTATION, CommonAnim.INFESTATION, turnCount, Moves.INFESTATION, sourceId); } @@ -883,7 +916,7 @@ 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 { @@ -910,9 +943,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 +967,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(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + } } } @@ -944,9 +979,9 @@ export class ContactDamageProtectedTag extends ProtectedTag { export class ContactStatChangeProtectedTag 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; @@ -1055,7 +1090,7 @@ export class SturdyTag extends BattlerTag { } export class PerishSongTag extends BattlerTag { - constructor(turnCount: integer) { + constructor(turnCount: number) { super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, Moves.PERISH_SONG); } @@ -1104,14 +1139,14 @@ 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("battle:battlerTagsCenterOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } export class AbilityBattlerTag extends BattlerTag { public ability: Abilities; - constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: integer) { + constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: number) { super(tagType, lapseType, turnCount, undefined); this.ability = ability; @@ -1199,7 +1234,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { 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) => { + stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = stats[i]; return value; @@ -1265,7 +1300,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); } @@ -1311,13 +1346,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("battle:battlerTagsMagnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " stopped levitating!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsMagnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -1372,22 +1407,10 @@ export class CritBoostTag extends BattlerTag { } } -export class AlwaysCritTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ALWAYS_CRIT, BattlerTagLapseType.TURN_END, 2, sourceMove); - } -} - -export class IgnoreAccuracyTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.IGNORE_ACCURACY, BattlerTagLapseType.TURN_END, 2, sourceMove); - } -} - 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); } @@ -1434,9 +1457,9 @@ export class SaltCuredTag extends BattlerTag { } export class CursedTag extends BattlerTag { - private sourceIndex: integer; + private sourceIndex: number; - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, Moves.CURSE, sourceId); } @@ -1475,8 +1498,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) { @@ -1535,7 +1558,96 @@ export class IceFaceTag extends BattlerTag { } } -export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves, sourceId: integer): BattlerTag { + +/** + * 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: { [BattleStat.DEF]: number; [BattleStat.SPDEF]: number } = { + [BattleStat.DEF]: 0, + [BattleStat.SPDEF]: 0 + }; + + constructor(sourceMove: Moves = Moves.NONE) { + super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove); + } + + private onStatsChanged: StatChangeCallback = (_, statsChanged, statChanges) => { + const defChange = statChanges[statsChanged.indexOf(BattleStat.DEF)] ?? 0; + const spDefChange = statChanges[statsChanged.indexOf(BattleStat.SPDEF)] ?? 0; + + if (defChange) { + this.statChangeCounts[BattleStat.DEF]++; + } + + if (spDefChange) { + this.statChangeCounts[BattleStat.SPDEF]++; + } + }; + + loadTag(source: BattlerTag | any): void { + super.loadTag(source); + this.stockpiledCount = source.stockpiledCount || 0; + this.statChangeCounts = { + [ BattleStat.DEF ]: source.statChangeCounts?.[ BattleStat.DEF ] ?? 0, + [ BattleStat.SPDEF ]: source.statChangeCounts?.[ BattleStat.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("battle:battlerTagsStockpilingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + stockpiledCount: this.stockpiledCount + })); + + // Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes. + pokemon.scene.unshiftPhase(new StatChangePhase( + pokemon.scene, pokemon.getBattlerIndex(), true, + [BattleStat.SPDEF, BattleStat.DEF], 1, true, false, true, this.onStatsChanged + )); + } + } + + 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[BattleStat.DEF]; + const spDefChange = this.statChangeCounts[BattleStat.SPDEF]; + + if (defChange) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF], -defChange, true, false, true)); + } + + if (spDefChange) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.SPDEF], -spDefChange, true, false, true)); + } + } +} + +export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: return new RechargingTag(sourceMove); @@ -1552,9 +1664,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: @@ -1627,13 +1739,15 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.CRIT_BOOST: return new CritBoostTag(tagType, sourceMove); case BattlerTagType.ALWAYS_CRIT: - return new AlwaysCritTag(sourceMove); + case BattlerTagType.IGNORE_ACCURACY: + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); case BattlerTagType.NO_CRIT: return new BattlerTag(tagType, BattlerTagLapseType.AFTER_MOVE, turnCount, sourceMove); - case BattlerTagType.IGNORE_ACCURACY: - return new IgnoreAccuracyTag(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: @@ -1652,6 +1766,10 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new DestinyBondTag(sourceMove, sourceId); case BattlerTagType.ICE_FACE: return new IceFaceTag(sourceMove); + case BattlerTagType.STOCKPILING: + return new StockpilingTag(sourceMove); + case BattlerTagType.OCTOLOCK: + return new OctolockTag(sourceId); 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 4e0d1dbd85f..5ca64544544 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -1,5 +1,5 @@ import { PokemonHealPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult } from "../field/pokemon"; import { BattleStat } from "./battle-stat"; import { getStatusEffectHealText } from "./status-effect"; @@ -72,7 +72,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - hpHealed.value, getPokemonMessage(pokemon, `'s ${getBerryName(berryType)}\nrestored its HP!`), true)); + hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); }; case BerryType.LUM: return (pokemon: Pokemon) => { @@ -80,7 +80,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { pokemon.battleData.berriesEaten.push(berryType); } if (pokemon.status) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); } pokemon.resetStatus(true, true); pokemon.updateInfo(); @@ -123,7 +123,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) ? pokemon.getMoveset().find(m => !m.getPpRatio()) : pokemon.getMoveset().find(m => m.getPpRatio() < 1); if (ppRestoreMove !== undefined) { ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); + 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..479e0994cb6 100644 --- a/src/data/biomes.ts +++ b/src/data/biomes.ts @@ -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: diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 75b200b24ee..7bea68e36c7 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,52 +1,97 @@ 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.js"; import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; -import Pokemon from "#app/field/pokemon.js"; +import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; import { BattleType, FixedBattleConfig } from "#app/battle.js"; import Trainer, { TrainerVariant } from "#app/field/trainer.js"; import { GameMode } from "#app/game-mode.js"; import { Type } from "./type"; -import { pokemonEvolutions } from "./pokemon-evolutions"; -import { pokemonFormChanges } from "./pokemon-forms"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { Nature } from "./nature"; +import { Moves } from "#app/enums/moves.js"; import { TypeColor, TypeShadow } from "#app/enums/color.js"; +import { Gender } from "./gender"; +import { pokemonEvolutions } from "./pokemon-evolutions"; +import { pokemonFormChanges } from "./pokemon-forms"; + +/** 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 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 +106,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 +118,6 @@ export abstract class Challenge { this.severity = 0; this.maxSeverity = 0; this.conditions = []; - this.challengeTypes = []; } /** @@ -87,7 +130,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 +138,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 +147,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 +157,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 +165,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 +177,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 +201,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 +220,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 +232,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 +244,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 +252,147 @@ 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. + * @param checkEvolutions {@link boolean} If true, check the pokemon's future evolutions + * @param checkForms {@link boolean} If true, check the pokemon's alternative forms + * @returns {@link boolean} Whether this function did anything. + */ + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean, checkForms?: boolean): 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 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 +403,68 @@ 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, checkEvolutions?: boolean): boolean { + const generations = [pokemon.generation]; + const checkPokemonEvolutions = checkEvolutions ?? true as boolean; + if (soft) { + const speciesToCheck = [pokemon.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (pokemonEvolutions.hasOwnProperty(checking) && checkPokemonEvolutions) { + 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; + 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,62 +531,49 @@ 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, checkEvolutions?: boolean, checkForms?: boolean): boolean { + const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); + const types = [speciesForm.type1, speciesForm.type2]; + const checkPokemonEvolutions = checkEvolutions ?? true as boolean; + const checkPokemonForms = checkForms ?? true as boolean; + if (soft) { + const speciesToCheck = [pokemon.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (pokemonEvolutions.hasOwnProperty(checking) && checkPokemonEvolutions) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); + }); + } + if (pokemonFormChanges.hasOwnProperty(checking) && checkPokemonForms) { + 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)) { + valid.value = false; + return true; + } + } + /** * @overrides */ @@ -512,28 +623,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; } + applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { + if (defaultStarterSpecies.includes(species) && cost.value !== 3) { + cost.value = 3; + 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.gender = Gender.MALE; // Starters default to male + pokemon.formIndex = 0; // Froakie should be base form + pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats + return true; + } + /** * @overrides */ @@ -555,7 +676,6 @@ export class FreshStartChallenge extends Challenge { export class LowerStarterMaxCostChallenge extends Challenge { constructor() { super(Challenges.LOWER_MAX_STARTER_COST, 9); - this.addChallengeType(ChallengeType.STARTER_CHOICE); } /** @@ -565,22 +685,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 +710,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 +719,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 +736,169 @@ 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, checkEvolutions?: boolean, checkForms?: 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 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], args[4], args[5]); + 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.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 +909,8 @@ 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); } throw new Error("Unknown challenge copied"); } @@ -671,8 +921,6 @@ export function initChallenges() { allChallenges.push( new SingleGenerationChallenge(), new SingleTypeChallenge(), - // new LowerStarterMaxCostChallenge(), - // new LowerStarterPointsChallenge(), - // new FreshStartChallenge() + new FreshStartChallenge(), ); } diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index ec3358b1a77..4386515c953 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -459,6 +459,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.ROCKET_ADMIN]: [ + { + encounter: [ + "dialogue:rocket_admin.encounter.1", + "dialogue:rocket_admin.encounter.2", + "dialogue:rocket_admin.encounter.3", + ], + victory: [ + "dialogue:rocket_admin.victory.1", + "dialogue:rocket_admin.victory.2", + "dialogue:rocket_admin.victory.3", + ] + } + ], [TrainerType.MAGMA_GRUNT]: [ { encounter: [ @@ -469,6 +483,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.MAGMA_ADMIN]: [ + { + encounter: [ + "dialogue:magma_admin.encounter.1", + "dialogue:magma_admin.encounter.2", + "dialogue:magma_admin.encounter.3", + ], + victory: [ + "dialogue:magma_admin.victory.1", + "dialogue:magma_admin.victory.2", + "dialogue:magma_admin.victory.3", + ] + } + ], [TrainerType.AQUA_GRUNT]: [ { encounter: [ @@ -479,6 +507,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.AQUA_ADMIN]: [ + { + encounter: [ + "dialogue:aqua_admin.encounter.1", + "dialogue:aqua_admin.encounter.2", + "dialogue:aqua_admin.encounter.3", + ], + victory: [ + "dialogue:aqua_admin.victory.1", + "dialogue:aqua_admin.victory.2", + "dialogue:aqua_admin.victory.3", + ] + } + ], [TrainerType.GALACTIC_GRUNT]: [ { encounter: [ @@ -489,6 +531,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.GALACTIC_ADMIN]: [ + { + encounter: [ + "dialogue:galactic_admin.encounter.1", + "dialogue:galactic_admin.encounter.2", + "dialogue:galactic_admin.encounter.3", + ], + victory: [ + "dialogue:galactic_admin.victory.1", + "dialogue:galactic_admin.victory.2", + "dialogue:galactic_admin.victory.3", + ] + } + ], [TrainerType.PLASMA_GRUNT]: [ { encounter: [ @@ -499,6 +555,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.PLASMA_SAGE]: [ + { + encounter: [ + "dialogue:plasma_sage.encounter.1", + "dialogue:plasma_sage.encounter.2", + "dialogue:plasma_sage.encounter.3", + ], + victory: [ + "dialogue:plasma_sage.victory.1", + "dialogue:plasma_sage.victory.2", + "dialogue:plasma_sage.victory.3", + ] + } + ], [TrainerType.FLARE_GRUNT]: [ { encounter: [ @@ -509,6 +579,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.FLARE_ADMIN]: [ + { + encounter: [ + "dialogue:flare_admin.encounter.1", + "dialogue:flare_admin.encounter.2", + "dialogue:flare_admin.encounter.3", + ], + victory: [ + "dialogue:flare_admin.victory.1", + "dialogue:flare_admin.victory.2", + "dialogue:flare_admin.victory.3", + ] + } + ], [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ { encounter: [ diff --git a/src/data/egg-moves.ts b/src/data/egg-moves.ts index 64e75113dbc..1f893a0c522 100644 --- a/src/data/egg-moves.ts +++ b/src/data/egg-moves.ts @@ -438,7 +438,7 @@ export const speciesEggMoves = { [Species.CHEWTLE]: [ Moves.FIRE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ], [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.ZIPPY_ZAP ], [Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ], - [Species.APPLIN]: [ Moves.DRAGON_CHEER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], + [Species.APPLIN]: [ Moves.MATCHA_GOTCHA, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.STONE_EDGE, Moves.PRECIPICE_BLADES ], [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ], [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.FILLET_AWAY ], diff --git a/src/data/egg.ts b/src/data/egg.ts index bb952d71fb0..a7a1b167238 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -2,7 +2,7 @@ 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"; @@ -66,7 +66,7 @@ export interface IEggOptions { export class Egg { //// - // #region Privat properties + // #region Private properties //// private _id: number; @@ -166,12 +166,12 @@ export class Egg { if (eggOptions.species) { this._tier = this.getEggTierFromSpeciesStarterValue(); this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); - // If species has no variant, set variantTier to common. This needs to - // be done because species with no variants get filtered at rollSpecies but since the - // species is set the check never happens - if (!getPokemonSpecies(this.species).hasVariants()) { - this._variantTier = VariantTier.COMMON; - } + } + // If species has no variant, set variantTier to common. This needs to + // be done because species with no variants get filtered at rollSpecies but if the + // species is set via options or the legendary gacha pokemon gets choosen the check never happens + if (this._species && !getPokemonSpecies(this._species).hasVariants()) { + this._variantTier = VariantTier.COMMON; } // Needs this._tier so it needs to be generated afer the tier override if bought from same species this._eggMoveIndex = eggOptions.eggMoveIndex ?? this.rollEggMoveIndex(); @@ -182,7 +182,7 @@ export class Egg { } //// - // #region Public methodes + // #region Public methods //// public isManaphyEgg(): boolean { @@ -212,7 +212,7 @@ export class Egg { 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; + abilityIndex = 2; } // This function has way to many optional parameters @@ -281,7 +281,7 @@ export class Egg { //// //// - // #region Private methodes + // #region Private methods //// private rollEggMoveIndex() { diff --git a/src/data/move.ts b/src/data/move.ts index 5ab4b1e8a64..13282a1a3d1 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,22 +1,21 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; -import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; +import { BattleEndPhase, MoveEndPhase, 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, HelpingHandTag, SemiInvulnerableTag, StockpilingTag, 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 { getTypeResistances, 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, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability"; import { allAbilities } from "./ability"; -import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier"; -import { BattlerIndex } from "../battle"; +import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier"; +import { BattlerIndex, BattleType } from "../battle"; import { Stat } from "./pokemon-stat"; import { TerrainType } from "./terrain"; -import { SpeciesFormChangeActiveTrigger } from "./pokemon-forms"; import { ModifierPoolType } from "#app/modifier/modifier-type"; import { Command } from "../ui/command-ui-handler"; import i18next from "i18next"; @@ -92,6 +91,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; @@ -549,6 +552,17 @@ export default class Move implements Localizable { 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): this { + 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 @@ -655,6 +669,112 @@ 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) { + const moveAccuracy = new Utils.NumberHolder(this.accuracy); + + applyMoveAttrs(VariableAccuracyAttr, user, target, this, moveAccuracy); + applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this, { value: false }, 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): number { + if (this.category === MoveCategory.STATUS) { + return -1; + } + + const power = new Utils.NumberHolder(this.power); + const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); + + applyPreAttackAbAttrs(MoveTypeChangeAttr, source, target, this, 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, power); + + if (source.getAlly()) { + applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source.getAlly(), target, this, power); + } + + const fieldAuras = new Set( + source.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, this, [power]); + } + + const alliedField: Pokemon[] = source instanceof PlayerPokemon ? source.scene.getPlayerField() : source.scene.getEnemyField(); + alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, target, this, 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 { @@ -853,10 +973,12 @@ 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, moveChance, move, target, selfEffect, showAbility); + if (!selfEffect) { + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, moveChance); + } return moveChance.value; } } @@ -1085,6 +1207,7 @@ 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) { @@ -1097,13 +1220,12 @@ export class RecoilAttr extends MoveEffectAttr { 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 +1277,7 @@ export class SacrificialAttr extends MoveEffectAttr { **/ export class SacrificialAttrOnHit extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, MoveEffectTrigger.HIT); } /** @@ -1215,7 +1337,7 @@ export class HalfSacrificialAttr extends MoveEffectAttr { applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (!cancelled.value) { user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, " cut its own HP to power up its move!")); // Queue recoil message + user.scene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", {pokemonName: getPokemonNameWithAffix(user)})); // Queue recoil message } return true; } @@ -1265,7 +1387,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)); + Math.max(Math.floor(target.getMaxHp() * healRatio), 1), i18next.t("moveTriggers:healHp", {pokemonName: getPokemonNameWithAffix(target)}), true, !this.showAnim)); } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { @@ -1312,6 +1434,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 +1481,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; } @@ -1512,16 +1667,21 @@ export class HitHealAttr extends MoveEffectAttr { if (this.healStat) { // Strength Sap formula healAmount = target.getBattleStat(this.healStat); - message = i18next.t("battle:drainMessage", {pokemonName: target.name}); + 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}); + 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 = null; + } else { + user.turnData.damageTaken += healAmount; + healAmount = healAmount * -1; + message = null; + } } user.scene.unshiftPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), healAmount, message, false, true)); return true; @@ -1617,6 +1777,7 @@ export class MultiHitAttr extends MoveAttr { } else { const hitType = new Utils.IntegerHolder(this.multiHitType); applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); + this.multiHitType = hitType.value; hitTimes = this.getHitCount(user, target); } @@ -1655,13 +1816,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 @@ -1703,7 +1861,7 @@ export class StatusEffectAttr extends MoveEffectAttr { } 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; @@ -1724,7 +1882,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 +1902,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,7 +1913,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const statusToApply: StatusEffect = user.status?.effect; + const statusToApply: StatusEffect = user.status?.effect ?? (user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined); if (target.status) { return false; @@ -1763,7 +1921,9 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { const statusAfflictResult = target.trySetStatus(statusToApply, true, user); if (statusAfflictResult) { - user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect))); + if (user.status) { + user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); + } user.resetStatus(); user.updateInfo(); } @@ -1796,7 +1956,7 @@ 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); @@ -1804,7 +1964,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { 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); }); @@ -1817,7 +1977,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 { @@ -1857,7 +2017,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; } @@ -1870,7 +2029,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()); } @@ -1883,9 +2043,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})); } } @@ -1894,7 +2054,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 { @@ -1909,7 +2069,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { } /** - * Attribute that causes targets of the move to eat a berry. If chosenBerry is not overridden, a random berry will be picked from the target's inventory. + * Attribute that causes targets of the move to eat a berry. Used for Teatime, Stuff Cheeks */ export class EatBerryAttr extends MoveEffectAttr { protected chosenBerry: BerryModifier; @@ -1918,42 +2078,29 @@ export class EatBerryAttr extends MoveEffectAttr { this.chosenBerry = undefined; } /** - * Causes the target to eat a berry. - * @param user {@linkcode Pokemon} Pokemon that used the move - * @param target {@linkcode Pokemon} Pokemon that will eat a berry - * @param move {@linkcode Move} The move being used - * @param args Unused - * @returns {boolean} true if the function succeeds - */ + * Causes the target to eat a berry. + * @param user {@linkcode Pokemon} Pokemon that used the move + * @param target {@linkcode Pokemon} Pokemon that will eat a berry + * @param move {@linkcode Move} The move being used + * @param args Unused + * @returns {boolean} true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - if (this.chosenBerry === undefined) { // if no berry has been provided, pick a random berry from their inventory - const heldBerries = this.getTargetHeldBerries(target); - if (heldBerries.length <= 0) { - return false; - } - this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + const heldBerries = this.getTargetHeldBerries(target); + if (heldBerries.length <= 0) { + return false; } - - getBerryEffectFunc(this.chosenBerry.berryType)(target); // target eats the berry - + this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; const preserve = new Utils.BooleanHolder(false); - target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); - - if (!preserve.value) { // remove the eaten berry if not preserved - if (!--this.chosenBerry.stackCount) { - target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } - target.scene.updateModifiers(target.isPlayer()); + target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); // check for berry pouch preservation + if (!preserve.value) { + this.reduceBerryModifier(target); } - - this.chosenBerry = undefined; - - applyAbAttrs(HealFromBerryUseAbAttr, target, new Utils.BooleanHolder(false)); - + this.eatBerry(target); return true; } @@ -1962,7 +2109,21 @@ export class EatBerryAttr extends MoveEffectAttr { && (m as BerryModifier).pokemonId === target.id, target.isPlayer()) as BerryModifier[]; } + reduceBerryModifier(target: Pokemon) { + if (this.chosenBerry.stackCount === 1) { + target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); + } else { + this.chosenBerry.stackCount--; + } + target.scene.updateModifiers(target.isPlayer()); + } + + eatBerry(consumer: Pokemon) { + getBerryEffectFunc(this.chosenBerry.berryType)(consumer); // consumer eats the berry + applyAbAttrs(HealFromBerryUseAbAttr, consumer, new Utils.BooleanHolder(false)); + } } + /** * Attribute used for moves that steal a random berry from the target. The user then eats the stolen berry. * Used for Pluck & Bug Bite. @@ -1972,36 +2133,31 @@ export class StealEatBerryAttr extends EatBerryAttr { super(); } /** - * User steals a random berry from the target and then eats it. - * @param {Pokemon} user Pokemon that used the move and will eat the stolen berry - * @param {Pokemon} target Pokemon that will have its berry stolen - * @param {Move} move Move being used - * @param {any[]} args Unused - * @returns {boolean} true if the function succeeds - */ + * User steals a random berry from the target and then eats it. + * @param {Pokemon} user Pokemon that used the move and will eat the stolen berry + * @param {Pokemon} target Pokemon that will have its berry stolen + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockItemTheftAbAttr, target, cancelled); // check for abilities that block item theft if (cancelled.value === true) { return false; } - const heldBerries = this.getTargetHeldBerries(target).filter(i => i.getTransferrable(false)); - - if (heldBerries.length) { // if the target has berries, pick a random berry and steal it - this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; - - if (this.chosenBerry.stackCount === 1) { // remove modifier if its the last berry - target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } - target.scene.updateModifiers(target.isPlayer()); - - user.scene.queueMessage(getPokemonMessage(user, ` stole and ate\n${target.name}'s ${this.chosenBerry.type.name}!`)); - return super.apply(user, user, move, args); + const heldBerries = this.getTargetHeldBerries(target); + if (heldBerries.length <= 0) { + return false; } - - return false; + // if the target has berries, pick a random berry and steal it + this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + const message = i18next.t("battle:stealEatBerry", {pokemonName: user.name, targetName: target.name, berryName: this.chosenBerry.type.name}); + user.scene.queueMessage(message); + this.reduceBerryModifier(target); + this.eatBerry(user); + return true; } } @@ -2035,9 +2191,15 @@ 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(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); pokemon.resetStatus(); pokemon.updateInfo(); @@ -2210,7 +2372,7 @@ export class ChargeAttr extends OverrideMoveEffectAttr { if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && (this.sameTurn || lastMove.turn !== user.scene.currentBattle.turn))) { (args[0] as Utils.BooleanHolder).value = true; new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); + 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); } @@ -2220,7 +2382,11 @@ 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); + let movesetMove = user.moveset.find(m => m.moveId === move.id); + if (!movesetMove) { // account for any move that calls a ChargeAttr move when the ChargeAttr move does not exist in moveset + movesetMove = new PokemonMove(move.id, 0, 0, true); + } + user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], movesetMove, true), this.followUpPriority); } user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); resolve(true); @@ -2262,7 +2428,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; } @@ -2314,14 +2480,14 @@ 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)), moveName: move.name}), null, () => resolve(true)); } }); } @@ -2348,7 +2514,7 @@ export class StatChangeAttr 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) { const levels = this.getLevels(user); user.scene.unshiftPhase(new StatChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, levels, this.showMessage)); @@ -2461,56 +2627,32 @@ export class GrowthStatChangeAttr extends StatChangeAttr { } } -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 { private cutRatio: integer; + private messageCallback: ((user: Pokemon) => void) | undefined; - constructor(stat: BattleStat | BattleStat[], levels: integer, cutRatio: integer) { + constructor(stat: BattleStat | 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(Math.floor(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.summonData.battleStats[s] < 6); } } @@ -2530,8 +2672,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; } @@ -2549,7 +2690,7 @@ export class InvertStatsAttr extends MoveEffectAttr { 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; } @@ -2567,7 +2708,7 @@ export class ResetStatsAttr extends MoveEffectAttr { target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere eliminated!")); + target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -2597,7 +2738,7 @@ export class SwapStatsAttr extends MoveEffectAttr { } target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(user, " switched stat changes with the target!")); + target.scene.queueMessage(i18next.t("moveTriggers:switchedStatChanges", {pokemonName: getPokemonNameWithAffix(user)})); return true; } } @@ -2742,7 +2883,12 @@ 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; } @@ -2753,7 +2899,7 @@ const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move 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; @@ -2966,9 +3112,29 @@ export class HpPowerAttr extends VariablePowerAttr { } } +/** + * 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 = Math.max(Math.floor(this.maxBasePower * target.getHpRatio()), 1); return true; } @@ -3012,7 +3178,7 @@ 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; }; @@ -3162,7 +3328,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)); + Math.max(Math.floor(target.getMaxHp() / 4), 1), i18next.t("moveTriggers:regainedHealth", {pokemonName: getPokemonNameWithAffix(target)}), true)); } return true; @@ -3179,6 +3345,62 @@ 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?.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?.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) => user.getTag(StockpilingTag)?.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. @@ -3216,6 +3438,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(); @@ -3527,26 +3815,18 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Wellspring Mask - move.type = Type.WATER; - break; - case 2: // Hearthflame Mask - move.type = Type.FIRE; - break; - case 3: // Cornerstone Mask - move.type = Type.ROCK; - break; - case 4: // Teal Mask Tera - move.type = Type.GRASS; - break; case 5: // Wellspring Mask Tera move.type = Type.WATER; break; + case 2: // Hearthflame Mask case 6: // Hearthflame Mask Tera move.type = Type.FIRE; break; + case 3: // Cornerstone Mask case 7: // Cornerstone Mask Tera move.type = Type.ROCK; break; + case 4: // Teal Mask Tera default: move.type = Type.GRASS; break; @@ -3602,7 +3882,7 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.isGrounded) { + if (!user.isGrounded()) { return false; } @@ -3796,7 +4076,7 @@ const crashDamageFunc = (user: Pokemon, move: Move) => { } user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - user.scene.queueMessage(getPokemonMessage(user, " kept going\nand crashed!")); + user.scene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", {pokemonName: getPokemonNameWithAffix(user)})); user.turnData.damageTaken += Math.floor(user.getMaxHp() / 2); return true; @@ -3836,7 +4116,7 @@ export class DisableMoveAttr extends MoveEffectAttr { target.summonData.disabledMove = disabledMove.moveId; target.summonData.disabledTurns = 4; - user.scene.queueMessage(getPokemonMessage(target, `'s ${disabledMove.getName()}\nwas disabled!`)); + user.scene.queueMessage(i18next.t("abilityTriggers:postDefendMoveDisable", { pokemonNameWithAffix: getPokemonNameWithAffix(target), moveName: disabledMove.getName()})); return true; } @@ -3887,19 +4167,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; } } @@ -3907,7 +4184,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; }; @@ -3932,7 +4209,7 @@ 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); } @@ -3991,7 +4268,7 @@ 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; } @@ -4012,7 +4289,7 @@ export class CurseAttr extends MoveEffectAttr { user.scene.queueMessage( i18next.t("battle:battlerTagsCursedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user), - pokemonName: target.name + pokemonName: getPokemonNameWithAffix(target) }) ); @@ -4120,12 +4397,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); @@ -4136,23 +4407,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; } @@ -4168,7 +4423,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; } @@ -4203,7 +4458,7 @@ export class AddArenaTagAttr extends MoveEffectAttr { public selfSideTarget: boolean; constructor(tagType: ArenaTagType, turnCount?: integer, failOnOverlap: boolean = false, selfSideTarget: boolean = false) { - super(true, MoveEffectTrigger.POST_APPLY, true); + super(true, MoveEffectTrigger.POST_APPLY); this.tagType = tagType; this.turnCount = turnCount; @@ -4288,7 +4543,7 @@ 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)) { @@ -4408,7 +4663,7 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { } - 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; } } @@ -4449,7 +4704,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { 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); + user.scene.queueMessage(`${getPokemonNameWithAffix(pokemon)} was revived!`,0,true); if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { const allyPokemon = user.getAlly(); @@ -4500,24 +4755,21 @@ 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 { + if (switchOutTarget.hp > 0) { + applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); + // switchOut below sets the UI to select party(this is not a separate Phase), then adds a SwitchSummonPhase with selected 'mon + (switchOutTarget as PlayerPokemon).switchOut(this.batonPass).then(() => 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.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot), false, this.batonPass, false), MoveEndPhase); } } else { // Switch out logic for everything else @@ -4526,7 +4778,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { if (switchOutTarget.hp) { switchOutTarget.hideInfo().then(() => switchOutTarget.destroy()); switchOutTarget.scene.field.remove(switchOutTarget); - user.scene.queueMessage(getPokemonMessage(switchOutTarget, " fled!"), null, true, 500); + user.scene.queueMessage(i18next.t("moveTriggers:fled", {pokemonName: getPokemonNameWithAffix(switchOutTarget)}), null, true, 500); } if (!switchOutTarget.getAlly()?.isActive(true)) { @@ -4550,7 +4802,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 { @@ -4638,7 +4890,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; } @@ -4663,7 +4915,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; } @@ -4682,7 +4934,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; } @@ -4703,11 +4955,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; } @@ -4728,10 +4982,8 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { } const firstMoveType = target.getMoveset()[0].getMove().type; - 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; } @@ -5020,7 +5272,7 @@ export class ReducePpMoveAttr extends MoveEffectAttr { 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 message = i18next.t("battle:ppReduced", {targetName: getPokemonNameWithAffix(target), moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed}); user.scene.queueMessage(message); @@ -5133,7 +5385,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; } @@ -5153,22 +5405,20 @@ 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 sketchedMove = allMoves[targetMoves[0].move]; - + 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; } @@ -5211,7 +5461,7 @@ export class AbilityChangeAttr extends MoveEffectAttr { (this.selfTarget ? user : target).summonData.ability = this.ability; - user.scene.queueMessage("The " + getPokemonMessage((this.selfTarget ? user : target), ` acquired\n${allAbilities[this.ability].name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", {pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name})); return true; } @@ -5237,11 +5487,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; @@ -5274,7 +5524,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; } @@ -5294,7 +5544,7 @@ 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)})); return true; } @@ -5321,7 +5571,7 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { target.summonData.abilitySuppressed = true; - target.scene.queueMessage(getPokemonMessage(target, "'s ability\nwas suppressed!")); + target.scene.queueMessage(i18next.t("moveTriggers:suppressAbilities", {pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -5378,7 +5628,7 @@ export class TransformAttr extends MoveEffectAttr { user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); 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(); @@ -5409,7 +5659,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; } } @@ -5433,7 +5683,7 @@ 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; } @@ -5466,14 +5716,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; }; @@ -5507,7 +5756,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; }; @@ -5577,6 +5826,62 @@ 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 = getTypeResistances(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; + } + + getCondition(): MoveConditionFunc { + return (user, target, move) => { + const moveHistory = target.getLastXMoves(); + return moveHistory.length !== 0; + }; + } +} + const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN); export type MoveTargetSet = { @@ -5645,6 +5950,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), @@ -5675,7 +5982,7 @@ export function initMoves() { .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), new AttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, "whipped\nup a whirlwind!") + .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, i18next.t("moveTriggers:whippedUpAWhirlwind", {pokemonName: "{USER}"})) .attr(HighCritAttr) .windMove() .ignoresVirtual() @@ -5695,7 +6002,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) @@ -5739,6 +6046,7 @@ 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) @@ -5842,7 +6150,7 @@ export function initMoves() { .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, "took\nin sunlight!") + .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, i18next.t("moveTriggers:tookInSunlight", {pokemonName: "{USER}"})) .attr(AntiSunlightPowerDecreaseAttr) .ignoresVirtual(), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) @@ -5857,6 +6165,7 @@ 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), @@ -5890,7 +6199,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) @@ -5986,7 +6295,7 @@ export function initMoves() { new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, "lowered\nits head!", null, true) + .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, i18next.t("moveTriggers:loweredItsHead", {pokemonName: "{USER}"}), null, true) .attr(StatChangeAttr, BattleStat.DEF, 1, true) .ignoresVirtual(), new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) @@ -6025,7 +6334,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) @@ -6065,7 +6374,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) @@ -6124,8 +6433,10 @@ 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) @@ -6148,7 +6459,9 @@ export function initMoves() { 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(CutHpStatBoostAttr, [BattleStat.ATK], 12, 2, (user) => { + user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(BattleStat.ATK)})); + }), new AttackMove(Moves.SLUDGE_BOMB, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.POISON) .ballBombMove(), @@ -6188,6 +6501,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) @@ -6196,7 +6510,7 @@ export function initMoves() { .attr(HitHealAttr) .triageMove(), new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2) - .attr(EndureAttr), + .attr(ProtectAttr, BattlerTagType.ENDURING), new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) .attr(StatChangeAttr, BattleStat.ATK, -2), new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) @@ -6228,7 +6542,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) @@ -6331,7 +6645,8 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPDEF, -1) .ballBombMove(), new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, "foresaw\nan attack!"), + .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), new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) @@ -6350,12 +6665,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) @@ -6424,7 +6744,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) .condition((user, target, move) => !target.status), new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) - .attr(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) @@ -6447,7 +6767,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) - .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, "hid\nunderwater!", BattlerTagType.UNDERWATER) + .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", {pokemonName: "{USER}"}), BattlerTagType.UNDERWATER) .ignoresVirtual(), new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), @@ -6503,7 +6823,7 @@ export function initMoves() { .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) .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), @@ -6578,7 +6898,7 @@ export function initMoves() { new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1, true), new AttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) - .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, "sprang up!", BattlerTagType.FLYING) + .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, i18next.t("moveTriggers:sprangUp", {pokemonName: "{USER}"}), BattlerTagType.FLYING) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .condition(failOnGravityCondition) .ignoresVirtual(), @@ -6614,7 +6934,8 @@ 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), new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) @@ -6659,6 +6980,7 @@ export function initMoves() { .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) @@ -6676,12 +6998,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() @@ -6690,7 +7013,7 @@ 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(), @@ -6914,7 +7237,7 @@ 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) @@ -6926,7 +7249,7 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .windMove(), new AttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) - .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, "vanished\ninstantly!", BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", {pokemonName: "{USER}"}), BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5) @@ -6968,7 +7291,7 @@ 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), @@ -7041,7 +7364,7 @@ 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) @@ -7055,7 +7378,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) @@ -7161,11 +7484,11 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPATK, 1, true) .danceMove(), new AttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, "became cloaked\nin a freezing light!") + .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, 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) @@ -7179,10 +7502,10 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF, BattleStat.SPD ], -1, true), new AttackMove(Moves.FUSION_FLARE, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) - .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) @@ -7207,7 +7530,7 @@ export function initMoves() { new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatChangeAttr, BattleStat.ATK, 3, true ), new AttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, "vanished\ninstantly!", BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", {pokemonName: "{USER}"}), BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) @@ -7309,7 +7632,7 @@ export function initMoves() { .powderMove() .unimplemented(), new SelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, "is charging its power!") + .attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, i18next.t("moveTriggers:isChargingPower", {pokemonName: "{USER}"})) .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 2, true) .ignoresVirtual(), new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6) @@ -7346,6 +7669,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) @@ -7514,7 +7838,7 @@ export function initMoves() { .condition((user, target, move) => target.summonData.battleStats[BattleStat.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) @@ -7554,7 +7878,7 @@ export function initMoves() { }) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(RemoveTypeAttr, Type.FIRE, (user) => { - user.scene.queueMessage(getPokemonMessage(user, " burned itself out!")); + user.scene.queueMessage(i18next.t("moveTriggers:burnedItselfOut", {pokemonName: getPokemonNameWithAffix(user)})); }), new StatusMove(Moves.SPEED_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 7) .unimplemented(), @@ -7576,7 +7900,7 @@ export function initMoves() { 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) + .attr(ChargeAttr, ChargeAnim.BEAK_BLAST_CHARGING, i18next.t("moveTriggers:startedHeatingUpBeak", {pokemonName: "{USER}"}), undefined, false, true, -3) .ballBombMove() .makesContact(false) .partial(), @@ -7736,9 +8060,19 @@ export function initMoves() { .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), @@ -7750,7 +8084,7 @@ export function initMoves() { .attr(EatBerryAttr) .attr(StatChangeAttr, BattleStat.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(), @@ -7771,8 +8105,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) @@ -7923,7 +8256,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, 100, 0, 8) - .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, "is overflowing\nwith space power!", null, true) + .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, i18next.t("moveTriggers:isOverflowingWithSpacePower", {pokemonName: "{USER}"}), null, true) .attr(StatChangeAttr, BattleStat.SPATK, 1, true) .ignoresVirtual(), new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) @@ -7974,8 +8307,9 @@ 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, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .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(), @@ -8022,6 +8356,7 @@ export function initMoves() { .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) @@ -8077,9 +8412,10 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.LUNAR_BLESSING, Type.PSYCHIC, -1, 5, -1, 0, 8) .attr(HealAttr, 0.25) + .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .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(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP), @@ -8216,7 +8552,8 @@ 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), new StatusMove(Moves.REVIVAL_BLESSING, Type.NORMAL, -1, 1, -1, 0, 9) .triageMove() .attr(RevivalBlessingAttr) @@ -8315,7 +8652,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) @@ -8325,6 +8662,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) @@ -8384,8 +8722,8 @@ export function initMoves() { 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) @@ -8410,4 +8748,9 @@ export function initMoves() { 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(StatChangeAttr).some(a => a.selfTarget && a.levels < 0)) { + selfStatLowerMoves.push(m.id); + } + }); } diff --git a/src/data/nature.ts b/src/data/nature.ts index 0d9be0f663d..1ae3b76a6b6 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"; -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]); diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index 5964884d967..f26451b802b 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; diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 71e5aeac0f5..03c4c984215 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1158,6 +1158,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]: [ diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index ae1532f0be0..93781063061 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -8,6 +8,8 @@ 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.js"; +import i18next from "i18next"; export enum FormChangeItem { NONE, @@ -137,7 +139,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; @@ -356,22 +358,31 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: SpeciesFormChange, preName: string): string { const isMega = formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; const isGmax = formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1; - const isEmax = formChange.formKey.indexOf("eternamax") > -1; + const isEmax = formChange.formKey.indexOf(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!`; + 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 { @@ -608,8 +619,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 +710,8 @@ 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)) ], [Species.MELMETAL]: [ new SpeciesFormChange(Species.MELMETAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) @@ -786,8 +797,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)) diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index 6c67226a687..09d34178772 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 ], //Custom [ 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 ], @@ -1740,7 +1746,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 ], @@ -1759,7 +1766,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.REFLECT ], [ 1, Moves.LEECH_SEED ], - [ 1, Moves.GROWTH ], ], [Species.CUBONE]: [ [ 1, Moves.GROWL ], @@ -1795,7 +1801,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 ], @@ -1818,7 +1824,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 ], @@ -1874,7 +1880,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 ], @@ -1909,7 +1915,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 ], @@ -2212,7 +2218,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 ], @@ -2272,7 +2278,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 ], @@ -2299,7 +2305,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 ], @@ -2326,7 +2332,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 ], @@ -2385,7 +2391,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 ], @@ -2420,7 +2426,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 ], @@ -2570,7 +2576,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 ], @@ -2656,7 +2662,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 ], @@ -2793,7 +2799,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 ], @@ -2897,7 +2903,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 ], @@ -2920,7 +2926,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 ], @@ -2954,9 +2960,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 ], @@ -3020,7 +3026,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 ], @@ -3052,7 +3058,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 ], @@ -3102,7 +3108,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 ], @@ -3125,7 +3131,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 ], @@ -3181,7 +3187,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 ], @@ -3201,21 +3207,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 ], @@ -3375,7 +3381,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 ], @@ -3401,7 +3407,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 ], @@ -3444,6 +3450,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 ], @@ -3451,8 +3459,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 ], @@ -3485,10 +3491,14 @@ 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 ], + [ 1, Moves.MIRROR_COAT ], [ 1, Moves.AMNESIA ], [ 1, Moves.SPLASH ], [ 1, Moves.CHARM ], @@ -3529,7 +3539,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 ], @@ -3665,7 +3675,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 ], @@ -3788,7 +3798,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 ], @@ -3821,7 +3831,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 ], @@ -3869,7 +3879,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 ], @@ -4014,7 +4024,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 ], @@ -4078,7 +4088,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 ], @@ -4206,12 +4216,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 ], @@ -4227,12 +4237,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 ], @@ -4266,7 +4276,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 ], @@ -4309,11 +4319,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 ], @@ -4375,14 +4385,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 ], @@ -4396,16 +4406,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 ], @@ -4436,13 +4446,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 ], @@ -4456,15 +4466,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 ], @@ -4495,11 +4505,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 ], @@ -4513,14 +4523,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 ], @@ -4551,7 +4561,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 ], @@ -4589,7 +4599,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 ], @@ -4616,11 +4626,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 ], @@ -4640,11 +4650,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 ], @@ -4698,22 +4708,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 ], @@ -4732,7 +4742,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 ], @@ -4753,28 +4763,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 ], @@ -4878,7 +4888,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 ], @@ -4943,7 +4953,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 ], @@ -4989,7 +5000,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 ], @@ -5017,9 +5028,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 ], @@ -5072,7 +5083,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 ], @@ -5087,7 +5098,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 ], @@ -5380,11 +5391,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 ], @@ -5402,11 +5413,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 ], @@ -5458,7 +5469,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 ], @@ -5495,7 +5506,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 ], @@ -5529,7 +5540,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 ], @@ -5601,7 +5612,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 ], @@ -5654,7 +5665,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 ], @@ -5703,16 +5714,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 ], @@ -5728,19 +5739,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 ], @@ -5775,7 +5786,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 ], @@ -5810,7 +5821,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 ], @@ -5828,20 +5839,20 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.SKY_ATTACK ], ], [Species.ZANGOOSE]: [ + [ 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 ], - [ 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 ], [ 5, Moves.QUICK_ATTACK ], [ 8, Moves.FURY_CUTTER ], [ 12, Moves.METAL_CLAW ], @@ -5926,7 +5937,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 ], @@ -5960,7 +5971,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 ], @@ -5997,7 +6008,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 ], @@ -6090,7 +6101,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 ], @@ -6164,7 +6175,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 ], @@ -6195,7 +6206,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 ], @@ -6292,7 +6303,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 ], @@ -6329,7 +6340,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 ], @@ -6462,7 +6473,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 ], @@ -6478,7 +6489,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 ], @@ -6500,8 +6511,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 ], @@ -6517,13 +6528,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 ], @@ -6739,7 +6750,7 @@ 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.RAZOR_LEAF ], @@ -6771,7 +6782,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 ], @@ -6787,7 +6798,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 ], @@ -6818,7 +6831,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 ], @@ -6833,7 +6846,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 ], @@ -6879,7 +6892,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 ], @@ -6910,7 +6923,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 ], @@ -6936,7 +6949,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 ], @@ -7044,7 +7057,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 ], @@ -7073,7 +7086,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 ], @@ -7095,7 +7109,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 ], @@ -7115,7 +7129,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 ], @@ -7140,7 +7154,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 ], @@ -7228,7 +7242,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 ], @@ -7305,7 +7319,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 ], @@ -7343,7 +7357,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 ], @@ -7406,7 +7420,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 ], @@ -7453,7 +7467,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 ], @@ -7487,7 +7501,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 ], @@ -7616,7 +7630,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 ], @@ -7669,7 +7683,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 ], @@ -7886,7 +7900,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 ], @@ -8035,7 +8049,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 ], @@ -8058,6 +8072,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 ], @@ -8075,7 +8090,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 ], @@ -8102,7 +8117,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 ], @@ -8146,7 +8161,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 ], @@ -8185,7 +8200,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 ], @@ -8220,7 +8235,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 ], @@ -8264,7 +8279,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 ], @@ -8303,6 +8318,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 ], @@ -8319,6 +8344,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 ], @@ -8335,6 +8370,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 ], @@ -8607,7 +8655,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 ], @@ -8625,12 +8673,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 ], @@ -8678,7 +8726,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 ], @@ -8716,7 +8764,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 ], @@ -9016,7 +9064,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 ], @@ -9095,7 +9143,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 ], @@ -9215,7 +9263,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HYDRO_PUMP ], ], [Species.SEISMITOAD]: [ - [ 0, Moves.DRAIN_PUNCH ], + [ EVOLVE_MOVE, Moves.DRAIN_PUNCH ], [ 1, Moves.GROWL ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.ACID ], @@ -9278,7 +9326,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 ], @@ -9291,7 +9339,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 ], @@ -9321,7 +9370,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 ], @@ -9416,7 +9465,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 ], @@ -9524,7 +9573,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 ], @@ -9666,7 +9715,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 ], @@ -9821,7 +9870,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 ], @@ -9855,22 +9904,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 ], @@ -9962,7 +10011,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 ], @@ -10083,7 +10132,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 ], @@ -10259,7 +10308,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 ], @@ -10291,7 +10340,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 ], @@ -10364,7 +10413,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 ], @@ -10562,7 +10611,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 ], @@ -10730,10 +10779,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 ], @@ -10817,7 +10866,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 ], @@ -10850,7 +10899,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 ], @@ -10981,7 +11030,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 ], @@ -11037,6 +11086,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 ], @@ -11228,7 +11278,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 ], @@ -11245,7 +11295,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 ], @@ -11299,7 +11349,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 ], @@ -11353,7 +11403,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 ], @@ -11424,7 +11474,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 ], @@ -11464,11 +11514,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 ], @@ -11583,7 +11633,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 ], @@ -11618,7 +11668,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 ], @@ -11716,7 +11766,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 ], @@ -12041,7 +12091,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 ], @@ -12132,7 +12182,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 ], @@ -12148,7 +12198,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 ], @@ -12201,7 +12251,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 ], @@ -12271,7 +12321,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 ], @@ -12309,7 +12359,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 ], @@ -12481,7 +12531,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 ], @@ -12534,14 +12584,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 ], @@ -12586,7 +12636,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 ], @@ -12618,11 +12668,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 ], @@ -12634,7 +12684,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 ], @@ -12696,7 +12746,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 ], @@ -12711,17 +12761,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 ], @@ -12748,7 +12798,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 ], @@ -12795,7 +12845,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 ], @@ -12825,7 +12875,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 ], @@ -12875,7 +12925,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 ], @@ -12969,7 +13019,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 ], @@ -13033,7 +13083,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 ], @@ -13072,7 +13122,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 ], @@ -13114,7 +13164,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 ], @@ -13189,7 +13239,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 ], @@ -13275,7 +13325,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 ], @@ -13446,7 +13496,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 ], @@ -13464,7 +13514,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 ], @@ -13567,11 +13618,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 ], @@ -13591,7 +13642,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 ], @@ -13816,7 +13867,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 ], @@ -13900,7 +13951,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 ], @@ -13930,7 +13981,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 ], @@ -13944,7 +13995,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 ], @@ -13988,7 +14039,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 ], @@ -14030,7 +14081,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 ], @@ -14061,7 +14112,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 ], @@ -14103,7 +14154,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 ], @@ -14123,9 +14174,12 @@ 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 ], [ 1, Moves.STRUGGLE_BUG ], ], [Species.ORBEETLE]: [ @@ -14160,7 +14214,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 ], @@ -14188,7 +14242,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 ], @@ -14243,7 +14297,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 ], @@ -14299,7 +14353,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 ], @@ -14313,7 +14367,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 ], @@ -14333,7 +14387,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 ], @@ -14352,7 +14406,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 ], @@ -14400,6 +14454,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 ], @@ -14447,7 +14502,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 ], @@ -14516,7 +14571,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 ], @@ -14546,7 +14601,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 ], @@ -14576,7 +14631,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 ], @@ -14590,7 +14645,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 ], @@ -14621,7 +14676,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 ], @@ -14637,7 +14692,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 ], @@ -14656,7 +14711,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 ], @@ -14679,7 +14734,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 ], @@ -14713,7 +14768,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 ], @@ -14765,7 +14820,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 ], @@ -14799,7 +14854,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 ], @@ -14850,7 +14905,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 ], @@ -14945,7 +15000,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 ], @@ -15042,7 +15097,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 ], @@ -15061,7 +15116,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 ], @@ -15146,7 +15201,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 ], @@ -15266,7 +15321,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 ], @@ -15283,7 +15338,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 ], @@ -15299,7 +15354,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 ], @@ -15339,7 +15394,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 ], @@ -15425,7 +15480,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 ], @@ -15475,7 +15532,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 ], @@ -15526,7 +15585,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 ], @@ -15595,7 +15655,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 ], @@ -15627,7 +15687,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 ], @@ -15665,7 +15725,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 ], @@ -15683,7 +15743,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 ], @@ -15855,7 +15915,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 ], @@ -15872,7 +15932,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 ], @@ -15905,7 +15965,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 ], @@ -15925,14 +15985,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 ], @@ -15992,7 +16052,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 ], @@ -16025,7 +16085,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 ], @@ -16061,7 +16121,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 ], @@ -16181,8 +16241,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 ], @@ -16212,7 +16272,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 ], @@ -16243,7 +16305,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 ], @@ -16297,7 +16359,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 ], @@ -16378,7 +16440,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 ], @@ -16414,7 +16476,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 ], @@ -16481,7 +16543,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 ], @@ -16517,7 +16579,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 ], @@ -16634,7 +16696,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 ], @@ -16655,7 +16717,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 ], @@ -16707,7 +16769,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 ], @@ -16745,6 +16807,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 ], @@ -16763,6 +16826,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 ], @@ -16780,6 +16844,7 @@ 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 ], @@ -16798,6 +16863,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 ], @@ -16817,6 +16883,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 ], @@ -16854,6 +16921,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 ], @@ -16871,6 +16939,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 ], @@ -16890,6 +16959,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 ], @@ -16909,6 +16979,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 ], @@ -16928,6 +16999,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 ], @@ -16976,7 +17048,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 ], @@ -17095,6 +17167,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 ], @@ -17114,6 +17190,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 ], @@ -17170,10 +17247,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 98, Moves.HYPER_BEAM ], ], [Species.WALKING_WAKE]: [ - [ 0, Moves.LEER ], - [ 0, Moves.ROAR ], - [ 0, Moves.TWISTER ], - [ 0, Moves.AQUA_JET ], + [ RELEARN_MOVE, Moves.SUNNY_DAY ], + [ RELEARN_MOVE, Moves.HONE_CLAWS ], + [ 1, Moves.LEER ], + [ 1, Moves.ROAR ], + [ 1, Moves.TWISTER ], + [ 1, Moves.AQUA_JET ], [ 7, Moves.BITE ], [ 14, Moves.WATER_PULSE ], [ 21, Moves.NOBLE_ROAR ], @@ -17187,10 +17266,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.HYDRO_PUMP ], ], [Species.IRON_LEAVES]: [ - [ 0, Moves.LEER ], - [ 0, Moves.QUICK_ATTACK ], - [ 0, Moves.HELPING_HAND ], - [ 0, Moves.WORK_UP ], + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], + [ RELEARN_MOVE, Moves.QUASH ], + [ 1, Moves.LEER ], + [ 1, Moves.QUICK_ATTACK ], + [ 1, Moves.HELPING_HAND ], + [ 1, Moves.WORK_UP ], [ 7, Moves.MAGICAL_LEAF ], [ 14, Moves.RETALIATE ], [ 21, Moves.QUICK_GUARD ], @@ -17206,12 +17287,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 ], @@ -17239,7 +17320,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 ], @@ -17300,6 +17381,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 ], @@ -17317,7 +17402,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 ], @@ -17333,14 +17418,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 ], @@ -17354,6 +17439,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 54, Moves.POWER_WHIP ], ], [Species.GOUGING_FIRE]: [ + [ RELEARN_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.ANCIENT_POWER ], + [ RELEARN_MOVE, Moves.NOBLE_ROAR ], [ 1, Moves.STOMP ], [ 1, Moves.LEER ], [ 1, Moves.INCINERATE ], @@ -17373,6 +17461,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.RAGING_FURY ], ], [Species.RAGING_BOLT]: [ + [ RELEARN_MOVE, Moves.ANCIENT_POWER ], [ 1, Moves.TWISTER ], [ 1, Moves.SUNNY_DAY ], [ 1, Moves.SHOCK_WAVE ], @@ -17444,6 +17533,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 ], @@ -17474,7 +17566,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 ], @@ -17491,8 +17583,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 ], @@ -17535,26 +17627,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]: [ @@ -17575,23 +17667,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 ], @@ -17609,7 +17701,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 ], @@ -17643,7 +17735,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 ], @@ -17751,7 +17843,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 ], @@ -17770,10 +17863,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 ], @@ -17843,7 +17935,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 ], @@ -17880,7 +17972,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 ], @@ -17918,7 +18010,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 ], @@ -18023,7 +18115,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 ], @@ -18031,9 +18126,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 ], @@ -18080,7 +18172,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 ], @@ -18116,7 +18208,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 ], @@ -18185,7 +18277,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 ], @@ -18225,7 +18317,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 ], @@ -18245,7 +18337,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 ], @@ -18299,7 +18391,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 ], @@ -18319,7 +18411,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 ], @@ -18360,7 +18452,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 ], @@ -18378,7 +18470,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 ], @@ -18397,7 +18489,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 ], @@ -18413,7 +18505,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 ], @@ -18434,7 +18526,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 ], @@ -18456,7 +18548,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 ], @@ -18504,11 +18596,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 ], @@ -18575,7 +18667,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 3: [ - [ 0, Moves.METEOR_MASH ], + [ EVOLVE_MOVE, Moves.METEOR_MASH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18599,7 +18691,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 4: [ - [ 0, Moves.ICICLE_CRASH ], + [ EVOLVE_MOVE, Moves.ICICLE_CRASH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18623,7 +18715,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 5: [ - [ 0, Moves.DRAINING_KISS ], + [ EVOLVE_MOVE, Moves.DRAINING_KISS ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18647,7 +18739,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 6: [ - [ 0, Moves.ELECTRIC_TERRAIN ], + [ EVOLVE_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18671,7 +18763,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 7: [ - [ 0, Moves.FLYING_PRESS ], + [ EVOLVE_MOVE, Moves.FLYING_PRESS ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18752,7 +18844,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 ], @@ -18772,7 +18864,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 ], @@ -18795,7 +18887,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.ROTOM]: { 1: [ - [ 0, Moves.OVERHEAT ], + [ EVOLVE_MOVE, Moves.OVERHEAT ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18811,7 +18903,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 2: [ - [ 0, Moves.HYDRO_PUMP ], + [ EVOLVE_MOVE, Moves.HYDRO_PUMP ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18827,7 +18919,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 3: [ - [ 0, Moves.BLIZZARD ], + [ EVOLVE_MOVE, Moves.BLIZZARD ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18843,7 +18935,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 4: [ - [ 0, Moves.AIR_SLASH ], + [ EVOLVE_MOVE, Moves.AIR_SLASH ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18859,7 +18951,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 5: [ - [ 0, Moves.LEAF_STORM ], + [ EVOLVE_MOVE, Moves.LEAF_STORM ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18973,8 +19065,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 ], @@ -18996,7 +19088,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 ], @@ -19016,7 +19108,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 ], @@ -19043,7 +19135,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 ], @@ -19063,7 +19155,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 ], @@ -19083,8 +19175,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 ], @@ -19106,7 +19198,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.TOXTRICITY]: { 1: [ - [ 0, Moves.SPARK ], + [ EVOLVE_MOVE, Moves.SPARK ], [ 1, Moves.LEER ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], @@ -19149,7 +19241,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 ], @@ -19168,7 +19260,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 ], @@ -19205,7 +19297,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 962772d6e78..ac79b6223c0 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -147,7 +147,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 +177,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 { @@ -284,7 +301,7 @@ export abstract class PokemonSpeciesForm { let variantDataIndex: integer|string = this.speciesId; const species = getPokemonSpecies(this.speciesId); if (species.forms.length > 0) { - formkey = species.forms[formIndex]?.formKey; + formkey = species.forms[formIndex]?.formSpriteKey; if (formkey) { variantDataIndex = `${this.speciesId}-${formkey}`; } @@ -418,7 +435,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; } } @@ -597,20 +614,24 @@ 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; 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"; } } + + if (key) { + return i18next.t(`battlePokemonForm:${key}`, {pokemonName: this.name}); + } } return this.name; } @@ -779,7 +800,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // This could definitely be written better and more accurate to the getSpeciesForLevel logic, but it is only for generating movesets for evolved Pokemon - getSimulatedEvolutionChain(currentLevel: integer, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false) { + getSimulatedEvolutionChain(currentLevel: integer, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): [Species, integer][] { const ret = []; if (pokemonPrevolutions.hasOwnProperty(this.speciesId)) { const prevolutionLevels = this.getPrevolutionLevels().reverse(); @@ -821,7 +842,14 @@ 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) { @@ -1643,7 +1671,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), @@ -2431,8 +2459,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), @@ -2654,71 +2682,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.JYNX]: 3, + [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 +2759,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.SPINARAK]: 2, + [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.SMOOCHUM]: 3, - [Species.ELEKID]: 4, - [Species.MAGBY]: 4, - [Species.MILTANK]: 5, + [Species.STANTLER]: 3, + [Species.SMEARGLE]: 1, + [Species.TYROGUE]: 2, + [Species.SMOOCHUM]: 2, + [Species.ELEKID]: 3, + [Species.MAGBY]: 3, + [Species.MILTANK]: 4, [Species.RAIKOU]: 6, [Species.ENTEI]: 6, [Species.SUICUNE]: 6, @@ -2797,62 +2825,62 @@ export const speciesStarters = { [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, @@ -2870,39 +2898,39 @@ export const speciesStarters = { [Species.CHIMCHAR]: 3, [Species.PIPLUP]: 3, [Species.STARLY]: 3, - [Species.BIDOOF]: 2, + [Species.BIDOOF]: 3, [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 +2946,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.SOLOSIS]: 4, + [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.TYNAMO]: 2, [Species.ELGYEM]: 3, [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 +3032,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 +3124,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.SOBBLE]: 3, + [Species.GROOKEY]: 4, + [Species.SCORBUNNY]: 4, + [Species.SOBBLE]: 4, [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 +3179,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.PAWMI]: 4, [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, @@ -3245,7 +3273,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[] = [ diff --git a/src/data/pokemon-stat.ts b/src/data/pokemon-stat.ts index a6bf77b1daa..16570785a62 100644 --- a/src/data/pokemon-stat.ts +++ b/src/data/pokemon-stat.ts @@ -1,16 +1,10 @@ +import { Stat } from "#enums/stat"; import i18next from "i18next"; -export enum Stat { - HP = 0, - ATK, - DEF, - SPATK, - SPDEF, - SPD -} +export { Stat }; export function getStatName(stat: Stat, shorten: boolean = false) { - let ret: string; + let ret: string = ""; switch (stat) { case Stat.HP: ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened"); 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 810bd4d9482..65caf58ccb9 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,15 +1,8 @@ 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; @@ -31,94 +24,52 @@ export class Status { } } -export function getStatusEffectObtainText(statusEffect: StatusEffect, sourceText?: string): string { - const sourceClause = sourceText ? ` ${statusEffect !== StatusEffect.SLEEP ? "by" : "from"} ${sourceText}` : ""; +function getStatusEffectMessageKey(statusEffect: StatusEffect): string { switch (statusEffect) { case StatusEffect.POISON: - return `\nwas poisoned${sourceClause}!`; + return "statusEffect:poison"; case StatusEffect.TOXIC: - return `\nwas badly poisoned${sourceClause}!`; + return "statusEffect:toxic"; case StatusEffect.PARALYSIS: - return ` was paralyzed${sourceClause}!\nIt may be unable to move!`; + return "statusEffect:paralysis"; case StatusEffect.SLEEP: - return `\nfell asleep${sourceClause}!`; + return "statusEffect:sleep"; case StatusEffect.FREEZE: - return `\nwas frozen solid${sourceClause}!`; + return "statusEffect:freeze"; case StatusEffect.BURN: - return `\nwas burned${sourceClause}!`; + return "statusEffect:burn"; + default: + return "statusEffect:none"; } - - return ""; } -export function getStatusEffectActivationText(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return " is hurt\nby poison!"; - case StatusEffect.PARALYSIS: - return " is paralyzed!\nIt can't move!"; - case StatusEffect.SLEEP: - return " is fast asleep."; - case StatusEffect.FREEZE: - return " is\nfrozen solid!"; - case StatusEffect.BURN: - return " is hurt\nby its burn!"; +export function getStatusEffectObtainText(statusEffect: StatusEffect, pokemonNameWithAffix: string, sourceText?: string): string { + if (!sourceText) { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } - - return ""; + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource`as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix, sourceText: sourceText }); } -export function getStatusEffectOverlapText(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return " is\nalready poisoned!"; - case StatusEffect.PARALYSIS: - return " is\nalready paralyzed!"; - case StatusEffect.SLEEP: - return " is\nalready asleep!"; - case StatusEffect.FREEZE: - return " is\nalready frozen!"; - case StatusEffect.BURN: - return " is\nalready burned!"; - } - - return ""; +export function getStatusEffectActivationText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.activation` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } -export function getStatusEffectHealText(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return " was\ncured of its poison!"; - case StatusEffect.PARALYSIS: - return " was\nhealed of paralysis!"; - case StatusEffect.SLEEP: - return " woke up!"; - case StatusEffect.FREEZE: - return " was\ndefrosted!"; - case StatusEffect.BURN: - return " was\nhealed of its burn!"; - } +export function getStatusEffectOverlapText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.overlap` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); +} - return ""; +export function getStatusEffectHealText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.heal` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } export function getStatusEffectDescriptor(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return "poisoning"; - case StatusEffect.PARALYSIS: - return "paralysis"; - case StatusEffect.SLEEP: - return "sleep"; - case StatusEffect.FREEZE: - return "freezing"; - case StatusEffect.BURN: - return "burn"; - } + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.description` as ParseKeys; + return i18next.t(i18nKey); } export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): number { diff --git a/src/data/terrain.ts b/src/data/terrain.ts index e396c693c4e..d0b2fb53d3e 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -5,6 +5,7 @@ import * as Utils from "../utils"; import { IncrementMovePriorityAbAttr, applyAbAttrs } from "./ability"; import { ProtectAttr } from "./move"; import { BattlerIndex } from "#app/battle.js"; +import i18next from "i18next"; export enum TerrainType { NONE, @@ -59,7 +60,8 @@ export class Terrain { 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; + // 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..761dcdf6be4 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, @@ -41565,7 +42442,9 @@ export const tmSpecies: TmSpecies = { Species.SHAYMIN, Species.ARCEUS, Species.PATRAT, + Species.WATCHOG, Species.PANSAGE, + Species.SIMISAGE, Species.LEAVANNY, Species.PETILIL, Species.LILLIGANT, @@ -41995,9 +42874,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 +43302,7 @@ export const tmSpecies: TmSpecies = { Species.MACHAMP, Species.HITMONLEE, Species.HITMONCHAN, + Species.ELECTABUZZ, Species.PINSIR, Species.MEWTWO, Species.MEW, @@ -42454,10 +43336,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 +43855,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 +44526,8 @@ export const tmSpecies: TmSpecies = { Species.DRAGONITE, Species.MEW, Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, Species.STEELIX, Species.KINGDRA, Species.LARVITAR, @@ -43520,6 +44630,7 @@ export const tmSpecies: TmSpecies = { Species.GROUDON, Species.TORTERRA, Species.SHIELDON, + Species.BASTIODON, Species.GASTRODON, Species.BRONZOR, Species.BRONZONG, @@ -43553,6 +44664,7 @@ export const tmSpecies: TmSpecies = { Species.TRUMBEAK, Species.TOUCANNON, Species.LYCANROC, + Species.MINIOR, Species.NECROZMA, Species.STAKATAKA, Species.BLACEPHALON, @@ -43579,6 +44691,7 @@ export const tmSpecies: TmSpecies = { Species.GLIMMET, Species.GLIMMORA, Species.IRON_THORNS, + Species.IRON_BOULDER, [ Species.WORMADAM, "sandy", @@ -44001,17 +45114,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 +45505,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, @@ -45920,6 +47125,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 +47323,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, @@ -46802,6 +48181,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, @@ -47150,7 +48674,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, @@ -47719,6 +49246,8 @@ export const tmSpecies: TmSpecies = { Species.HERACROSS, Species.TYROGUE, Species.HITMONTOP, + Species.GROVYLE, + Species.SCEPTILE, Species.COMBUSKEN, Species.BLAZIKEN, Species.SHIFTRY, @@ -47728,6 +49257,7 @@ export const tmSpecies: TmSpecies = { Species.HARIYAMA, Species.MEDITITE, Species.MEDICHAM, + Species.FLYGON, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -47740,6 +49270,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, @@ -49976,6 +51509,7 @@ export const tmSpecies: TmSpecies = { Species.KADABRA, Species.ALAKAZAM, Species.DROWZEE, + Species.HYPNO, Species.EXEGGUTOR, Species.STARMIE, Species.SCYTHER, @@ -49987,6 +51521,7 @@ export const tmSpecies: TmSpecies = { Species.SNEASEL, Species.CELEBI, Species.MEDITITE, + Species.MEDICHAM, Species.SPINDA, Species.ABSOL, Species.METANG, @@ -50021,15 +51556,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, @@ -51032,6 +52572,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 +52583,8 @@ export const tmSpecies: TmSpecies = { Species.TANGELA, Species.MEW, Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, Species.BELLOSSOM, Species.HOPPIP, Species.SKIPLOOM, @@ -51073,6 +52618,7 @@ export const tmSpecies: TmSpecies = { Species.SERVINE, Species.SERPERIOR, Species.PANSAGE, + Species.SIMISAGE, Species.LEAVANNY, Species.PETILIL, Species.LILLIGANT, @@ -51126,7 +52672,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 +52757,9 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.OBSTAGOON, Species.ETERNATUS, + Species.KLEAVOR, Species.SHROODLE, + Species.GRAFAIAI, Species.FEZANDIPITI, ], [Moves.GUNK_SHOT]: [ @@ -52869,6 +54420,7 @@ export const tmSpecies: TmSpecies = { Species.OBSTAGOON, Species.PERRSERKER, Species.DURALUDON, + Species.URSALUNA, Species.SNEASLER, Species.SPRIGATITO, Species.FLORAGATO, @@ -52876,10 +54428,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, @@ -53501,6 +55056,9 @@ export const tmSpecies: TmSpecies = { Species.NIDOKING, Species.VILEPLUME, Species.DUGTRIO, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, Species.TENTACOOL, Species.TENTACRUEL, Species.GRIMER, @@ -53511,6 +55069,8 @@ export const tmSpecies: TmSpecies = { Species.KOFFING, Species.WEEZING, Species.MEW, + Species.SPINARAK, + Species.ARIADOS, Species.WOOPER, Species.QUAGSIRE, Species.QWILFISH, @@ -53525,6 +55085,8 @@ export const tmSpecies: TmSpecies = { Species.CRAWDAUNT, Species.CRADILY, Species.GASTRODON, + Species.STUNKY, + Species.SKUNTANK, Species.CROAGUNK, Species.TOXICROAK, Species.TYMPOLE, @@ -53538,6 +55100,7 @@ export const tmSpecies: TmSpecies = { Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS, + Species.GRENINJA, Species.BINACLE, Species.BARBARACLE, Species.SKRELP, @@ -53561,10 +55124,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 +55145,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]: [ @@ -55466,6 +57039,8 @@ export const tmSpecies: TmSpecies = { Species.SLOWBRO, Species.DROWZEE, Species.HYPNO, + Species.EXEGGCUTE, + Species.EXEGGUTOR, Species.CHANSEY, Species.MR_MIME, Species.JYNX, @@ -55505,6 +57080,7 @@ export const tmSpecies: TmSpecies = { Species.LATIAS, Species.LATIOS, Species.JIRACHI, + Species.DEOXYS, Species.DRIFLOON, Species.DRIFBLIM, Species.MISMAGIUS, @@ -55523,6 +57099,7 @@ export const tmSpecies: TmSpecies = { Species.MESPRIT, Species.AZELF, Species.CRESSELIA, + Species.MANAPHY, Species.ARCEUS, Species.VICTINI, Species.MUNNA, @@ -55544,6 +57121,7 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, Species.FLOETTE, Species.FLORGES, + Species.MEOWSTIC, Species.INKAY, Species.MALAMAR, Species.SYLVEON, @@ -55588,14 +57166,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 +57681,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, @@ -57989,6 +59766,7 @@ export const tmSpecies: TmSpecies = { Species.TORKOAL, Species.GROUDON, Species.RHYPERIOR, + Species.MAGMORTAR, Species.HEATRAN, Species.REGIGIGAS, Species.TEPIG, @@ -58024,6 +59802,8 @@ export const tmSpecies: TmSpecies = { Species.ZIGZAGOON, Species.LINOONE, Species.BUIZEL, + Species.FLOATZEL, + Species.AMBIPOM, Species.STUNKY, Species.SKUNTANK, Species.MINCCINO, @@ -58125,12 +59905,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, @@ -59846,16 +61620,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 +61656,6 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.PINCURCHIN, Species.ETERNATUS, - Species.PIKACHU, - Species.ALOLA_MUK, Species.GALAR_WEEZING, Species.GALAR_SLOWKING, [ @@ -60266,8 +62033,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 +62329,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 +62340,7 @@ export const tmSpecies: TmSpecies = { Species.SAWSBUCK, Species.GOLURK, Species.BOUFFALANT, + Species.TERRAKION, Species.CHESNAUGHT, Species.DIGGERSBY, Species.GOGOAT, @@ -61014,6 +63003,7 @@ export const tmSpecies: TmSpecies = { Species.ZACIAN, Species.ETERNATUS, Species.ZARUDE, + Species.KLEAVOR, Species.TINKATINK, Species.TINKATUFF, Species.TINKATON, @@ -61030,6 +63020,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 +63713,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 +63764,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 +63780,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, @@ -61853,6 +63897,7 @@ export const tmSpecies: TmSpecies = { Species.METANG, Species.METAGROSS, Species.JIRACHI, + Species.DEOXYS, Species.BRONZOR, Species.BRONZONG, Species.GALLADE, @@ -61965,6 +64010,7 @@ export const tmSpecies: TmSpecies = { Species.COPPERAJAH, Species.DURALUDON, Species.IRON_TREADS, + Species.ARCHALUDON, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, ], @@ -62061,10 +64107,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 +64127,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 +64150,7 @@ export const tmSpecies: TmSpecies = { Species.AURORUS, Species.CARBINK, Species.DIANCIE, + Species.MINIOR, Species.SOLGALEO, Species.LUNALA, Species.NIHILEGO, @@ -62129,7 +64182,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 +64359,7 @@ export const tmSpecies: TmSpecies = { Species.DRACOZOLT, Species.ARCTOZOLT, Species.REGIELEKI, + Species.RAGING_BOLT, Species.ALOLA_RAICHU, ], [Moves.TERRAIN_PULSE]: [ @@ -62332,30 +64388,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 +64465,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 +64500,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 +64830,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 +64853,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 +64877,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 +64895,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 +64908,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 +64920,7 @@ export const tmSpecies: TmSpecies = { Species.SHARPEDO, Species.MILOTIC, Species.LUVDISC, + Species.LATIOS, Species.PIPLUP, Species.PRINPLUP, Species.EMPOLEON, @@ -62820,24 +64960,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 +64996,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 +65044,7 @@ export const tmSpecies: TmSpecies = { Species.FLYGON, Species.SWABLU, Species.ALTARIA, + Species.TROPIUS, Species.SALAMENCE, Species.LATIAS, Species.LATIOS, @@ -62934,6 +65089,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 +65144,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 +65159,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 +65171,7 @@ export const tmSpecies: TmSpecies = { Species.RHYPERIOR, Species.MAGMORTAR, Species.HEATRAN, + Species.ARCEUS, Species.VICTINI, Species.DRILBUR, Species.EXCADRILL, @@ -63015,12 +65182,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 +65208,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, @@ -65303,6 +67476,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 +67532,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 +67542,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 +67566,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 +67599,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 +67610,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 +67618,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 +67685,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 +67721,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 +67732,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..2cc228a93cf 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -556,7 +556,7 @@ 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.setBattleBgm("battle_plasma_boss"); @@ -1187,6 +1187,12 @@ export const trainerConfigs: TrainerConfigs = { [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.ROCKET_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [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] + }), [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], @@ -1194,6 +1200,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] }), + [TrainerType.MAGMA_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).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.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR], + [TrainerPoolTier.RARE]: [Species.TURTONATOR, Species.CHARCADET] + }), [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").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 ], @@ -1201,6 +1213,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA], [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO] }), + [TrainerType.AQUA_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).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.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] + }), [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], @@ -1208,6 +1226,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] }), + [TrainerType.GALACTIC_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).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.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] + }), [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], @@ -1215,6 +1239,12 @@ export const trainerConfigs: TrainerConfigs = { [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.PLASMA_SAGE]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [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] + }), [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], @@ -1222,6 +1252,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON] }), + [TrainerType.FLARE_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).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.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] + }), [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"), @@ -1346,15 +1382,18 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"],true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PIKACHU], TrainerSlot.TRAINER, true, p => { p.formIndex = 8; p.generateAndPopulateMoveset(); + p.generateName(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"],true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.AERODACTYL], TrainerSlot.TRAINER, true, p => { @@ -1363,6 +1402,7 @@ export const trainerConfigs: TrainerConfigs = { .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") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY], TrainerSlot.TRAINER, true, p => { @@ -1371,6 +1411,7 @@ export const trainerConfigs: TrainerConfigs = { .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") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => { @@ -1388,6 +1429,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"],true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BOUFFALANT, Species.BRAVIARY], TrainerSlot.TRAINER, true, p => { @@ -1400,6 +1442,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"],false).setMixedBattleBgm("battle_kalos_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GOURGEIST], TrainerSlot.TRAINER, true, p => { @@ -1408,6 +1451,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"],true).setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALOLA_RAICHU], TrainerSlot.TRAINER, true, p => { @@ -1420,6 +1464,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => { p.formIndex = 3; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"],false).setMixedBattleBgm("battle_champion_geeta") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GLIMMORA], TrainerSlot.TRAINER, true, p => { @@ -1494,6 +1539,7 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; p.formIndex = 1; + p.generateName(); })) .setGenModifiersFunc(party => { const starter = party[0]; @@ -1511,6 +1557,7 @@ export const trainerConfigs: TrainerConfigs = { 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 => { @@ -1525,6 +1572,7 @@ export const trainerConfigs: TrainerConfigs = { 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 => { @@ -1543,6 +1591,7 @@ export const trainerConfigs: TrainerConfigs = { 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 => { @@ -1564,6 +1613,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1581,6 +1631,7 @@ export const trainerConfigs: TrainerConfigs = { 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 => { @@ -1605,6 +1656,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1620,6 +1672,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1637,6 +1690,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1689,6 +1743,7 @@ export const trainerConfigs: TrainerConfigs = { 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 => { @@ -1704,6 +1759,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); diff --git a/src/data/type.ts b/src/data/type.ts index c92416afca9..1330eb83f4b 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -501,6 +501,55 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer): } } +/** + * Retrieve the types resisting a given type + * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type) + */ +export function getTypeResistances(type: number): Type[] { + switch (type) { + case Type.NORMAL: + return [Type.ROCK, Type.STEEL, Type.GHOST]; + case Type.FIGHTING: + return [Type.FLYING, Type.POISON, Type.BUG, Type.PSYCHIC, Type.FAIRY, Type.GHOST]; + case Type.FLYING: + return [Type.ROCK, Type.ELECTRIC, Type.STEEL]; + case Type.POISON: + return [Type.POISON, Type.GROUND, Type.ROCK, Type.GHOST, Type.STEEL]; + case Type.GROUND: + return [Type.BUG, Type.GRASS, Type.FLYING]; + case Type.ROCK: + return [Type.FIGHTING, Type.GROUND, Type.STEEL]; + case Type.BUG: + return [Type.FIGHTING, Type.FLYING, Type.POISON, Type.GHOST, Type.STEEL, Type.FIRE, Type.FAIRY]; + case Type.GHOST: + return [Type.DARK, Type.NORMAL]; + case Type.STEEL: + return [Type.STEEL, Type.FIRE, Type.WATER, Type.ELECTRIC]; + case Type.FIRE: + return [Type.ROCK, Type.FIRE, Type.WATER, Type.DRAGON]; + case Type.WATER: + return [Type.WATER, Type.GRASS, Type.DRAGON]; + case Type.GRASS: + return [Type.FLYING, Type.POISON, Type.BUG, Type.STEEL, Type.FIRE, Type.GRASS, Type.DRAGON]; + case Type.ELECTRIC: + return [Type.GRASS, Type.ELECTRIC, Type.DRAGON, Type.GROUND]; + case Type.PSYCHIC: + return [Type.STEEL, Type.PSYCHIC]; + case Type.ICE: + return [Type.STEEL, Type.FIRE, Type.WATER, Type.ICE]; + case Type.DRAGON: + return [Type.STEEL, Type.FAIRY]; + case Type.DARK: + return [Type.FIGHTING, Type.DARK, Type.FAIRY]; + case Type.FAIRY: + return [Type.POISON, Type.STEEL, Type.FIRE]; + case Type.UNKNOWN: + case Type.STELLAR: + default: + return []; + } +} + /** * Retrieve the color corresponding to a specific damage multiplier * @returns A color or undefined if the default color should be used diff --git a/src/data/weather.ts b/src/data/weather.ts index 425dd3724f6..901ad08d164 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; @@ -216,34 +205,34 @@ export function getWeatherClearMessage(weatherType: WeatherType): string { export function getTerrainStartMessage(terrainType: TerrainType): string { 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"); } } export function getTerrainClearMessage(terrainType: TerrainType): string { 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"); } } 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/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 44b72fb3d05..3965eae74f6 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -11,6 +11,7 @@ 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 { getPokemonNameWithAffix } from "./messages"; /** * Class that represents egg hatching @@ -342,7 +343,7 @@ 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(() => { diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 5cdabfe78c2..52f6402861e 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", @@ -59,5 +60,8 @@ export enum BattlerTagType { MINIMIZED = "MINIMIZED", DESTINY_BOND = "DESTINY_BOND", CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", - ICE_FACE = "ICE_FACE" + ICE_FACE = "ICE_FACE", + STOCKPILING = "STOCKPILING", + RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", + ALWAYS_GET_HIT = "ALWAYS_GET_HIT" } 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/stat.ts b/src/enums/stat.ts new file mode 100644 index 00000000000..a40319664d6 --- /dev/null +++ b/src/enums/stat.ts @@ -0,0 +1,8 @@ +export enum Stat { + HP = 0, + ATK, + DEF, + SPATK, + SPDEF, + SPD, +} 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..db0bf3a8d64 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -53,11 +53,17 @@ export enum TrainerType { WORKER, YOUNGSTER, ROCKET_GRUNT, + ROCKET_ADMIN, MAGMA_GRUNT, + MAGMA_ADMIN, AQUA_GRUNT, + AQUA_ADMIN, GALACTIC_GRUNT, + GALACTIC_ADMIN, PLASMA_GRUNT, + PLASMA_SAGE, FLARE_GRUNT, + FLARE_ADMIN, ROCKET_BOSS_GIOVANNI_1, ROCKET_BOSS_GIOVANNI_2, MAXIE, 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/evolution-phase.ts b/src/evolution-phase.ts index c7986f6664f..7633fbb3fdd 100644 --- a/src/evolution-phase.ts +++ b/src/evolution-phase.ts @@ -10,6 +10,7 @@ import { cos, sin } from "./field/anims"; import { PlayerPokemon } from "./field/pokemon"; import { getTypeRgb } from "./data/type"; import i18next from "i18next"; +import { getPokemonNameWithAffix } from "./messages"; export class EvolutionPhase extends Phase { protected pokemon: PlayerPokemon; @@ -116,7 +117,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(); @@ -218,7 +219,7 @@ export class EvolutionPhase extends Phase { 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])); diff --git a/src/field/arena.ts b/src/field/arena.ts index 2d20abeedd1..cb045cc76ac 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -13,7 +13,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"; @@ -384,6 +384,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: @@ -634,6 +638,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 +669,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,7 +721,7 @@ 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; } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 40d6be65480..bf9b10c3c68 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,27 +3,27 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr, OneHitKOAccuracyAttr } 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 { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, 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 { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase, MoveEndPhase } 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 } 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 } from "../data/ability"; +import { ArenaTagSide, WeakenMoveScreenTag } from "../data/arena-tag"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -37,7 +37,7 @@ 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"; @@ -50,6 +50,7 @@ import { BerryType } from "#enums/berry-type"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { getPokemonNameWithAffix } from "#app/messages.js"; export enum FieldPosition { CENTER, @@ -60,6 +61,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; @@ -82,6 +84,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public friendship: integer; public metLevel: integer; public metBiome: Biome | -1; + public metSpecies: Species; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -127,9 +130,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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); + // 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 + 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; } @@ -154,6 +167,7 @@ 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; @@ -161,6 +175,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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.evoCounter = dataSource.evoCounter || 0; @@ -202,6 +217,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) { @@ -228,6 +244,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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 { this.fieldPosition = FieldPosition.CENTER; @@ -297,6 +326,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); @@ -522,7 +556,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 { @@ -775,6 +809,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); } @@ -851,8 +889,41 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return ret; } + /** + * 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. + * @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).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).map(lm => lm[1]); + if (this.metBiome === -1) { + levelMoves = this.getUnlockedEggMoves().concat(levelMoves); + } + return levelMoves.filter(lm => !this.moveset.some(m => m.moveId === lm)); } /** @@ -1118,7 +1189,7 @@ 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)); } /** @@ -1147,7 +1218,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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 typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move, source)); const cancelled = new Utils.BooleanHolder(false); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); if (!typeless && !ignoreAbility) { @@ -1157,10 +1228,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); } - return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; + return (!cancelled.value ? Number(typeMultiplier.value) : 0) as TypeDamageMultiplier; } - getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false): TypeDamageMultiplier { + /** + * Calculates the type effectiveness multiplier for an attack type + * @param moveOrType The move being used, or a type if the move is unknown + * @param source 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 + */ + getAttackTypeEffectiveness(moveOrType: Move | Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { + const move = (moveOrType instanceof Move) + ? moveOrType + : undefined; + const moveType = (moveOrType instanceof Move) + ? move.type + : moveOrType; + if (moveType === Type.STELLAR) { return this.isTerastallized() ? 2 : 1; } @@ -1181,30 +1267,57 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; // 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 && this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 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; + 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)) { + multiplier = 0; + break; + } } return multiplier; } - 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.getBattleStat(Stat.SPD, opponent) : this.getStat(Stat.SPD)) >= opponent.getBattleStat(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); } @@ -1237,7 +1350,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return null; } - getLevelMoves(startingLevel?: integer, includeEvolutionMoves: boolean = false, simulateEvolutionChain: boolean = false): LevelMoves { + /** + * Gets all level up moves in a given range for a particular pokemon. + * @param {integer} startingLevel Don't include moves below this level + * @param {boolean} includeEvolutionMoves Whether to include evolution moves + * @param {boolean} simulateEvolutionChain Whether to include moves from prior evolutions + * @param {boolean} includeRelearnerMoves Whether to include moves that would require a relearner. Note the move relearner inherently allows evolution moves + * @returns {LevelMoves} A list of moves and the levels they can be learned at + */ + getLevelMoves(startingLevel?: integer, includeEvolutionMoves: boolean = false, simulateEvolutionChain: boolean = false, includeRelearnerMoves: boolean = false): LevelMoves { const ret: LevelMoves = []; let levelMoves: LevelMoves = []; if (!startingLevel) { @@ -1248,62 +1369,45 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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(); - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && !lm[0]) || ((!e || lm[0] > 1) && (e === evolutionChain.length - 1 || lm[0] <= evolutionChain[e + 1][1])))); - } - levelMoves.sort((lma: [integer, integer], lmb: [integer, integer]) => lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0); - const uniqueMoves: Moves[] = []; - levelMoves = levelMoves.filter(lm => { - if (uniqueMoves.find(m => m === lm[1])) { - return false; + if (includeRelearnerMoves) { + levelMoves.push(...speciesLevelMoves); + } else { + levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || ((!e || lm[0] > 1) && (e === evolutionChain.length - 1 || lm[0] <= evolutionChain[e + 1][1])))); } - uniqueMoves.push(lm[1]); - return true; - }); + } } else { - levelMoves = this.getSpeciesForm(true).getLevelMoves(); + levelMoves = this.getSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === 0) || (includeRelearnerMoves && lm[0] === -1) || lm[0] > 0); } if (this.fusionSpecies) { - const evolutionLevelMoves = levelMoves.slice(0, Math.max(levelMoves.findIndex(lm => !!lm[0]), 0)); - const fusionLevelMoves = this.getFusionSpeciesForm(true).getLevelMoves(); - const fusionEvolutionLevelMoves = fusionLevelMoves.slice(0, Math.max(fusionLevelMoves.findIndex(flm => !!flm[0]), 0)); - const newLevelMoves: LevelMoves = []; - while (levelMoves.length && levelMoves[0][0] < startingLevel) { - levelMoves.shift(); - } - while (fusionLevelMoves.length && fusionLevelMoves[0][0] < startingLevel) { - fusionLevelMoves.shift(); - } - if (includeEvolutionMoves) { - for (const elm of evolutionLevelMoves.reverse()) { - levelMoves.unshift(elm); - } - for (const felm of fusionEvolutionLevelMoves.reverse()) { - fusionLevelMoves.unshift(felm); - } - } - for (let l = includeEvolutionMoves ? 0 : startingLevel; l <= this.level; l++) { - if (l === 1 && startingLevel > 1) { - l = startingLevel; - } - while (levelMoves.length && levelMoves[0][0] === l) { - const levelMove = levelMoves.shift(); - if (!newLevelMoves.find(lm => lm[1] === levelMove[1])) { - newLevelMoves.push(levelMove); - } - } - while (fusionLevelMoves.length && fusionLevelMoves[0][0] === l) { - const fusionLevelMove = fusionLevelMoves.shift(); - if (!newLevelMoves.find(lm => lm[1] === fusionLevelMove[1])) { - newLevelMoves.push(fusionLevelMove); + if (simulateEvolutionChain) { + 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(); + if (includeRelearnerMoves) { + levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || lm[0] !== 0)); + } else { + levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || ((!e || lm[0] > 1) && (e === fusionEvolutionChain.length - 1 || lm[0] <= fusionEvolutionChain[e + 1][1])))); } } + } else { + levelMoves.push(...this.getFusionSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === 0) || (includeRelearnerMoves && lm[0] === -1) || lm[0] > 0)); } - levelMoves = newLevelMoves; } + levelMoves.sort((lma: [integer, integer], lmb: [integer, integer]) => lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0); + const uniqueMoves: Moves[] = []; + levelMoves = levelMoves.filter(lm => { + if (uniqueMoves.find(m => m === lm[1])) { + return false; + } + uniqueMoves.push(lm[1]); + return true; + }); + if (levelMoves) { for (const lm of levelMoves) { const level = lm[0]; - if ((!includeEvolutionMoves || level) && level < startingLevel) { + if (!includeRelearnerMoves && ((level > 0 && level < startingLevel) || (!includeEvolutionMoves && level === 0) || level < 0)) { continue; } else if (level > this.level) { break; @@ -1339,8 +1443,8 @@ 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; @@ -1722,13 +1826,64 @@ 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 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 userAccuracyLevel = new Utils.IntegerHolder(this.summonData.battleStats[BattleStat.ACC]); + const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]); + + applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, userAccuracyLevel); + applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, targetEvasionLevel); + applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, targetEvasionLevel); + applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, target, sourceMove, targetEvasionLevel); + this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), TempBattleStat.ACC, userAccuracyLevel); + + 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, this, BattleStat.ACC, accuracyMultiplier, sourceMove); + + const evasionMultiplier = new Utils.NumberHolder(1); + applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier); + + accuracyMultiplier.value /= evasionMultiplier.value; + + return accuracyMultiplier.value; + } + apply(source: Pokemon, move: Move): HitResult { let result: HitResult; const damage = new Utils.NumberHolder(0); @@ -1738,15 +1893,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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); const cancelled = new Utils.BooleanHolder(false); + const power = move.calculateBattlePower(source, this); 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) + ? this.getAttackTypeEffectiveness(move, source, false, false) : 1); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); if (typeless) { @@ -1765,32 +1920,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget); } + // Apply exceptional condition of Crafty Shield if the move used is Curse + if (move.id === Moves.CURSE) { + const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget); + } + 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]); - } - - power.value *= typeChangeMovePowerMultiplier.value; if (!typeless) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); @@ -1806,27 +1946,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { result = 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); - } + if (typeBoost?.oneUse) { + source.removeTag(typeBoost.tagType); } + const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(move.type, 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; - } - 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); @@ -1838,6 +1967,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else { const critLevel = new Utils.IntegerHolder(0); applyMoveAttrs(HighCritAttr, source, this, move, critLevel); + this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critLevel); this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel); const bonusCrit = new Utils.BooleanHolder(false); if (applyAbAttrs(BonusCritAbAttr, source, null, bonusCrit)) { @@ -1848,6 +1978,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (source.getTag(BattlerTagType.CRIT_BOOST)) { critLevel.value += 2; } + console.log(`crit stage: +${critLevel.value}`); const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))]; isCritical = !source.getTag(BattlerTagType.NO_CRIT) && (critChance === 1 || !this.scene.randBattleSeedInt(critChance)); if (Overrides.NEVER_CRIT_OVERRIDE) { @@ -1885,6 +2016,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); } + const targetCount = getMoveTargets(source, move.id).targets.length; + const targetMultiplier = targetCount > 1 ? 0.75 : 1; // 25% damage debuff on multi-target hits (even if it's immune) + applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); @@ -1897,7 +2031,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); if (!isTypeImmune) { - damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * twoStrikeMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); + const levelMultiplier = (2 * source.level / 5 + 2); + const randomMultiplier = ((this.scene.randBattleSeedInt(16) + 85) / 100); + damage.value = Math.ceil((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2) + * stabMultiplier.value + * typeMultiplier.value + * 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); @@ -1939,9 +2085,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!typeMultiplier.value) { result = move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; } else { - const oneHitKo = new Utils.BooleanHolder(false); - applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); - if (oneHitKo.value) { + 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; @@ -1955,37 +2101,41 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - 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, 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) { + if (this.isFullHp()) { applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, damage); } else if (!this.isPlayer() && damage.value >= this.hp) { this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); } /** - * We explicitly require to ignore the faint phase here, as we want to show the messages - * about the critical hit and the super effective/not very effective messages before the faint phase. - */ - damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo, true); + * 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")); } @@ -1998,7 +2148,7 @@ 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()) { if (!this.isPlayer()) { @@ -2010,7 +2160,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - 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")); @@ -2019,7 +2170,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); break; case HitResult.NO_EFFECT: - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); break; case HitResult.IMMUNE: this.scene.queueMessage(`${this.name} is unaffected!`); @@ -2031,13 +2182,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } 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); } @@ -2052,7 +2203,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, typeMultiplier)); } if (!typeMultiplier.value) { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); } result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; break; @@ -2061,6 +2212,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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; @@ -2082,9 +2241,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(); } @@ -2092,6 +2258,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); @@ -2126,7 +2302,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const newTag = getBattlerTag(tagType, turnCount, sourceMove, sourceId); 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); @@ -2138,13 +2317,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } + /** @overload */ + getTag(tagType: BattlerTagType): BattlerTag; + + /** @overload */ + getTag(tagType: Constructor): T; + getTag(tagType: BattlerTagType | Constructor): BattlerTag { 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); } findTag(tagFilter: ((tag: BattlerTag) => boolean)) { @@ -2154,15 +2339,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 []; @@ -2182,7 +2358,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); }); @@ -2192,7 +2368,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); } @@ -2540,6 +2715,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; } @@ -2990,6 +3168,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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) + */ + leaveField(clearEffects: boolean = true) { + this.resetTurnData(); + if (clearEffects) { + this.resetSummonData(); + this.resetBattleData(); + } + this.hideInfo(); + this.setVisible(false); + this.scene.field.remove(this); + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); + } + destroy(): void { this.battleInfo?.destroy(); super.destroy(); @@ -2998,6 +3193,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 { @@ -3090,25 +3296,21 @@ 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); }); } @@ -3121,7 +3323,7 @@ export class PlayerPokemon extends Pokemon { fusionStarterSpeciesId ? this.scene.gameData.starterData[fusionStarterSpeciesId] : null ].filter(d => d); const amount = new Utils.IntegerHolder(friendship); - const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic ? 2 : 1) / (fusionStarterSpeciesId ? 2 : 1))); + const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic && friendship > 0 ? 2 : 1) / (fusionStarterSpeciesId ? 2 : 1))); if (amount.value > 0) { this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount); @@ -3204,9 +3406,10 @@ export class PlayerPokemon extends Pokemon { }); } - evolve(evolution: SpeciesFormEvolution): Promise { + evolve(evolution: SpeciesFormEvolution, preEvolution: PokemonSpeciesForm): Promise { return new Promise(resolve => { this.pauseEvolutions = false; + // Handles Nincada evolving into Ninjask + Shedinja this.handleSpecialEvolutions(evolution); const isFusion = evolution instanceof FusionSpeciesFormEvolution; if (!isFusion) { @@ -3225,13 +3428,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); @@ -3275,9 +3493,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; @@ -3370,7 +3588,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)); @@ -3519,7 +3737,13 @@ 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) : null; @@ -3532,11 +3756,15 @@ export class EnemyPokemon extends Pokemon { } } + // 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) }; } + // 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); @@ -3545,11 +3773,16 @@ export class EnemyPokemon extends Pokemon { } } switch (this.aiType) { - case AiType.RANDOM: + case AiType.RANDOM: // No enemy should spawn with this AI type in-game const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)].moveId; 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) ])); for (const m in movePool) { @@ -3566,14 +3799,26 @@ 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) { + /** + * 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.getAttackMoveEffectiveness(this, pokemonMove); if (target.isPlayer() !== this.isPlayer()) { targetScore *= effectiveness; @@ -3586,13 +3831,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 @@ -3601,6 +3847,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)]; @@ -3609,10 +3856,12 @@ 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++; @@ -3626,15 +3875,25 @@ export class EnemyPokemon extends Pokemon { 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) ]); @@ -3658,12 +3917,14 @@ 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); @@ -3678,6 +3939,11 @@ 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; @@ -3861,6 +4127,7 @@ export class EnemyPokemon extends Pokemon { 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; @@ -3891,6 +4158,7 @@ export interface AttackMoveResult { damage: integer; critical: boolean; sourceId: integer; + sourceBattlerIndex: BattlerIndex; } export class PokemonSummonData { @@ -3937,6 +4205,7 @@ export class PokemonTurnData { public currDamageDealt: integer = 0; public damageTaken: integer = 0; public attacksReceived: AttackMoveResult[] = []; + public order: number; } export enum AiType { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 3e78afeae83..107dfbe6831 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -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", "admin", "sage"]; + 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); diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index 7d4e8349775..55bf655081b 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -10,6 +10,7 @@ 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 { getPokemonNameWithAffix } from "./messages"; export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; @@ -34,7 +35,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 => { @@ -191,7 +192,7 @@ export class QuietFormChangePhase extends BattlePhase { return this.end(); } - const preName = this.pokemon.name; + const preName = getPokemonNameWithAffix(this.pokemon); if (!this.pokemon.isOnField()) { this.pokemon.changeForm(this.formChange).then(() => { @@ -280,7 +281,6 @@ export class QuietFormChangePhase extends BattlePhase { end(): void { if (this.pokemon.scene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { this.scene.playBgm(); - this.pokemon.summonData.battleStats = [ 0, 0, 0, 0, 0, 0, 0 ]; this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); this.pokemon.findAndRemoveTags(() => true); this.pokemon.bossSegments = 5; diff --git a/src/game-mode.ts b/src/game-mode.ts index 0a472e223e3..010cae03e5e 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -4,7 +4,7 @@ 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"; @@ -107,22 +107,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 +153,7 @@ export class GameMode implements GameModeConfig { } } } - return allowTrainerBattle && trainerChance && !Utils.randSeedInt(trainerChance); + return Boolean(allowTrainerBattle && trainerChance && !Utils.randSeedInt(trainerChance)); } return false; } diff --git a/src/interfaces/locales.ts b/src/interfaces/locales.ts index 76dc76058aa..5f7c52100c1 100644 --- a/src/interfaces/locales.ts +++ b/src/interfaces/locales.ts @@ -58,6 +58,20 @@ export interface BerryTranslationEntries { [key: string]: BerryTranslationEntry } +export interface StatusEffectTranslationEntries { + [key: string]: StatusEffectTranslationEntry +} + +export interface StatusEffectTranslationEntry { + name: string, + obtain: string, + obtainSource: string, + activation: string, + overlap: string, + heal: string + description: string, +} + export interface AchievementTranslationEntry { name?: string, description?: string, diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 0a6648a9c57..5275411055e 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,7 @@ export class LoadingScene extends SceneBase { this.loadImage("loading_bg", "arenas"); this.loadImage("logo", ""); - this.loadImage("pride-update", "events"); + // this.loadImage("pride-update", "events"); // Load menu images this.loadAtlas("bg", "ui"); @@ -78,6 +80,7 @@ export class LoadingScene extends SceneBase { this.loadImage("overlay_exp", "ui"); this.loadImage("icon_owned", "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,6 +93,7 @@ export class LoadingScene extends SceneBase { this.loadImage("shiny_star_small", "ui", "shiny_small.png"); this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); + this.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"); @@ -144,6 +148,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 +160,8 @@ 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("default_bg", "arenas"); // Load arena images @@ -427,7 +436,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, @@ -475,7 +484,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 +499,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/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 4e69db20231..3c9586fb6f2 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -5,7 +5,59 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", "iceFaceAvoidedDamage": "{{pokemonName}} 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}}!", + "postDefendDisguise": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!", + "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!", + "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!", + "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!", } as const; diff --git a/src/locales/de/arena-flyout.ts b/src/locales/de/arena-flyout.ts new file mode 100644 index 00000000000..c353b432bc0 --- /dev/null +++ b/src/locales/de/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Aktive Kampfeffekte", + "player": "Spieler", + "neutral": "Neutral", + "enemy": "Gegner", + + // WeatherType + "sunny": "Sonne", + "rain": "Regen", + "sandstorm": "Sandsturm", + "hail": "Hagelsturm", + "snow": "Schneesturm", + "fog": "Nebel", + "heavyRain": "Strömender Regen", + "harshSun": "Sehr starker Sonnenschein", + "strongWinds": "Luftströmungen", + + // TerrainType + "misty": "Nebelfeld", + "electric": "Elektrofeld", + "grassy": "Grasfeld", + "psychic": "Psychofeld", + + // ArenaTagType + "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", +}; diff --git a/src/locales/de/arena-tag.ts b/src/locales/de/arena-tag.ts new file mode 100644 index 00000000000..cc0a821aade --- /dev/null +++ b/src/locales/de/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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!", + "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!", +} as const; diff --git a/src/locales/de/battle-info.ts b/src/locales/de/battle-info.ts new file mode 100644 index 00000000000..f24dad46c6c --- /dev/null +++ b/src/locales/de/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generation {{generation}}", +} as const; diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 72acb7d073e..a9686da7524 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -2,21 +2,22 @@ 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!", + "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}}\nund {{pokemonName2}} erscheinen!", + "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\n{{pokemonName}} auswechseln?", - "trainerDefeated": "{{trainerName}}\nwurde besiegt!", - "moneyWon": "Du gewinnst\n{{moneyAmount}} ₽!", + "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.\nMöchtest du ein Pokémon durch {{pokemonName}} ersetzen?", + "partyFull": "Dein Team ist voll. Möchtest du ein Pokémon durch {{pokemonName}} ersetzen?", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", "hitResultCriticalHit": "Ein Volltreffer!", @@ -25,37 +26,38 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…", "hitResultOneHitKO": "Ein K.O.-Treffer!", "attackFailed": "Es ist fehlgeschlagen!", + "attackMissed": "Die Attacke hat {{pokemonNameWithAffix}} verfehlt!", "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}}!", + "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\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.", + "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\n{{moveName}} vergessen.", + "learnMoveForgetSuccess": "{{pokemonName}} hat {{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!", + "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\ndiese Attacke mehr übrig!", + "moveNoPP": "Es sind keine AP für diese 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}}!", + "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?", - "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", + "notDisabled": "{{moveName}} von {{pokemonName}} ist nicht mehr deaktiviert!", "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", "hpIsFull": "Die KP von {{pokemonName}} sind voll!", "eggHatching": "Oh?", @@ -65,16 +67,34 @@ export const battle: SimpleTranslationEntries = { "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!", - "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!", + "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}}!", "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.", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", "battlerTagsPerishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} zieht alle Aufmerksamkeit auf sich!", "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!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} schwebt aufgrund von Elektromagnetismus!", + "battlerTagsMagnetRisenOnRemove": "Der Elektromagnetismus von {{pokemonNameWithAffix}} hört auf zu wirken!", "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!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/de/battler-tags.ts b/src/locales/de/battler-tags.ts new file mode 100644 index 00000000000..2858d163dac --- /dev/null +++ b/src/locales/de/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "Wechselsperre", + "flinchedDesc": "Zurückschrecken", + "confusedDesc": "Verwirrung", + "infatuatedDesc": "Verliebt", + "seedDesc": "Bepflanzt", + "nightmareDesc": "Nachtmahr", + "ingrainDesc": "Verwurzlung", + "drowsyDesc": "Schläfrigkeit", +} as const; diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts index 71e775c8846..2a247e51a44 100644 --- a/src/locales/de/bgm-name.ts +++ b/src/locales/de/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Musik", + "music": "Musik: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "S2W2 Vs. Kanto Champion", "battle_johto_champion": "S2W2 Vs. Johto Champion", @@ -74,16 +74,16 @@ 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_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", // Biome Music "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "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", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD Erkundungsteam Himmel Himmelsgipfel-Küste", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD Erkundungsteam Himmel Himmelsgipfel-Schneefeld", "space": "Firel - Aether", "swamp": "PMD Erkundungsteam Himmel Ringmeer", diff --git a/src/locales/de/challenges.ts b/src/locales/de/challenges.ts index 176de9879b6..e5e8a96f3fd 100644 --- a/src/locales/de/challenges.ts +++ b/src/locales/de/challenges.ts @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "Du kannst nur Pokémon des gewählten Typs verwenden." // types in pokemon-info }, + "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", + } } as const; diff --git a/src/locales/de/common.ts b/src/locales/de/common.ts index 82966b4ffeb..07f920aaf30 100644 --- a/src/locales/de/common.ts +++ b/src/locales/de/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "Start", + "luckIndicator": "Glück:", + "shinyOnHover": "Schillernd", + "commonShiny": "Gewöhnlich", + "rareShiny": "Selten", + "epicShiny": "Episch", } as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index b7bb827d8d3..d0779c9eec4 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/de/settings.js"; -import { common } from "#app/locales/de/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const deConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const deConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/de/dialogue.ts b/src/locales/de/dialogue.ts index 02c497b3182..57fd9071463 100644 --- a/src/locales/de/dialogue.ts +++ b/src/locales/de/dialogue.ts @@ -378,6 +378,19 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Das war mal wieder ein Schuss in den Ofen!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? Du wagst es, dich Team Rocket zu widersetzen? Du wirst es bereuen.", + 2: "Du glaubst, du kannst uns aufhalten? Naiver Narr!", + 3: "Ich werde dir die wahre Macht von Team Rocket zeigen!" + }, + "victory": { + 1: "Nein! Verzeih mir, Giovanni!", + 2: "Wie konnte das geschehen?", + 3: "Urgh... Du warst zu stark..." + }, + }, + "firebreather": { "encounter": { 1: "Meine Flammen werden dich verschlingen!", @@ -410,6 +423,20 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Wie kann das sein? Ich bin Teil vom mächtigen Team Magma! Wir wollen doch nur die Welt verbessern…" }, }, + "magma_admin": { + "encounter": { + 1: `Hahaha! Du hast den ganzen weiten Weg auf dich genommen! Aber du bist zu spät! + $Unsere Mission ist schon fast abgeschlossen!`, + 2: `Du willst dich in Team Magmas Angelegenheiten einmischen? Du bist so süß, dass es ekelhaft ist! + $Ich werde dich ein für alle Mal erledigen!`, + 3: "Ich werde dir zeigen, was wahrer Schmerz ist! Mach dich bereit!", + }, + "victory": { + 1: "Hahaha! Ouch! Ich habe wohl verloren...", + 2: "Du bist ekelhaft stark!", + 3: "Da habe ich meine eigene Medizin zu schmecken bekommen!" + }, + }, "aqua_grunt": { "encounter": { 1: "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!", @@ -418,6 +445,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Vielleicht sollte ich wohl lieber selber über die Planke gehen…", }, }, + "aqua_admin": { + "encounter": { + 1: "Ich bin eine Stufe über den Rüpeln, die du bisher gesehen hast. Ich werde dich pulverisieren!", + 2: "Hmmm? Wer ist das? Wer ist dieses verwöhnte Gör?", + 3: "Was machst du hier? Bist du uns gefolgt? Dann müssen wir dich wohl loswerden!" + }, + "victory": { + 1: "Also habe ich auch verloren...", + 2: "Ahhh?! War ich zu nachsichtig mit dir?!", + 3: "W-was war das?" + }, + }, "galactic_grunt": { "encounter": { 1: "Team Galaktik wird die Welt in eine bessere Welt verwandeln! Und du wirst uns nicht aufhalten!" @@ -426,6 +465,19 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Zyrus wird uns für diese Niederlage bestrafen…" }, }, + "galactic_admin": { + "encounter": { + 1: "Ich bin einer der Commander von Team Galaktik. Wir werden Zyrus' Traum verwirklichen!", + 2: `Alles, was sich Team Galaktik widersetzt, muss zerschlagen werden! + $Selbst der Gedanke an Widerstand wird nicht toleriert!`, + 3: "Was ist los? Sag mir nicht, dass du zitterst? Mach ich dir Angst? Gut so! Knie nieder!" + }, + "victory": { + 1: "Das kann nicht sein?! Ich habe verloren?! Du... du freches Gör!", + 2: "Du, mein Freund, bist stark! Aber widestand ist zwecklos! Team Galaktik wird siegen!", + 3: "Gegen ein Kind zu verlieren... Meine Unachtsamkeit wird mir nicht verziehen werden..." + }, + }, "plasma_grunt": { "encounter": { 1: "Pokémon sollten frei sein! Team Plasma wird sie befreien!" @@ -434,6 +486,19 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten…" }, }, + "plasma_sage": { + "encounter": { + 1: "Du könntest eine Bedrohung für Team Plasma werden, also werden wir dich hier eliminieren!", + 2: "Oh, ernsthaft... Ich hatte nicht erwartet, kämpfen zu müssen!", + 3: `Du bist ein beeindruckender Trainer, dass du es so weit geschafft hast. + $Als Weiser von Team Plasma werde ich dich besiegen!` + }, + "victory": { + 1: "G-Cis...", + 2: "Es ist bitterkalt. Ich zittere. Ich leide.", + 3: "Hm. Du bist ein klügerer Trainer, als ich erwartet hatte. Ich bin beeindruckt." + }, + }, "flare_grunt": { "encounter": { 1: `Ich bin ein Mitglied von Team Flare! Das sieht man mir doch an. Mein Stil ist unverkennbar! @@ -443,6 +508,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Stil ist wohl doch nicht alles…" }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! Es wäre mir ein Vergnügen. Komm schon, kleiner Trainer! Zeig mir, was du drauf hast!", + 2: "Wir von Team Flare sind die einzigen, die die Schönheit der Welt wirklich schätzen!", + 3: "Ich habe auf dich gewartet! Lass mich ein wenig an dir forschen! Komm, lass uns beginnen!" + }, + "victory": { + 1: "Du bist ziemlich stark. Oh ja, sehr stark, in der Tat.", + 2: "Es scheint als hätte ich mich geirrt… Der Sieger steht fest.", + 3: "Wunderbar! Erstaunlich! Du hast enormes Geschick und dieser Mut!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: `Ich bin beeindruckt, du hast es bis hierher geschafft! @@ -476,7 +553,7 @@ export const PGMdialogue: DialogueTranslationEntries = { $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!" + 1: "Ugh! Das entspricht nicht meinen Berechnungen! Wie konnte ich verlieren? Wir sehen uns wieder!" }, "defeat": { 1: "Team Magma wird weiterhin die Welt verbessern!" @@ -542,7 +619,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "plasma_boss_ghetsis_1": { "encounter": { - 1:"Ich werde nicht zulassen, dass mich jemand aufhält! Egal wer es auch sein mag!" + 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!" @@ -2604,7 +2681,7 @@ export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDial // 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. + `@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. @@ -2615,7 +2692,7 @@ export const PGMmiscDialogue: SimpleTranslationEntries = { $@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{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. diff --git a/src/locales/de/egg.ts b/src/locales/de/egg.ts index 61a2f627aa4..9dc7b10f174 100644 --- a/src/locales/de/egg.ts +++ b/src/locales/de/egg.ts @@ -22,4 +22,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}}", + "moveUPGacha": "Mehr\nEi-Attacken!", + "shinyUPGacha": "Mehr\nSchillernde!", + "legendaryUPGacha": "erscheint\nöfter!", } as const; diff --git a/src/locales/de/filter-bar.ts b/src/locales/de/filter-bar.ts new file mode 100644 index 00000000000..9c1009171e2 --- /dev/null +++ b/src/locales/de/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen.", + "typeFilter": "Typ", + "dexFilter": "Dex.", + "unlocksFilter": "Freisch.", + "miscFilter": "Sonst.", + "sortFilter": "Sort.", + "all": "Alle", + "normal": "Normal", + "uncaught": "Nicht gefangen", + "passive": "Passive", + "passiveUnlocked": "Passive freigeschaltet", + "passiveLocked": "Passive gesperrt", + "ribbon": "Band", + "hasWon": "Hat Klassik-Modus gewonnen", + "hasNotWon": "Hat Klassik-Modus nicht gewonnen", + "sortByNumber": "Pokédex-Nummer", + "sortByCost": "Kosten", + "sortByCandies": "Anzahl Bonbons", + "sortByIVs": "IS-Werte", + "sortByName": "Name", +}; diff --git a/src/locales/de/game-mode.ts b/src/locales/de/game-mode.ts index 72661bd4682..3347bbb565f 100644 --- a/src/locales/de/game-mode.ts +++ b/src/locales/de/game-mode.ts @@ -6,5 +6,5 @@ export const gameMode: SimpleTranslationEntries = { "endlessSpliced": "Endlos (Fusion)", "dailyRun": "Täglicher Run", "unknown": "Unbekannt", - "challenge": "Challenge", + "challenge": "Herausforderung", } as const; diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index 0338ba6f399..6d461d286af 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Wähle einen Slot zum Exportieren.", "importData": "Daten importieren", "exportData": "Daten exportieren", + "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!" diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index bffcdeb1c3e..bfc4c31efcb 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -17,6 +17,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.", @@ -54,5 +55,8 @@ export const menu: SimpleTranslationEntries = { "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; diff --git a/src/locales/de/modifier-select-ui-handler.ts b/src/locales/de/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..78248f82da1 --- /dev/null +++ b/src/locales/de/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}}₽" +} as const; diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index 8b2950f44c3..90ac9413466 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { 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.", + description: "Erhöht das Level eines Pokémon um {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Erhöht das Level aller Teammitglieder um 1.", + description: "Erhöht das Level aller Teammitglieder um {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Erhöht den {{statName}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist.", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "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." }, + "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" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Sanftglocke" }, + "SCOPE_LENS": { name: "Scope-Linse", description: "Ein Item zum Tragen. Es erhöht die 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)." }, @@ -208,7 +213,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "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)." }, + "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." }, @@ -221,7 +226,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "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." }, + "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)." }, diff --git a/src/locales/de/modifier.ts b/src/locales/de/modifier.ts new file mode 100644 index 00000000000..5a8126e3d85 --- /dev/null +++ b/src/locales/de/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "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!", + "pokemonResetNegativeStatStageApply": "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!", +} as const; diff --git a/src/locales/de/move-trigger.ts b/src/locales/de/move-trigger.ts new file mode 100644 index 00000000000..427ec6acbde --- /dev/null +++ b/src/locales/de/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "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!", + "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!", + "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!", + "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!", + "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!", + "swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!", +} as const; diff --git a/src/locales/de/move.ts b/src/locales/de/move.ts index 430b4f85ec3..f8e5f7c6ff5 100644 --- a/src/locales/de/move.ts +++ b/src/locales/de/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "dynamaxCannon": { name: "Dynamax-Kanone", - effect: "Der Anwender schießt einen Strahl aus seinem Kern ab. Dynamaximierte Ziele erleiden doppelten Schaden." + 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", diff --git a/src/locales/de/party-ui-handler.ts b/src/locales/de/party-ui-handler.ts index da83d2370c3..097b670c768 100644 --- a/src/locales/de/party-ui-handler.ts +++ b/src/locales/de/party-ui-handler.ts @@ -6,5 +6,49 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "Abbrechen", "RELEASE": "Freilassen", "APPLY": "Anwenden", - "TEACH": "Erlernen" + "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", + + // Slot TM text + "able": "Erlernbar!", + "notAble": "Nicht erlernbar", + "learned": "Bereits erlernt!", + + // Releasing messages + "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}}!", } as const; diff --git a/src/locales/de/pokemon-form.ts b/src/locales/de/pokemon-form.ts new file mode 100644 index 00000000000..53ecc310411 --- /dev/null +++ b/src/locales/de/pokemon-form.ts @@ -0,0 +1,198 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + // Battle forms + "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!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Rocker-Pikachu", + "pikachuBeautyCosplay": "Damen-Pikachu", + "pikachuCuteCosplay": "Star-Pikachu", + "pikachuSmartCosplay": "Professoren-Pikachu", + "pikachuToughCosplay": "Wrestler-Pikachu", + "pikachuPartner": "Partner-Pikachu", + "eeveePartner": "Partner-Evoli", + // 2G + "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": "?", + // 3G + "castformSunny": "Sonnenform", + "castformRainy": "Regenform", + "castformSnowy": "Schneeform", + "deoxysNormal": "Normalform", + // 4G + "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", + // 5G + "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", + // 6G + "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", + // 7G + "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", + // 8G + "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", + // 9G + "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", + +} as const; diff --git a/src/locales/de/pokemon-info-container.ts b/src/locales/de/pokemon-info-container.ts index f408dbcff9c..1f82cf2cd83 100644 --- a/src/locales/de/pokemon-info-container.ts +++ b/src/locales/de/pokemon-info-container.ts @@ -5,7 +5,4 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "Geschlecht:", "ability": "Fähigkeit:", "nature": "Wesen:", - "epic": "Episch", - "rare": "Selten", - "common": "Gewöhnlich" } as const; diff --git a/src/locales/de/pokemon-summary.ts b/src/locales/de/pokemon-summary.ts new file mode 100644 index 00000000000..69683d4d4a0 --- /dev/null +++ b/src/locales/de/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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.", + }, +} as const; diff --git a/src/locales/de/save-slot-select-ui-handler.ts b/src/locales/de/save-slot-select-ui-handler.ts index b6577cd574a..47069d62780 100644 --- a/src/locales/de/save-slot-select-ui-handler.ts +++ b/src/locales/de/save-slot-select-ui-handler.ts @@ -4,6 +4,6 @@ export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Den ausgewählten Speicherstand überschreiben?", "loading": "Läd...", "wave": "Welle", - "lv": "Lvl", + "lv": "Lv. ", "empty": "Leer", } as const; diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts index 85f8645d69f..227b8f97581 100644 --- a/src/locales/de/settings.ts +++ b/src/locales/de/settings.ts @@ -82,7 +82,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 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Controllerunterstützung", "showBgmBar": "Musiknamen anzeigen", + "shopOverlayOpacity": "Shop Overlay Deckkraft", } as const; diff --git a/src/locales/de/splash-messages.ts b/src/locales/de/splash-messages.ts index f5ab8572b7b..a521d96057d 100644 --- a/src/locales/de/splash-messages.ts +++ b/src/locales/de/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Versuche auch Radical Red!", "eeveeExpo": "Evoli-Expo!", "ynoproject": "YNO-Projekt!", + "breedersInSpace": "Züchter im Weltall!", } as const; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index 92ead61ebe7..e8ae4ed201e 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -7,6 +7,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Mit diesen Pokémon losziehen?", + "confirmExit": "Do you want to exit?", + "invalidParty": "Das ist kein gültiges Team!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,6 +24,7 @@ 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", diff --git a/src/locales/de/status-effect.ts b/src/locales/de/status-effect.ts new file mode 100644 index 00000000000..b48bd468626 --- /dev/null +++ b/src/locales/de/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Gift", + description: "Vergiftungen", + obtain: "{{pokemonNameWithAffix}} wurde vergiftet!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} vergiftet!", + activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", + heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + toxic: { + name: "Gift", + description: "Vergiftungen", + obtain: "{{pokemonNameWithAffix}} wurde schwer vergiftet!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} schwer vergiftet!", + activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", + heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + paralysis: { + name: "Paralyse", + description: "Paralyse", + obtain: "{{pokemonNameWithAffix}} wurde paralysiert!\nEs kann eventuell nicht handeln!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} paralysiert,\nEs kann eventuell nicht handeln!", + activation: "{{pokemonNameWithAffix}} ist paralysiert!\nEs kann nicht angreifen!", + overlap: "{{pokemonNameWithAffix}} ist bereits paralysiert!", + heal: "Die Paralyse von {{pokemonNameWithAffix}} wurde aufgehoben!" + }, + sleep: { + name: "Schlaf", + description: "Einschlafen", + obtain: "{{pokemonNameWithAffix}} ist eingeschlafen!", + obtainSource: "{{pokemonNameWithAffix}}ist durch {{sourceText}} eingeschlafen!", + activation: "{{pokemonNameWithAffix}} schläft tief und fest!", + overlap: "{{pokemonNameWithAffix}} schläft bereits!", + heal: "{{pokemonNameWithAffix}} ist aufgewacht!" + }, + freeze: { + name: "Gefroren", + description: "Einfrieren", + obtain: "{{pokemonNameWithAffix}} erstarrt zu Eis!", + obtainSource: "{{pokemonNameWithAffix}} erstarrt durch {{sourceText}} zu Eis!", + activation: "{{pokemonNameWithAffix}} ist eingefroren und kann nicht handeln!", + overlap: "{{pokemonNameWithAffix}} ist bereits eingefroren!", + heal: "{{pokemonNameWithAffix}} wurde aufgetaut!" + }, + burn: { + name: "Verbrennung ", + description: "Verbrennungen", + obtain: "{{pokemonNameWithAffix}} erleidet Verbrennungen!", + obtainSource: "{{pokemonNameWithAffix}} erleidet durch {{sourceText}} Verbrennungen!", + activation: "Die Verbrennungen schaden {{pokemonNameWithAffix}}!", + overlap: "{{pokemonNameWithAffix}} leidet bereits unter Verbrennungen!", + heal: "Die Verbrennungen von {{pokemonNameWithAffix}} wurden geheilt!" + }, +} as const; diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 1390bf410ae..5b156afd331 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Rüpel von Team Rocket", "rocket_grunt_female": "Rüpel von Team Rocket", "rocket_grunts": "Rüpel von Team Rocket", + "rocket_admin": "Team Rocket Vorstand", + "rocket_admin_female": "Team Rocket Vorstand", "magma_grunt": "Rüpel von Team Magma", "magma_grunt_female": "Rüpel von Team Magma", "magma_grunts": "Rüpel von Team Magma", + "magma_admin": "Team Magma Vorstand", + "magma_admin_female": "Team Magma Vorstand", "aqua_grunt": "Rüpel von Team Aqua", "aqua_grunt_female": "Rüpel von Team Aqua", "aqua_grunts": "Rüpel von Team Aqua", + "aqua_admin": "Team Aqua Vorstand", + "aqua_admin_female": "Team Aqua Vorstand", "galactic_grunt": "Rüpel von Team Galaktik", "galactic_grunt_female": "Rüpel von Team Galaktik", "galactic_grunts": "Rüpel von Team Galaktik", + "galactic_admin": "Team Galaktik Commander", + "galactic_admin_female": "Team Galaktik Commander", "plasma_grunt": "Rüpel von Team Plasma", "plasma_grunt_female": "Rüpel von Team Plasma", "plasma_grunts": "Rüpel von Team Plasma", + "plasma_sage": "Weiser 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", + "flare_admin": "Team Flare Vorstand", + "flare_admin_female": "Team Flare Vorstand", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/de/weather.ts b/src/locales/de/weather.ts index 1132c35c430..8a820f3d549 100644 --- a/src/locales/de/weather.ts +++ b/src/locales/de/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "Alle Flug-Pokémon werden von rätselhaften Luftströmungen geschützt!", "strongWindsLapseMessage": "Die rätselhafte Luftströmung hält an.", + "strongWindsEffectMessage": "Rätselhafte Luftströmungen haben den Angriff abgeschwächt!", "strongWindsClearMessage": "Die rätselhafte Luftströmung hat sich wieder geleget.", }; + +export const terrain: SimpleTranslationEntries = { + "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!" +}; diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index b516bc8dde0..ce41a964922 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -10,4 +10,54 @@ export const abilityTriggers: SimpleTranslationEntries = { "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!", + "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", + "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!", + "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!", + "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!", } as const; diff --git a/src/locales/en/achv.ts b/src/locales/en/achv.ts index bff75344ea5..3063488c659 100644 --- a/src/locales/en/achv.ts +++ b/src/locales/en/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Hey! Listen!", }, + "FRESH_START": { + name: "First Try!", + description: "Complete the fresh start challenge." + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/en/arena-flyout.ts b/src/locales/en/arena-flyout.ts new file mode 100644 index 00000000000..8a31d37b10c --- /dev/null +++ b/src/locales/en/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Active Battle Effects", + "player": "Player", + "neutral": "Neutral", + "enemy": "Enemy", + + // WeatherType + "sunny": "Sunny", + "rain": "Rain", + "sandstorm": "Sandstorm", + "hail": "Hail", + "snow": "Snow", + "fog": "Fog", + "heavyRain": "Heavy Rain", + "harshSun": "Harsh Sun", + "strongWinds": "Strong Winds", + + // TerrainType + "misty": "Misty Terrain", + "electric": "Electric Terrain", + "grassy": "Grassy Terrain", + "psychic": "Psychic Terrain", + + // ArenaTagType + "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", +}; diff --git a/src/locales/en/arena-tag.ts b/src/locales/en/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/en/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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!", + "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.", +} as const; diff --git a/src/locales/en/battle-info.ts b/src/locales/en/battle-info.ts new file mode 100644 index 00000000000..f24dad46c6c --- /dev/null +++ b/src/locales/en/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generation {{generation}}", +} as const; diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 263a48e8f0a..12a0f2c99c6 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -14,6 +14,7 @@ export const battle: SimpleTranslationEntries = { "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}}?", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "It doesn't affect {{pokemonName}}!", "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!", @@ -65,15 +67,33 @@ export const battle: SimpleTranslationEntries = { "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!", - "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!", + "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}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", "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!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism 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!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/en/battler-tags.ts b/src/locales/en/battler-tags.ts new file mode 100644 index 00000000000..1d897c70f3d --- /dev/null +++ b/src/locales/en/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", +} as const; diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts index ef15c6c6dcb..01fb86b281d 100644 --- a/src/locales/en/bgm-name.ts +++ b/src/locales/en/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Music", + "music": "Music: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", diff --git a/src/locales/en/challenges.ts b/src/locales/en/challenges.ts index a40f05a0843..a3b45d31792 100644 --- a/src/locales/en/challenges.ts +++ b/src/locales/en/challenges.ts @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "You can only use Pokémon of the chosen type." //types in pokemon-info }, + "freshStart": { + "name": "Fresh Start", + "desc": "You can only use the original starters, and only as if you had just started pokerogue.", + "value.0": "Off", + "value.1": "On", + } } as const; diff --git a/src/locales/en/common.ts b/src/locales/en/common.ts index 82966b4ffeb..750322e1f09 100644 --- a/src/locales/en/common.ts +++ b/src/locales/en/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "Start", + "luckIndicator": "Luck:", + "shinyOnHover": "Shiny", + "commonShiny": "Common", + "rareShiny": "Rare", + "epicShiny": "Epic", } as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index fbbae3df329..a98dd750fbe 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -1,10 +1,14 @@ -import { common } from "#app/locales/en/common.js"; -import { settings } from "#app/locales/en/settings.js"; +import { common } from "./common.js"; +import { settings } from "./settings.js"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -22,32 +26,44 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; 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 { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const enConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const enConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, - partyUiHandler: partyUiHandler, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index dda8891b788..44693c38aa1 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Team Rocket blasting off again!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: " If you get in the way of Team Magma, don’t expect any mercy!" @@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Huh? I lost?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "No one who crosses Team Aqua gets any mercy, not even kids!" @@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You're kidding me!" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Don't mess with Team Galactic!" @@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Shut down..." }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "We won't tolerate people who have different ideas!" @@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Fashion is most important to us!" @@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "The future doesn't look bright for me." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "So! I must say, I am impressed you got here!" diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.ts index b6e13d26213..9f699ce0fdc 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.ts @@ -22,4 +22,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} hatched from the egg!", "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", + "moveUPGacha": "Move UP!", + "shinyUPGacha": "Shiny UP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/en/filter-bar.ts b/src/locales/en/filter-bar.ts new file mode 100644 index 00000000000..18b6ba77e21 --- /dev/null +++ b/src/locales/en/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen", + "typeFilter": "Type", + "dexFilter": "Dex", + "unlocksFilter": "Unlocks", + "miscFilter": "Misc", + "sortFilter": "Sort", + "all": "All", + "normal": "Normal", + "uncaught": "Uncaught", + "passive": "Passive", + "passiveUnlocked": "Passive Unlocked", + "passiveLocked": "Passive Locked", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", + "sortByNumber": "No.", + "sortByCost": "Cost", + "sortByCandies": "Candy Count", + "sortByIVs": "IVs", + "sortByName": "Name", +}; diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.ts index 97d6e38a099..6eb680544ed 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Select a slot to export from.", "importData": "Import Data", "exportData": "Export Data", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "cancel": "Cancel", "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?", "noEggs": "You are not hatching\nany eggs at the moment!" diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 47d19bd56b6..fe4d96c5120 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -17,6 +17,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", @@ -54,5 +55,8 @@ export const menu: SimpleTranslationEntries = { "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; diff --git a/src/locales/en/modifier-select-ui-handler.ts b/src/locales/en/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..64cf3aa2ba3 --- /dev/null +++ b/src/locales/en/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}}" +} as const; diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 09d9baea6fb..c6c98e44a92 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Increases the power of a Pokémon's {{moveType}}-type moves by 20%.", }, "PokemonLevelIncrementModifierType": { - description: "Increases a Pokémon's level by 1.", + description: "Increases a Pokémon's level by {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Increases all party members' level by 1.", + description: "Increases all party members' level by {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit.", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Sacred Ash" }, - "REVIVER_SEED": { name: "Reviver Seed", description: "Revives the holder for 1/2 HP upon fainting." }, + "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" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "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."}, + "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)." }, diff --git a/src/locales/en/modifier.ts b/src/locales/en/modifier.ts new file mode 100644 index 00000000000..26a6a9c18ae --- /dev/null +++ b/src/locales/en/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "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}}!", + "pokemonResetNegativeStatStageApply": "{{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}}!", +} as const; diff --git a/src/locales/en/move-trigger.ts b/src/locales/en/move-trigger.ts new file mode 100644 index 00000000000..1d9d6459d83 --- /dev/null +++ b/src/locales/en/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "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!", + "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!", + "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!", + "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!", + "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!", + "swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!", +} as const; diff --git a/src/locales/en/move.ts b/src/locales/en/move.ts index b9a8836dfec..cec7c93ede5 100644 --- a/src/locales/en/move.ts +++ b/src/locales/en/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "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." + 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", diff --git a/src/locales/en/party-ui-handler.ts b/src/locales/en/party-ui-handler.ts index b7eac04b4c8..4f300dd36ea 100644 --- a/src/locales/en/party-ui-handler.ts +++ b/src/locales/en/party-ui-handler.ts @@ -1,11 +1,54 @@ 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" + "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", + + // Slot TM text + "able": "Able", + "notAble": "Not able", + "learned": "Learned", + + // Releasing messages + "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}}!", } as const; diff --git a/src/locales/en/pokemon-form.ts b/src/locales/en/pokemon-form.ts new file mode 100644 index 00000000000..e8d6fb8df4a --- /dev/null +++ b/src/locales/en/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cool Cosplay", + "pikachuBeautyCosplay": "Beauty Cosplay", + "pikachuCuteCosplay": "Cute Cosplay", + "pikachuSmartCosplay": "Smart Cosplay", + "pikachuToughCosplay": "Tough Cosplay", + "pikachuPartner": "Partner", + "eeveePartner": "Partner", + // 2G + "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": "?", + // 3G + "castformSunny": "Sunny", + "castformRainy": "Rainy", + "castformSnowy": "Snowy", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Plant", + "burmySandy": "Sandy", + "burmyTrash": "Trash", + "shellosEast": "East", + "shellosWest": "West", + "rotomHeat": "Heat", + "rotomWash": "Wash", + "rotomFrost": "Frost", + "rotomFan": "Fan", + "rotomMow": "Mow", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "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", + // 6G + "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", + // 7G + "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", + // 8G + "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", + // 9G + "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", + +} as const; diff --git a/src/locales/en/pokemon-info-container.ts b/src/locales/en/pokemon-info-container.ts index 0d37b2ead62..64e5bd3cfcc 100644 --- a/src/locales/en/pokemon-info-container.ts +++ b/src/locales/en/pokemon-info-container.ts @@ -5,8 +5,5 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "Gender:", "ability": "Ability:", "nature": "Nature:", - "epic": "Epic", - "rare": "Rare", - "common": "Common", "form": "Form:" } as const; diff --git a/src/locales/en/pokemon-summary.ts b/src/locales/en/pokemon-summary.ts new file mode 100644 index 00000000000..484ea2a9d67 --- /dev/null +++ b/src/locales/en/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}.", + }, +} as const; diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.ts index f68a649269f..491bfa4a481 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Gamepad Support", "showBgmBar": "Show Music Names", + "shopOverlayOpacity": "Shop Overlay Opacity" } as const; diff --git a/src/locales/en/splash-messages.ts b/src/locales/en/splash-messages.ts index 17eafc2d6d6..e549bc24f19 100644 --- a/src/locales/en/splash-messages.ts +++ b/src/locales/en/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Also Try Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "Breeders in space!", } as const; diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index ac59785bab7..deb4236c8ba 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -6,7 +6,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * 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,6 +24,7 @@ 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", diff --git a/src/locales/en/status-effect.ts b/src/locales/en/status-effect.ts new file mode 100644 index 00000000000..5914fc27298 --- /dev/null +++ b/src/locales/en/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by 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!" + }, +} as const; diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index b59cfdc4fda..00367865d14 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -126,17 +126,34 @@ export const trainerClasses: SimpleTranslationEntries = { "workers": "Workers", "youngster": "Youngster", "rocket_grunt": "Rocket Grunt", + "rocket_grunts": "Rocket Grunts", "rocket_grunt_female": "Rocket Grunt", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Magma Grunt", "magma_grunt_female": "Magma Grunt", + "magma_grunts": "Magma Grunts", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Aqua Grunt", "aqua_grunt_female": "Aqua Grunt", + "aqua_grunts": "Aqua Grunts", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Galactic Grunt", "galactic_grunt_female": "Galactic Grunt", + "galactic_grunts": "Galactic Grunts", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Plasma Grunt", "plasma_grunt_female": "Plasma Grunt", + "plasma_grunts": "Plasma Grunts", + "plasma_sage": "Plasma Sage", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", + "flare_grunts": "Flare Grunts", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/en/weather.ts b/src/locales/en/weather.ts index f50c1ee907e..8222064f341 100644 --- a/src/locales/en/weather.ts +++ b/src/locales/en/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "A heavy wind began!", "strongWindsLapseMessage": "The wind blows intensely.", + "strongWindsEffectMessage": "The mysterious air current weakened the attack!", "strongWindsClearMessage": "The heavy wind stopped." }; + +export const terrain: SimpleTranslationEntries = { + "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!" +}; diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index 5c09c3832c0..6b1f66a11e3 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -5,7 +5,59 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "¡{{pokemonName}} está atormentado!", "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{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": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", + "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!", + "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!", + "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}} está muy nervioso y no puede comer bayas!", } as const; diff --git a/src/locales/es/arena-flyout.ts b/src/locales/es/arena-flyout.ts new file mode 100644 index 00000000000..376b737811f --- /dev/null +++ b/src/locales/es/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Efectos de Terreno Activos", + "player": "Jugador", + "neutral": "Neutral", + "enemy": "Enemigo", + + // WeatherType + "sunny": "Sol", + "rain": "Lluvia", + "sandstorm": "Tormenta de Arena", + "hail": "Granizo", + "snow": "Nieve", + "fog": "Niebla", + "heavyRain": "Diluvio", + "harshSun": "Sol Abrasador", + "strongWinds": "Turbulencias", + + // TerrainType + "misty": "Campo de Niebla", + "electric": "Campo Eléctrico", + "grassy": "Campo de Hierba", + "psychic": "Campo Psíquico", + + // ArenaTagType + "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", +}; diff --git a/src/locales/es/arena-tag.ts b/src/locales/es/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/es/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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!", + "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.", +} as const; diff --git a/src/locales/es/battle-info.ts b/src/locales/es/battle-info.ts new file mode 100644 index 00000000000..f24dad46c6c --- /dev/null +++ b/src/locales/es/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generation {{generation}}", +} as const; diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index c1a85ffe267..7f29060c5d3 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -14,6 +14,7 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?", "trainerDefeated": "¡Has derrotado a\n{{trainerName}}!", "moneyWon": "¡Has ganado\n₽{{moneyAmount}} por vencer!", + "moneyPickedUp": "You picked up ₽{{moneyAmount}}!", "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}}?", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "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.", @@ -65,15 +67,33 @@ export const battle: SimpleTranslationEntries = { "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ó!", + "ppHealBerry": "{{pokemonNameWithAffix}} restored PP to its move {{moveName}}\nusing its {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restored its health using\nits {{berryName}}!", "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!", + "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!", + "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}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", "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!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism 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!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/es/battler-tags.ts b/src/locales/es/battler-tags.ts new file mode 100644 index 00000000000..1d897c70f3d --- /dev/null +++ b/src/locales/es/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", +} as const; diff --git a/src/locales/es/bgm-name.ts b/src/locales/es/bgm-name.ts index cda6fba84f4..ab6de0b81b5 100644 --- a/src/locales/es/bgm-name.ts +++ b/src/locales/es/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Música", + "music": "Música: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "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", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS - Costa de la Cumbre del Cielo", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", "space": "Firel - Aether", "swamp": "PMD EoS - Mar Circundante", diff --git a/src/locales/es/common.ts b/src/locales/es/common.ts index 82966b4ffeb..347b39c973c 100644 --- a/src/locales/es/common.ts +++ b/src/locales/es/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "Start", + "luckIndicator": "Suerte:", + "shinyOnHover": "Shiny", + "commonShiny": "Común", + "rareShiny": "Raro", + "epicShiny": "Épico", } as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index e09224ce85e..ce9ad19aac3 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/es/settings.js"; -import { common } from "#app/locales/es/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const esConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const esConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/es/dialogue.ts b/src/locales/es/dialogue.ts index c1b23b57fe0..d19acc3ec0f 100644 --- a/src/locales/es/dialogue.ts +++ b/src/locales/es/dialogue.ts @@ -106,85 +106,85 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "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!" + 1: "¡Eh! ¡He pescado uno grande!", + 2: "¡La caña está lista, para pescar la victoria!", + 3: "¡Lista para hacer olas!" }, "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!" + 1: "Volveré con un pez más grande.", + 2: "Pescaré la victoria a la siguiente...", + 3: "¡Estoy afilando mis anzuelos para la próxima!" }, }, "swimmer": { "encounter": { - 1: "Time to dive in!", - 2: "Let's ride the waves of victory!", - 3: "Ready to make a splash!", + 1: "¡Listo para bucear!", + 2: "¡Montemos las olas de la victoria!", + 3: "¡Listo para darme un chapuzón!", }, "victory": { - 1: "Drenched in defeat!", - 2: "A wave of defeat!", - 3: "Back to shore, I guess.", + 1: "¡Empapado en la derrota!", + 2: "¡Las olas de la derrota!", + 3: "Vuelta a la costa, supongo.", }, }, "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?" + 1: "¡Recoge y vámonos!", + 2: "¡Veamos si puedes mantener la velocidad!", + 3: "¡Sube la marcha, entrenador!", + 4: "Traté de encontrarme un sentido durante 20 años… ¿Pero dónde estoy?" }, "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?" + 1: "¡Tropecé esta vez!", + 2: "Oh, creo que me perdí.", + 3: "¡Punto muerto!", + 4: "¡Un segundo! ¡Ey! ¿No sabes quién soy?" }, }, "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?" + 1: "Pareces muy seguro en ti mismo.", + 2: "Enséñame tus Pokémon…", + 3: "Como soy un Entrenador Guay, la gente cree que soy fuerte.", + 4: "¿Sabes lo que toma ser un Entrenador Guay?" }, "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!" + 1: "Sí, tienes buenos Pokémon…", + 2: "¡¿Cómo?! ¡Si soy un genio combatiendo!", + 3: "Claro, ¡tienes el poder del guión!", + 4: "¡OK! ¡OK! ¡Puedes ser un Entrenador Guay!" }, "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." + 1: "¡Doy mi cuerpo y alma para los combates Pokémon.", + 2: "Según mis expectativas… Nada de qué sorprenderse…", + 3: "Pensé que crecería como persona frágil que parece que rompe a llorar si le hacen daño muy fuerte.", + 4: "Por supuesto que soy fuerte y no pierdo. Es importante que gane con gracia." } }, "parasol_lady": { "encounter": { - 1: "Time to grace the battlefield with elegance and poise!", + 1: "¡Tiempo de agradar al campo de batalla con elegancia y esmero!", }, "victory": { - 1: "My elegance remains unbroken!", + 1: "¡Mi elegancia es indestructible!", } }, "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!" + 1: "¡Prepárate, porque cuando somos juntas el problema es doble!", + 2: "Dos almas, una estrategia – ¡veamos si eres capaz de seguir nuestro poder gemelo!", + 3: "¡Espero que estés listo para el doble problema, porque traeremos mucha emoción!" }, "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!" + 1: "¡Aunque hayamos perdido esta ronda, nuestra unión es indestructible!", + 2: "Nuestro espíritu gemelo no seguirá así por mucho tiempo.", + 3: "¡Volveremos más fuertes como un dúo dinámico!" }, "defeat": { - 1: "Twin power reigns supreme!", - 2: "Two hearts, one triumph!", - 3: "Double the smiles, double the victory dance!" + 1: "¡El poder gemelo triunfa como ninguno!", + 2: "¡Dos almas, un triunfo!", + 3: "¡Doble sonrisa, doble baile de victoria!" } }, "cyclist": { @@ -565,73 +565,73 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "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!" + 1: "Mi conocimiento en Pokémon tipo Roca te aplastará. ¡Dalo todo!", + 2: "¡Mi determinación tipo Roca te sorprenderá!", + 3: "¡Permíteme enseñarte la verdadera fuerza de mis 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…" + 1: "¡La fuerza de mis Pokémon superó mi defensa dura como una roca!", + 2: "¡El mundo es enorme! Me encantó tener una oportunidad para combatir contigo.", + 3: "A lo mejor tendría que volver a mi sueño de ser un Criapokémon…" }, "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!" + 1: "¡La mejor ofensa es una buena defensa!\n¡Esa es mi manera de hacer las cosas!", + 2: "¡Ven preparado sobre las rocas para saber cómo luchar contra las mías!", + 3: "Ja, ¡todos mis viajes por regiones se notan!" } }, "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?" + 1: "¡Mi política es muy ofensiva con Pokémon tipo Agua!", + 2: "Oye, ¡te enseñaré la auténtica fuerza de mis Pokémon tipo Agua!", + 3: "Mi sueño era viajar conociendo Entrenadores fuertes…\n¿Serás suficiente desafío?" }, "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!" + 1: "Eres muy fuerte… Admito tu talento…", + 2: "Grrr… ¡¿Solo tuviste suerte, sabes?!", + 3: "¡Guau, eres demasiado! ¡No me creo que me hayas vencido!" }, "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!" + 1: "¿Fue la valiente Misty demasiado para ti?", + 2: "¡Espero que hayas visto la elegancia en las técnicas de nado de mis Pokémon!", + 3: "¡Tus Pokémon no fueron rival para mi orgullo y felicidad!" } }, "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!" + 1: "¡Mis Pokémon eléctricos me salvaron en la guerra! ¡Te enseñaré cómo!", + 2: "¡10 voltios! ¡Te electrocutaré hasta la derrota!", + 3: "¡Te electrocutaré como a todos mis enemigos en combate!" }, "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!" + 1: "¡Guau! ¡Tu equipo es lo mejor de lo mejor, chaval!", + 2: "¡Aaargh, eres fuerte! Incluso mis trucos electrizantes fallaron.", + 3: "¡Fue una derrota electrizante!" }, "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!" + 1: "¡Oh sí! Cuando se trata de Pokémon tipo Eléctrico, ¡soy el número uno!", + 2: "¡Jajaja! ¡Menuda batalla electrizante, chaval!", + 3: "Un combate Pokémon es la guerra, ¡y te he enseñado lo esencial, chaval!" } }, "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." + 1: "El tiempo es maravilloso aquí…\n¿Oh un combate? Perfecto, entonces.", + 2: "Mis dotes como Entrenadora rivalizan mis dotes como florista.", + 3: "Espero que el dulce aroma de mis Pokémon no me dé sueño…", + 4: "Ver flores en un jardín es tan relajante." }, "victory": { - 1: "Oh! I concede defeat.", - 2: "That match was most delightful.", - 3: "Ah, it appears it is my loss…", - 4: "Oh, my goodness." + 1: "¡Oh! Reconozco mi derrota.", + 2: "Este combate fue agradable.", + 3: "Ah, es mi derrota…", + 4: "Oh Dios mío." }, "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?" + 1: "Tenía miedo de dormirme…", + 2: "Oh, parece que mis Pokémon tipo planta te sobrecargaron.", + 3: "Este combate fue una experiencia muy relajante.", + 4: "Oh… ¿Eso es todo?" } }, "janine": { diff --git a/src/locales/es/egg.ts b/src/locales/es/egg.ts index dea466066f1..ab2c3aab903 100644 --- a/src/locales/es/egg.ts +++ b/src/locales/es/egg.ts @@ -22,4 +22,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}}", + "moveUPGacha": "¡Más Mov.\nHuevo Raro!", + "shinyUPGacha": "¡Más Shiny!", + "legendaryUPGacha": ", ¡mayor\nprob.!", } as const; diff --git a/src/locales/es/filter-bar.ts b/src/locales/es/filter-bar.ts new file mode 100644 index 00000000000..33b60cfa427 --- /dev/null +++ b/src/locales/es/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen.", + "typeFilter": "Tipo", + "dexFilter": "Dex", + "unlocksFilter": "Otros", + "miscFilter": "Misc", + "sortFilter": "Orden", + "all": "Todo", + "normal": "Normal", + "uncaught": "No Capt.", + "passive": "Passive", + "passiveUnlocked": "Pasiva Desbloq.", + "passiveLocked": "Pasiva Bloq.", + "ribbon": "Ribbon", + "hasWon": "Ya ha ganado", + "hasNotWon": "Aún no ha ganado", + "sortByNumber": "Núm.", + "sortByCost": "Coste", + "sortByCandies": "# Caramelos", + "sortByIVs": "IVs", + "sortByName": "Nombre", +}; diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.ts index bf71c2b390b..e38ac4eab3d 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Selecciona una ranura para exportar.", "importData": "Importar Datos", "exportData": "Exportar 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!" diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index 8176af456e1..55bd9c6c038 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -17,6 +17,7 @@ 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", @@ -54,5 +55,8 @@ export const menu: SimpleTranslationEntries = { "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.", + "renamePokemon": "Rename Pokémon", + "rename": "Rename", + "nickname": "Nickname", "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta,\nel juego se reconectará automáticamente.", } as const; diff --git a/src/locales/es/modifier-select-ui-handler.ts b/src/locales/es/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..e78be5d4ea5 --- /dev/null +++ b/src/locales/es/modifier-select-ui-handler.ts @@ -0,0 +1,15 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}} ₽" + +} as const; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index e7d6e8889fe..d2bd44a0f06 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { 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.", + description: "Aumenta el nivel de un Pokémon en {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Aumenta el nivel de todos los miembros del equipo en 1.", + description: "Aumenta el nivel de todos los miembros del equipo en {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Aumenta la est. {{statName}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación.", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Cen. Sagrada" }, - "REVIVER_SEED": { name: "Semilla Revivir", description: "Revive al portador con la mitad de sus PS al debilitarse." }, + "REVIVER_SEED": { name: "Semilla Revivir", description: "Revive al portador con la mitad de sus PS al debilitarse por un golpe directo." }, + + "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: "Éter" }, "MAX_ETHER": { name: "Éter Máx." }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Camp. Alivio" }, + "SCOPE_LENS": { name: "Periscopio", description: "Aumenta la probabilidad de asestar un golpe crítico." }, + "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)." }, diff --git a/src/locales/es/modifier.ts b/src/locales/es/modifier.ts new file mode 100644 index 00000000000..b0a3d36e233 --- /dev/null +++ b/src/locales/es/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "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}}!", + "pokemonResetNegativeStatStageApply": "{{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": "¡Gracias {{itemName}} {{pokemonName}} puede tener prioridad!", +} as const; diff --git a/src/locales/es/move-trigger.ts b/src/locales/es/move-trigger.ts new file mode 100644 index 00000000000..3ff93997cc2 --- /dev/null +++ b/src/locales/es/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "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!", + "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!", + "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!", + "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!", + "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", + "copyType": "{{pokemonName}}'s type\nchanged to match {{targetPokemonName}}'s!", + "suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!", + "swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!", +} as const; diff --git a/src/locales/es/move.ts b/src/locales/es/move.ts index 3693e008574..873e7e2da94 100644 --- a/src/locales/es/move.ts +++ b/src/locales/es/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, 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.", + 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", diff --git a/src/locales/es/party-ui-handler.ts b/src/locales/es/party-ui-handler.ts index 894ea14bb12..cbbd6734b62 100644 --- a/src/locales/es/party-ui-handler.ts +++ b/src/locales/es/party-ui-handler.ts @@ -6,5 +6,49 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "Cancel", "RELEASE": "Release", "APPLY": "Apply", - "TEACH": "Teach" + "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 quedan\nfuerzas para luchar!", + "hasEnergy": "¡A {{pokemonName}} le quedan\nfuerzas para luchar!", + "cantBeUsed": "¡{{pokemonName}} no puede usarse\nen este desafío!", + "tooManyItems": "¡{{pokemonName}} tiene demasiados\nde este objeto!", + "anyEffect": "No tendría ningún efecto.", + "unpausedEvolutions": "Se reanudó las evoluciones de {{pokemonName}}.", + "unspliceConfirmation": "¿Seguro que quiere separar a {{fusionName}}\nde {{pokemonName}}? {{fusionName}} se perderá.", + "wasReverted": "{{fusionName}} se revirtió a {{pokemonName}}.", + "releaseConfirmation": "¿Quieres liberar a {{pokemonName}}?", + "releaseInBattle": "¡No puedes liberar un Pokémon que está en batalla!", + "selectAMove": "Selecciona un movimiento.", + "changeQuantity": "Selecciona un objeto equipado para transferir.\nUsa < y > para cambiar la cantidad.", + "selectAnotherPokemonToSplice": "Selecciona otro Pokémon para fusionar.", + "cancel": "Salir", + + // Slot TM text + "able": "Apto", + "notAble": "No apto", + "learned": "Aprendido", + + // Releasing messages + "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 encontrar, {{pokemonName}}!", + "sayonara": "¡Sayonara, {{pokemonName}}!", + "smellYaLater": "¡Nos vemos luego, {{pokemonName}}!", } as const; diff --git a/src/locales/es/pokemon-form.ts b/src/locales/es/pokemon-form.ts new file mode 100644 index 00000000000..96e40bcfbbd --- /dev/null +++ b/src/locales/es/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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}} 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!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "Coqueta", + "pikachuCoolCosplay": "Roquera", + "pikachuBeautyCosplay": "Aristócrata", + "pikachuCuteCosplay": "Superstar", + "pikachuSmartCosplay": "Erudita", + "pikachuToughCosplay": "Enmascarada", + "pikachuPartner": "Compañero", + "eeveePartner": "Compañero", + // 2G + "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": "?", + // 3G + "castformSunny": "Sol", + "castformRainy": "Lluvia", + "castformSnowy": "Nieve", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Planta", + "burmySandy": "Arena", + "burmyTrash": "Basura", + "shellosEast": "Este", + "shellosWest": "Oeste", + "rotomHeat": "Calor", + "rotomWash": "Lavado", + "rotomFrost": "Frío", + "rotomFan": "Ventilador", + "rotomMow": "Corte", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "Raya Roja", + "basculinBlueStriped": "Raya Azul", + "basculinWhiteStriped": "Raya Blanca", + "deerlingSpring": "Primavera", + "deerlingSummer": "Verano", + "deerlingAutumn": "Otoño", + "deerlingWinter": "Invierno", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "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": "Debutante", + "furfrouMatron": "Matrón", + "furfrouDandy": "Dandi", + "furfrouLaReine": "La Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraón", + "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", + // 7G + "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", + // 8G + "sinisteaPhony": "Falsificada", + "sinisteaAntique": "Auténtica", + "eiscueNoIce": "Cara Deshielo", + "indeedeeMale": "Macho", + "indeedeeFemale": "Hembra", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Papá", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "Plumaje Verde", + "squawkabillyBluePlumage": "Plumaje Azul", + "squawkabillyYellowPlumage": "Plumaje Amarillo", + "squawkabillyWhitePlumage": "Plumaje Blanco", + "tatsugiriCurly": "Curvada", + "tatsugiriDroopy": "Lánguida", + "tatsugiriStretchy": "Estirada", + "gimmighoulChest": "Cofre", + "gimmighoulRoaming": "Andante", + "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": "Imitación", + "poltchageistArtisan": "Original", + "paldeaTaurosCombat": "Combatiente", + "paldeaTaurosBlaze": "Ardiente", + "paldeaTaurosAqua": "Acuático", + +} as const; diff --git a/src/locales/es/pokemon-info-container.ts b/src/locales/es/pokemon-info-container.ts index ad0f951b984..6f97f29ee39 100644 --- a/src/locales/es/pokemon-info-container.ts +++ b/src/locales/es/pokemon-info-container.ts @@ -5,7 +5,4 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "Género:", "ability": "Habilid:", "nature": "Natur:", - "epic": "Épico", - "rare": "Raro", - "common": "Común" } as const; diff --git a/src/locales/es/pokemon-summary.ts b/src/locales/es/pokemon-summary.ts new file mode 100644 index 00000000000..2eca4f118c6 --- /dev/null +++ b/src/locales/es/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}.", + }, +} as const; diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts index dfd6f097242..407bfab602f 100644 --- a/src/locales/es/settings.ts +++ b/src/locales/es/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Gamepad Support", "showBgmBar": "Show Music Names", + "shopOverlayOpacity": "Opacidad de la fase de compra" } as const; diff --git a/src/locales/es/splash-messages.ts b/src/locales/es/splash-messages.ts index 0d6f050be94..47f9fa1f98f 100644 --- a/src/locales/es/splash-messages.ts +++ b/src/locales/es/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "¡Prueba también Radical Red!", "eeveeExpo": "¡Eevee Expo!", "ynoproject": "¡YNOproject!", + "breedersInSpace": "Criadores... ¡EN EL ESPACIO!", } as const; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 14c22e22097..d7c203f49c4 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -6,7 +6,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"¿Comenzar con estos Pokémon?", + "confirmStartTeam": "¿Comenzar con estos Pokémon?", + "confirmExit": "Do you want to exit?", + "invalidParty": "¡Este equipo no es válido!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -21,10 +23,11 @@ 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.", diff --git a/src/locales/es/status-effect.ts b/src/locales/es/status-effect.ts new file mode 100644 index 00000000000..975288fc451 --- /dev/null +++ b/src/locales/es/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Ninguno", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Envenenamiento", + description: "envenenamiento", + obtain: "¡{{pokemonNameWithAffix}}\nha sido envenenado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido envenenado por {{sourceText}}!", + activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + toxic: { + name: "Envenenamiento grave", + description: "envenenamiento grave", + obtain: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado por {{sourceText}}!", + activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + paralysis: { + name: "Parálisis", + description: "parálisis", + obtain: "¡{{pokemonNameWithAffix}} sufre parálisis!\nQuizás no se pueda mover.", + obtainSource: "¡{{pokemonNameWithAffix}} sufre parálisis por {{sourceText}}!\nQuizás no se pueda mover.", + activation: "¡{{pokemonNameWithAffix}} está paralizado!\n¡No se puede mover!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá paralizado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá paralizado!" + }, + sleep: { + name: "Dormir", + description: "dormir", + obtain: "¡{{pokemonNameWithAffix}}\nse ha dormido!", + obtainSource: "¡{{pokemonNameWithAffix}}\nse ha dormido\npor culpa de {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} está/ndormido como un tronco.", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá dormido!", + heal: "¡{{pokemonNameWithAffix}} se despertó!" + }, + freeze: { + name: "Congelamiento", + description: "congelamiento", + obtain: "¡{{pokemonNameWithAffix}}\nha sido congelado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido congelado por {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} está\ncongelado!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá congelado!", + heal: "¡{{pokemonNameWithAffix}} se\nha descongelado!" + }, + burn: { + name: "Quemadura", + description: "quemadura", + obtain: "¡{{pokemonNameWithAffix}}\nse ha quemado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nse ha quemado por {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} se resiente\nde las quemaduras!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá quemado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá quemado!" + }, +} as const; diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index d5647f83cf6..f881fc04f94 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -117,7 +117,35 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Operario", "worker_female": "Operaria", "workers": "Operarios", - "youngster": "Joven" + "youngster": "Joven", + "rocket_grunt": "Rocket Grunt", + "rocket_grunts": "Rocket Grunts", + "rocket_grunt_female": "Rocket Grunt", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", + "magma_grunt": "Magma Grunt", + "magma_grunt_female": "Magma Grunt", + "magma_grunts": "Magma Grunts", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", + "aqua_grunt": "Aqua Grunt", + "aqua_grunt_female": "Aqua Grunt", + "aqua_grunts": "Aqua Grunts", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", + "galactic_grunt": "Galactic Grunt", + "galactic_grunt_female": "Galactic Grunt", + "galactic_grunts": "Galactic Grunts", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", + "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", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/es/weather.ts b/src/locales/es/weather.ts index 5565779a7bd..1129443d71b 100644 --- a/src/locales/es/weather.ts +++ b/src/locales/es/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "¡Comenzó un fuerte viento!", "strongWindsLapseMessage": "El viento sopla intensamente.", + "strongWindsEffectMessage": "¡Las misteriosas turbulencias atenúan el ataque!", "strongWindsClearMessage": "El fuerte viento cesó." }; + +export const terrain: SimpleTranslationEntries = { + "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!" +}; diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index f99ff15c26f..f6b9c306cd1 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -9,5 +9,55 @@ export const abilityTriggers: SimpleTranslationEntries = { "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!", + "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}} !", + "postDefendDisguise": "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 !", + "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 !", + "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 !", } as const; diff --git a/src/locales/fr/achv.ts b/src/locales/fr/achv.ts index 4ff9bf20f51..d5b80700493 100644 --- a/src/locales/fr/achv.ts +++ b/src/locales/fr/achv.ts @@ -22,7 +22,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Banquier", }, "10M_MONEY": { - name: "Évadé·e fiscal·e", + name: "Évadé fiscal", }, "DamageAchv": { @@ -45,7 +45,7 @@ export const PGMachv: AchievementTranslationEntries = { description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", }, "250_HEAL": { - name: "Infirmier·ère", + name: "Infirmier", }, "1000_HEAL": { name: "Médecin", @@ -74,19 +74,19 @@ export const PGMachv: AchievementTranslationEntries = { description: "Accumuler un total de {{ribbonAmount}} Rubans", }, "10_RIBBONS": { - name: "Maitre·sse de la Ligue", + name: "Maitre de la Ligue", }, "25_RIBBONS": { - name: "Super Maitre·sse de la Ligue", + name: "Super Maitre de la Ligue", }, "50_RIBBONS": { - name: "Hyper Maitre·sse de la Ligue", + name: "Hyper Maitre de la Ligue", }, "75_RIBBONS": { - name: "Rogue Maitre·sse de la Ligue", + name: "Rogue Maitre de la Ligue", }, "100_RIBBONS": { - name: "Master Maitre·sse de la Ligue", + name: "Master Maitre de la Ligue", }, "TRANSFER_MAX_BATTLE_STAT": { @@ -166,7 +166,7 @@ export const PGMachv: AchievementTranslationEntries = { description: "Avoir des IV parfaits sur un Pokémon", }, "CLASSIC_VICTORY": { - name: "Invaincu·e", + name: "Invaincu", description: "Terminer le jeu en mode classique", }, @@ -264,7 +264,278 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Hey ! Listen !", }, + "FRESH_START": { + name: "Du premier coup !", + description: "Terminer un challenge « Nouveau départ »." + } } 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; +export const PGFachv: AchievementTranslationEntries = { + "Achievements": { + name: "Succès", + }, + "Locked": { + name: "Verrouillé", + }, + + "MoneyAchv": { + description: "Récolter un total de {{moneyAmount}} ₽", + }, + "10K_MONEY": { + name: "Épargnante", + }, + "100K_MONEY": { + name: "Je possède des thunes", + }, + "1M_MONEY": { + name: "Banquière", + }, + "10M_MONEY": { + name: "Évadée fiscale", + }, + + "DamageAchv": { + description: "Infliger {{damageAmount}} de dégâts en un coup", + }, + "250_DMG": { + name: "Caïd", + }, + "1000_DMG": { + name: "Boxeuse", + }, + "2500_DMG": { + name: "Distributrice de pains", + }, + "10000_DMG": { + name: "One Punch Woman", + }, + + "HealAchv": { + description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", + }, + "250_HEAL": { + name: "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: "Maitresse de la Ligue", + }, + "25_RIBBONS": { + name: "Super Maitresse de la Ligue", + }, + "50_RIBBONS": { + name: "Hyper Maitresse de la Ligue", + }, + "75_RIBBONS": { + name: "Rogue Maitresse de la Ligue", + }, + "100_RIBBONS": { + name: "Master Maitresse 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: "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: "Invaincue", + 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 !", + }, + "FRESH_START": { + name: "Du premier coup !", + description: "Terminer un challenge « Nouveau départ »." + } +} as const; diff --git a/src/locales/fr/arena-flyout.ts b/src/locales/fr/arena-flyout.ts new file mode 100644 index 00000000000..cf412e3b671 --- /dev/null +++ b/src/locales/fr/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Effets Actifs", + "player": "Vous", + "neutral": "Neutre", + "enemy": "Ennemi", + + // WeatherType + "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", + + // TerrainType + "misty": "Champ Brumeux", + "electric": "Champ Électrifié", + "grassy": "Champ Herbu", + "psychic": "Champ Psychique", + + // ArenaTagType + "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", +}; diff --git a/src/locales/fr/arena-tag.ts b/src/locales/fr/arena-tag.ts new file mode 100644 index 00000000000..cc97cb4e34f --- /dev/null +++ b/src/locales/fr/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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\de {{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 !", + "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 !", +} as const; diff --git a/src/locales/fr/battle-info.ts b/src/locales/fr/battle-info.ts new file mode 100644 index 00000000000..a0b2ad2911a --- /dev/null +++ b/src/locales/fr/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Génération {{generation}}", +} as const; diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index 3d86c5f84f1..861dc6fd73c 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -14,6 +14,7 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?", "trainerDefeated": "Vous avez battu\n{{trainerName}} !", "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", + "moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !", "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…", "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 !", @@ -63,18 +65,36 @@ export const battle: SimpleTranslationEntries = { "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. !", - "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 !", + "statsAnd": "et", + "stats": "Les stats", + "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statRose_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent !", + "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statSharplyRose_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent beaucoup !", + "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statRoseDrastically_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent énormément !", + "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statWontGoAnyHigher_other": "{{stats}} de {{pokemonNameWithAffix}}\nne peuvent plus augmenter !", + "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent !", + "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statHarshlyFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent beaucoup !", + "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent énormément !", + "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}}\nne peuvent plus baisser !", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{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}} !", "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}} !", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "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 !", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !", + "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 !", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !", + "battlerTagsMagnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse 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 !" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/fr/battler-tags.ts b/src/locales/fr/battler-tags.ts new file mode 100644 index 00000000000..971fe4e00d1 --- /dev/null +++ b/src/locales/fr/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "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", +} as const; diff --git a/src/locales/fr/berry.ts b/src/locales/fr/berry.ts index b5048eb02c0..e08afb8bc55 100644 --- a/src/locales/fr/berry.ts +++ b/src/locales/fr/berry.ts @@ -3,46 +3,46 @@ 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%", + 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", + 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", + 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%", + 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%", + 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%", + 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%", + 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%", + 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%", + 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%", + 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", + 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.ts index 025f339ee86..da344fe001e 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Musique ", + "music": "Musique : ", "missing_entries" : "{{name}}", "battle_kanto_champion": "N2B2 - Vs. Maitre de Kanto", "battle_johto_champion": "N2B2 - Vs. Maitre de Johto", @@ -74,16 +74,16 @@ export const bgmName: SimpleTranslationEntries = { "battle_wild": "NB - Vs. Pokémon sauvage", "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", "end_summit": "PDM ÉSDX - Tour Céleste", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_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_rocket_boss": "USUL - Vs. Giovanni", + "battle_aqua_magma_boss": "ROSA - Vs. Max/Arthur", + "battle_galactic_boss": "DÉPS - Vs. Hélio", + "battle_plasma_boss": "N2B2 - Vs. Ghetis", + "battle_flare_boss": "XY - Vs. Lysandre", // Biome Music "abyss": "PDM EdS - Cratère Obscur", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PDM EdS - Pic Céleste (prairie)", "power_plant": "PDM EdS - Plaines Élek", "ruins": "PDM EdS - Ruine Scellée", - "sea": "PDM EdS - Caverne Saline", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PDM EdS - Pic Céleste (côte)", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PDM EdS - Pic Céleste (plaine enneigée)", "space": "Firel - Aether", "swamp": "PDM EdS - Mer Fermée", diff --git a/src/locales/fr/challenges.ts b/src/locales/fr/challenges.ts index d88960dbe3b..694cc242e73 100644 --- a/src/locales/fr/challenges.ts +++ b/src/locales/fr/challenges.ts @@ -2,7 +2,7 @@ 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 !", + "illegalEvolution": "{{pokemon}} est devenu\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.", @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." //type in pokemon-info }, + "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", + } } as const; diff --git a/src/locales/fr/common.ts b/src/locales/fr/common.ts index e4ccc627f5e..c8e3d58dd3e 100644 --- a/src/locales/fr/common.ts +++ b/src/locales/fr/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "Lancer", + "luckIndicator": "Chance :", + "shinyOnHover": "Chromatique", + "commonShiny": "Commun", + "rareShiny": "Rare", + "epicShiny": "Épique", } as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 6bc5a53a376..246ae9a073f 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/fr/settings.js"; -import { common } from "#app/locales/fr/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const frConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const frConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts index ab192963cad..ac68aa6413b 100644 --- a/src/locales/fr/dialogue.ts +++ b/src/locales/fr/dialogue.ts @@ -7,14 +7,14 @@ export const PGMdialogue: DialogueTranslationEntries = { 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 !", + 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 !", + 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 !" }, @@ -28,146 +28,146 @@ export const PGMdialogue: DialogueTranslationEntries = { 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 !", + 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 !" + 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." + 1: "Affrontons-nous, d’accord ?", + 2: "T’as l’air d’un nouveau Dresseur. 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 être pris au sérieux. T’es prêt à 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: "Wow, c'était impressionnant. J'ai beaucoup à apprendre.", + 1: "Wah, c’était impressionnant ! J’ai encore 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…" + 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.", + 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: "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.", + 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: "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.", + 1: "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.", + 2: "Contrairement à moi, ces Pokémon ont un bon fond.", + 3: "Trop d’éloges peut ruiner les Pokémon et les gens.", }, "defeat": { - 1: "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." + 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: "Peut importe à quel point t’aimes tes Pokémon, il faut toujours de la discipline s’ils se comportent mal." } }, "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." + 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: "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." + 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: "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." + 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: "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!", + 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: "Just forget about it.", - 2: "Next time, I'll be reelin' in the triumph!", - 3: "Guess I underestimated the currents this time.", + 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: "Woah! I've hooked a big one!", - 2: "Line's in, ready to reel in success!", - 3: "Ready to make waves!" + 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: "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!" + 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 combat !", - 2: "Je vais surfer sur les vagues de la victoire !", - 3: "Je vais t'éclabousser de mon talent !", + 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 j'ai surfé sur les vagues de la défaite...", + 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: "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?" + 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: "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?" + 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: "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?" + 1: "T’as l’air plutôt confiant.", + 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: "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!" + 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 !" }, "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." + 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: "Time to grace the battlefield with elegance and poise!", + 1: "Honorons ce terrain de combat avec élégance et équilibre !", }, "victory": { - 2: "My elegance remains unbroken!", + 2: "Mon élégance demeure inébranlable !", } }, "twins": { @@ -439,7 +439,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "QUOI ? IMPOSSIBLE !" }, "defeat": { - 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’un gamin." + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’un gamin." } }, "rocket_boss_giovanni_2": { @@ -447,7 +447,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 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…" + 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 !" @@ -466,13 +466,13 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "magma_boss_maxie_2": { "encounter": { - 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" + 1: "T’es le dernier rempart entravant mes objectifs. Prépare-toi à mon ultime riposte ! Hahahaha !" }, "victory": { - 1: "Ce… Ce n'est pas… Gnn…" + 1: "Ce… Ce n’est pas… Gnn…" }, "defeat": { - 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + 1: "L’heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." } }, "aqua_boss_archie_1": { @@ -554,7 +554,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "flare_boss_lysandre_2": { "encounter": { - 1: "Ton future ou le mien… Voyons lequel mérite plus." + 1: "Ton futur ou le mien…\nVoyons lequel mérite plus d’aboutir." }, "victory": { 1: "Ohhhh… !" @@ -2289,13 +2289,13 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "alder": { "encounter": { - 1: "Prépare-toi pour un combat contre le meilleur Dresseur d'Unys !", + 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… + 1: `Une brise fraiche traverse mon cœur… $Quel effort extraordinaire !`, } }, @@ -2305,25 +2305,25 @@ export const PGMdialogue: DialogueTranslationEntries = { $Je ne perdrai pas.`, }, "victory": { - 1: `Je n'y crois pas… + 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.`, + $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… + 1: `@c{smile}Ah, je te cherchais ! Je savais que t’étais pressé de partir, mais je m’attendais quand même à un au revoir… $@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_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prêt. $@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. + 1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment un débutant ? + $@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 !` }, }, @@ -2331,27 +2331,27 @@ export const PGMdialogue: DialogueTranslationEntries = { "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{smile}Je veux bien te pardonner de m’avoir oubliée,\nà 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. + 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…\nJ’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. + 1: `@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincu, hein… ? + $@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivi 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}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 !` @@ -2360,10 +2360,10 @@ export const PGMdialogue: DialogueTranslationEntries = { "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{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. $@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 !` + $@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… @@ -2378,11 +2378,11 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_3": { "encounter": { - 1: `@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable. + 1: `@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincu ? 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{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prêt pour ça ? $@c{serious_mopen_fists}Si tu l’es, alors prouve-le.` }, "victory": { @@ -2411,9 +2411,9 @@ export const PGMdialogue: DialogueTranslationEntries = { $@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.` + $@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êt.` }, "victory": { 1: "@c{neutral}Que…@d{64} Qui es-tu ?" @@ -2423,7 +2423,7 @@ export const PGMdialogue: DialogueTranslationEntries = { "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_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. @@ -2467,16 +2467,16 @@ export const PGMdialogue: DialogueTranslationEntries = { $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait. + $@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_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable. $@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. + 1: `@c{smile_eclosed}J’ai fait ce que j’avais à faire. $Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison.` }, }, @@ -2493,12 +2493,12 @@ export const PGMdialogue: DialogueTranslationEntries = { $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{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… + 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.` @@ -2514,14 +2514,14 @@ export const PGFdialogue: DialogueTranslationEntries = { 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 !", + 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 !", + 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 !" }, @@ -2535,146 +2535,146 @@ export const PGFdialogue: DialogueTranslationEntries = { 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 !", + 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 !" + 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." + 1: "Affrontons-nous, d’accord ?", + 2: "T’as l’air d’une nouvelle Dresseuse. Battons nous !", + 3: "Je te connais pas. Ça te dis de te battre ?", + 4: "Prenons du bon temps avec ce combat Pokémon !", + 5: "Je vais t’apprendre à te battre avec tes Pokémon !", + 6: "Un combat doit être pris au sérieux. T’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: "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…" + 1: "Wah, c’était impressionnant ! J’ai encore beaucoup à apprendre.", + 2: "Je pensais pas que je perdrais comme ça…", + 3: "J’espère que j’aurai ma revanche un jour.", + 4: "C’était super amusant ! Mais ce combat m’a épuisée…", + 5: "Tu m’as appris une belle leçon ! T’es vraiment incroyable !", + 6: "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.", + 7: "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*", + 8: "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…", + 9: "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…" } }, "breeder": { "encounter": { - 1: "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.", + 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: "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.", + 1: "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.", + 2: "Contrairement à moi, ces Pokémon ont un bon fond.", + 3: "Trop d’éloges peut ruiner les Pokémon et les gens.", }, "defeat": { - 1: "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." + 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: "Peut importe à quel point t’aimes tes Pokémon, il faut toujours de la discipline s’ils se comportent mal." } }, "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." + 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: "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." + 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: "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." + 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: "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!", + 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: "Just forget about it.", - 2: "Next time, I'll be reelin' in the triumph!", - 3: "Guess I underestimated the currents this time.", + 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: "Woah! I've hooked a big one!", - 2: "Line's in, ready to reel in success!", - 3: "Ready to make waves!" + 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: "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!" + 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: "Time to dive in!", - 2: "Let's ride the waves of victory!", - 3: "Ready to make a splash!", + 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: "Drenched in defeat!", - 2: "A wave of defeat!", - 3: "Back to shore, I guess.", + 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: "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?" + 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: "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?" + 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: "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?" + 1: "T’as l’air plutôt confiante.", + 2: "Tes Pokémon… Montre-les-moi…", + 3: "Les gens pensent que je suis fort par que je suis un Topdresseur.", + 4: "T’es au courant de ce que ça signifie d’être un Topdresseur ?" }, "victory": { - 1: "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!" + 1: "Très bien… T’as de bons Pokémon…", + 2: "Quoi ?! Mais c'est moi le génie des combats !", + 3: "Évidemment que t’es le personnage principal !", + 4: "OK ! OK ! Tu pourrais être une Topdresseuse !" }, "defeat": { - 1: "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." + 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: "Time to grace the battlefield with elegance and poise!", + 1: "Honorons ce terrain de combat avec élégance et équilibre !", }, "victory": { - 1: "My elegance remains unbroken!", + 2: "Mon élégance demeure inébranlable !", } }, "twins": { @@ -2898,6 +2898,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" @@ -2906,6 +2918,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Je…?\nJ’ai perdu ?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !" @@ -2914,6 +2938,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Comment ça ?" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Ne te mets pas en travers de la Team Galaxie !" @@ -2922,6 +2958,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Désactivation…" }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" @@ -2930,6 +2978,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa !" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Le style et le bon gout, il n’y a que ça qui compte !" @@ -2938,6 +2998,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Mon futur me semble guère radieux." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" @@ -2954,7 +3026,7 @@ export const PGFdialogue: DialogueTranslationEntries = { 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…" + 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 !" @@ -2976,10 +3048,10 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" }, "victory": { - 1: "Ce… Ce n'est pas… Gnn…" + 1: "Ce… Ce n’est pas… Gnn…" }, "defeat": { - 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + 1: "L’heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." } }, "aqua_boss_archie_1": { @@ -3061,7 +3133,7 @@ export const PGFdialogue: DialogueTranslationEntries = { }, "flare_boss_lysandre_2": { "encounter": { - 1: "Ton future ou le mien… Voyons lequel mérite plus." + 1: "Ton futur ou le mien…\nVoyons lequel mérite plus d’aboutir." }, "victory": { 1: "Ohhhh… !" @@ -4799,26 +4871,26 @@ export const PGFdialogue: DialogueTranslationEntries = { "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_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{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 ? + 1: `@c{smile_wave}Ah, je te cherchais ! Je t’ai cherchée partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ? $@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{smile}Je veux bien te pardonner de m’avoir oubliée,\nà 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. + 1: `@c{shock}Tu viens de commencer et t’es déjà si forte ?!@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…\nJ’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 !` }, @@ -4826,14 +4898,14 @@ export const PGFdialogue: DialogueTranslationEntries = { "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. + $@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}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 !` @@ -4841,11 +4913,11 @@ export const PGFdialogue: DialogueTranslationEntries = { }, "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. + 1: `@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincue. @c{angry_mopen}Eh… Pas mal ! + $@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. $@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 !` + $@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… @@ -4876,7 +4948,7 @@ export const PGFdialogue: DialogueTranslationEntries = { 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 !` + $@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenue forte !` }, "victory": { 1: "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…" @@ -4893,8 +4965,8 @@ export const PGFdialogue: DialogueTranslationEntries = { $@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{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": { @@ -4904,20 +4976,20 @@ export const PGFdialogue: DialogueTranslationEntries = { "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}Tu devrais être fière d’être arrivée 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.` + $@c{angry_mopen}Tiens-toi prête.` }, "victory": { 1: "@c{neutral}Que…@d{64} Qui es-tu ?" }, "defeat": { - 1: "$@c{smile}Tu devrais être fier d’être arrivé jusque là." + 1: "$@c{smile}Tu devrais être fière d’être arrivé jusque là." } }, "rival_5": { @@ -4949,7 +5021,7 @@ export const PGFdialogue: DialogueTranslationEntries = { $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait. + $@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 ? @@ -4958,7 +5030,7 @@ export const PGFdialogue: DialogueTranslationEntries = { $@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. + 1: `@c{smile_eclosed}J’ai fait ce que j’avais à faire. $Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison.` }, }, @@ -4975,13 +5047,13 @@ export const PGFdialogue: DialogueTranslationEntries = { $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{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. + 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 saine et sauve. $@c{smile_ehalf}… Merci.` }, @@ -5021,7 +5093,7 @@ export const PGFbattleSpecDialogue: SimpleTranslationEntries = { // 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}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 ? @@ -5029,7 +5101,7 @@ export const PGMmiscDialogue: SimpleTranslationEntries = { $@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{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 ! @@ -5067,76 +5139,76 @@ export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { }, "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?`, + 1: `Lévy : Héhéhé… Tu en fais une drôle de tête. + $Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ? + $Lévy : Nous sommes des jumeaux ! + $Tatia : Nous n’avons pas besoin de parler entre nous ! + $Lévy : Tu crois pouvoir briser… + $Tatia : … Notre duo parfait ?`, }, "victory": { - 1: `Lévy : What? Our combination was perfect! - $Tatia : Looks like we need to train more...`, + 1: `Lévy : Quoi ? Notre combinaison était parfaite ! + $Tatia : Nous avons encore besoin d’entrainement…`, }, }, "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?` + 1: `Tatia : Hihih… Si tu voyais ta tête ! + $Lévy : Oui, nous sommes deux Champions en un ! + $Tatia : Voici mon frère, Lévy… + $Lévy : … Et ma sœur, Tatia ! + $Tatia : Tu ne penses pas que notre combinaison est parfaite ?` }, "victory": { - 1: `Tatia : Are we... - $Lévy : ...not as strong as we thought?`, + 1: `Tatia : Quoi ? Notre combinaison… + $Lévy : … a échoué !`, }, }, "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!`, + 1: `Pierre R. : Marc, montrons-lui la puissance des Maitres ! + $Marc : Tu vas gouter au pouvoir de Hoenn ! + $Pierre R. : C’est parti !`, }, "victory": { - 1: `Pierre R. : That was a great battle! - $Marc : We will win next time!`, + 1: `Pierre R. : C’était un beau combat ! + $Marc : Ce sera notre tour la prochaine fois !`, }, }, "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!`, + 1: `Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ? + $Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon. + $Pierre R. : Oh… Je vois… Commençons alors !`, }, "victory": { - 1: `Pierre R. : Now that we are done with the battle, let's show off our pokémon! - $Marc : Pierre...`, + 1: `Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos 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!`, + 1: `Goyah : Nous sommes l’élite des Dresseurs d’Unys ! + $Iris : Rien de mieux que des combats contre des prodiges !`, }, "victory": { - 1: `Goyah : Wow! You are super strong! - $Iris : We will win next time!`, + 1: `Goyah : INCROYABLE ! T’es trop doué ! + $Iris : On gagnera la prochaine fois !`, }, }, "iris_alder_double": { "encounter": { - 1: `Iris : Welcome Challenger! I am THE Unova Champion! - $Goyah : Iris, aren't you a bit too excited?`, + 1: `Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys ! + $Goyah : Iris, concentre-toi s’il te plait…`, }, "victory": { - 1: `Iris : A loss like this is not easy to take... - $Goyah : But we will only get stronger with every loss!`, + 1: `Iris : On a tout donné et pourtant… + $Goyah : Cette défaite ne pourra que nous être bénéfique !`, }, }, "piers_marnie_double": { "encounter": { - 1: `Rosemary : Frérot, montrons-leur la puissance de Smashings ! + 1: `Rosemary : Frérot, montrons-lui la puissance de Smashings ! $Peterson : Nous sommes les ténèbres !`, }, "victory": { @@ -5147,10 +5219,10 @@ export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { "marnie_piers_double": { "encounter": { 1: `Peterson : Chauds pour un concert ? - $Rosemary : Frérot… Ils sont pas là pour chanter, mais se battre…`, + $Rosemary : Frérot… Il est pas là pour chanter, mais se battre…`, }, "victory": { - 1: `Peterson : Ça c'est du rock ! + 1: `Peterson : Ça c’est du rock ! $Rosemary : Frérot…`, }, }, @@ -5182,76 +5254,76 @@ export const PGFdoubleBattleDialogue: DialogueTranslationEntries = { }, "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?`, + 1: `Lévy : Héhéhé… Tu en fais une drôle de tête. + $Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ? + $Lévy : Nous sommes des jumeaux ! + $Tatia : Nous n’avons pas besoin de parler entre nous ! + $Lévy : Tu crois pouvoir briser… + $Tatia : … Notre duo parfait ?`, }, "victory": { - 1: `Lévy : What? Our combination was perfect! - $Tatia : Looks like we need to train more...`, + 1: `Lévy : Quoi ? Notre combinaison était parfaite ! + $Tatia : Nous avons encore besoin d’entrainement…`, }, }, "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?` + 1: `Tatia : Hihih… Si tu voyais ta tête ! + $Lévy : Oui, nous sommes deux Champions en un ! + $Tatia : Voici mon frère, Lévy… + $Lévy : … Et ma sœur, Tatia ! + $Tatia : Tu ne penses pas que notre combinaison est parfaite ?` }, "victory": { - 1: `Tatia : Are we... - $Lévy : ...not as strong as we thought?`, + 1: `Tatia : Quoi ? Notre combinaison… + $Lévy : … a échoué !`, }, }, "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!`, + 1: `Pierre R. : Marc, montrons-lui la puissance des Maitres ! + $Marc : Tu vas gouter au pouvoir de Hoenn ! + $Pierre R. : C’est parti !`, }, "victory": { - 1: `Pierre R. : That was a great battle! - $Marc : We will win next time!`, + 1: `Pierre R. : C’était un beau combat ! + $Marc : Ce sera notre tour la prochaine fois !`, }, }, "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!`, + 1: `Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ? + $Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon. + $Pierre R. : Oh… Je vois… Commençons alors !`, }, "victory": { - 1: `Pierre R. : Now that we are done with the battle, let's show off our pokémon! - $Marc : Pierre...`, + 1: `Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos 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!`, + 1: `Goyah : Nous sommes l’élite des Dresseurs d’Unys ! + $Iris : Rien de mieux que des combats contre des prodiges !`, }, "victory": { - 1: `Goyah : Wow! You are super strong! - $Iris : We will win next time!`, + 1: `Goyah : INCROYABLE ! T’es trop doué ! + $Iris : On gagnera la prochaine fois !`, }, }, "iris_alder_double": { "encounter": { - 1: `Iris : Welcome Challenger! I am THE Unova Champion! - $Goyah : Iris, aren't you a bit too excited?`, + 1: `Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys ! + $Goyah : Iris, concentre-toi s’il te plait…`, }, "victory": { - 1: `Iris : A loss like this is not easy to take... - $Goyah : But we will only get stronger with every loss!`, + 1: `Iris : On a tout donné et pourtant… + $Goyah : Cette défaite ne pourra que nous être bénéfique !`, }, }, "piers_marnie_double": { "encounter": { - 1: `Rosemary : Frérot, montrons-leur la puissance de Smashings ! + 1: `Rosemary : Frérot, montrons-lui la puissance de Smashings ! $Peterson : Nous sommes les ténèbres !`, }, "victory": { @@ -5262,10 +5334,10 @@ export const PGFdoubleBattleDialogue: DialogueTranslationEntries = { "marnie_piers_double": { "encounter": { 1: `Peterson : Chauds pour un concert ? - $Rosemary : Frérot… Ils sont pas là pour chanter, mais se battre…`, + $Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…`, }, "victory": { - 1: `Peterson : Ça c'est du rock ! + 1: `Peterson : Ça c’est du rock ! $Rosemary : Frérot…`, }, }, diff --git a/src/locales/fr/egg.ts b/src/locales/fr/egg.ts index 96fbc4dce15..f63ac3abb0d 100644 --- a/src/locales/fr/egg.ts +++ b/src/locales/fr/egg.ts @@ -22,4 +22,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", + "moveUPGacha": "Bonus Capacité\nŒuf Rare !", + "shinyUPGacha": "Bonus\nChromatique !", + "legendaryUPGacha": "Bonus !", } as const; diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts new file mode 100644 index 00000000000..8e2c1a53afa --- /dev/null +++ b/src/locales/fr/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen", + "typeFilter": "Type", + "dexFilter": "Dex", + "unlocksFilter": "Débloq.", + "miscFilter": "Divers", + "sortFilter": "Tri", + "all": "Tous", + "normal": "Normal", + "uncaught": "Non-capturé", + "passive": "Passif", + "passiveUnlocked": "Passif débloqué", + "passiveLocked": "Passif verrouillé", + "ribbon": "Ruban", + "hasWon": "Ruban - Oui", + "hasNotWon": "Ruban - Non", + "sortByNumber": "Par N°", + "sortByCost": "Par cout", + "sortByCandies": "Par bonbons", + "sortByIVs": "Par IV", + "sortByName": "Par nom", +}; diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index b8446b1aa68..1270ce6d361 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -18,7 +18,11 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Sélectionnez l’emplacement depuis lequel exporter les données.", "importData": "Importer données", "exportData": "Exporter données", + "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!" + "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !" } as const; diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.ts index 0402bd4bfda..41927f83b1c 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -12,6 +12,7 @@ export const menu: SimpleTranslationEntries = { "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", @@ -49,5 +50,8 @@ export const menu: SimpleTranslationEntries = { "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 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; diff --git a/src/locales/fr/modifier-select-ui-handler.ts b/src/locales/fr/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..7e3d4837e54 --- /dev/null +++ b/src/locales/fr/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}} ₽" +} as const; diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 0423751e937..671a122f992 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -4,7 +4,7 @@ export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { "AddPokeballModifierType": { name: "{{pokeballName}} x{{modifierCount}}", - description: "Recevez {{modifierCount}} {{pokeballName}}·s (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}.", + description: "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}", }, "AddVoucherModifierType": { name: "{{voucherTypeName}} x{{modifierCount}}", @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { 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.", + description: "Fait monter un Pokémon de {{levels}} niveau·x.", }, "AllPokemonLevelIncrementModifierType": { - description: "Fait monter toute l’équipe d’un niveau.", + description: "Fait monter toute l’équipe de {{levels}} niveau·x.", }, "PokemonBaseStatBoosterModifierType": { description: "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter.", @@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TmModifierTypeWithInfo": { name: "CT{{moveId}} - {{moveName}}", - description: "Apprend la capacité {{moveName}} à un Pokémon\n(Maintenez C ou Maj pour plus d’infos).", + 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.", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Cendre Sacrée" }, - "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O. ." }, + "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il est mis K.O. par une capacité directe." }, + + "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: "Huile" }, "MAX_ETHER": { name: "Huile Max" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Grelot Zen" }, + "SCOPE_LENS": { name: "Lentilscope", description: "Une lentille qui augmente le taux de critiques du porteur." }, + "LEEK": { name: "Poireau", description: "Objet à faire tenir à Canarticho. Un poireau très long et solide qui augmente son taux de critiques." }, + "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)." }, diff --git a/src/locales/fr/modifier.ts b/src/locales/fr/modifier.ts new file mode 100644 index 00000000000..368b186a07b --- /dev/null +++ b/src/locales/fr/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "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 !", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{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 !", +} as const; diff --git a/src/locales/fr/move-trigger.ts b/src/locales/fr/move-trigger.ts new file mode 100644 index 00000000000..d1fbda50b03 --- /dev/null +++ b/src/locales/fr/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "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 !", + "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 !", + "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 !", + "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 !", + "faintCountdown": "{{pokemonName}}\nsera K.O. dans {{turnCount}} tours !", + "copyType": "{{pokemonName}} prend le type\nde {{targetPokemonName}} !", + "suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !", + "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !", +} as const; diff --git a/src/locales/fr/move.ts b/src/locales/fr/move.ts index 3fea8995694..425d9226d57 100644 --- a/src/locales/fr/move.ts +++ b/src/locales/fr/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "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." + 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", diff --git a/src/locales/fr/party-ui-handler.ts b/src/locales/fr/party-ui-handler.ts index 369f7b65bb9..158a6e8416a 100644 --- a/src/locales/fr/party-ui-handler.ts +++ b/src/locales/fr/party-ui-handler.ts @@ -1,11 +1,54 @@ 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" + "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", + + // Slot TM text + "able": "Apte", + "notAble": "Pas Apte", + "learned": "Appris", + + // Releasing messages + "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}} !", } as const; diff --git a/src/locales/fr/pokemon-form.ts b/src/locales/fr/pokemon-form.ts new file mode 100644 index 00000000000..f96931fd0e9 --- /dev/null +++ b/src/locales/fr/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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 !", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "Cosplayeur", + "pikachuCoolCosplay": "Cosplay Rockeur", + "pikachuBeautyCosplay": "Cosplay Lady", + "pikachuCuteCosplay": "Cosplay Star", + "pikachuSmartCosplay": "Cosplay Docteur", + "pikachuToughCosplay": "Cosplay Catcheur", + "pikachuPartner": "Partenaire", + "eeveePartner": "Partenaire", + // 2G + "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": "?", + // 3G + "castformSunny": "Solaire", + "castformRainy": "Eau de Pluie", + "castformSnowy": "Blizzard", + "deoxysNormal": "Normal", + // 4G + "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", + // 5G + "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", + // 6G + "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", + // 7G + "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", + // 8G + "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", + // 9G + "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", + +} as const; diff --git a/src/locales/fr/pokemon-info-container.ts b/src/locales/fr/pokemon-info-container.ts index c61c23b0970..4e09e8915ad 100644 --- a/src/locales/fr/pokemon-info-container.ts +++ b/src/locales/fr/pokemon-info-container.ts @@ -5,8 +5,5 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "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.ts index 641b372f3d3..a10944173e5 100644 --- a/src/locales/fr/pokemon-info.ts +++ b/src/locales/fr/pokemon-info.ts @@ -14,8 +14,8 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEFshortened": "DéfSp", "SPD": "Vitesse", "SPDshortened": "Vit", - "ACC": "Accuracy", - "EVA": "Evasiveness" + "ACC": "Précison", + "EVA": "Esquive" }, Type: { diff --git a/src/locales/fr/pokemon-summary.ts b/src/locales/fr/pokemon-summary.ts new file mode 100644 index 00000000000..8f21a942c36 --- /dev/null +++ b/src/locales/fr/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}.", + }, +} as const; diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts index cd85b0f8cb9..9e3bd04923a 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -95,5 +95,6 @@ export const settings: SimpleTranslationEntries = { "mute": "Muet", "controller": "Controller", "gamepadSupport": "Gamepad Support", - "showBgmBar": "Montrer titre de la musique", + "showBgmBar": "Titre de la musique", + "shopOverlayOpacity": "Opacité boutique" } as const; diff --git a/src/locales/fr/splash-messages.ts b/src/locales/fr/splash-messages.ts index 13de7f28116..1ee76ab9a13 100644 --- a/src/locales/fr/splash-messages.ts +++ b/src/locales/fr/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Essaye aussi Radical Red !", "eeveeExpo": "Eevee Expo !", "ynoproject": "YNOproject !", + "breedersInSpace": "Des Éleveurs dans l’espace !", } as const; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index 84fb56c9ccc..c49c326385f 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -6,7 +6,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Commencer avec ces Pokémon ?", + "confirmStartTeam": "Commencer avec ces Pokémon ?", + "confirmExit": "Do you want to exit?", + "invalidParty": "Cette équipe de départ est invalide !", "gen1": "1G", "gen2": "2G", "gen3": "3G", @@ -22,6 +24,7 @@ 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", @@ -31,13 +34,13 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "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", "enablePassive": "Activer Passif", "disablePassive": "Désactiver Passif", "locked": "Verrouillé", diff --git a/src/locales/fr/status-effect.ts b/src/locales/fr/status-effect.ts new file mode 100644 index 00000000000..ca8c46043e7 --- /dev/null +++ b/src/locales/fr/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Aucun", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Empoisonnement", + description: "empoisonné", + obtain: "{{pokemonNameWithAffix}} est\nempoisonné !", + obtainSource: "{{pokemonNameWithAffix}} est\nempoisonné par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\nsouffre du poison !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", + heal: "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" + }, + toxic: { + name: "Empoisonnement grave", + description: "gravement empoisonné", + obtain: "{{pokemonNameWithAffix}} est\ngravement empoisonné !", + obtainSource: "{{pokemonNameWithAffix}} est\ngravement empoisonné par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\nsouffre du poison !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", + heal: "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" + }, + paralysis: { + name: "Paralysie", + description: "paralysé", + obtain: "{{pokemonNameWithAffix}} est paralysé !\nIl aura du mal à attaquer !", + obtainSource: "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !", + activation: "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà paralysé.", + heal: "{{pokemonNameWithAffix}} n’est\nplus paralysé !" + }, + sleep: { + name: "Sommeil", + description: "endormi", + obtain: "{{pokemonNameWithAffix}}\ns’est endormi !", + obtainSource: "{{pokemonNameWithAffix}} est\nendormi par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\ndort profondément.", + overlap: "{{pokemonNameWithAffix}}\ndort déjà.", + heal: "{{pokemonNameWithAffix}}\nse réveille !" + }, + freeze: { + name: "Gelé", + description: "gelé", + obtain: "{{pokemonNameWithAffix}} est\ngelé !", + obtainSource: "{{pokemonNameWithAffix}} est\ngelé par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}} est gelé !\nIl ne peut plus attaquer !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà gelé.", + heal: "{{pokemonNameWithAffix}} n’est\nplus gelé !" + }, + burn: { + name: "Brulure", + description: "brulé", + obtain: "{{pokemonNameWithAffix}} est\nbrulé !", + obtainSource: "{{pokemonNameWithAffix}} est\nbrulé par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\nsouffre de sa brulure !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà brulé.", + heal: "{{pokemonNameWithAffix}} n’est\nplus brulé !" + }, +} as const; diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index fc0639d47b9..84d49eba549 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -127,16 +127,33 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "Gamin", "rocket_grunt": "Sbire de la Team Rocket", "rocket_grunt_female": "Sbire de la Team Rocket", + "rocket_grunts": "Sbires de la Team Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Sbire de la Team Magma", "magma_grunt_female": "Sbire de la Team Magma", + "magma_grunts": "Sbires de la Team Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Sbire de la Team Aqua", "aqua_grunt_female": "Sbire de la Team Aqua", + "aqua_grunts": "Sbires de la Team Aqua", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Sbire de la Team Galaxie", - "galactic_grunt_female": "Sbire Team Galaxie", + "galactic_grunt_female": "Sbire de la Team Galaxie", + "galactic_grunts": "Sbires de la Team Galaxie", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Sbire de la Team Plasma", "plasma_grunt_female": "Sbire de la Team Plasma", + "plasma_grunts": "Sbires de la Team Plasma", + "plasma_sage": "Plasma Sage", "flare_grunt": "Sbire de la Team Flare", "flare_grunt_female": "Sbire de la Team Flare", + "flare_grunts": "Sbires de la Team Flare", + "flare_admin": "Manager de la Team Flare", + "flare_admin_female": "Manageuse de la Team Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -265,7 +282,11 @@ export const trainerNames: SimpleTranslationEntries = { "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 - + "maxie": "Max", + "archie": "Arthur", + "cyrus": "Hélio", + "ghetsis": "Ghetis", + "lysandre": "Lysandre", // Double Names "blue_red_double": "Blue & Red", diff --git a/src/locales/fr/weather.ts b/src/locales/fr/weather.ts index fa6090a3ad5..3427748480e 100644 --- a/src/locales/fr/weather.ts +++ b/src/locales/fr/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "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é…" }; + +export const terrain: SimpleTranslationEntries = { + "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}} !" +}; diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index 1f6fcfb1258..37472dbdeab 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -3,9 +3,61 @@ 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!", + "costar": "{{pokemonName}} ha copiato le modifiche alle statistiche\ndel suo alleato {{allyName}}!", "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{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}} can act faster than normal, thanks to its Quick Draw!", + "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}}!", + "postDefendDisguise": "{{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": "{{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!", + "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!", + "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}} non riesce a\nmangiare le bacche per l'agitazione!", } as const; diff --git a/src/locales/it/ability.ts b/src/locales/it/ability.ts index 5e01e02a718..3b98f1b389d 100644 --- a/src/locales/it/ability.ts +++ b/src/locales/it/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Mielincetta", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", + description: "Il Pokémon raccoglie del miele dopo ogni battaglia. Esso viene poi venduto.", }, frisk: { name: "Indagine", diff --git a/src/locales/it/achv.ts b/src/locales/it/achv.ts index 0ec9ad3f98a..50baae41790 100644 --- a/src/locales/it/achv.ts +++ b/src/locales/it/achv.ts @@ -10,7 +10,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "MoneyAchv": { - description: "Accumula ₽{{moneyAmount}} PokéDollari", + description: "Accumula {{moneyAmount}} PokéDollari", }, "10K_MONEY": { name: "Benestante", @@ -191,19 +191,19 @@ export const PGMachv: AchievementTranslationEntries = { description: "Completa la modalità sfida di quinta generazione.", }, "MONO_GEN_SIX": { - name: "Quasi Reali", + name: "Vita e Morte", description: "Completa la modalità sfida di sesta generazione.", }, "MONO_GEN_SEVEN": { - name: "Solo In Teoria", + name: "Troppo amichevoli?", description: "Completa la modalità sfida di settima generazione.", }, "MONO_GEN_EIGHT": { - name: "È Champion-time!", + name: "It's champion time!", description: "Completa la modalità sfida di ottava generazione.", }, "MONO_GEN_NINE": { - name: "Non si Stava Impegnando...", + name: "Paradossalmente sbalorditivi", description: "Completa la modalità sfida di nona generazione.", }, diff --git a/src/locales/it/arena-flyout.ts b/src/locales/it/arena-flyout.ts new file mode 100644 index 00000000000..9e1e55226ea --- /dev/null +++ b/src/locales/it/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Effetti attivi in campo", + "player": "Giocatore", + "neutral": "Neutrali", + "enemy": "Nemico", + + // WeatherType + "sunny": "Sole", + "rain": "Pioggia", + "sandstorm": "Tempesta di sabbia", + "hail": "Grandine", + "snow": "Neve", + "fog": "Nebbia", + "heavyRain": "Acquazzone", + "harshSun": "Luce accecante", + "strongWinds": "Corrente d'aria misteriosa", + + // TerrainType + "misty": "Campo Nebbioso", + "electric": "Campo Elettrico", + "grassy": "Campo Erboso", + "psychic": "Campo Psichico", + + // ArenaTagType + "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", +}; diff --git a/src/locales/it/arena-tag.ts b/src/locales/it/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/it/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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!", + "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.", +} as const; diff --git a/src/locales/it/battle-info.ts b/src/locales/it/battle-info.ts new file mode 100644 index 00000000000..00f72e60f6c --- /dev/null +++ b/src/locales/it/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "{{generation}} generazione", +} as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index 2052dc49cfc..954f52e4a7f 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -5,8 +5,8 @@ export const battle: SimpleTranslationEntries = { "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!", + "singleWildAppeared": "È apparso {{pokemonName}} selvatico!", + "multiWildAppeared": "Sono apparsi {{pokemonName1}}\ne {{pokemonName2}} salvatici!", "playerComeBack": "Rientra, {{pokemonName}}!", "trainerComeBack": "{{trainerName}} ha ritirato {{pokemonName}}!", "playerGo": "Vai! {{pokemonName}}!", @@ -14,8 +14,9 @@ export const battle: SimpleTranslationEntries = { "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}} has been\nadded as a starter!", + "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}}!", @@ -25,8 +26,9 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Non ha effetto su {{pokemonName}}!", "hitResultOneHitKO": "KO con un colpo!", "attackFailed": "Ma ha fallito!", + "attackMissed": "{{pokemonNameWithAffix}}\nevita l’attacco!", "attackHitsCount": "Colpito {{count}} volta/e!", - "rewardGain": "You received\n{{modifierName}}!", + "rewardGain": "Ricevi\n{{modifierName}}!", "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", "learnMove": "{{pokemonName}} impara\n{{moveName}}!", @@ -43,10 +45,10 @@ export const battle: SimpleTranslationEntries = { "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.", + "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\nquando rimane un solo Pokémon!", - "noPokeballStrong": "Il Pokémon avversario è troppo forte per essere catturato!\nDevi prima indebolirlo!", + "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}}!", @@ -54,27 +56,45 @@ export const battle: SimpleTranslationEntries = { "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!", + "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?", - "eggHatching": "Oh!", + "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!", - "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}}!", + "statsAnd": "e", + "stats": "statistiche", + "statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", + "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", + "statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "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}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!", "battlerTagsPerishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} è al centro\ndell’attenzione!", "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!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} si solleva in aria\na causa dell’elettromagnetismo!", + "battlerTagsMagnetRisenOnRemove": "L’effetto dell’elettromagnetismo di {{pokemonNameWithAffix}}\nè terminato!", "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!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!" } as const; diff --git a/src/locales/it/battler-tags.ts b/src/locales/it/battler-tags.ts new file mode 100644 index 00000000000..1d897c70f3d --- /dev/null +++ b/src/locales/it/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", +} as const; diff --git a/src/locales/it/bgm-name.ts b/src/locales/it/bgm-name.ts index ef15c6c6dcb..01fb86b281d 100644 --- a/src/locales/it/bgm-name.ts +++ b/src/locales/it/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Music", + "music": "Music: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", diff --git a/src/locales/it/common.ts b/src/locales/it/common.ts index f42fa311472..2a84e982350 100644 --- a/src/locales/it/common.ts +++ b/src/locales/it/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "Inizia", + "luckIndicator": "Fortuna:", + "shinyOnHover": "Shiny", + "commonShiny": "Comune", + "rareShiny": "Raro", + "epicShiny": "Epico", } as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index fa0ddb5add2..ceb52665796 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/it/settings.js"; -import { common } from "#app/locales/it/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const itConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const itConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/it/dialogue.ts b/src/locales/it/dialogue.ts index 702b550c45a..3861d530c01 100644 --- a/src/locales/it/dialogue.ts +++ b/src/locales/it/dialogue.ts @@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Team Rocket blasting off again!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: " If you get in the way of Team Magma, don’t expect any mercy!" @@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Huh? I lost?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "No one who crosses Team Aqua gets any mercy, not even kids!" @@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You're kidding me!" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Don't mess with Team Galactic!" @@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Shut down..." }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "We won't tolerate people who have different ideas!" @@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Fashion is most important to us!" @@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "The future doesn't look bright for me." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "So! I must say, I am impressed you got here!" diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts index 9b60b2f1835..5e5ddee2e2f 100644 --- a/src/locales/it/egg.ts +++ b/src/locales/it/egg.ts @@ -6,20 +6,23 @@ export const egg: SimpleTranslationEntries = { "greatTier": "Raro", "ultraTier": "Epico", "masterTier": "Leggendario", - "hatchWavesMessageSoon": "Si sentono dei suoni provenienti dall'interno! Si schiuderà presto!", + "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? 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!", + "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": "Egg Move unlocked: {{moveName}}", - "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", + "eggMoveUnlock": "Mossa da uovo sbloccata: {{moveName}}", + "rareEggMoveUnlock": "Mossa da uovo rara sbloccata: {{moveName}}", + "moveUPGacha": "Mossa +", + "shinyUPGacha": "Shiny +", + "legendaryUPGacha": "+", } as const; diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts new file mode 100644 index 00000000000..88745d2c4f8 --- /dev/null +++ b/src/locales/it/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen", + "typeFilter": "Tipo", + "dexFilter": "Dex", + "unlocksFilter": "Altro", + "miscFilter": "Misc", + "sortFilter": "Ordina", + "all": "Tutto", + "normal": "Normale", + "uncaught": "Mancante", + "passive": "Passive", + "passiveUnlocked": "Passiva sbloccata", + "passiveLocked": "Passiva bloccata", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", + "sortByNumber": "Num. Dex", + "sortByCost": "Costo", + "sortByCandies": "Caramelle", + "sortByIVs": "IVs", + "sortByName": "Nome", +}; diff --git a/src/locales/it/game-stats-ui-handler.ts b/src/locales/it/game-stats-ui-handler.ts index f4b5f80e23b..904acbf610d 100644 --- a/src/locales/it/game-stats-ui-handler.ts +++ b/src/locales/it/game-stats-ui-handler.ts @@ -9,13 +9,13 @@ export const gameStatsUiHandler: SimpleTranslationEntries = { "speciesSeen": "Specie viste", "speciesCaught": "Specie catturate", "ribbonsOwned": "Fiocchi ottenuti", - "classicRuns": "Run in modalità classica", - "classicWins": "Vittorie in modalità classica", + "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 raggiunta (Infinita)", - "highestMoney": "Patrimonio maggiore posseduto", + "highestWaveEndless": "Orda più alta (Infinita)", + "highestMoney": "Miglior patrimonio", "highestDamage": "Danni maggiori inflitti", "highestHPHealed": "PS maggiori rigenerati", "pokemonEncountered": "Pokémon incontrati", diff --git a/src/locales/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts index 7aae9e26f6d..58e48574476 100644 --- a/src/locales/it/menu-ui-handler.ts +++ b/src/locales/it/menu-ui-handler.ts @@ -2,23 +2,27 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Impostazioni", - "ACHIEVEMENTS": "Trofei", + "ACHIEVEMENTS": "Obiettivi", "STATS": "Statistiche", "VOUCHERS": "Biglietti", - "EGG_LIST": "Lista Uova", - "EGG_GACHA": "Gacha Uova", - "MANAGE_DATA": "Gestisci Dati", + "EGG_LIST": "Lista uova", + "EGG_GACHA": "Macchine uova", + "MANAGE_DATA": "Gestisci dati", "COMMUNITY": "Community", - "SAVE_AND_QUIT": "Salva ed Esci", + "SAVE_AND_QUIT": "Salva ed esci", "LOG_OUT": "Disconnettiti", "slot": "Slot {{slotNumber}}", - "importSession": "Importa Sessione", + "importSession": "Importa sessione", "importSlotSelect": "Seleziona uno slot in cui importare.", - "exportSession": "Esporta Sessione", + "exportSession": "Esporta sessione", "exportSlotSelect": "Seleziona uno slot da cui esportare.", - "importData": "Importa Dati", - "exportData": "Esporta Dati", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", + "importData": "Importa dati", + "exportData": "Esporta dati", "cancel": "Annulla", - "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?", + "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Confermi?", "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index 3336373a6c3..9766708f7ae 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "Nome utente", "password": "Password", "login": "Accedi", + "orUse": "Or use", "register": "Registrati", "emptyUsername": "Nome utente mancante!", "invalidLoginUsername": "Nome utente non valido!", @@ -53,6 +54,9 @@ export const menu: SimpleTranslationEntries = { "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.", + "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.", } as const; diff --git a/src/locales/it/modifier-select-ui-handler.ts b/src/locales/it/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..f0852a7d87c --- /dev/null +++ b/src/locales/it/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}}₽" +} as const; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 2b7147133e1..618d19395e5 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -13,18 +13,18 @@ export const modifierType: ModifierTypeTranslationEntries = { "PokemonHeldItemModifierType": { extra: { "inoperable": "{{pokemonName}} non può prendere\nquesto oggetto!", - "tooMany": "{{pokemonName}} ne ha troppi\ndi questo 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 stato.", + "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}}% PS.", + 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.", @@ -46,7 +46,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "PokemonNatureChangeModifierType": { name: "Menta {{natureName}}.", - description: "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura per il Pokémon iniziale.", + description: "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura nel menu degli starter.", }, "DoubleBattleChanceBoosterModifierType": { description: "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie.", @@ -58,16 +58,16 @@ export const modifierType: ModifierTypeTranslationEntries = { 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.", + description: "Aumenta il livello di un Pokémon di {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Aumenta il livello di tutti i Pokémon nel gruppo di 1.", + description: "Aumenta i livell di tutti i Pokémon della squadra di {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Aumenta {{statName}} di base del possessore del 10%.", }, "AllPokemonFullHpRestoreModifierType": { - description: "Recupera il 100% dei PS per tutti i Pokémon.", + description: "Restituisce il 100% dei PS a tutti i Pokémon.", }, "AllPokemonFullReviveModifierType": { description: "Rianima tutti i Pokémon esausti restituendogli tutti i PS.", @@ -75,7 +75,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "MoneyRewardModifierType": { description: "Garantisce una {{moneyMultiplier}} quantità di soldi (₽{{moneyAmount}}).", extra: { - "small": "poca", + "small": "contenuta", "moderate": "moderata", "large": "grande", }, @@ -90,7 +90,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Aumenta del 50% il guadagno di amicizia per vittoria.", }, "PokemonMoveAccuracyBoosterModifierType": { - description: "Aumenta l'accuratezza delle mosse di {{accuracyAmount}} (massimo 100).", + 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.", @@ -117,7 +117,7 @@ export const modifierType: ModifierTypeTranslationEntries = { 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.", + 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.", @@ -129,72 +129,77 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Aggiunge una probabilità del {{probabilitàPercent}}% di resistere ad un colpo.", }, - "RARE_CANDY": { name: "Caramella Rara" }, - "RARER_CANDY": { name: "Caramella Molto Rara" }, + "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." }, + "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" }, + "MAX_POTION": { name: "Pozione max" }, + "FULL_RESTORE": { name: "Ricarica totale" }, "REVIVE": { name: "Revitalizzante" }, - "MAX_REVIVE": { name: "Revitalizzante Max" }, + "MAX_REVIVE": { name: "Revitalizzante max" }, - "FULL_HEAL": { name: "Cura Totale" }, + "FULL_HEAL": { name: "Cura totale" }, - "SACRED_ASH": { name: "Cenere Magica" }, + "SACRED_ASH": { name: "Cenere magica" }, - "REVIVER_SEED": { name: "Revitalseme", description: "Il possessore recupera 1/2 di PS in caso di svenimento." }, + "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: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, "ETHER": { name: "Etere" }, - "MAX_ETHER": { name: "Etere Max" }, + "MAX_ETHER": { name: "Etere max" }, "ELIXIR": { name: "Elisir" }, - "MAX_ELIXIR": { name: "Elisir Max" }, + "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" }, + "LURE": { name: "Esca" }, + "SUPER_LURE": { name: "Super esca" }, + "MAX_LURE": { name: "Esca max" }, - "MEMORY_MUSHROOM": { name: "Fungo della Memoria", description: "Ricorda la mossa dimenticata di un Pokémon." }, + "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 del gruppo di livello inferiore." }, + "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 Oro" }, + "SUPER_EXP_CHARM": { name: "Esperienzamuleto super" }, + "GOLDEN_EXP_CHARM": { name: "Esperienzamuleto dorato" }, - "LUCKY_EGG": { name: "Uovo Fortunato" }, - "GOLDEN_EGG": { name: "Uovo d'Oro" }, + "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." }, + "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 (Aggiuntivo)." }, + "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" }, + "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." }, + "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 degli oggetti." }, + "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" }, @@ -202,18 +207,18 @@ export const modifierType: ModifierTypeTranslationEntries = { "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." }, + "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." }, + "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." }, + "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à (dopo la priorità)." }, + "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: "Guarisce 1/8 del danno inflitto a un Pokémon." }, + "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." }, @@ -223,22 +228,22 @@ export const modifierType: ModifierTypeTranslationEntries = { "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." }, + "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" }, + "DNA_SPLICERS": { name: "Cuneo DNA" }, - "MINI_BLACK_HOLE": { name: "Piccolo Buco Nero" }, + "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." }, + "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 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_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: { @@ -258,14 +263,14 @@ export const modifierType: ModifierTypeTranslationEntries = { }, TempBattleStatBoosterStatName: { - "ATK": "Attack", - "DEF": "Defense", - "SPATK": "Sp. Atk", - "SPDEF": "Sp. Def", - "SPD": "Speed", - "ACC": "Accuracy", - "CRIT": "Critical Hit Ratio", - "EVA": "Evasiveness", + "ATK": "Attacco", + "DEF": "Difesa", + "SPATK": "Att. Speciale", + "SPDEF": "Dif. Speciale", + "SPD": "Velocità", + "ACC": "Precisione", + "CRIT": "Tasso di brutti colpi", + "EVA": "Elusione", "DEFAULT": "???", }, diff --git a/src/locales/it/modifier.ts b/src/locales/it/modifier.ts new file mode 100644 index 00000000000..810524a9e5e --- /dev/null +++ b/src/locales/it/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "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}}!", + "pokemonResetNegativeStatStageApply": "{{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}} agisce più rapidamente del normale grazie al suo {{itemName}}!", +} as const; diff --git a/src/locales/it/move-trigger.ts b/src/locales/it/move-trigger.ts new file mode 100644 index 00000000000..60679d844c0 --- /dev/null +++ b/src/locales/it/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "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!", + "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": " Si sente suonare una campanella!", + "foresawAnAttack": "{{pokemonName}} presagisce\nl’attacco imminente!", + "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!", + "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!", + "faintCountdown": "{{pokemonName}}\nandrà KO dopo {{turnCount}} turni.", + "copyType": "{{pokemonName}} assume il tipo\ndi {{targetPokemonName}}!", + "suppressAbilities": "L’abilità di {{pokemonName}}\nperde ogni efficacia!", + "swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!", +} as const; diff --git a/src/locales/it/move.ts b/src/locales/it/move.ts index a7ebd605f18..a2c99218cec 100644 --- a/src/locales/it/move.ts +++ b/src/locales/it/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "Cannone Dynamax", - effect: "Il Pokémon attacca emettendo dal suo nucleo l'energia concentrata nel corpo.", + 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", diff --git a/src/locales/it/party-ui-handler.ts b/src/locales/it/party-ui-handler.ts index c174df03d1f..979e04f3ea1 100644 --- a/src/locales/it/party-ui-handler.ts +++ b/src/locales/it/party-ui-handler.ts @@ -6,5 +6,49 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "Annulla", "RELEASE": "Rilascia", "APPLY": "Applica", - "TEACH": "Insegna" + "TEACH": "Insegna", + "SPLICE": "Splice", + "UNSPLICE": "Unsplice", + "ACTIVATE": "Activate", + "DEACTIVATE": "Deactivate", + "TRANSFER": "Transfer", + "ALL": "All", + "PASS_BATON": "Pass Baton", + "UNPAUSE_EVOLUTION": "Unpause Evolution", + "REVIVE": "Revive", + "RENAME": "Rinomina", + + "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", + + // Slot TM text + "able": "Able", + "notAble": "Not able", + "learned": "Learned", + + // Releasing messages + "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}}!", } as const; diff --git a/src/locales/it/pokemon-form.ts b/src/locales/it/pokemon-form.ts new file mode 100644 index 00000000000..eb5d132bacd --- /dev/null +++ b/src/locales/it/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cosplay classe", + "pikachuBeautyCosplay": "Cosplay bellezza", + "pikachuCuteCosplay": "Cosplay grazie", + "pikachuSmartCosplay": "Cosplay acume", + "pikachuToughCosplay": "Cosplay grinta", + "pikachuPartner": "Compagno", + "eeveePartner": "Compagno", + // 2G + "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": "?", + // 3G + "castformSunny": "Sole", + "castformRainy": "Pioggia", + "castformSnowy": "Nuvola di neve", + "deoxysNormal": "Normale", + // 4G + "burmyPlant": "Pianta", + "burmySandy": "Sabbia", + "burmyTrash": "Scarti", + "shellosEast": "Est", + "shellosWest": "Ovest", + "rotomHeat": "Calore", + "rotomWash": "Lavaggio", + "rotomFrost": "Gelo", + "rotomFan": "Vortice", + "rotomMow": "Taglio", + "giratinaAltered": "Alterata", + "shayminLand": "Terra", + // 5G + "basculinRedStriped": "Linearossa", + "basculinBlueStriped": "Lineablu", + "basculinWhiteStriped": "Lineabianca", + "deerlingSpring": "Primavera", + "deerlingSummer": "Estate", + "deerlingAutumn": "Autunno", + "deerlingWinter": "Inverno", + "tornadusIncarnate": "Incarnazione", + "thundurusIncarnate": "Incarnazione", + "landorusIncarnate": "Incarnazione", + "keldeoOrdinary": "Normale", + "meloettaAria": "Canto", + // 6G + "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", + // 7G + "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", + // 8G + "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", + // 9G + "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", + +} as const; diff --git a/src/locales/it/pokemon-info-container.ts b/src/locales/it/pokemon-info-container.ts index 2d80763abc3..03d83a1e6d7 100644 --- a/src/locales/it/pokemon-info-container.ts +++ b/src/locales/it/pokemon-info-container.ts @@ -5,7 +5,4 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "Genere:", "ability": "Abilità:", "nature": "Natura:", - "epic": "Epico", - "rare": "Raro", - "common": "Comune" } as const; diff --git a/src/locales/it/pokemon-summary.ts b/src/locales/it/pokemon-summary.ts new file mode 100644 index 00000000000..7f17440b16c --- /dev/null +++ b/src/locales/it/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}.", + }, +} as const; diff --git a/src/locales/it/settings.ts b/src/locales/it/settings.ts index af48368aeeb..07cbe6b7f46 100644 --- a/src/locales/it/settings.ts +++ b/src/locales/it/settings.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; export const settings: SimpleTranslationEntries = { "boy": "Ragazzo", "girl": "Ragazza", - "general": "General", + "general": "Generale", "display": "Display", "audio": "Audio", "gamepad": "Gamepad", @@ -94,6 +94,7 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support", - "showBgmBar": "Show Music Names", + "gamepadSupport": "Supporto Gamepad", + "showBgmBar": "Mostra Nomi Musica", + "shopOverlayOpacity": "Opacità Finestra Negozio" } as const; diff --git a/src/locales/it/splash-messages.ts b/src/locales/it/splash-messages.ts index eeb71842094..dbbb0a5bcea 100644 --- a/src/locales/it/splash-messages.ts +++ b/src/locales/it/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Prova anche Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "Allevapokémon nello spazio!", } as const; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index c84334fcd6a..6f43b9415e0 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -6,7 +6,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Vuoi iniziare con questi Pokémon?", + "confirmStartTeam": "Vuoi iniziare con questi Pokémon?", + "confirmExit": "Do you want to exit?", + "invalidParty": "Questo squadra iniziale non è valida!", "gen1": "1ª", "gen2": "2ª", "gen3": "3ª", @@ -22,6 +24,7 @@ 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", diff --git a/src/locales/it/status-effect.ts b/src/locales/it/status-effect.ts new file mode 100644 index 00000000000..eb676c08c84 --- /dev/null +++ b/src/locales/it/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by 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!" + }, +} as const; diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index 420b9bf9f24..dde79d694ca 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -118,7 +118,35 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Operaio", "worker_female": "Lavoratrice", "workers": "Lavoratori", - "youngster": "Bullo" + "youngster": "Bullo", + "rocket_grunt": "Recluta Team Rocket", + "rocket_grunt_female": "Recluta Team Rocket", + "rocket_grunts": "Reclute Team Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", + "magma_grunt": "Recluta Team Magma", + "magma_grunt_female": "Recluta Team Magma", + "magma_grunts": "Reclute Team Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", + "aqua_grunt": "Recluta Team Idro", + "aqua_grunt_female": "Recluta Team Idro", + "aqua_grunts": "Recluta Team Idro", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", + "galactic_grunt": "Recluta Team Galassia", + "galactic_grunt_female": "Recluta Team Galassia", + "galactic_grunts": "Reclute Team Galassia", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", + "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", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/it/weather.ts b/src/locales/it/weather.ts index 2d169421a38..604108435c3 100644 --- a/src/locales/it/weather.ts +++ b/src/locales/it/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "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." }; + +export const terrain: SimpleTranslationEntries = { + "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!" +}; diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index 58ba7bf9aa6..61be21bc7ec 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -3,11 +3,61 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "costar": "{{pokemonName}}[[는]] {{allyName}}의\n능력 변화를 복사했다!", "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "trace": "{{pokemonName}}[[는]] 상대 {{targetName}}의 \n{{abilityName}}[[를]] 트레이스했다!", "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", + "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", + "postDefendDisguise": "{{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}} 때문에\{{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프레셔를 발산하고 있다!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}의\n틀깨기!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}[[는]]\n몸을 떨었다!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}[[는]]\n활활 타오르는 오라를 발산하고 있다!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!", + "postSummonFairyAura": "{{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나무열매를 먹을 수 없게 되었다!", } as const; diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts index d8b8cc54f66..abc0f186fd4 100644 --- a/src/locales/ko/achv.ts +++ b/src/locales/ko/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "설마 자시안으로?", }, + "FRESH_START": { + name: "첫트!", + description: "새 출발 챌린지 모드 클리어." + }, } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/ko/arena-flyout.ts b/src/locales/ko/arena-flyout.ts new file mode 100644 index 00000000000..33d9596af2c --- /dev/null +++ b/src/locales/ko/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "배틀 효과 상태", + "player": "플레이어", + "neutral": "공통", + "enemy": "상대", + + // WeatherType + "sunny": "쾌청", + "rain": "비", + "sandstorm": "모래바람", + "hail": "싸라기눈", + "snow": "눈", + "fog": "안개", + "heavyRain": "강한 비", + "harshSun": "강한 쾌청", + "strongWinds": "난기류", + + // TerrainType + "misty": "미스트필드", + "electric": "일렉트릭필드", + "grassy": "그래스필드", + "psychic": "사이코필드", + + // ArenaTagType + "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/ko/arena-tag.ts b/src/locales/ko/arena-tag.ts new file mode 100644 index 00000000000..ca1039e2bc0 --- /dev/null +++ b/src/locales/ko/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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마룻바닥세워막기를 노리고 있다!", + "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": "기분이 원래대로 돌아왔다.", +} as const; diff --git a/src/locales/ko/battle-info.ts b/src/locales/ko/battle-info.ts new file mode 100644 index 00000000000..357de6003ec --- /dev/null +++ b/src/locales/ko/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "{{generation}}", +} as const; diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index bf32bbe08e7..10f3e1b5853 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -14,6 +14,7 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "{{pokemonName}}[[를]]\n교체하시겠습니까?", "trainerDefeated": "{{trainerName}}[[와]]의\n승부에서 이겼다!", "moneyWon": "상금으로\n₽{{moneyAmount}}을 손에 넣었다!", + "moneyPickedUp": "₽{{moneyAmount}}을 주웠다!", "pokemonCaught": "신난다-!\n{{pokemonName}}[[를]] 잡았다!", "addedAsAStarter": "{{pokemonName}}[[가]]\n스타팅 포켓몬에 추가되었다!", "partyFull": "지닌 포켓몬이 가득 찼습니다. {{pokemonName}}[[를]]\n대신해 포켓몬을 놓아주시겠습니까?", @@ -24,7 +25,8 @@ export const battle: SimpleTranslationEntries = { "hitResultNotVeryEffective": "효과가 별로인 듯하다…", "hitResultNoEffect": "{{pokemonName}}에게는\n효과가 없는 것 같다…", "hitResultOneHitKO": "일격필살!", - "attackFailed": "하지만 실패했다!", + "attackFailed": "그러나 실패하고 말았다!!", + "attackMissed": "{{pokemonNameWithAffix}}에게는\n맞지 않았다!", "attackHitsCount": "{{count}}번 맞았다!", "rewardGain": "{{modifierName}}[[를]] 받았다!", "expGain": "{{pokemonName}}[[는]]\n{{exp}} 경험치를 얻었다!", @@ -64,16 +66,34 @@ export const battle: SimpleTranslationEntries = { "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}}[[는]] 쓰러졌다!", - "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}}[[는]] 더 떨어지지 않는다!", + "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}} 깎았다!", "battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", @@ -103,7 +123,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!", "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!", "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!", - "battlerTagsAquaRingLapse": "{{moveName}} 효과로 \n{{pokemonName}}[[는]] HP를 회복했다!", + "battlerTagsAquaRingLapse": "{{moveName}} 효과로\n{{pokemonName}}[[는]] HP를 회복했다!", "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!", "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!", "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}[[는]]\n주목의 대상이 되었다!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}의\n{{abilityName}} 효과가 사라졌다!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}[[는]]\n전자력으로 떠올랐다!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}의\n전자력이 없어졌다!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!" + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!", } as const; diff --git a/src/locales/ko/battler-tags.ts b/src/locales/ko/battler-tags.ts new file mode 100644 index 00000000000..93a9106a8ce --- /dev/null +++ b/src/locales/ko/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "함정", + "flinchedDesc": "풀죽음", + "confusedDesc": "혼란", + "infatuatedDesc": "헤롱헤롱", + "seedDesc": "씨뿌리기", + "nightmareDesc": "악몽", + "ingrainDesc": "뿌리", + "drowsyDesc": "졸음", +} as const; diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts index c133a93450e..69697b07774 100644 --- a/src/locales/ko/bgm-name.ts +++ b/src/locales/ko/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Music", + "music": "Music: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "BW2 관동 챔피언 배틀", "battle_johto_champion": "BW2 성도 챔피언 배틀", @@ -62,7 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_calyrex": "SWSH 버드렉스 배틀", "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", "battle_legendary_ruinous": "SV 재앙의 보물 배틀", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_kor_mir": "SV 에리어 제로 배틀", "battle_legendary_loyal_three": "SV 세벗들 배틀", "battle_legendary_ogerpon": "SV 오거폰 배틀", "battle_legendary_terapagos": "SV 테라파고스 배틀", @@ -74,16 +74,16 @@ 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", + "battle_flare_grunt": "XY 플레어단 배틀", + "battle_rocket_boss": "USUM 비주기 배틀", + "battle_aqua_magma_boss": "ORAS 아강 & 마적 배틀", + "battle_galactic_boss": "BDSP 태홍 배틀", + "battle_plasma_boss": "B2W2 게치스 배틀", + "battle_flare_boss": "XY 플라드리 배틀", // Biome Music "abyss": "불가사의 던전 하늘의 탐험대 어둠의 화구", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", - "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", "space": "Firel - Aether", "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", diff --git a/src/locales/ko/challenges.ts b/src/locales/ko/challenges.ts index 1f10c4f215a..f84a4f31dc6 100644 --- a/src/locales/ko/challenges.ts +++ b/src/locales/ko/challenges.ts @@ -2,7 +2,7 @@ import { TranslationEntries } from "#app/interfaces/locales"; export const challenges: TranslationEntries = { "title": "챌린지 조건 설정", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "illegalEvolution": "{{pokemon}}[[는]] 현재의 챌린지에\n부적합한 포켓몬이 되었습니다!", "singleGeneration": { "name": "단일 세대", "desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.", @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다." //type in pokemon-info }, + "freshStart": { + "name": "새 출발", + "desc": "포켓로그를 처음 시작했던 때처럼 강화가 전혀 되지 않은 오리지널 스타팅 포켓몬만 고를 수 있습니다.", + "value.0": "해제", + "value.1": "설정", + } } as const; diff --git a/src/locales/ko/common.ts b/src/locales/ko/common.ts index d87be482f99..30df85cb3a6 100644 --- a/src/locales/ko/common.ts +++ b/src/locales/ko/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "시작", + "luckIndicator": "행운:", + "shinyOnHover": "색이 다른", + "commonShiny": "커먼", + "rareShiny": "레어", + "epicShiny": "에픽", } as const; diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index 10fa5cb9a3d..114950a4d35 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/ko/settings.js"; -import { common } from "#app/locales/ko/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const koConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const koConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index a98b31a7c61..8e7f09ff373 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "로켓단은 다시 떠오를 거니까!" }, }, + "rocket_admin": { + "encounter": { + 1: "어라 어라… 결국 여기까지 오셨습니까? 꽤 우수한 트레이너인가 보군요.", + 2: "영웅 놀이는 여기까지랍니다, 꼬마야.", + 3: "어른이 화를 내면 무섭다는 걸 보여 드리죠!" + }, + "victory": { + 1: "크으… 비주기님 용서해 주세요…!", + 2: "어떻게 이런 일이…", + 3: "아아… 넌 너무 강하다…" + }, + }, "magma_grunt": { "encounter": { 1: " 마그마단을 방해한다면, 자비는 없닷!" @@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "하? 내가 졌어?!" }, }, + "magma_admin": { + "encounter": { + 1: "……아하… ……역시 왔네…그치만 안타깝게 됐어……다 끝났거든", + 2: "……남은……내 일은……너를……막는 것", + 3: "……너랑……인게이지……하고 싶어……아하하하" + }, + "victory": { + 1: "……룰루리", + 2: "……재밌쪄", + 3: "…하아하아……으…하아하아…" + }, + }, "aqua_grunt": { "encounter": { 1: "아쿠아단을 넘본 사람에게는 자비는 없다, 꼬마도 마찬가지야!" @@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "말도 안돼!" }, }, + "aqua_admin": { + "encounter": { + 1: "각오하는 게 좋을 거야! 네 얼굴이 눈물로 범벅이 되게 해주겠어!", + 2: "아앙? 뭐야? 이 건방진 꼬맹이는…", + 3: "…아니 넌!? 일부러 여기까지 쫓아온 거야?" + }, + "victory": { + 1: "하아… 하아…완전 지쳤어", + 2: "크윽…!? 너무 봐줬나…!", + 3: "뭐…뭐라고!?" + }, + }, "galactic_grunt": { "encounter": { 1: "갤럭시단을 방해하지 마!" @@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "사격 중지…… " }, }, + "galactic_admin": { + "encounter": { + 1: "나는 갤럭시단에 있는 간부 중의 한 명.", + 2: "갤럭시단을 방해한다면 일말의 가능성도 모두 제거한다!!", + 3: "왜 그래? 설마 떨고 있는 거야?" + }, + "victory": { + 1: "설마! 내가 졌다고!? 건방진 아이로구나!!", + 2: "…역시 강해!", + 3: "어린아이에게 지다니… 방심이란 무섭구나." + }, + }, "plasma_grunt": { "encounter": { 1: "다른 생각을 가진사람들은 용납하지 않겠다!" @@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "플라-스마-!" }, }, + "plasma_sage": { + "encounter": { + 1: "너는 플라스마단에게 있어 불안요소가 될 것이다. 여기서 제거하겠다!", + 2: "이런 이런… 내가 싸워야만 하다니.", + 3: "여기까지 오다니 대단한 트레이너군." + }, + "victory": { + 1: "게치스…", + 2: "그건 그렇고 춥구먼. 나는 떨고 있다. 괴롭지만 살아 있다.", + 3: "흐음. 의외로 똑똑한 트레이너군." + }, + }, "flare_grunt": { "encounter": { 1: "패션이 우리한텐 가장 중요하다고!" @@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "미래가 밝아 보이질 않네." }, }, + "flare_admin": { + "encounter": { + 1: "왔다! 왔구나! 자! 자! 아직 끝나지 않았다!", + 2: "너 강하구나. 에너지를 얼마나 갖고 있지?", + 3: "기다리고 있었어! 너를 조사하겠다. 자 시작한다!" + }, + "victory": { + 1: "강하구나, 너는. 응, 정말 강해, 너는.", + 2: "그렇지만 보스의 꿈이 이루어져 아름다운 세상이 태어날 것이다!", + 3: "굉장하구나 너! 아주 굉장해! 나는 너를 인정하겠다" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "그래서! 여기까지 오다니, 감탄이 절로 나오는군!" @@ -1433,7 +1505,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: `좋아! 꼬마야, 정말로, 인상적이었단다. - $Y네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나. + $네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나. $비록 내가 졌지만, 좋아서 바보같이 웃음이 나오는구나!`, }, "defeat": { diff --git a/src/locales/ko/egg.ts b/src/locales/ko/egg.ts index 88a845c6424..7b10b548bc4 100644 --- a/src/locales/ko/egg.ts +++ b/src/locales/ko/egg.ts @@ -22,4 +22,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "알이 부화해서\n{{pokemonName}}[[가]] 태어났다!", "eggMoveUnlock": "알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", "rareEggMoveUnlock": "레어 알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", + "moveUPGacha": "알 기술 UP!", + "shinyUPGacha": "색이 다른 포켓몬\nUP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/ko/filter-bar.ts b/src/locales/ko/filter-bar.ts new file mode 100644 index 00000000000..821a80d78ee --- /dev/null +++ b/src/locales/ko/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "세대", + "typeFilter": "타입", + "dexFilter": "도감", + "unlocksFilter": "해금", + "miscFilter": "기타", + "sortFilter": "정렬", + "all": "전체", + "normal": "기본", + "uncaught": "미포획", + "passive": "패시브", + "passiveUnlocked": "패시브 해금", + "passiveLocked": "패시브 잠김", + "ribbon": "클리어 여부", + "hasWon": "클리어 함", + "hasNotwon": "클리어 안함", + "sortByNumber": "도감번호", + "sortByCost": "코스트", + "sortByCandies": "사탕 수", + "sortByIVs": "개체값", + "sortByName": "이름", +}; diff --git a/src/locales/ko/menu-ui-handler.ts b/src/locales/ko/menu-ui-handler.ts index 94c3cb2df0c..2e036f49b4d 100644 --- a/src/locales/ko/menu-ui-handler.ts +++ b/src/locales/ko/menu-ui-handler.ts @@ -18,7 +18,11 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "내보낼 슬롯을 골라주세요.", "importData": "데이터 불러오기", "exportData": "데이터 내보내기", + "linkDiscord": "디스코드 연동", + "unlinkDiscord": "디스코드 연동해제", + "linkGoogle": "구글 연동", + "unlinkGoogle": "구글 연동해제", "cancel": "취소", "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?", - "noEggs": "You are not hatching\nany eggs at the moment!" + "noEggs": "부화중인 알이 없습니다!" } as const; diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.ts index cf72dab8a37..368627b0d5d 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "이름", "password": "비밀번호", "login": "로그인", + "orUse": "혹은", "register": "등록", "emptyUsername": "이름은 비워둘 수 없습니다", "invalidLoginUsername": "사용할 수 없는 이름입니다", @@ -54,5 +55,8 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", "choosePokemon": "포켓몬을 선택하세요.", + "renamePokemon": "포켓몬의 닉네임은?", + "rename": "닉네임 바꾸기", + "nickname": "닉네임", "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", } as const; diff --git a/src/locales/ko/modifier-select-ui-handler.ts b/src/locales/ko/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..c25b6d57af2 --- /dev/null +++ b/src/locales/ko/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "transfer": "건네주기", + "reroll": "갱신", + "lockRarities": "희귀도 고정", + "checkTeam": "파티 확인", + "transferDesc": "지닌 물건을 다른 포켓몬에게 건네줍니다.", + "rerollDesc": "돈을 소모하여 아이템 목록을 새로 고칩니다.", + "lockRaritiesDesc": "갱신되는 아이템의 희귀도가 고정됩니다(갱신 비용 증가).", + "checkTeamDesc": "파티를 확인하거나 폼 변경 아이템을 사용합니다.", + "rerollCost": "₽{{formattedMoney}}", + "itemCost": "₽{{formattedMoney}}" +} as const; diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index 7a8f1bef8e9..f09fba0b09a 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -42,7 +42,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonPpUpModifierType": { - description: "포켓몬이 기억하고 있는 기술 중 1개의 PP 최대치를 5마다 {{upPoints}}씩 상승시킨다 (최대 3).", + description: "포켓몬이 기억하고 있는 기술 중 1개의 PP 최대치를 5마다 {{upPoints}}씩 상승시킨다. (최대 3)", }, "PokemonNatureChangeModifierType": { name: "{{natureName}}민트", @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다.", }, "PokemonLevelIncrementModifierType": { - description: "포켓몬 1마리의 레벨이 1만큼 상승한다.", + description: "포켓몬 1마리의 레벨이 {{levels}}만큼 상승한다.", }, "AllPokemonLevelIncrementModifierType": { - description: "자신의 모든 포켓몬의 레벨이 1씩 상승한다.", + description: "자신의 모든 포켓몬의 레벨이 {{levels}}만큼 상승한다.", }, "PokemonBaseStatBoosterModifierType": { description: "지니게 하면 {{statName}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다.", @@ -73,7 +73,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "기절해 버린 포켓몬 전원의 HP를 완전히 회복한다.", }, "MoneyRewardModifierType": { - description: "{{moneyMultiplier}} 양의 돈을 획득한다 (₽{{moneyAmount}}).", + description: "{{moneyMultiplier}} 양의 돈을 획득한다. (₽{{moneyAmount}})", extra: { "small": "적은", "moderate": "적당한", @@ -90,7 +90,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "배틀 승리로 얻는 친밀도가 50% 증가한다.", }, "PokemonMoveAccuracyBoosterModifierType": { - description: "기술의 명중률이 {{accuracyAmount}} 증가한다 (최대 100).", + description: "기술의 명중률이 {{accuracyAmount}} 증가한다. (최대 100)", }, "PokemonMultiHitModifierType": { description: "지닌 개수(최대 3개)마다 추가 공격을 하는 대신, 공격력이 60%(1개)/75%(2개)/82.5%(3개)만큼 감소합니다.", @@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TmModifierTypeWithInfo": { name: "No.{{moveId}} {{moveName}}", - description: "포켓몬에게 {{moveName}}를(을) 가르침\n(C 또는 Shift를 꾹 눌러 정보 확인).", + description: "포켓몬에게 {{moveName}}[[를]] 가르침.\n(C 또는 Shift를 꾹 눌러 정보 확인)", }, "EvolutionItemModifierType": { description: "어느 특정 포켓몬을 진화시킨다.", @@ -110,7 +110,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "어느 특정 포켓몬을 폼 체인지시킨다.", }, "FusePokemonModifierType": { - description: "두 포켓몬을 결합시킨다 (특성 변환, 종족값과 타입 분배, 기술폭 공유).", + description: "두 포켓몬을 결합시킨다. (특성 변환, 종족값과 타입 분배, 기술폭 공유)", }, "TerastallizeModifierType": { name: "테라피스 {{teraType}}", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "성스러운분말" }, - "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 쓰러지려 할 때 HP를 절반 회복한다." }, + "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 공격을 받고 쓰러지려 할 때 HP를 절반 회복한다." }, + + "WHITE_HERB": { name: "하양허브", description: "지니게 한 포켓몬의 능력이 떨어졌을 때 원래 상태로 돌아온다." }, "ETHER": { name: "PP에이드" }, "MAX_ETHER": { name: "PP회복" }, @@ -182,9 +184,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "평온의방울" }, + "SCOPE_LENS": { name: "초점렌즈", description: "약점이 보이는 렌즈. 지니게 한 포켓몬의 기술이 급소에 맞기 쉬워진다." }, + "LEEK": { name: "대파", description: "매우 길고 단단한 줄기. 파오리에게 지니게 하면 기술이 급소에 맞기 쉬워진다." }, + "EVIOLITE": { name: "진화의휘석", description: "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." }, - "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다 (합연산)." }, + "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다. (합연산)" }, "NUGGET": { name: "금구슬" }, "BIG_NUGGET": { name: "큰금구슬" }, @@ -201,14 +206,14 @@ export const modifierType: ModifierTypeTranslationEntries = { "MULTI_LENS": { name: "멀티렌즈" }, - "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술이나 도구를 썼을 때 효율이 10% 증가한다 (부활 제외)." }, + "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술이나 도구를 썼을 때 효율이 10% 증가한다. (부활 제외)" }, "CANDY_JAR": { name: "사탕단지", description: "이상한사탕 종류의 아이템이 올려주는 레벨이 1 증가한다." }, "BERRY_POUCH": { name: "열매주머니", description: "사용한 나무열매가 소모되지 않을 확률이 30% 추가된다." }, "FOCUS_BAND": { name: "기합의머리띠", description: "기절할 듯한 데미지를 받아도 HP를 1 남겨서 견딜 확률이 10% 추가된다." }, - "QUICK_CLAW": { name: "선제공격손톱", description: "상대보다 먼저 행동할 수 있게 될 확률이 10% 추가된다 (우선도 처리 이후)." }, + "QUICK_CLAW": { name: "선제공격손톱", description: "상대보다 먼저 행동할 수 있게 될 확률이 10% 추가된다. (우선도 처리 이후)" }, "KINGS_ROCK": { name: "왕의징표석", description: "공격해서 데미지를 줄 때 상대를 풀죽일 확률이 10% 추가된다." }, diff --git a/src/locales/ko/modifier.ts b/src/locales/ko/modifier.ts new file mode 100644 index 00000000000..98460b118f1 --- /dev/null +++ b/src/locales/ko/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "surviveDamageApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 버텼다!!", + "turnHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", + "hitHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n정신을 차려 싸울 수 있게 되었다!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", + "moneyInterestApply": "{{typeName}}[[로]]부터\n₽{{moneyAmount}}[[를]] 받았다!", + "turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!", + "contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}의\n체력이 약간 회복되었다!", + "bypassSpeedChanceApply": "{{pokemonName}}[[는]] {{itemName}}[[로]]\n행동이 빨라졌다!", +} as const; diff --git a/src/locales/ko/move-trigger.ts b/src/locales/ko/move-trigger.ts new file mode 100644 index 00000000000..9ebf08b1017 --- /dev/null +++ b/src/locales/ko/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}}[[는]]\n반동으로 데미지를 입었다!", + "cutHpPowerUpMove": "{{pokemonName}}[[는]]\n체력을 깎아서 자신의 기술을 강화했다!", + "absorbedElectricity": "{{pokemonName}}는(은)\n전기를 흡수했다!", + "switchedStatChanges": "{{pokemonName}}[[는]] 상대와 자신의\n능력 변화를 바꿨다!", + "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미래의 공격을 예지했다!", + "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부리를 가열하기 시작했다!", + "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원래대로 되돌아왔다!", + "faintCountdown": "{{pokemonName}}[[는]]\n{{turnCount}}턴 후에 쓰러져 버린다!", + "copyType": "{{pokemonName}}[[는]]\n{{targetPokemonName}}[[와]] 같은 타입이 되었다!", + "suppressAbilities": "{{pokemonName}}의\n특성이 효과를 발휘하지 못하게 되었다!", + "swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!", +} as const; diff --git a/src/locales/ko/move.ts b/src/locales/ko/move.ts index 3781725bc6f..bb9d4515ba8 100644 --- a/src/locales/ko/move.ts +++ b/src/locales/ko/move.ts @@ -2981,8 +2981,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "다이맥스포", - /* 다이맥스에서 200레벨로 조건 변경 */ - effect: "코어에서 빔을 발사해서 공격한다. 상대의 레벨이 200보다 크면 데미지가 2배가 된다." + effect: "코어에서 빔을 발사해서 공격한다. 상대가 웨이브 레벨 최대치를 초과했다면, 초과한 정도에 비례하여 데미지가 최대 2배가 된다." }, snipeShot: { name: "노려맞히기", diff --git a/src/locales/ko/party-ui-handler.ts b/src/locales/ko/party-ui-handler.ts index 15a42ae0521..ff5d81eeb52 100644 --- a/src/locales/ko/party-ui-handler.ts +++ b/src/locales/ko/party-ui-handler.ts @@ -6,5 +6,49 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "그만둔다", "RELEASE": "놓아준다", "APPLY": "사용한다", - "TEACH": "가르친다" + "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": "그만둔다", + + // Slot TM text + "able": "배운다!", + "notAble": "배우지 못함", + "learned": "알고 있다", + + // Releasing messages + "goodbye": "잘 가, {{pokemonName}}!", + "byebye": "바이바이, {{pokemonName}}!", + "farewell": "작별이야, {{pokemonName}}!", + "soLong": "안녕, {{pokemonName}}!", + "thisIsWhereWePart": "여기서 헤어지자, {{pokemonName}}!", + "illMissYou": "보고 싶을거야, {{pokemonName}}!", + "illNeverForgetYou": "잊지 못할거야, {{pokemonName}}!", + "untilWeMeetAgain": "다시 만날 때까지, {{pokemonName}}!", + "sayonara": "사요나라, {{pokemonName}}!", + "smellYaLater": "또 보자, {{pokemonName}}!", } as const; diff --git a/src/locales/ko/pokemon-form.ts b/src/locales/ko/pokemon-form.ts new file mode 100644 index 00000000000..78c9a762233 --- /dev/null +++ b/src/locales/ko/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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다른 모습으로 변화했다!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "옷갈아입기", + "pikachuCoolCosplay": "하드록", + "pikachuBeautyCosplay": "마담", + "pikachuCuteCosplay": "아이돌", + "pikachuSmartCosplay": "닥터", + "pikachuToughCosplay": "마스크드", + "pikachuPartner": "파트너", + "eeveePartner": "파트너", + // 2G + "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": "?", + // 3G + "castformSunny": "태양의 모습", + "castformRainy": "빗방울의 모습", + "castformSnowy": "설운의 모습", + "deoxysNormal": "노말폼", + // 4G + "burmyPlant": "초목도롱", + "burmySandy": "모래땅도롱", + "burmyTrash": "슈레도롱", + "shellosEast": "동쪽바다의 모습", + "shellosWest": "서쪽바다의 모습", + "rotomHeat": "히트", + "rotomWash": "워시", + "rotomFrost": "프로스트", + "rotomFan": "스핀", + "rotomMow": "커트", + "giratinaAltered": "어나더폼", + "shayminLand": "랜드폼", + // 5G + "basculinRedStriped": "적색근의 모습", + "basculinBlueStriped": "청색근의 모습", + "basculinWhiteStriped": "백색근의 모습", + "deerlingSpring": "봄의 모습", + "deerlingSummer": "여름의 모습", + "deerlingAutumn": "가을의 모습", + "deerlingWinter": "겨울의 모습", + "tornadusIncarnate": "화신폼", + "thundurusIncarnate": "화신폼", + "landorusIncarnate": "화신폼", + "keldeoOrdinary": "평상시 모습", + "meloettaAria": "보이스폼", + // 6G + "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": "퍼펙트폼", + // 7G + "oricorioBaile": "이글이글스타일", + "oricorioPompom": "파칙파칙스타일", + "oricorioPau": "훌라훌라스타일", + "oricorioSensu": "하늘하늘스타일", + "rockruffOwnTempo": "마이페이스", + "miniorRedMeteor": "유성의 모습(빨강)", + "miniorOrangeMeteor": "유성의 모습(주황)", + "miniorYellowMeteor": "유성의 모습(노랑)", + "miniorGreenMeteor": "유성의 모습(초록)", + "miniorBlueMeteor": "유성의 모습(옥색)", + "miniorIndigoMeteor": "유성의 모습(파랑)", + "miniorVioletMeteor": "유성의 모습(보라)", + "miniorRed": "빨간색 코어", + "miniorOrange": "주황색 코어", + "miniorYellow": "노란색 코어", + "miniorGreen": "초록색 코어", + "miniorBlue": "옥색 코어", + "miniorIndigo": "파란색 코어", + "miniorViolet": "보라색 코어", + "mimikyuDisguised": "둔갑한 모습", + "mimikyuBusted": "들킨 모습", + "magearnaOriginal": "500년 전의 색", + "marshadowZenith": "투지를 불태운 마샤도", + // 8G + "sinisteaPhony": "위작품", + "sinisteaAntique": "진작품", + "eiscueNoIce": "나이스페이스", + "indeedeeMale": "수컷의 모습", + "indeedeeFemale": "암컷의 모습", + "morpekoFullBelly": "배부른 모양", + "zacianHeroOfManyBattles": "역전의 용사", + "zamazentaHeroOfManyBattles": "역전의 용사", + "zarudeDada": "아빠", + "enamorusIncarnate": "화신폼", + // 9G + "squawkabillyGreenPlumage": "그린 페더", + "squawkabillyBluePlumage": "블루 페더", + "squawkabillyYellowPlumage": "옐로 페더", + "squawkabillyWhitePlumage": "화이트 페더", + "tatsugiriCurly": "젖힌 모습", + "tatsugiriDroopy": "늘어진 모습", + "tatsugiriStretchy": "뻗은 모습", + "gimmighoulChest": "상자폼", + "gimmighoulRoaming": "도보폼", + "koraidonApexBuild": "완전형태", + "koraidonLimitedBuild":"제한형태", + "koraidonSprintingBuild":"질주형태", + "koraidonSwimmingBuild":"유영형태", + "koraidonGlidingBuild":"활공형태", + "miraidonUltimateMode":"컴플리트모드", + "miraidonLowPowerMode":"리미티드모드", + "miraidonDriveMode":"드라이브모드", + "miraidonAquaticMode":"플로트모드", + "miraidonGlideMode":"글라이드모드", + "poltchageistCounterfeit": "가짜배기의 모습", + "poltchageistArtisan": "알짜배기의 모습", + "paldeaTaurosCombat": "컴뱃종", + "paldeaTaurosBlaze": "블레이즈종", + "paldeaTaurosAqua": "워터종", + +} as const; diff --git a/src/locales/ko/pokemon-info-container.ts b/src/locales/ko/pokemon-info-container.ts index 31048dee3ef..80a0d59addd 100644 --- a/src/locales/ko/pokemon-info-container.ts +++ b/src/locales/ko/pokemon-info-container.ts @@ -5,8 +5,5 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "성별:", "ability": "특성:", "nature": "성격:", - "epic": "에픽", - "rare": "레어", - "common": "커먼", "form": "폼:" } as const; diff --git a/src/locales/ko/pokemon-summary.ts b/src/locales/ko/pokemon-summary.ts new file mode 100644 index 00000000000..029588a7cf2 --- /dev/null +++ b/src/locales/ko/pokemon-summary.ts @@ -0,0 +1,47 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}스러운 성격", + }, +} as const; diff --git a/src/locales/ko/settings.ts b/src/locales/ko/settings.ts index ef1469fc8cb..40e9676b6da 100644 --- a/src/locales/ko/settings.ts +++ b/src/locales/ko/settings.ts @@ -84,7 +84,7 @@ export const settings: SimpleTranslationEntries = { "buttonCancel": "취소", "buttonStats": "스탯", "buttonCycleForm": "폼 변환", - "buttonCycleShiny": "특별한 색 변환", + "buttonCycleShiny": "색이 다른 변환", "buttonCycleGender": "성별 변환", "buttonCycleAbility": "특성 변환", "buttonCycleNature": "성격 변환", @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "컨트롤러", "gamepadSupport": "게임패드 지원", "showBgmBar": "BGM 제목 보여주기", + "shopOverlayOpacity": "상점 오버레이 투명도" } as const; diff --git a/src/locales/ko/splash-messages.ts b/src/locales/ko/splash-messages.ts index b875e7b282f..1e364f9c098 100644 --- a/src/locales/ko/splash-messages.ts +++ b/src/locales/ko/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Radical Red도 해봐요!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "충격!우주에 브리더 진짜 계심ㄷㄷ", } as const; diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index 6fdd21a3454..c57a37788fa 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -7,6 +7,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", + "confirmExit": "Do you want to exit?", + "invalidParty": "스타팅 포켓몬 파티에 적합하지 않습니다!", "gen1": "1세대", "gen2": "2세대", "gen3": "3세대", @@ -22,6 +24,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "성격:", "eggMoves": "알 기술", "addToParty": "파티에 추가", + "removeFromParty": "파티에서 제외", "toggleIVs": "개체값 토글", "manageMoves": "기술 관리", "manageNature": "성격 관리", @@ -29,10 +32,10 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "교체할 성격을 선택해주세요.", "selectMoveSwapOut": "교체할 기술을 선택해주세요.", "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", + "sameSpeciesEgg": "알 구매하기", "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", - "sameSpeciesEgg": "알 구매하기", - "cycleShiny": ": 특별한 색", + "cycleShiny": ": 색이 다른", "cycleForm": ": 폼", "cycleGender": ": 암수", "cycleAbility": ": 특성", diff --git a/src/locales/ko/status-effect.ts b/src/locales/ko/status-effect.ts new file mode 100644 index 00000000000..c4e0ab52722 --- /dev/null +++ b/src/locales/ko/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "없음", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "독", + description: "독", + obtain: "{{pokemonNameWithAffix}}의\n몸에 독이 퍼졌다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 독이 퍼졌다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", + overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", + heal: "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" + }, + toxic: { + name: "맹독", + description: "독", + obtain: "{{pokemonNameWithAffix}}의\n몸에 맹독이 퍼졌다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 맹독이 퍼졌다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", + overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", + heal: "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" + }, + paralysis: { + name: "마비", + description: "마비", + obtain: "{{pokemonNameWithAffix}}[[는]] 마비되어\n기술이 나오기 어려워졌다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]] {{sourceText}} 때문에\n마비되어 기술이 나오기 어려워졌다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n몸이 저려서 움직일 수 없다!", + overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 마비되어 있다!", + heal: "{{pokemonNameWithAffix}}의\n몸저림이 풀렸다!" + }, + sleep: { + name: "잠듦", + description: "잠듦", + obtain: "{{pokemonNameWithAffix}}[[는]]\n잠들어 버렸다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 잠들어 버렸다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n쿨쿨 잠들어 있다.", + overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 잠들어 있다.", + heal: "{{pokemonNameWithAffix}}[[는]]\n눈을 떴다!" + }, + freeze: { + name: "얼음", + description: "얼음", + obtain: "{{pokemonNameWithAffix}}[[는]]\n얼어붙었다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 얼어붙었다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n얼어 버려서 움직일 수 없다!", + overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 얼어 있다.", + heal: "{{pokemonNameWithAffix}}의\n얼음 상태가 나았다!" + }, + burn: { + name: "화상", + description: "화상", + obtain: "{{pokemonNameWithAffix}}[[는]]\n화상을 입었다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 화상을 입었다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n화상 데미지를 입었다!", + overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n화상을 입은 상태다.", + heal: "{{pokemonNameWithAffix}}의\n화상이 나았다!" + }, +} as const; diff --git a/src/locales/ko/trainers.ts b/src/locales/ko/trainers.ts index 429ab13b223..3a139026448 100644 --- a/src/locales/ko/trainers.ts +++ b/src/locales/ko/trainers.ts @@ -127,16 +127,33 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "반바지 꼬마", "rocket_grunt": "로켓단 조무래기", "rocket_grunt_female": "로켓단 조무래기", + "rocket_grunts": "로켓단 조무래기들", + "rocket_admin": "로켓단 간부", + "rocket_admin_female": "로켓단 간부", "magma_grunt": "마그마단 조무래기", "magma_grunt_female": "마그마단 조무래기", + "magma_grunts": "마그마단 조무래기들", + "magma_admin": "마그마단 간부", + "magma_admin_female": "마그마단 간부", "aqua_grunt": "아쿠아단 조무래기", "aqua_grunt_female": "아쿠아단 조무래기", + "aqua_grunts": "아쿠아단 조무래기들", + "aqua_admin": "아쿠아단 간부", + "aqua_admin_female": "아쿠아단 간부", "galactic_grunt": "갤럭시단 조무래기", "galactic_grunt_female": "갤럭시단 조무래기", + "galactic_grunts": "갤럭시단 조무래기들", + "galactic_admin": "갤럭시단 간부", + "galactic_admin_female": "갤럭시단 간부", "plasma_grunt": "플라스마단 조무래기", "plasma_grunt_female": "플라스마단 조무래기", + "plasma_grunts": "플라스마단 조무래기들", + "plasma_sage": "플라스마단 현인", "flare_grunt": "플레어단 조무래기", "flare_grunt_female": "플레어단 조무래기", + "flare_grunts": "플레어단 조무래기들", + "flare_admin": "플레어단 간부", + "flare_admin_female": "플레어단 간부", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/ko/weather.ts b/src/locales/ko/weather.ts index 7fbd1eaf20b..c89cc335859 100644 --- a/src/locales/ko/weather.ts +++ b/src/locales/ko/weather.ts @@ -41,5 +41,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "수수께끼의 난기류가\n비행포켓몬을 지킨다!", "strongWindsLapseMessage": "수수께끼의 난기류가 강렬하게 불고 있다", + "strongWindsEffectMessage": "수수께끼의 난기류가 공격을 약하게 만들었다!", "strongWindsClearMessage": "수수께끼의 난기류가 멈췄다!" // 임의번역 }; + +export const terrain: SimpleTranslationEntries = { + "misty": "미스트필드", + "mistyStartMessage": "발밑이 안개로 자욱해졌다!", + "mistyClearMessage": "발밑의 안개가 사라졌다!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}[[를]]\n미스트필드가 지켜주고 있다!", + + "electric": "일렉트릭필드", + "electricStartMessage": "발밑에 전기가 흐르기 시작했다!", + "electricClearMessage": "발밑의 전기가 사라졌다!", + + "grassy": "그래스필드", + "grassyStartMessage": "발밑에 풀이 무성해졌다!", + "grassyClearMessage": "발밑의 풀이 사라졌다!", + + "psychic": "사이코필드", + "psychicStartMessage": "발밑에서 이상한 느낌이 든다!", + "psychicClearMessage": "발밑의 이상한 느낌이 사라졌다!", + + "defaultBlockMessage": "{{pokemonNameWithAffix}}[[를]]\n{{terrainName}}[[가]] 지켜주고 있다!" +}; diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index 4e3d6d11487..f5d9511f3f6 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!", + "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": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!", @@ -9,5 +9,55 @@ export const abilityTriggers: SimpleTranslationEntries = { "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}} can act faster than normal, thanks to its Quick Draw!", + "quickDraw": "{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", + "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", + "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", + "postDefendDisguise": "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", + "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!", + "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!", } as const; diff --git a/src/locales/pt_BR/achv.ts b/src/locales/pt_BR/achv.ts index ea77e0c17e9..78c4da6ae2e 100644 --- a/src/locales/pt_BR/achv.ts +++ b/src/locales/pt_BR/achv.ts @@ -227,7 +227,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Comendo Poeira", }, "MONO_ROCK": { - name: "Duro Como Pedra", + name: "...Tanto Bate Até Que Fura", }, "MONO_BUG": { name: "Vida de Inseto", @@ -265,6 +265,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Clube das Winx", }, + "FRESH_START": { + name: "De Primeira!", + description: "Complete o desafio de novo começo." + }, } as const; // Achievement translations for the when the player character is female @@ -494,7 +498,7 @@ export const PGFachv: AchievementTranslationEntries = { name: "Comendo Poeira", }, "MONO_ROCK": { - name: "Duro Como Pedra", + name: "...Tanto Bate Até Que Fura", }, "MONO_BUG": { name: "Vida de Inseto", @@ -532,4 +536,8 @@ export const PGFachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Clube das Winx", }, + "FRESH_START": { + name: "De Primeira!", + description: "Complete o desafio de novo começo." + }, } as const; diff --git a/src/locales/pt_BR/arena-flyout.ts b/src/locales/pt_BR/arena-flyout.ts new file mode 100644 index 00000000000..97382aa2b2f --- /dev/null +++ b/src/locales/pt_BR/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Efeitos de Batalha Ativos", + "player": "Jogador", + "neutral": "Neutro", + "enemy": "Inimigo", + + // WeatherType + "sunny": "Ensolarado", + "rain": "Chuva", + "sandstorm": "Tempestade de Areia", + "hail": "Granizo", + "snow": "Neve", + "fog": "Névoa", + "heavyRain": "Chuva Forte", + "harshSun": "Sol Forte", + "strongWinds": "Ventos Fortes", + + // TerrainType + "misty": "Terreno Enevoado", + "electric": "Terreno Elétrico", + "grassy": "Terreno de Planta", + "psychic": "Terreno Psíquico", + + // ArenaTagType + "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", +}; diff --git a/src/locales/pt_BR/arena-tag.ts b/src/locales/pt_BR/arena-tag.ts new file mode 100644 index 00000000000..0d3b8ff587f --- /dev/null +++ b/src/locales/pt_BR/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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!", + "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.", +} as const; diff --git a/src/locales/pt_BR/battle-info.ts b/src/locales/pt_BR/battle-info.ts new file mode 100644 index 00000000000..37cb7cb1aeb --- /dev/null +++ b/src/locales/pt_BR/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Geração {{generation}}", +} as const; diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index e5ec5cb9917..824b069f0a4 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -13,7 +13,8 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} escolheu {{pokemonName}}!", "switchQuestion": "Quer trocar\nde {{pokemonName}}?", "trainerDefeated": "Você derrotou\n{{trainerName}}!", - "moneyWon": "Você ganhou\n₽{{moneyAmount}} por ganhar!", + "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}}?", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Isso não afeta {{pokemonName}}!", "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.", @@ -65,16 +67,34 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} restaurou PP do movimento {{moveName}}\nusando sua {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restarou sua saúde usando\nsua {{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!", + "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}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", @@ -121,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", "battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} virou o centro\ndas atenções!", "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!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitou com eletromagnetismo!", + "battlerTagsMagnetRisenOnRemove": "O eletromagnetismo de {{pokemonNameWithAffix}} sumiu!", "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!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!", } as const; diff --git a/src/locales/pt_BR/battler-tags.ts b/src/locales/pt_BR/battler-tags.ts new file mode 100644 index 00000000000..de8be35f1aa --- /dev/null +++ b/src/locales/pt_BR/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "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", +} as const; diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts index ef15c6c6dcb..ae2756e74be 100644 --- a/src/locales/pt_BR/bgm-name.ts +++ b/src/locales/pt_BR/bgm-name.ts @@ -1,89 +1,89 @@ 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", + "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": "B2W2 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_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_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_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", // Biome Music "abyss": "PMD EoS Dark Crater", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", @@ -123,23 +123,23 @@ export const bgmName: SimpleTranslationEntries = { "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_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 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)", + "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)", // Other - "heal": "BW Pokémon Heal", - "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme", + "heal": "BW Centro Pokémon", + "menu": "PMD EoS Bem-vindo ao Mundo dos Pokémon!", + "title": "PMD EoS Menu Principal", } as const; diff --git a/src/locales/pt_BR/biome.ts b/src/locales/pt_BR/biome.ts index 46dad06b0de..0217836ed20 100644 --- a/src/locales/pt_BR/biome.ts +++ b/src/locales/pt_BR/biome.ts @@ -1,7 +1,7 @@ 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", diff --git a/src/locales/pt_BR/common.ts b/src/locales/pt_BR/common.ts index d7cbfd5d052..7161f5c9966 100644 --- a/src/locales/pt_BR/common.ts +++ b/src/locales/pt_BR/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "Iniciar", + "luckIndicator": "Sorte:", + "shinyOnHover": "Shiny", + "commonShiny": "Comum", + "rareShiny": "Raro", + "epicShiny": "Épico", } as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index 53195fbc32e..5f7582dca63 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -1,15 +1,18 @@ -import { common } from "#app/locales/pt_BR/common.js"; -import { settings } from "#app/locales/pt_BR/settings.js"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { PGFachv, PGMachv } from "./achv"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; +import { common } from "./common.js"; import { PGFbattleSpecDialogue, PGFdialogue, @@ -22,32 +25,45 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; +import { modifierSelectUiHandler } from "./modifier-select-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 { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; +import { settings } from "./settings.js"; 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 { terrain, weather } from "./weather"; +import { moveTriggers } from "./move-trigger"; export const ptBrConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,20 +82,25 @@ export const ptBrConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, - partyUiHandler: partyUiHandler, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, @@ -88,5 +109,8 @@ export const ptBrConfig = { trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, - weather: weather + weather: weather, + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/pt_BR/egg.ts b/src/locales/pt_BR/egg.ts index 6690c293aaf..fbd13bed4e3 100644 --- a/src/locales/pt_BR/egg.ts +++ b/src/locales/pt_BR/egg.ts @@ -22,4 +22,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} nasceu do ovo!", "eggMoveUnlock": "Movimento de Ovo desbloqueado: {{moveName}}", "rareEggMoveUnlock": "Movimento Raro de Ovo desbloqueado: {{moveName}}", + "moveUPGacha": "Movimento\nde Ovo Bônus!", + "shinyUPGacha": "Shiny Bônus!", + "legendaryUPGacha": "Bônus!", } as const; diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts new file mode 100644 index 00000000000..0c6a8e9ae50 --- /dev/null +++ b/src/locales/pt_BR/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Ger.", + "typeFilter": "Tipo", + "dexFilter": "Dex", + "unlocksFilter": "Outros", + "miscFilter": "Misc", + "sortFilter": "Ordem", + "all": "Tudo", + "normal": "Normal", + "uncaught": "Não Capturado", + "passive": "Passive", + "passiveUnlocked": "Passiva Desbloq.", + "passiveLocked": "Passiva Bloq.", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", + "sortByNumber": "Núm.", + "sortByCost": "Custo", + "sortByCandies": "# Doces", + "sortByIVs": "IVs", + "sortByName": "Nome", +}; diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.ts index 258433d72c6..b874df7e23b 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.ts @@ -18,7 +18,11 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Selecione um slot para exportar.", "importData": "Importar dados", "exportData": "Exportar dados", + "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": "You are not hatching\nany eggs at the moment!" + "noEggs": "Você não está chocando\nnenhum ovo no momento!" } as const; diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index a200f2c9abe..927ccce518b 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -17,6 +17,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", @@ -54,5 +55,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.", + "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.", } as const; diff --git a/src/locales/pt_BR/modifier-select-ui-handler.ts b/src/locales/pt_BR/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..fd9dfcf4c30 --- /dev/null +++ b/src/locales/pt_BR/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}}" +} as const; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index a6504b931f0..a5cddaed235 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { 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.", + description: "Aumenta em {{levels}} o nível de um Pokémon.", }, "AllPokemonLevelIncrementModifierType": { - description: "Aumenta em 1 os níveis de todos os Pokémon.", + description: "Aumenta em {{levels}} o nível de todos os membros da equipe.", }, "PokemonBaseStatBoosterModifierType": { description: "Aumenta o atributo base de {{statName}} em 10%. Quanto maior os IVs, maior o limite de aumento.", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Cinza Sagrada" }, - "REVIVER_SEED": { name: "Semente Reanimadora", description: "Após desmaiar, reanima com 50% de PS." }, + "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" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "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." }, + "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)." }, diff --git a/src/locales/pt_BR/modifier.ts b/src/locales/pt_BR/modifier.ts new file mode 100644 index 00000000000..168665205c3 --- /dev/null +++ b/src/locales/pt_BR/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "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 revivido\npor sua {{typeName}}!", + "pokemonResetNegativeStatStageApply": "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}}!", +} as const; diff --git a/src/locales/pt_BR/move-trigger.ts b/src/locales/pt_BR/move-trigger.ts new file mode 100644 index 00000000000..c6f35d8f6d1 --- /dev/null +++ b/src/locales/pt_BR/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "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}} continuou/nindo e bateu!", + "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!", + "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!", + "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!", + "faintCountdown": "{{pokemonName}}\nirá desmaiar em {{turnCount}} turnos.", + "copyType": "O tipo de {{pokemonName}}\nmudou para combinar com {{targetPokemonName}}!", + "suppressAbilities": "A habilidade de {{pokemonName}}\nfoi suprimida!", + "swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!", +} as const; diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index 0008cc55416..1748f726682 100644 --- a/src/locales/pt_BR/move.ts +++ b/src/locales/pt_BR/move.ts @@ -2281,8 +2281,8 @@ export const move: MoveTranslationEntries = { 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", + "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": { @@ -2349,8 +2349,8 @@ export const move: MoveTranslationEntries = { 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", + "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": { @@ -2461,8 +2461,8 @@ export const move: MoveTranslationEntries = { 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", + "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": { @@ -2873,547 +2873,547 @@ export const move: MoveTranslationEntries = { 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": { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "pikaPapow": { name: "Pika Papow", effect: "Quanto mais o Pikachu ama seu Treinador, maior o poder do movimento. Nunca erra." }, - bouncyBubble: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "veeveeVolley": { name: "Veevee Volley", effect: "Quanto mais o Eevee ama seu Treinador, maior o poder do movimento. Nunca erra." }, - doubleIronBash: { + "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: { + "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: { + "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." + 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: { + "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: { + "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: { + "stuffCheeks": { name: "Stuff Cheeks", effect: "O usuário come sua Fruta segurada, depois aumenta muito seu atributo de Defesa." }, - noRetreat: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "courtChange": { name: "Court Change", effect: "Com seu poder misterioso, o usuário troca os efeitos de cada lado do campo." }, - maxFlare: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "clangorousSoul": { name: "Clangorous Soul", effect: "O usuário aumenta todos os seus atributos usando um pouco de seu HP." }, - bodyPress: { + "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: { + "decorate": { name: "Decorate", effect: "O usuário aumenta muito os atributos de Ataque e Atq. Esp. do alvo decorando o alvo." }, - drumBeating: { + "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: { + "snapTrap": { name: "Snap Trap", effect: "O usuário prende o alvo em uma armadilha rápida por quatro ou cinco turnos." }, - pyroBall: { + "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: { + "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: { + "behemothBash": { name: "Behemoth Bash", effect: "O corpo do usuário se torna um escudo firme e atinge o alvo com força." }, - auraWheel: { + "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: { + "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: { + "branchPoke": { name: "Branch Poke", effect: "O usuário ataca o alvo cutucando-o com um galho pontiagudo." }, - overdrive: { + "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: { + "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: { + "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: { + "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: { + "strangeSteam": { name: "Strange Steam", effect: "O usuário ataca o alvo emitindo vapor. Isso também pode deixar o alvo confuso." }, - lifeDew: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "coaching": { name: "Coaching", effect: "O usuário treina adequadamente seus Pokémon aliados, aumentando seus atributos de Ataque e Defesa." }, - flipTurn: { + "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: { + "tripleAxel": { name: "Triple Axel", effect: "Um ataque de três chutes consecutivos que se torna mais poderoso a cada acerto bem-sucedido." }, - dualWingbeat: { + "dualWingbeat": { name: "Dual Wingbeat", effect: "O usuário atinge o alvo com suas asas. O alvo é atingido duas vezes seguidas." }, - scorchingSands: { + "scorchingSands": { name: "Scorching Sands", effect: "O usuário joga areia escaldante no alvo para atacar. Isso também pode deixar o alvo queimado." }, - jungleHealing: { + "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: { + "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: { + "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: { + "thunderCage": { name: "Thunder Cage", effect: "O usuário prende o alvo em uma gaiola de eletricidade cintilante por quatro ou cinco turnos." }, - dragonEnergy: { + "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: { + "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: { + "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: { + "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: { + "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: { + "astralBarrage": { name: "Astral Barrage", effect: "O usuário ataca enviando uma quantidade assustadora de pequenos fantasmas nos Pokémon adversários." }, - eerieSpell: { + "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: { + "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: { + "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: { + "powerShift": { name: "Power Shift", effect: "O usuário troca seus atributos de Ataque e Defesa." }, - stoneAxe: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "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: { + "gMaxVoltCrash": { name: "G-Max Volt Crash", effect: "Um ataque do tipo Elétrico que o Gigantamax Pikachu usa. Este movimento paralisa os oponentes." }, - gMaxGoldRush: { + "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." }, diff --git a/src/locales/pt_BR/nature.ts b/src/locales/pt_BR/nature.ts index 976778bd1cb..fc906fde6ef 100644 --- a/src/locales/pt_BR/nature.ts +++ b/src/locales/pt_BR/nature.ts @@ -10,7 +10,7 @@ export const nature: SimpleTranslationEntries = { "Docile": "Dócil", "Relaxed": "Relaxada", "Impish": "Inquieta", - "Lax": "Relaxada", + "Lax": "Frouxa", "Timid": "Tímida", "Hasty": "Apressada", "Serious": "Séria", diff --git a/src/locales/pt_BR/party-ui-handler.ts b/src/locales/pt_BR/party-ui-handler.ts index 683dc4b368a..08132b4bfc0 100644 --- a/src/locales/pt_BR/party-ui-handler.ts +++ b/src/locales/pt_BR/party-ui-handler.ts @@ -7,4 +7,48 @@ export const partyUiHandler: SimpleTranslationEntries = { "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": "Reviver", + "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", + + // Slot TM text + "able": "Capaz", + "notAble": "Incapaz", + "learned": "Aprendido", + + // Releasing messages + "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}}!", } as const; diff --git a/src/locales/pt_BR/pokemon-form.ts b/src/locales/pt_BR/pokemon-form.ts new file mode 100644 index 00000000000..6c7c649862a --- /dev/null +++ b/src/locales/pt_BR/pokemon-form.ts @@ -0,0 +1,198 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cosplay Legal", + "pikachuBeautyCosplay": "Cosplay Bonito", + "pikachuCuteCosplay": "Cosplay Fofo", + "pikachuSmartCosplay": "Cosplay Inteligente", + "pikachuToughCosplay": "Cosplay Forte", + "pikachuPartner": "Parceiro", + "eeveePartner": "Parceiro", + // 2G + "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": "?", + // 3G + "castformSunny": "Ensolarado", + "castformRainy": "Chuvoso", + "castformSnowy": "Nevado", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Vegetal", + "burmySandy": "Arenoso", + "burmyTrash": "Lixo", + "shellosEast": "Leste", + "shellosWest": "Oeste", + "rotomHeat": "Calor", + "rotomWash": "Lavagem", + "rotomFrost": "Congelante", + "rotomFan": "Ventilador", + "rotomMow": "Corte", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "Listras Vermelhas", + "basculinBlueStriped": "Listras Azuis", + "basculinWhiteStriped": "Listras Brancas", + "deerlingSpring": "Primavera", + "deerlingSummer": "Verão", + "deerlingAutumn": "Outono", + "deerlingWinter": "Inverno", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "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", + // 7G + "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", + // 8G + "sinisteaPhony": "Falsificado", + "sinisteaAntique": "Autêntico", + "eiscueNoIce": "Descongelado", + "indeedeeMale": "Macho", + "indeedeeFemale": "Fêmea", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Papa", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "Plumas Verdes", + "squawkabillyBluePlumage": "Plumas Azuis", + "squawkabillyYellowPlumage": "Plumas Amarelas", + "squawkabillyWhitePlumage": "Plumas Brancas", + "tatsugiriCurly": "Curvado", + "tatsugiriDroopy": "Caído", + "tatsugiriStretchy": "Reto", + "gimmighoulChest": "Baú", + "gimmighoulRoaming": "Perambulante", + "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": "Imitação", + "poltchageistArtisan": "Artesão", + "paldeaTaurosCombat": "Combate", + "paldeaTaurosBlaze": "Chamas", + "paldeaTaurosAqua": "Aquático", + +} as const; diff --git a/src/locales/pt_BR/pokemon-info-container.ts b/src/locales/pt_BR/pokemon-info-container.ts index 31b93d90daf..5789e60b274 100644 --- a/src/locales/pt_BR/pokemon-info-container.ts +++ b/src/locales/pt_BR/pokemon-info-container.ts @@ -5,7 +5,5 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "Gênero:", "ability": "Habilidade:", "nature": "Natureza:", - "epic": "Épico", - "rare": "Raro", - "common": "Comum", + "form": "Forma:", } as const; diff --git a/src/locales/pt_BR/pokemon-summary.ts b/src/locales/pt_BR/pokemon-summary.ts new file mode 100644 index 00000000000..a492e701c94 --- /dev/null +++ b/src/locales/pt_BR/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}.", + }, +} as const; diff --git a/src/locales/pt_BR/settings.ts b/src/locales/pt_BR/settings.ts index 9d336cf0757..c3a077acc4a 100644 --- a/src/locales/pt_BR/settings.ts +++ b/src/locales/pt_BR/settings.ts @@ -95,5 +95,6 @@ export const settings: SimpleTranslationEntries = { "mute": "Mudo", "controller": "Controle", "gamepadSupport": "Suporte para Controle", - "showBgmBar": "Show Music Names", + "showBgmBar": "Exibir Nomes das Músicas", + "shopOverlayOpacity": "Opacidade da Loja" } as const; diff --git a/src/locales/pt_BR/splash-messages.ts b/src/locales/pt_BR/splash-messages.ts index d21945943a0..b621456a9ec 100644 --- a/src/locales/pt_BR/splash-messages.ts +++ b/src/locales/pt_BR/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Também Jogue Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "Criadores Pokémon no Espaço!", } as const; diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index eb2709a0da8..a6407b5368d 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -7,6 +7,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Começar com esses Pokémon?", + "confirmExit": "Do you want to exit?", + "invalidParty": "Essa equipe de iniciais não é válida!", "gen1": "G1", "gen2": "G2", "gen3": "G3", @@ -22,6 +24,7 @@ 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", @@ -29,9 +32,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "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", diff --git a/src/locales/pt_BR/status-effect.ts b/src/locales/pt_BR/status-effect.ts new file mode 100644 index 00000000000..d99e2bd5ec1 --- /dev/null +++ b/src/locales/pt_BR/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Nenhum", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Envenenamento", + description: "envenenamento", + obtain: "{{pokemonNameWithAffix}}\nfoi envenenado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi envenenado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", + heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + toxic: { + name: "Toxic", + description: "envenenamento", + obtain: "{{pokemonNameWithAffix}}\nfoi seriamente envenenado!", + obtainSource: "{{pokemonNameWithAffix}} foi seriamente\nenvenenado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", + heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + paralysis: { + name: "Paralisia", + description: "paralisia", + obtain: "{{pokemonNameWithAffix}} foi paralisado,\nTalvez ele não consiga se mover!", + obtainSource: "{{pokemonNameWithAffix}} foi paralisado por {{sourceText}},\nTalvez ele não consiga se mover!", + activation: "{{pokemonNameWithAffix}} está paralisado!\nEle não consegue se mover!", + overlap: "{{pokemonNameWithAffix}} já\nestá paralisado!", + heal: "{{pokemonNameWithAffix}} foi\ncurado da paralisia!" + }, + sleep: { + name: "Dormindo", + description: "dormindo", + obtain: "{{pokemonNameWithAffix}}\nadormeceu!", + obtainSource: "{{pokemonNameWithAffix}}\ndormiu devido a {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} está dormindo profundamente.", + overlap: "{{pokemonNameWithAffix}} já\nestá dormindo!", + heal: "{{pokemonNameWithAffix}} acordou!" + }, + freeze: { + name: "Congelamento", + description: "congelando", + obtain: "{{pokemonNameWithAffix}}\nfoi congelado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi congelado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} está\ncongelado!", + overlap: "{{pokemonNameWithAffix}} já\nestá congelado!", + heal: "{{pokemonNameWithAffix}} foi\ndescongelado!" + }, + burn: { + name: "Queimadura", + description: "queimadura", + obtain: "{{pokemonNameWithAffix}}\nfoi queimado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi queimado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\npor sua queimadura!", + overlap: "{{pokemonNameWithAffix}} já\nestá queimado!", + heal: "{{pokemonNameWithAffix}} foi\ncurado de sua queimadura!" + }, +} as const; diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index 57fbe220412..32cc46300d5 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -127,16 +127,33 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "Jovem", "rocket_grunt": "Recruta da Equipe Rocket", "rocket_grunt_female": "Recruta da Equipe Rocket", + "rocket_grunts": "Recrutas da Equipe Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Recruta da Equipe Magma", "magma_grunt_female": "Recruta da Equipe Magma", + "magma_grunts": "Recrutas da Equipe Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Recruta da Equipe Aqua", "aqua_grunt_female": "Recruta da Equipe Aqua", + "aqua_grunts": "Recrutas da Equipe Aqua", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Recruta da Equipe Galáctica", "galactic_grunt_female": "Recruta da Equipe Galáctica", + "galactic_grunts": "Recrutas da Equipe Galáctica", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Recruta da Equipe Plasma", "plasma_grunt_female": "Recruta da Equipe Plasma", + "plasma_grunts": "Recrutas da Equipe Plasma", + "plasma_sage": "Plasma Sage", "flare_grunt": "Recruta da Equipe Flare", "flare_grunt_female": "Recruta da Equipe Flare", + "flare_grunts": "Recrutas da Equipe Flare", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.ts index 6aaab6d3cd9..a99708afff4 100644 --- a/src/locales/pt_BR/weather.ts +++ b/src/locales/pt_BR/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "Ventos fortes apareceram!", "strongWindsLapseMessage": "Os ventos fortes continuam.", + "strongWindsEffectMessage": "A corrente de ar misteriosa enfraqueceu o ataque!", "strongWindsClearMessage": "Os ventos fortes diminuíram.", }; + +export const terrain: SimpleTranslationEntries = { + "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}}!" +}; diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index a9d7fa5b202..0f2201049d2 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -5,7 +5,59 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}}被折磨着!", "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", "iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害!", + "perishBody": "因为{{pokemonName}}的{{abilityName}}\n双方将在3回合后灭亡!", + "poisonHeal": "{{pokemonName}}因{{abilityName}}\n回复了少许HP!", "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", + "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害!", + "postDefendDisguise": "{{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感到了一种压迫感!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常规!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}\n发抖了!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在释放炽焰气场!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场!", + "postSummonFairyAura": "{{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而无法食用树果!", } as const; diff --git a/src/locales/zh_CN/achv.ts b/src/locales/zh_CN/achv.ts index 486ff3cc02b..a32f244400d 100644 --- a/src/locales/zh_CN/achv.ts +++ b/src/locales/zh_CN/achv.ts @@ -172,43 +172,43 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_GEN_ONE": { name: "最初的劲敌", - description: "完成仅限第一世代的挑战.", + description: "完成仅限第一世代的挑战", }, "MONO_GEN_TWO": { name: "1.5世代", - description: "完成仅限第二世代的挑战.", + description: "完成仅限第二世代的挑战", }, "MONO_GEN_THREE": { name: "“水太多了”", - description: "完成仅限第三世代的挑战.", + description: "完成仅限第三世代的挑战", }, "MONO_GEN_FOUR": { name: "她真是最强冠军吗?", - description: "完成仅限第四世代的挑战.", + description: "完成仅限第四世代的挑战", }, "MONO_GEN_FIVE": { name: "完全原创", - description: "完成仅限第五世代的挑战.", + description: "完成仅限第五世代的挑战", }, "MONO_GEN_SIX": { name: "女大公", - description: "完成仅限第六世代的挑战.", + description: "完成仅限第六世代的挑战", }, "MONO_GEN_SEVEN": { name: "首届冠军", - description: "完成仅限第七世代的挑战.", + description: "完成仅限第七世代的挑战", }, "MONO_GEN_EIGHT": { name: "冠军时刻!", - description: "完成仅限第八世代的挑战.", + description: "完成仅限第八世代的挑战", }, "MONO_GEN_NINE": { name: "她又放水了", - description: "完成仅限第九世代的挑战.", + description: "完成仅限第九世代的挑战", }, "MonoType": { - description: "完成 {{type}} 单属性挑战.", + description: "完成 {{type}} 单属性挑战", }, "MONO_NORMAL": { name: "异乎寻常的寻常", @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "林克,醒醒!", }, + "FRESH_START": { + name: "初次尝试!", + description: "完成初次尝试挑战" + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/zh_CN/arena-flyout.ts b/src/locales/zh_CN/arena-flyout.ts new file mode 100644 index 00000000000..e30642e7d21 --- /dev/null +++ b/src/locales/zh_CN/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "当前战斗效果", + "player": "我方", + "neutral": "全局", + "enemy": "敌方", + + // WeatherType + "sunny": "大晴天", + "rain": "下雨", + "sandstorm": "沙暴", + "hail": "冰雹", + "snow": "下雪", + "fog": "起雾", + "heavyRain": "大雨", + "harshSun": "大日照", + "strongWinds": "乱流", + + // TerrainType + "misty": "薄雾场地", + "electric": "电气场地", + "grassy": "青草场地", + "psychic": "精神场地", + + // ArenaTagType + "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/zh_CN/arena-tag.ts b/src/locales/zh_CN/arena-tag.ts new file mode 100644 index 00000000000..027a5667415 --- /dev/null +++ b/src/locales/zh_CN/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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伺机使出掀榻榻米!", + "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": "气氛回复到平常了。", +} as const; diff --git a/src/locales/zh_CN/battle-info.ts b/src/locales/zh_CN/battle-info.ts new file mode 100644 index 00000000000..684ce4bc26a --- /dev/null +++ b/src/locales/zh_CN/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "第{{generation}}世代", +} as const; diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index 5fab96c422b..b07cb79e258 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -4,16 +4,17 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出现了。", "trainerAppeared": "{{trainerName}}\n想要和你对战!", "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", - "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", + "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", "singleWildAppeared": "一只野生的{{pokemonName}}出现了!", "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出现了!", - "playerComeBack": "回来吧,{{pokemonName}}!", + "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}}腾出空间?", @@ -25,11 +26,12 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "对{{pokemonName}}没有效果!!", "hitResultOneHitKO": "一击必杀!", "attackFailed": "但是失败了!", + "attackMissed": "没有命中{{pokemonNameWithAffix}}!", "attackHitsCount": "击中{{count}}次!", "rewardGain": "你获得了\n{{modifierName}}!", - "expGain": "{{pokemonName}}获得了 {{exp}} 点经验值!", - "levelUp": "{{pokemonName}}升级到 Lv.{{level}}!", - "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", + "expGain": "{{pokemonName}}获得了{{exp}} 点经验值!", + "levelUp": "{{pokemonName}}升级到Lv.{{level}}!", + "learnMove": "{{pokemonName}}学会了{{moveName}}!", "learnMovePrompt": "{{pokemonName}}想要学习{{moveName}}。", "learnMoveLimitReached": "但是,{{pokemonName}}已经学会了\n四个技能", "learnMoveReplaceQuestion": "要忘记一个技能并学习{{moveName}}吗?", @@ -59,22 +61,32 @@ export const battle: SimpleTranslationEntries = { "hpIsFull": "{{pokemonName}}的体力已满!", "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", + "stealEatBerry": "{{pokemonName}}夺取并吃掉了\n{{targetName}}的{{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP!", + "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了体力!", "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", "wildPokemonWithAffix": "野生的{{pokemonName}}", - "foePokemonWithAffix": "对手 {{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}}已经无法再降低了!", + "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}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", @@ -121,15 +133,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n变得万众瞩目了!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因电磁力浮了起来!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n电磁力消失了!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!" } as const; diff --git a/src/locales/zh_CN/battler-tags.ts b/src/locales/zh_CN/battler-tags.ts new file mode 100644 index 00000000000..2a945809282 --- /dev/null +++ b/src/locales/zh_CN/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "束缚", + "flinchedDesc": "畏缩", + "confusedDesc": "混乱", + "infatuatedDesc": "着迷", + "seedDesc": "寄生种子", + "nightmareDesc": "恶梦", + "ingrainDesc": "扎根", + "drowsyDesc": "瞌睡", +} as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts index 70e969d7b5e..71db565eb05 100644 --- a/src/locales/zh_CN/bgm-name.ts +++ b/src/locales/zh_CN/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "BGM", + "music": "BGM: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "黑2白2「决战!关都冠军」", "battle_johto_champion": "黑2白2「决战!城都冠军」", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "空之探险队「天空顶端(草原)」", "power_plant": "空之探险队「电气平原 深处」", "ruins": "空之探险队「封印岩地 深处」", - "sea": "空之探险队「石滩洞窟」", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - 海底", // The composer thinks about a more creative name - "slum": "空之探险队「天空顶端(岩场)」", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "空之探险队「天空顶端(雪山)」", "space": "Firel - 太空", "swamp": "空之探险队「封闭之海」", diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index 4c1b523ef16..de14d2f6486 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -22,4 +22,10 @@ export const challenges: TranslationEntries = { "desc": "你只能使用{{type}}\n属性的宝可梦", "desc_default": "你只能使用所选\n属性的宝可梦" }, + "freshStart": { + "name": "初次尝试", + "desc": "你只能使用御三家,就像是你第一次玩宝可梦肉鸽一样。", + "value.0": "关闭", + "value.1": "开启", + }, } as const; diff --git a/src/locales/zh_CN/common.ts b/src/locales/zh_CN/common.ts index 29f54ff0dc9..7c2c73eb3c0 100644 --- a/src/locales/zh_CN/common.ts +++ b/src/locales/zh_CN/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "开始", + "luckIndicator": "幸运:", + "shinyOnHover": "闪光", + "commonShiny": "常见", + "rareShiny": "稀有", + "epicShiny": "史诗", } as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 169c91535ed..24c8b870ffa 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/zh_CN/settings.js"; -import { common } from "#app/locales/zh_CN/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const zhCnConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const zhCnConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/zh_CN/dialogue.ts b/src/locales/zh_CN/dialogue.ts index 6afbcd71064..50d6c5f4333 100644 --- a/src/locales/zh_CN/dialogue.ts +++ b/src/locales/zh_CN/dialogue.ts @@ -390,6 +390,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "好讨厌的感觉啊!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: "如果你挡在熔岩队路上,那就别指望我们手下留情!" @@ -398,6 +410,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "哈?我输了?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!" @@ -406,6 +430,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "你在开玩笑吧?" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "别惹银河队!" @@ -414,6 +450,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "停机了…" }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "异端不共戴天!" @@ -422,6 +470,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "等离子子子子子子!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "时尚最重要!" @@ -430,6 +490,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "未来一片黑暗啊…" }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "我不得不说,能来到这里,你的确很不简单!" diff --git a/src/locales/zh_CN/egg.ts b/src/locales/zh_CN/egg.ts index 35334d75bdd..454cdb0af52 100644 --- a/src/locales/zh_CN/egg.ts +++ b/src/locales/zh_CN/egg.ts @@ -22,4 +22,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} 从蛋中孵化了!", "eggMoveUnlock": "蛋招式已解锁: {{moveName}}", "rareEggMoveUnlock": "稀有蛋招式已解锁: {{moveName}}", + "moveUPGacha": "蛋招式UP!", + "shinyUPGacha": "闪光UP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/zh_CN/filter-bar.ts b/src/locales/zh_CN/filter-bar.ts new file mode 100644 index 00000000000..5ccc5b8d9d9 --- /dev/null +++ b/src/locales/zh_CN/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "世代", + "typeFilter": "属性", + "dexFilter": "Dex", + "unlocksFilter": "解锁", + "miscFilter": "混合", + "sortFilter": "排序", + "all": "全部", + "normal": "无闪光", + "uncaught": "未捕获", + "passive": "被动", + "passiveUnlocked": "被动解锁", + "passiveLocked": "被动未解锁", + "ribbon": "缎带", + "hasWon": "有缎带", + "hasNotWon": "无缎带", + "sortByNumber": "编号", + "sortByCost": "费用", + "sortByCandies": "糖果", + "sortByIVs": "个体", + "sortByName": "名称", +}; diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.ts index 71d79472a45..e5ca6d977df 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "选择要导出的存档位。", "importData": "导入数据", "exportData": "导出数据", + "linkDiscord": "关联Discord", + "unlinkDiscord": "解除关联Discord", + "linkGoogle": "关联Google", + "unlinkGoogle": "解除关联Google", "cancel": "取消", "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。\n是否继续?", "noEggs": "当前没有任何蛋\n正在孵化中!" diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index c19c41333e8..332457c949f 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "用户名", "password": "密码", "login": "登录", + "Or use": "或使用", "register": "注册", "emptyUsername": "用户名不能为空", "invalidLoginUsername": "输入的用户名无效", @@ -54,5 +55,8 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "免责声明", "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", "choosePokemon": "选择一只宝可梦。", + "renamePokemon": "给宝可梦起名", + "rename": "起名", + "nickname": "昵称", "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。", } as const; diff --git a/src/locales/zh_CN/modifier-select-ui-handler.ts b/src/locales/zh_CN/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..a836f07e910 --- /dev/null +++ b/src/locales/zh_CN/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "transfer": "交换道具", + "reroll": "刷新商店", + "lockRarities": "锁定稀有度", + "checkTeam": "查看队伍", + "transferDesc": "将宝可梦携带的道具交换给其他宝可梦", + "rerollDesc": "花钱刷新道具", + "lockRaritiesDesc": "在刷新时锁定道具稀有度(影响刷新费用)", + "checkTeamDesc": "检查队伍或使用形态改变道具", + "rerollCost": "₽{{formattedMoney}}", + "itemCost": "₽{{formattedMoney}}" +} as const; diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 3ac9ac196cd..71f5b21ba81 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "一只宝可梦的{{moveType}}系招式威力提升20%。", }, "PokemonLevelIncrementModifierType": { - description: "一只宝可梦等级提升1级。", + description: "使一只宝可梦的等级提升{{levels}}级。", }, "AllPokemonLevelIncrementModifierType": { - description: "所有成员宝可梦等级提升1级。", + description: "使一只寶可夢的等級提升{{levels}}級。", }, "PokemonBaseStatBoosterModifierType": { description: "增加10%持有者的{{statName}},\n个体值越高堆叠上限越高。", @@ -151,7 +151,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "圣灰" }, - "REVIVER_SEED": { name: "复活种子", description: "恢复1只濒死宝可梦的HP至1/2。" }, + "REVIVER_SEED": { name: "复活种子", description: "受到技能攻击伤害濒死时,\n恢复该宝可梦的HP至1/2。" }, + + "WHITE_HERB": { name: "白色香草", description: "当携带它的宝可梦能力降低时,\n仅能回到之前的状态1次。" }, "ETHER": { name: "PP单项小补剂" }, "MAX_ETHER": { name: "PP单项全补剂" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, + "SCOPE_LENS": { name: "焦点镜", description: "能看见弱点的镜片。携带它的宝可梦的招式\n会变得容易击中要害。" }, + "LEEK": { name: "大葱", description: "非常长且坚硬的茎。让大葱鸭携带后,\n招式会变得容易击中要害。" }, + "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, "SOUL_DEW": { name: "心之水滴", description: "增加10%宝可梦性格对数值的影响 (加算)。" }, @@ -215,8 +220,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "LEFTOVERS": { name: "吃剩的东西", description: "携带后,在每个回合结束时恢复\n最大HP的1/16。" }, "SHELL_BELL": { name: "贝壳之铃", description: "携带后,在攻击对方成功造成伤害时,\n携带者的HP会恢复其所造成伤害的1/8。" }, - "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。携带后,在战斗时会变成剧毒状态。" }, - "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, + "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。\n携带后,在战斗时会变成剧毒状态。" }, + "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。\n携带后,在战斗时会变成灼伤状态。" }, "BATON": { name: "接力棒", description: "允许在切换宝可梦时保留能力变化, 对陷阱\n同样生效。" }, @@ -242,10 +247,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率。" }, }, SpeciesBoosterItem: { - "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会提高的神奇之球。" }, - "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, - "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。非常细腻坚硬。" }, - "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。非常细腻坚硬。" } + "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,\n攻击和特攻就会提高的神奇之球。" }, + "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。\n让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, + "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。\n非常细腻坚硬。" }, + "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。\n非常细腻坚硬。" } }, TempBattleStatBoosterItem: { "x_attack": "力量强化", diff --git a/src/locales/zh_CN/modifier.ts b/src/locales/zh_CN/modifier.ts new file mode 100644 index 00000000000..6900e99dfb6 --- /dev/null +++ b/src/locales/zh_CN/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "surviveDamageApply": "{{pokemonNameWithAffix}}用{{typeName}}\n撑住了!", + "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", + "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!", + "pokemonResetNegativeStatStageApply": "{{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}}后,行动变快了!", +} as const; diff --git a/src/locales/zh_CN/move-trigger.ts b/src/locales/zh_CN/move-trigger.ts new file mode 100644 index 00000000000..0efe24f76f0 --- /dev/null +++ b/src/locales/zh_CN/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}}\n受到了反作用力造成的伤害!", + "cutHpPowerUpMove": "{{pokemonName}}\n削减了体力并提升了招式威力!", + "absorbedElectricity": "{{pokemonName}}\n吸收了电力!", + "switchedStatChanges": "{{pokemonName}}和对手互换了\n自己的能力变化!", + "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预知了未来的攻击!", + "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开始给鸟嘴加热了!", + "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能力变化复原了!", + "faintCountdown": "{{pokemonName}}\n将在{{turnCount}}回合后灭亡!", + "copyType": "{{pokemonName}}\n变成了{{targetPokemonName}}的属性!", + "suppressAbilities": "{{pokemonName}}的特性\n变得无效了!", + "swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果!", +} as const; diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index f75ca001548..0c022559329 100644 --- a/src/locales/zh_CN/move.ts +++ b/src/locales/zh_CN/move.ts @@ -3,19 +3,19 @@ import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { "pound": { name: "拍击", - effect: "使用长长的尾巴或手等拍打\n对手进行攻击", + effect: "使用长长的尾巴或手等拍打对手进行攻击", }, "karateChop": { name: "空手劈", - effect: "用锋利的手刀劈向对手进行\n攻击。容易击中要害", + effect: "用锋利的手刀劈向对手进行攻击。\n容易击中要害", }, "doubleSlap": { name: "连环巴掌", - effect: "用连环巴掌拍打对手进行攻\n击。连续攻击2~5次", + effect: "用连环巴掌拍打对手进行攻击。\n连续攻击2~5次", }, "cometPunch": { name: "连续拳", - effect: "用拳头怒涛般的殴打对手进\n行攻击。连续攻击2~5次", + effect: "用拳头怒涛般的殴打对手进行攻击。\n连续攻击2~5次", }, "megaPunch": { name: "百万吨重拳", @@ -23,35 +23,35 @@ export const move: MoveTranslationEntries = { }, "payDay": { name: "聚宝功", - effect: "向对手的身体投掷小金币进\n行攻击。战斗后可以拿到钱", + effect: "向对手的身体投掷小金币进行攻击。\n战斗后可以拿到钱", }, "firePunch": { name: "火焰拳", - effect: "用充满火焰的拳头攻击对手。\n有时会让对手陷入灼伤状\n态", + effect: "用充满火焰的拳头攻击对手。\n有时会让对手陷入灼伤状态", }, "icePunch": { name: "冰冻拳", - effect: "用充满寒气的拳头攻击对手。\n有时会让对手陷入冰冻状\n态", + effect: "用充满寒气的拳头攻击对手。\n有时会让对手陷入冰冻状态", }, "thunderPunch": { name: "雷电拳", - effect: "用充满电流的拳头攻击对手。\n有时会让对手陷入麻痹状\n态", + effect: "用充满电流的拳头攻击对手。\n有时会让对手陷入麻痹状态", }, "scratch": { name: "抓", - effect: "用坚硬且无比锋利的爪子抓\n对手进行攻击", + effect: "用坚硬且无比锋利的爪子抓对手进行攻击", }, "viseGrip": { name: "夹住", - effect: "将对手从两侧夹住,给予伤\n害", + effect: "将对手从两侧夹住,给予伤害", }, "guillotine": { name: "极落钳", - effect: "用大钳子或剪刀等夹断对手\n进行攻击。只要命中就会一\n击昏厥", + effect: "用大钳子或剪刀等夹断对手进行攻击。\n只要命中就会一击昏厥", }, "razorWind": { name: "旋风刀", - effect: "制造风之刃,于第2回合攻\n击对手。容易击中要害", + effect: "制造风之刃,于第2回合攻击对手。\n容易击中要害", }, "swordsDance": { name: "剑舞", @@ -59,35 +59,35 @@ export const move: MoveTranslationEntries = { }, "cut": { name: "居合劈", - effect: "用镰刀或爪子等切斩对手进\n行攻击", + effect: "用镰刀或爪子等切斩对手进行攻击", }, "gust": { name: "起风", - effect: "用翅膀将刮起的狂风袭向对\n手进行攻击", + effect: "用翅膀将刮起的狂风袭向对手进行攻击", }, "wingAttack": { name: "翅膀攻击", - effect: "大大地展开美丽的翅膀,将\n其撞向对手进行攻击", + effect: "大大地展开美丽的翅膀,\n将其撞向对手进行攻击", }, "whirlwind": { name: "吹飞", - effect: "吹飞对手,强制拉后备宝可\n梦上场。如果对手为野生宝\n可梦,战斗将直接结束", + effect: "吹飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", }, "fly": { name: "飞翔", - effect: "第1回合飞上天空,第2回\n合攻击对手", + effect: "第1回合飞上天空,第2回合攻击对手", }, "bind": { name: "绑紧", - effect: "使用长长的身体或藤蔓等,\n在4~5回合内绑紧对手进\n行攻击", + effect: "使用长长的身体或藤蔓等,\n在4~5回合内绑紧对手进行攻击", }, "slam": { name: "摔打", - effect: "使用长长的尾巴或藤蔓等摔\n打对手进行攻击", + effect: "使用长长的尾巴或藤蔓等摔打对手\n进行攻击", }, "vineWhip": { name: "藤鞭", - effect: "用如同鞭子般弯曲而细长的\n藤蔓摔打对手进行攻击", + effect: "用如同鞭子般弯曲而细长的藤蔓摔\n打对手进行攻击", }, "stomp": { name: "踩踏", @@ -99,23 +99,23 @@ export const move: MoveTranslationEntries = { }, "megaKick": { name: "百万吨重踢", - effect: "使出力大无穷的重踢踢飞对\n手进行攻击", + effect: "使出力大无穷的重踢踢飞对手进行攻击", }, "jumpKick": { name: "飞踢", - effect: "使出高高的腾空踢攻击对手。\n如果踢偏则自己会受到伤\n害", + effect: "使出高高的腾空踢攻击对手。\n如果踢偏则自己会受到伤害", }, "rollingKick": { name: "回旋踢", - effect: "一边使身体快速旋转,一边\n踢飞对手进行攻击。有时会\n使对手畏缩", + effect: "一边使身体快速旋转,\n一边踢飞对手进行攻击。\n有时会使对手畏缩", }, "sandAttack": { name: "泼沙", - effect: "向对手脸上泼沙子,从而降\n低命中率", + effect: "向对手脸上泼沙子,从而降低命中率", }, "headbutt": { name: "头锤", - effect: "将头伸出,笔直地扑向对手\n进行攻击。有时会使对手畏\n缩", + effect: "将头伸出,笔直地扑向对手进行攻击。\n有时会使对手畏缩", }, "hornAttack": { name: "角撞", @@ -127,27 +127,27 @@ export const move: MoveTranslationEntries = { }, "hornDrill": { name: "角钻", - effect: "用旋转的角刺入对手进行攻\n击。只要命中就会一击昏厥", + effect: "用旋转的角刺入对手进行攻击。\n只要命中就会一击昏厥", }, "tackle": { name: "撞击", - effect: "用整个身体撞向对手进行攻\n击", + effect: "用整个身体撞向对手进行攻击", }, "bodySlam": { name: "泰山压顶", - effect: "用整个身体压住对手进行攻\n击。有时会让对手陷入麻痹\n状态", + effect: "用整个身体压住对手进行攻击。\n有时会让对手陷入麻痹状态", }, "wrap": { name: "紧束", - effect: "使用长长的身体或藤蔓等,\n在4~5回合内紧束对手进\n行攻击", + effect: "使用长长的身体或藤蔓等,\n在4~5回合内紧束对手进行攻击", }, "takeDown": { name: "猛撞", - effect: "以惊人的气势撞向对手进行\n攻击。自己也会受到少许伤\n害", + effect: "以惊人的气势撞向对手进行攻击。\n自己也会受到少许伤害", }, "thrash": { name: "大闹一番", - effect: "在2~3回合内,乱打一气\n地攻击对手。大闹一番后自\n己会陷入混乱", + effect: "在2~3回合内,乱打一气地攻击对手。\n大闹一番后自己会陷入混乱", }, "doubleEdge": { name: "舍身冲撞", @@ -155,15 +155,15 @@ export const move: MoveTranslationEntries = { }, "tailWhip": { name: "摇尾巴", - effect: "可爱地左右摇晃尾巴,诱使\n对手疏忽大意。会降低对手\n的防御", + effect: "可爱地左右摇晃尾巴,\n诱使对手疏忽大意。会降低对手的防御", }, "poisonSting": { name: "毒针", - effect: "将有毒的针刺入对手进行攻\n击。有时会让对手陷入中毒\n状态", + effect: "将有毒的针刺入对手进行攻击。\n有时会让对手陷入中毒状态", }, "twineedle": { name: "双针", - effect: "将2根针刺入对手,连续2\n次给予伤害。有时会让对手\n陷入中毒状态", + effect: "将2根针刺入对手,连续2次给予伤害。\n有时会让对手陷入中毒状态", }, "pinMissile": { name: "飞弹针", @@ -171,19 +171,19 @@ export const move: MoveTranslationEntries = { }, "leer": { name: "瞪眼", - effect: "用犀利的眼神使其害怕,从\n而降低对手的防御", + effect: "用犀利的眼神使其害怕,\n从而降低对手的防御", }, "bite": { name: "咬住", - effect: "用尖锐的牙咬住对手进行攻\n击。有时会使对手畏缩", + effect: "用尖锐的牙咬住对手进行攻击。\n有时会使对手畏缩", }, "growl": { name: "叫声", - effect: "让对手听可爱的叫声,引开\n注意力使其疏忽,从而降低\n对手的攻击", + effect: "让对手听可爱的叫声,\n引开注意力使其疏忽,\n从而降低对手的攻击", }, "roar": { name: "吼叫", - effect: "放走对手,强制拉后备宝可\n梦上场。如果对手为野生宝\n可梦,战斗将直接结束", + effect: "放走对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", }, "sing": { name: "唱歌", @@ -191,7 +191,7 @@ export const move: MoveTranslationEntries = { }, "supersonic": { name: "超音波", - effect: "从身体发出特殊的音波,从\n而使对手混乱", + effect: "从身体发出特殊的音波,\n从而使对手混乱", }, "sonicBoom": { name: "音爆", @@ -199,7 +199,7 @@ export const move: MoveTranslationEntries = { }, "disable": { name: "定身法", - effect: "阻碍对手行动,之前使出的\n招式将在4回合内无法使用", + effect: "阻碍对手行动,之前使出的招式将\n在4回合内无法使用", }, "acid": { name: "溶解液", @@ -207,7 +207,7 @@ export const move: MoveTranslationEntries = { }, "ember": { name: "火花", - effect: "向对手发射小型火焰进行攻\n击。有时会让对手陷入灼伤\n状态", + effect: "向对手发射小型火焰进行攻击。\n有时会让对手陷入灼伤状态", }, "flamethrower": { name: "喷射火焰", @@ -215,91 +215,91 @@ export const move: MoveTranslationEntries = { }, "mist": { name: "白雾", - effect: "用白雾覆盖身体。在5回合\n内不会让对手降低自己的能\n力", + effect: "用白雾覆盖身体。在5回合内不会\n让对手降低自己的能力", }, "waterGun": { name: "水枪", - effect: "向对手猛烈地喷射水流进行\n攻击", + effect: "向对手猛烈地喷射水流进行攻击", }, "hydroPump": { name: "水炮", - effect: "向对手猛烈地喷射大量水流\n进行攻击", + effect: "向对手猛烈地喷射大量水流进行攻击", }, "surf": { name: "冲浪", - effect: "利用大浪攻击自己周围所有\n的宝可梦", + effect: "利用大浪攻击自己周围所有的宝可梦", }, "iceBeam": { name: "冰冻光束", - effect: "向对手发射冰冻光束进行攻\n击。有时会让对手陷入冰冻\n状态", + effect: "向对手发射冰冻光束进行攻击。\n有时会让对手陷入冰冻状态", }, "blizzard": { name: "暴风雪", - effect: "将猛烈的暴风雪刮向对手进\n行攻击。有时会让对手陷入\n冰冻状态", + effect: "将猛烈的暴风雪刮向对手进行攻击。\n有时会让对手陷入冰冻状态", }, "psybeam": { name: "幻象光线", - effect: "向对手发射神奇的光线进行\n攻击。有时会使对手混乱", + effect: "向对手发射神奇的光线进行攻击。\n有时会使对手混乱", }, "bubbleBeam": { name: "泡沫光线", - effect: "向对手猛烈地喷射泡沫进行\n攻击。有时会降低对手的速\n度", + effect: "向对手猛烈地喷射泡沫进行攻击。\n有时会降低对手的速度", }, "auroraBeam": { name: "极光束", - effect: "向对手发射虹色光束进行攻\n击。有时会降低对手的攻击", + effect: "向对手发射虹色光束进行攻击。\n有时会降低对手的攻击", }, "hyperBeam": { name: "破坏光线", - effect: "向对手发射强烈的光线进行\n攻击。下一回合自己将无法\n动弹", + effect: "向对手发射强烈的光线进行攻击。\n下一回合自己将无法动弹", }, "peck": { name: "啄", - effect: "用尖锐的喙或角刺向对手进\n行攻击", + effect: "用尖锐的喙或角刺向对手进行攻击", }, "drillPeck": { name: "啄钻", - effect: "一边旋转,一边将尖喙刺入\n对手进行攻击", + effect: "一边旋转,一边将尖喙刺入对手进行攻击", }, "submission": { name: "深渊翻滚", - effect: "将对手连同自己一起摔向地\n面进行攻击。自己也会受到\n少许伤害", + effect: "将对手连同自己一起摔向地面进行攻击。\n自己也会受到少许伤害", }, "lowKick": { name: "踢倒", - effect: "用力踢对手的脚,使其摔倒\n进行攻击。对手越重,威力\n越大", + effect: "用力踢对手的脚,使其摔倒进行攻击。\n对手越重,威力越大", }, "counter": { name: "双倍奉还", - effect: "从对手那里受到物理攻击的\n伤害将以2倍返还给同一个\n对手", + effect: "从对手那里受到物理攻击的伤害将\n以2倍返还给同一个对手", }, "seismicToss": { name: "地球上投", - effect: "利用引力将对手甩飞出去。\n给予对手和自己等级相同的\n伤害", + effect: "利用引力将对手甩飞出去。\n给予对手和自己等级相同的伤害", }, "strength": { name: "怪力", - effect: "使出浑身力气殴打对手进行\n攻击", + effect: "使出浑身力气殴打对手进行攻击", }, "absorb": { name: "吸取", - effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一\n半HP", + effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP", }, "megaDrain": { name: "超级吸取", - effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一\n半HP", + effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP", }, "leechSeed": { name: "寄生种子", - effect: "植入寄生种子后,将在每回\n合一点一点吸取对手的HP,\n从而用来回复自己的HP", + effect: "植入寄生种子后,将在每回合一点\n一点吸取对手的HP,\n从而用来回复自己的HP", }, "growth": { name: "生长", - effect: "让身体一下子长大,从而提\n高攻击和特攻", + effect: "让身体一下子长大,从而提高攻击和特攻", }, "razorLeaf": { name: "飞叶快刀", - effect: "飞出叶片,切斩对手进行攻\n击。容易击中要害", + effect: "飞出叶片,切斩对手进行攻击。\n容易击中要害", }, "solarBeam": { name: "日光束", @@ -307,19 +307,19 @@ export const move: MoveTranslationEntries = { }, "poisonPowder": { name: "毒粉", - effect: "撒出毒粉,从而让对手陷入\n中毒状态", + effect: "撒出毒粉,从而让对手陷入中毒状态", }, "stunSpore": { name: "麻痹粉", - effect: "撒出麻痹粉,从而让对手陷\n入麻痹状态", + effect: "撒出麻痹粉,从而让对手陷入麻痹状态", }, "sleepPowder": { name: "催眠粉", - effect: "撒出催眠粉,从而让对手陷\n入睡眠状态", + effect: "撒出催眠粉,从而让对手陷入睡眠状态", }, "petalDance": { name: "花瓣舞", - effect: "在2~3回合内,散落花瓣\n攻击对手。之后自己会陷入\n混乱", + effect: "在2~3回合内,散落花瓣攻击对手。\n之后自己会陷入混乱", }, "stringShot": { name: "吐丝", @@ -327,23 +327,23 @@ export const move: MoveTranslationEntries = { }, "dragonRage": { name: "龙之怒", - effect: "将愤怒的冲击波撞向对手进\n行攻击。必定会给予40的\n伤害", + effect: "将愤怒的冲击波撞向对手进行攻击。\n必定会给予40的伤害", }, "fireSpin": { name: "火焰旋涡", - effect: "将对手困在激烈的火焰旋涡\n中,在4~5回合内进行攻\n击", + effect: "将对手困在激烈的火焰旋涡中,\n在4~5回合内进行攻击", }, "thunderShock": { name: "电击", - effect: "发出电流刺激对手进行攻击。\n有时会让对手陷入麻痹状\n态", + effect: "发出电流刺激对手进行攻击。\n有时会让对手陷入麻痹状态", }, "thunderbolt": { name: "十万伏特", - effect: "向对手发出强力电击进行攻\n击。有时会让对手陷入麻痹\n状态", + effect: "向对手发出强力电击进行攻击。\n有时会让对手陷入麻痹状态", }, "thunderWave": { name: "电磁波", - effect: "向对手发出微弱的电击,从\n而让对手陷入麻痹状态", + effect: "向对手发出微弱的电击,\n从而让对手陷入麻痹状态", }, "thunder": { name: "打雷", @@ -351,35 +351,35 @@ export const move: MoveTranslationEntries = { }, "rockThrow": { name: "落石", - effect: "拿起小岩石,投掷对手进行\n攻击", + effect: "拿起小岩石,投掷对手进行攻击", }, "earthquake": { name: "地震", - effect: "利用地震的冲击,攻击自己\n周围所有的宝可梦", + effect: "利用地震的冲击,攻击自己周围所\n有的宝可梦", }, "fissure": { name: "地裂", - effect: "让对手掉落于地裂的裂缝中\n进行攻击。只要命中就会一\n击昏厥", + effect: "让对手掉落于地裂的裂缝中进行攻击。\n只要命中就会一击昏厥", }, "dig": { name: "挖洞", - effect: "第1回合钻入地底,第2回\n合攻击对手", + effect: "第1回合钻入地底,第2回合攻击对手", }, "toxic": { name: "剧毒", - effect: "让对手陷入剧毒状态。随着\n回合的推进,中毒伤害会增\n加", + effect: "让对手陷入剧毒状态。\n随着回合的推进,中毒伤害会增加", }, "confusion": { name: "念力", - effect: "向对手发送微弱的念力进行\n攻击。有时会使对手混乱", + effect: "向对手发送微弱的念力进行攻击。\n有时会使对手混乱", }, "psychic": { name: "精神强念", - effect: "向对手发送强大的念力进行\n攻击。有时会降低对手的特\n防", + effect: "向对手发送强大的念力进行攻击。\n有时会降低对手的特防", }, "hypnosis": { name: "催眠术", - effect: "施以诱导睡意的暗示,让对\n手陷入睡眠状态", + effect: "施以诱导睡意的暗示,\n让对手陷入睡眠状态", }, "meditate": { name: "瑜伽姿势", @@ -387,23 +387,23 @@ export const move: MoveTranslationEntries = { }, "agility": { name: "高速移动", - effect: "让身体放松变得轻盈,以便\n高速移动。大幅提高自己的\n速度", + effect: "让身体放松变得轻盈,\n以便高速移动。大幅提高自己的速度", }, "quickAttack": { name: "电光一闪", - effect: "以迅雷不及掩耳之势扑向对\n手。必定能够先制攻击", + effect: "以迅雷不及掩耳之势扑向对手。\n必定能够先制攻击", }, "rage": { name: "愤怒", - effect: "如果在使出招式后受到攻击\n的话,会因愤怒的力量而提\n高攻击", + effect: "如果在使出招式后受到攻击的话,\n会因愤怒的力量而提高攻击", }, "teleport": { name: "瞬间移动", - effect: "当有后备宝可梦时使用,就\n可以进行替换。野生的宝可\n梦使用则会逃走", + effect: "当有后备宝可梦时使用,\n就可以进行替换。\n野生的宝可梦使用则会逃走", }, "nightShade": { name: "黑夜魔影", - effect: "显示恐怖幻影,只给予对手\n和自己等级相同的伤害", + effect: "显示恐怖幻影,只给予对手和自己\n等级相同的伤害", }, "mimic": { name: "模仿", @@ -411,7 +411,7 @@ export const move: MoveTranslationEntries = { }, "screech": { name: "刺耳声", - effect: "发出不由自主想要捂起耳朵\n的刺耳声,从而大幅降低对\n手的防御", + effect: "发出不由自主想要捂起耳朵的刺耳声,\n从而大幅降低对手的防御", }, "doubleTeam": { name: "影子分身", @@ -419,19 +419,19 @@ export const move: MoveTranslationEntries = { }, "recover": { name: "自我再生", - effect: "让细胞再生,从而回复自己\n最大HP的一半", + effect: "让细胞再生,从而回复自己最大H\nP的一半", }, "harden": { name: "变硬", - effect: "全身使劲,让身体变硬,从\n而提高自己的防御", + effect: "全身使劲,让身体变硬,\n从而提高自己的防御", }, "minimize": { name: "变小", - effect: "蜷缩身体显得很小,从而大\n幅提高自己的闪避率", + effect: "蜷缩身体显得很小,从而大幅提高\n自己的闪避率", }, "smokescreen": { name: "烟幕", - effect: "向对手喷出烟或墨汁等,从\n而降低对手的命中率", + effect: "向对手喷出烟或墨汁等,\n从而降低对手的命中率", }, "confuseRay": { name: "奇异之光", @@ -439,59 +439,59 @@ export const move: MoveTranslationEntries = { }, "withdraw": { name: "缩入壳中", - effect: "缩入壳里保护身体,从而提\n高自己的防御", + effect: "缩入壳里保护身体,从而提高自己的防御", }, "defenseCurl": { name: "变圆", - effect: "将身体蜷曲变圆,从而提高\n自己的防御", + effect: "将身体蜷曲变圆,从而提高自己的防御", }, "barrier": { name: "屏障", - effect: "制造坚固的壁障,从而大幅\n提高自己的防御", + effect: "制造坚固的壁障,从而大幅提高自\n己的防御", }, "lightScreen": { name: "光墙", - effect: "利用神奇的墙壁,在5回合\n内减弱从对手那里受到的特\n殊攻击的伤害", + effect: "利用神奇的墙壁,在5回合内减弱\n从对手那里受到的特殊攻击的伤害", }, "haze": { name: "黑雾", - effect: "升起黑雾,将正在场上战斗\n的全体宝可梦的能力变回原\n点", + effect: "升起黑雾,将正在场上战斗的全体\n宝可梦的能力变回原点", }, "reflect": { name: "反射壁", - effect: "利用神奇的墙壁,在5回合\n内减弱从对手那里受到的物\n理攻击的伤害", + effect: "利用神奇的墙壁,在5回合内减弱\n从对手那里受到的物理攻击的伤害", }, "focusEnergy": { name: "聚气", - effect: "深深地吸口气,集中精神。\n自己的攻击会变得容易击中\n要害", + effect: "深深地吸口气,集中精神。\n自己的攻击会变得容易击中要害", }, "bide": { name: "忍耐", - effect: "在2回合内忍受攻击,受到\n的伤害会2倍返还给对手", + effect: "在2回合内忍受攻击,\n受到的伤害会2倍返还给对手", }, "metronome": { name: "挥指", - effect: "挥动手指刺激自己的大脑,\n从许多的招式中随机使出1\n个", + effect: "挥动手指刺激自己的大脑,\n从许多的招式中随机使出1个", }, "mirrorMove": { name: "鹦鹉学舌", - effect: "模仿对手使用的招式,自己\n也使用相同招式", + effect: "模仿对手使用的招式,\n自己也使用相同招式", }, "selfDestruct": { name: "玉石俱碎", - effect: "引发爆炸,攻击自己周围所\n有的宝可梦。使用后陷入昏\n厥", + effect: "引发爆炸,攻击自己周围所有的宝可梦。\n使用后陷入昏厥", }, "eggBomb": { name: "炸蛋", - effect: "向对手用力投掷大大的蛋进\n行攻击", + effect: "向对手用力投掷大大的蛋进行攻击", }, "lick": { name: "舌舔", - effect: "用长长的舌头,舔遍对手进\n行攻击。有时会让对手陷入\n麻痹状态", + effect: "用长长的舌头,舔遍对手进行攻击。\n有时会让对手陷入麻痹状态", }, "smog": { name: "浊雾", - effect: "将肮脏的浓雾吹向对手进行\n攻击。有时会让对手陷入中\n毒状态", + effect: "将肮脏的浓雾吹向对手进行攻击。\n有时会让对手陷入中毒状态", }, "sludge": { name: "污泥攻击", @@ -499,27 +499,27 @@ export const move: MoveTranslationEntries = { }, "boneClub": { name: "骨棒", - effect: "用手中的骨头殴打对手进行\n攻击。有时会使对手畏缩", + effect: "用手中的骨头殴打对手进行攻击。\n有时会使对手畏缩", }, "fireBlast": { name: "大字爆炎", - effect: "用大字形状的火焰烧尽对手。\n有时会让对手陷入灼伤状\n态", + effect: "用大字形状的火焰烧尽对手。\n有时会让对手陷入灼伤状态", }, "waterfall": { name: "攀瀑", - effect: "以惊人的气势扑向对手。有\n时会使对手畏缩", + effect: "以惊人的气势扑向对手。\n有时会使对手畏缩", }, "clamp": { name: "贝壳夹击", - effect: "用非常坚固且厚实的贝壳,\n在4~5回合内夹住对手进\n行攻击", + effect: "用非常坚固且厚实的贝壳,\n在4~5回合内夹住对手进行攻击", }, "swift": { name: "高速星星", - effect: "发射星形的光攻击对手。攻\n击必定会命中", + effect: "发射星形的光攻击对手。\n攻击必定会命中", }, "skullBash": { name: "火箭头锤", - effect: "第1回合把头缩进去,从而\n提高防御。第2回合攻击对\n手", + effect: "第1回合把头缩进去,\n从而提高防御。第2回合攻击对手", }, "spikeCannon": { name: "尖刺加农炮", @@ -527,7 +527,7 @@ export const move: MoveTranslationEntries = { }, "constrict": { name: "缠绕", - effect: "用触手或青藤等缠绕进行攻\n击。有时会降低对手的速度", + effect: "用触手或青藤等缠绕进行攻击。\n有时会降低对手的速度", }, "amnesia": { name: "瞬间失忆", @@ -535,7 +535,7 @@ export const move: MoveTranslationEntries = { }, "kinesis": { name: "折弯汤匙", - effect: "折弯汤匙引开注意,从而降\n低对手的命中率", + effect: "折弯汤匙引开注意,从而降低对手\n的命中率", }, "softBoiled": { name: "生蛋", @@ -543,7 +543,7 @@ export const move: MoveTranslationEntries = { }, "highJumpKick": { name: "飞膝踢", - effect: "跳起后用膝盖撞对手进行攻\n击。如果撞偏则自己会受到\n伤害", + effect: "跳起后用膝盖撞对手进行攻击。\n如果撞偏则自己会受到伤害", }, "glare": { name: "大蛇瞪眼", @@ -551,7 +551,7 @@ export const move: MoveTranslationEntries = { }, "dreamEater": { name: "食梦", - effect: "吃掉正在睡觉的对手的梦进\n行攻击。回复对手所受到伤\n害的一半HP", + effect: "吃掉正在睡觉的对手的梦进行攻击。\n回复对手所受到伤害的一半HP", }, "poisonGas": { name: "毒瓦斯", @@ -559,43 +559,43 @@ export const move: MoveTranslationEntries = { }, "barrage": { name: "投球", - effect: "向对手投掷圆形物体进行攻\n击。连续攻击2~5次", + effect: "向对手投掷圆形物体进行攻击。\n连续攻击2~5次", }, "leechLife": { name: "吸血", - effect: "吸取血液攻击对手。可以回\n复给予对手伤害的一半HP", + effect: "吸取血液攻击对手。可以回复给予\n对手伤害的一半HP", }, "lovelyKiss": { name: "恶魔之吻", - effect: "用恐怖的脸强吻对手。让对\n手陷入睡眠状态", + effect: "用恐怖的脸强吻对手。\n让对手陷入睡眠状态", }, "skyAttack": { name: "神鸟猛击", - effect: "第2回合攻击对手。偶尔使\n对手畏缩。也容易击中要害", + effect: "第2回合攻击对手。偶尔使对手畏缩。\n也容易击中要害", }, "transform": { name: "变身", - effect: "变身成对手宝可梦的样子,\n能够使用和对手完全相同的\n招式", + effect: "变身成对手宝可梦的样子,\n能够使用和对手完全相同的招式", }, "bubble": { name: "泡沫", - effect: "向对手用力吹起无数泡泡进\n行攻击。有时会降低对手的\n速度", + effect: "向对手用力吹起无数泡泡进行攻击。\n有时会降低对手的速度", }, "dizzyPunch": { name: "迷昏拳", - effect: "有节奏地出拳攻击对手。有\n时会使对手混乱", + effect: "有节奏地出拳攻击对手。\n有时会使对手混乱", }, "spore": { name: "蘑菇孢子", - effect: "沙沙沙地撒满具有催眠效果\n的孢子,从而让对手陷入睡\n眠状态", + effect: "沙沙沙地撒满具有催眠效果的孢子,\n从而让对手陷入睡眠状态", }, "flash": { name: "闪光", - effect: "使出光芒,从而降低对手的\n命中率。也可在阴暗的洞窟\n里照亮四周", + effect: "使出光芒,从而降低对手的命中率。\n也可在阴暗的洞窟里照亮四周", }, "psywave": { name: "精神波", - effect: "向对手发射神奇的念波进行\n攻击。每次使用,伤害都会\n改变", + effect: "向对手发射神奇的念波进行攻击。\n每次使用,伤害都会改变", }, "splash": { name: "跃起", @@ -611,59 +611,59 @@ export const move: MoveTranslationEntries = { }, "explosion": { name: "大爆炸", - effect: "引发大爆炸,攻击自己周围\n所有的宝可梦。使用后自己\n会陷入昏厥", + effect: "引发大爆炸,\n攻击自己周围所有的宝可梦。\n使用后自己会陷入昏厥", }, "furySwipes": { name: "乱抓", - effect: "用爪子或镰刀等抓对手进行\n攻击。连续攻击2~5次", + effect: "用爪子或镰刀等抓对手进行攻击。\n连续攻击2~5次", }, "bonemerang": { name: "骨头回力镖", - effect: "用手中的骨头投掷对手,来\n回连续2次给予伤害", + effect: "用手中的骨头投掷对手,\n来回连续2次给予伤害", }, "rest": { name: "睡觉", - effect: "连续睡上2回合。回复自己\n的全部HP以及治愈所有异\n常状态", + effect: "连续睡上2回合。回复自己的全部\nHP以及治愈所有异常状态", }, "rockSlide": { name: "岩崩", - effect: "将大岩石猛烈地撞向对手进\n行攻击。有时会使对手畏缩", + effect: "将大岩石猛烈地撞向对手进行攻击。\n有时会使对手畏缩", }, "hyperFang": { name: "终结门牙", - effect: "用锋利的门牙牢牢地咬住对\n手进行攻击。有时会使对手\n畏缩", + effect: "用锋利的门牙牢牢地咬住对手进行攻击。\n有时会使对手畏缩", }, "sharpen": { name: "棱角化", - effect: "增加身体的角,变得棱棱角\n角,从而提高自己的攻击", + effect: "增加身体的角,变得棱棱角角,\n从而提高自己的攻击", }, "conversion": { name: "纹理", - effect: "将自己的属性转换成和已学\n会的招式中第一个招式相同\n的属性", + effect: "将自己的属性转换成和已学会的招\n式中第一个招式相同的属性", }, "triAttack": { name: "三重攻击", - effect: "用3种光线进行攻击。有时\n会让对手陷入麻痹、灼伤或\n冰冻的状态", + effect: "用3种光线进行攻击。\n有时会让对手陷入麻痹、\n灼伤或冰冻的状态", }, "superFang": { name: "愤怒门牙", - effect: "用锋利的门牙猛烈地咬住对\n手进行攻击。对手的HP减\n半", + effect: "用锋利的门牙猛烈地咬住对手进行攻击。\n对手的HP减半", }, "slash": { name: "劈开", - effect: "用爪子或镰刀等劈开对手进\n行攻击。容易击中要害", + effect: "用爪子或镰刀等劈开对手进行攻击。\n容易击中要害", }, "substitute": { name: "替身", - effect: "削减少许自己的HP,制造\n分身。分身将成为自己的替\n身", + effect: "削减少许自己的HP,\n制造分身。分身将成为自己的替身", }, "struggle": { name: "挣扎", - effect: "当自己的PP耗尽时,努力\n挣扎攻击对手。自己也会受\n到少许伤害", + effect: "当自己的PP耗尽时,\n努力挣扎攻击对手。\n自己也会受到少许伤害", }, "sketch": { name: "写生", - effect: "将对手使用的招式变成自己\n的招式。使用1次后写生消\n失", + effect: "将对手使用的招式变成自己的招式。\n使用1次后写生消失", }, "tripleKick": { name: "三连踢", @@ -675,59 +675,59 @@ export const move: MoveTranslationEntries = { }, "spiderWeb": { name: "蛛网", - effect: "将黏糊糊的细丝一层一层缠\n住对手,使其不能从战斗中\n逃走", + effect: "将黏糊糊的细丝一层一层缠住对手,\n使其不能从战斗中逃走", }, "mindReader": { name: "心之眼", - effect: "用心感受对手的行动,下次\n攻击必定会击中对手", + effect: "用心感受对手的行动,\n下次攻击必定会击中对手", }, "nightmare": { name: "恶梦", - effect: "让在睡眠状态下的对手做恶\n梦,每回合会缓缓减少HP", + effect: "让在睡眠状态下的对手做恶梦,\n每回合会缓缓减少HP", }, "flameWheel": { name: "火焰轮", - effect: "让火焰覆盖全身,猛撞向对\n手进行攻击。有时会让对手\n陷入灼伤状态", + effect: "让火焰覆盖全身,猛撞向对手进行攻击。\n有时会让对手陷入灼伤状态", }, "snore": { name: "打鼾", - effect: "在自己睡觉时,发出噪音进\n行攻击。有时会使对手畏缩", + effect: "在自己睡觉时,发出噪音进行攻击。\n有时会使对手畏缩", }, "curse": { name: "诅咒", - effect: "使用该招式的宝可梦,其属\n性是幽灵属性或其他属性时,\n效果会不一样", + effect: "使用该招式的宝可梦,\n其属性是幽灵属性或其他属性时,\n效果会不一样", }, "flail": { name: "抓狂", - effect: "抓狂般乱打进行攻击。自己\n的HP越少,招式的威力越\n大", + effect: "抓狂般乱打进行攻击。\n自己的HP越少,招式的威力越大", }, "conversion2": { name: "纹理2", - effect: "为了可以抵抗对手最后使用\n的招式,从而使自己的属性\n发生变化", + effect: "为了可以抵抗对手最后使用的招式,\n从而使自己的属性发生变化", }, "aeroblast": { name: "气旋攻击", - effect: "发射空气旋涡进行攻击。容\n易击中要害", + effect: "发射空气旋涡进行攻击。\n容易击中要害", }, "cottonSpore": { name: "棉孢子", - effect: "将棉花般柔软的孢子紧贴对\n手,从而大幅降低对手的速\n度", + effect: "将棉花般柔软的孢子紧贴对手,\n从而大幅降低对手的速度", }, "reversal": { name: "绝处逢生", - effect: "竭尽全力进行攻击。自己的\nHP越少,招式的威力越大", + effect: "竭尽全力进行攻击。自己的HP越少,\n招式的威力越大", }, "spite": { name: "怨恨", - effect: "对对手最后使用的招式怀有\n怨恨,减少4PP该招式", + effect: "对对手最后使用的招式怀有怨恨,\n减少4PP该招式", }, "powderSnow": { name: "细雪", - effect: "将冰冷的细雪吹向对手进行\n攻击。有时会让对手陷入冰\n冻状态", + effect: "将冰冷的细雪吹向对手进行攻击。\n有时会让对手陷入冰冻状态", }, "protect": { name: "守住", - effect: "完全抵挡对手的攻击。连续\n使出则容易失败", + effect: "完全抵挡对手的攻击。\n连续使出则容易失败", }, "machPunch": { name: "音速拳", @@ -735,11 +735,11 @@ export const move: MoveTranslationEntries = { }, "scaryFace": { name: "可怕面孔", - effect: "用恐怖的表情瞪着对手,使\n其害怕,从而大幅降低对手\n的速度", + effect: "用恐怖的表情瞪着对手,\n使其害怕,从而大幅降低对手的速度", }, "feintAttack": { name: "出奇一击", - effect: "悄悄地靠近对手,趁其不备\n进行殴打。攻击必定会命中", + effect: "悄悄地靠近对手,趁其不备进行殴打。\n攻击必定会命中", }, "sweetKiss": { name: "天使之吻", @@ -747,7 +747,7 @@ export const move: MoveTranslationEntries = { }, "bellyDrum": { name: "腹鼓", - effect: "将自己的HP减少到最大\nHP的一半,从而最大限度提\n高自己的攻击", + effect: "将自己的HP减少到最大HP的一半,\n从而最大限度提高自己的攻击", }, "sludgeBomb": { name: "污泥炸弹", @@ -755,79 +755,79 @@ export const move: MoveTranslationEntries = { }, "mudSlap": { name: "掷泥", - effect: "向对手的脸等投掷泥块进行\n攻击。会降低对手的命中率", + effect: "向对手的脸等投掷泥块进行攻击。\n会降低对手的命中率", }, "octazooka": { name: "章鱼桶炮", - effect: "向对手的脸等喷出墨汁进行\n攻击。有时会降低对手的命\n中率", + effect: "向对手的脸等喷出墨汁进行攻击。\n有时会降低对手的命中率", }, "spikes": { name: "撒菱", - effect: "在对手的脚下扔撒菱。对替\n换出场的对手的宝可梦给予\n伤害", + effect: "在对手的脚下扔撒菱。\n对替换出场的对手的宝可梦给予伤害", }, "zapCannon": { name: "电磁炮", - effect: "发射大炮一样的电流进行攻\n击。让对手陷入麻痹状态", + effect: "发射大炮一样的电流进行攻击。\n让对手陷入麻痹状态", }, "foresight": { name: "识破", - effect: "使出后对幽灵属性宝可梦没\n有效果的招式以及闪避率高\n的对手,变得能够打中", + effect: "使出后对幽灵属性宝可梦没有效果\n的招式以及闪避率高的对手,\n变得能够打中", }, "destinyBond": { name: "同命", - effect: "使出招式后,当受到对手攻\n击陷入昏厥时,对手也会一\n同昏厥。连续使出则会失败", + effect: "使出招式后,当受到对手攻击\n陷入昏厥时,对手也会一同昏厥。\n连续使出则会失败", }, "perishSong": { name: "终焉之歌", - effect: "倾听歌声的宝可梦经过3回\n合陷入昏厥。替换后效果消\n失", + effect: "倾听歌声的宝可梦经过3回合陷入昏厥。\n替换后效果消失", }, "icyWind": { name: "冰冻之风", - effect: "将结冰的冷气吹向对手进行\n攻击。会降低对手的速度", + effect: "将结冰的冷气吹向对手进行攻击。\n会降低对手的速度", }, "detect": { name: "看穿", - effect: "完全抵挡对手的攻击。连续\n使出则容易失败", + effect: "完全抵挡对手的攻击。\n连续使出则容易失败", }, "boneRush": { name: "骨棒乱打", - effect: "用坚硬的骨头殴打对手进行\n攻击。连续攻击2~5次", + effect: "用坚硬的骨头殴打对手进行攻击。\n连续攻击2~5次", }, "lockOn": { name: "锁定", - effect: "紧紧瞄准对手,下次攻击必\n定会打中", + effect: "紧紧瞄准对手,下次攻击必定会打中", }, "outrage": { name: "逆鳞", - effect: "在2~3回合内,乱打一气\n地进行攻击。大闹一番后自\n己会陷入混乱", + effect: "在2~3回合内,乱打一气地进行攻击。\n大闹一番后自己会陷入混乱", }, "sandstorm": { name: "沙暴", - effect: "在5回合内扬起沙暴,除岩\n石、地面和钢属性以外的宝\n可梦,都会受到伤害。岩石\n属性的特防还会提高", + effect: "在5回合内扬起沙暴,\n除岩石、地面和钢属性以外的宝可梦,\n都会受到伤害。岩石属性的特防还会提高", }, "gigaDrain": { name: "终极吸取", - effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一\n半HP", + effect: "吸取对手的养分进行攻击。\n可以回复给予对手伤害的一半HP", }, "endure": { name: "挺住", - effect: "即使受到攻击,也至少会留\n下1HP。连续使出则容易\n失败", + effect: "即使受到攻击,也至少会留下1HP。\n连续使出则容易失败", }, "charm": { name: "撒娇", - effect: "可爱地凝视,诱使对手疏忽\n大意,从而大幅降低对手的\n攻击", + effect: "可爱地凝视,诱使对手疏忽大意,\n从而大幅降低对手的攻击", }, "rollout": { name: "滚动", - effect: "在5回合内连续滚动攻击对\n手。招式每次击中,威力就\n会提高", + effect: "在5回合内连续滚动攻击对手。\n招式每次击中,威力就会提高", }, "falseSwipe": { name: "点到为止", - effect: "对手的HP至少会留下1\nHP,如此般手下留情地攻击", + effect: "对手的HP至少会留下1HP,\n如此般手下留情地攻击", }, "swagger": { name: "虚张声势", - effect: "激怒对手,使其混乱。因为\n愤怒,对手的攻击会大幅提\n高", + effect: "激怒对手,使其混乱。\n因为愤怒,对手的攻击会大幅提高", }, "milkDrink": { name: "喝牛奶", @@ -835,31 +835,31 @@ export const move: MoveTranslationEntries = { }, "spark": { name: "电光", - effect: "让电流覆盖全身,猛撞向对\n手进行攻击。有时会让对手\n陷入麻痹状态", + effect: "让电流覆盖全身,猛撞向对手进行攻击。\n有时会让对手陷入麻痹状态", }, "furyCutter": { name: "连斩", - effect: "用镰刀或爪子等切斩对手进\n行攻击。连续击中,威力就\n会提高", + effect: "用镰刀或爪子等切斩对手进行攻击。\n连续击中,威力就会提高", }, "steelWing": { name: "钢翼", - effect: "用坚硬的翅膀敲打对手进行\n攻击。有时会提高自己的防\n御", + effect: "用坚硬的翅膀敲打对手进行攻击。\n有时会提高自己的防御", }, "meanLook": { name: "黑色目光", - effect: "用好似要勾人心魂的黑色目\n光一动不动地凝视对手,使\n其不能从战斗中逃走", + effect: "用好似要勾人心魂的黑色目光一动\n不动地凝视对手,使其不能从战斗中逃走", }, "attract": { name: "迷人", - effect: "♂诱惑♀或♀诱惑♂,让对\n手着迷。对手将很难使出招\n式", + effect: "♂诱惑♀或♀诱惑♂,让对手着迷。\n对手将很难使出招式", }, "sleepTalk": { name: "梦话", - effect: "从自己已学会的招式中任意\n使出1个。只能在自己睡觉\n时使用", + effect: "从自己已学会的招式中任意使出1个。\n只能在自己睡觉时使用", }, "healBell": { name: "治愈铃声", - effect: "让同伴听舒适的铃音,从而\n治愈我方全员的异常状态", + effect: "让同伴听舒适的铃音,\n从而治愈我方全员的异常状态", }, "return": { name: "报恩", @@ -867,27 +867,27 @@ export const move: MoveTranslationEntries = { }, "present": { name: "礼物", - effect: "递给对手设有圈套的盒子进\n行攻击。也有可能回复对手\nHP", + effect: "递给对手设有圈套的盒子进行攻击。\n也有可能回复对手HP", }, "frustration": { name: "迁怒", - effect: "为了发泄不满而全力攻击对\n手。亲密度越低,威力越大", + effect: "为了发泄不满而全力攻击对手。\n亲密度越低,威力越大", }, "safeguard": { name: "神秘守护", - effect: "在5回合内被神奇的力量守\n护,从而不会陷入异常状态", + effect: "在5回合内被神奇的力量守护,\n从而不会陷入异常状态", }, "painSplit": { name: "分担痛楚", - effect: "将自己的HP和对手的HP\n相加,然后自己和对手友好\n地平分", + effect: "将自己的HP和对手的HP相加,\n然后自己和对手友好地平分", }, "sacredFire": { name: "神圣之火", - effect: "用神秘的火焰烧尽对手进行\n攻击。有时会让对手陷入灼\n伤状态", + effect: "用神秘的火焰烧尽对手进行攻击。\n有时会让对手陷入灼伤状态", }, "magnitude": { name: "震级", - effect: "晃动地面,攻击自己周围所\n有的宝可梦。招式的威力会\n有各种变化", + effect: "晃动地面,攻击自己周围所有的宝可梦。\n招式的威力会有各种变化", }, "dynamicPunch": { name: "爆裂拳", @@ -895,75 +895,75 @@ export const move: MoveTranslationEntries = { }, "megahorn": { name: "超级角击", - effect: "用坚硬且华丽的角狠狠地刺\n入对手进行攻击", + effect: "用坚硬且华丽的角狠狠地刺入对手\n进行攻击", }, "dragonBreath": { name: "龙息", - effect: "将强烈的气息吹向对手进行\n攻击。有时会让对手陷入麻\n痹状态", + effect: "将强烈的气息吹向对手进行攻击。\n有时会让对手陷入麻痹状态", }, "batonPass": { name: "接棒", - effect: "和后备宝可梦进行替换。换\n上的宝可梦能直接继承其能\n力的变化", + effect: "和后备宝可梦进行替换。\n换上的宝可梦能直接继承其能力的变化", }, "encore": { name: "再来一次", - effect: "让对手接受再来一次,连续\n3次使出最后使用的招式", + effect: "让对手接受再来一次,\n连续3次使出最后使用的招式", }, "pursuit": { name: "追打", - effect: "当对手替换宝可梦上场时使\n出此招式的话,能够以2倍\n的威力进行攻击", + effect: "当对手替换宝可梦上场时\n使出此招式的话,\n能够以2倍的威力进行攻击", }, "rapidSpin": { name: "高速旋转", - effect: "通过旋转来攻击对手。可以\n摆脱绑紧、紧束、寄生种子\n等招式。还能提高自己的速\n度", + effect: "通过旋转来攻击对手。\n可以摆脱绑紧、紧束、寄生种子等招式。\n还能提高自己的速度", }, "sweetScent": { name: "甜甜香气", - effect: "用香气大幅降低对手的闪避\n率", + effect: "用香气大幅降低对手的闪避率", }, "ironTail": { name: "铁尾", - effect: "使用坚硬的尾巴摔打对手进\n行攻击。有时会降低对手的\n防御", + effect: "使用坚硬的尾巴摔打对手进行攻击。\n有时会降低对手的防御", }, "metalClaw": { name: "金属爪", - effect: "用钢铁之爪劈开对手进行攻\n击。有时会提高自己的攻击", + effect: "用钢铁之爪劈开对手进行攻击。\n有时会提高自己的攻击", }, "vitalThrow": { name: "借力摔", - effect: "会在对手之后进行攻击。但\n是自己的攻击必定会命中", + effect: "会在对手之后进行攻击。\n但是自己的攻击必定会命中", }, "morningSun": { name: "晨光", - effect: "回复自己的HP。根据天气\n的不同,回复量也会有所变\n化", + effect: "回复自己的HP。根据天气的不同,\n回复量也会有所变化", }, "synthesis": { name: "光合作用", - effect: "回复自己的HP。根据天气\n的不同,回复量也会有所变\n化", + effect: "回复自己的HP。根据天气的不同,\n回复量也会有所变化", }, "moonlight": { name: "月光", - effect: "回复自己的HP。根据天气\n的不同,回复量也会有所变\n化", + effect: "回复自己的HP。根据天气的不同,\n回复量也会有所变化", }, "hiddenPower": { name: "觉醒力量", - effect: "招式的属性会随着使用此招\n式的宝可梦而改变", + effect: "招式的属性会随着使用此招式的宝\n可梦而改变", }, "crossChop": { name: "十字劈", - effect: "用两手呈十字劈打对手进行\n攻击。容易击中要害", + effect: "用两手呈十字劈打对手进行攻击。\n容易击中要害", }, "twister": { name: "龙卷风", - effect: "兴起龙卷风,将对手卷入进\n行攻击。有时会使对手畏缩", + effect: "兴起龙卷风,将对手卷入进行攻击。\n有时会使对手畏缩", }, "rainDance": { name: "求雨", - effect: "在5回合内一直降雨,从而\n提高水属性的招式威力。火\n属性的招式威力则降低", + effect: "在5回合内一直降雨,\n从而提高水属性的招式威力。\n火属性的招式威力则降低", }, "sunnyDay": { name: "大晴天", - effect: "在5回合内让日照变得强烈,\n从而提高火属性的招式威\n力。水属性的招式威力则降\n低", + effect: "在5回合内让日照变得强烈,\n从而提高火属性的招式威力。\n水属性的招式威力则降低", }, "crunch": { name: "咬碎", @@ -971,111 +971,111 @@ export const move: MoveTranslationEntries = { }, "mirrorCoat": { name: "镜面反射", - effect: "从对手那里受到特殊攻击的\n伤害将以2倍返还给同一个\n对手", + effect: "从对手那里受到特殊攻击的伤害将\n以2倍返还给同一个对手", }, "psychUp": { name: "自我暗示", - effect: "向自己施以自我暗示,将能\n力变化的状态变得和对手一\n样", + effect: "向自己施以自我暗示,\n将能力变化的状态变得和对手一样", }, "extremeSpeed": { name: "神速", - effect: "以迅雷不及掩耳之势猛撞向\n对手进行攻击。必定能够先\n制攻击", + effect: "以迅雷不及掩耳之势猛\n撞向对手进行攻击。\n必定能够先制攻击", }, "ancientPower": { name: "原始之力", - effect: "用原始之力进行攻击。有时\n会提高自己所有的能力", + effect: "用原始之力进行攻击。\n有时会提高自己所有的能力", }, "shadowBall": { name: "暗影球", - effect: "投掷一团黑影进行攻击。有\n时会降低对手的特防", + effect: "投掷一团黑影进行攻击。\n有时会降低对手的特防", }, "futureSight": { name: "预知未来", - effect: "在使用招式2回合后,向对\n手发送一团念力进行攻击", + effect: "在使用招式2回合后,\n向对手发送一团念力进行攻击", }, "rockSmash": { name: "碎岩", - effect: "用拳头进行攻击。有时会降\n低对手的防御", + effect: "用拳头进行攻击。有时会降低对手的防御", }, "whirlpool": { name: "潮旋", - effect: "将对手困在激烈的水流旋涡\n中,在4~5回合内进行攻\n击", + effect: "将对手困在激烈的水流旋涡中,\n在4~5回合内进行攻击", }, "beatUp": { name: "围攻", - effect: "我方全员进行攻击。同行的\n宝可梦越多,招式的攻击次\n数越多", + effect: "我方全员进行攻击。同行的宝可梦越多,\n招式的攻击次数越多", }, "fakeOut": { name: "击掌奇袭", - effect: "进行先制攻击,使对手畏缩。\n要在出场后立刻使出才能\n成功", + effect: "进行先制攻击,使对手畏缩。\n要在出场后立刻使出才能成功", }, "uproar": { name: "吵闹", - effect: "在3回合内大吵大闹攻击对\n手。在此期间谁都不能入眠", + effect: "在3回合内大吵大闹攻击对手。\n在此期间谁都不能入眠", }, "stockpile": { name: "蓄力", - effect: "积蓄力量,提高自己的防御\n和特防。最多积蓄3次", + effect: "积蓄力量,提高自己的防御和特防。\n最多积蓄3次", }, "spitUp": { name: "喷出", - effect: "将积蓄的力量撞向对手进行\n攻击。积蓄得越多,威力越\n大", + effect: "将积蓄的力量撞向对手进行攻击。\n积蓄得越多,威力越大", }, "swallow": { name: "吞下", - effect: "将积蓄的力量吞下,从而回\n复自己的HP。积蓄得越多,\n回复越大", + effect: "将积蓄的力量吞下,\n从而回复自己的HP。\n积蓄得越多,回复越大", }, "heatWave": { name: "热风", - effect: "将炎热的气息吹向对手进行\n攻击。有时会让对手陷入灼\n伤状态", + effect: "将炎热的气息吹向对手进行攻击。\n有时会让对手陷入灼伤状态", }, "hail": { name: "冰雹", - effect: "在5回合内一直降冰雹,除\n冰属性的宝可梦以外,给予\n全体宝可梦伤害", + effect: "在5回合内一直降冰雹,\n除冰属性的宝可梦以外,\n给予全体宝可梦伤害", }, "torment": { name: "无理取闹", - effect: "向对手无理取闹,令其不能\n连续2次使出相同招式", + effect: "向对手无理取闹,令其不能连续2\n次使出相同招式", }, "flatter": { name: "吹捧", - effect: "吹捧对手,使其混乱。同时\n还会提高对手的特攻", + effect: "吹捧对手,使其混乱。\n同时还会提高对手的特攻", }, "willOWisp": { name: "磷火", - effect: "放出怪异的火焰,从而让对\n手陷入灼伤状态", + effect: "放出怪异的火焰,从而让对手陷入\n灼伤状态", }, "memento": { name: "临别礼物", - effect: "虽然会使自己陷入昏厥,但\n是能够大幅降低对手的攻击\n和特攻", + effect: "虽然会使自己陷入昏厥,\n但是能够大幅降低对手的攻击和特攻", }, "facade": { name: "硬撑", - effect: "当自己处于中毒、麻痹、灼\n伤状态时,向对手使出此招\n式的话,威力会变成2倍", + effect: "当自己处于中毒、麻痹、灼伤状态时,\n向对手使出此招式的话,\n威力会变成2倍", }, "focusPunch": { name: "真气拳", - effect: "集中精神出拳。在招式使出\n前若受到攻击则会失败", + effect: "集中精神出拳。在招式使出前若受\n到攻击则会失败", }, "smellingSalts": { name: "清醒", - effect: "对于麻痹状态下的对手,威\n力会变成2倍。但相反对手\n的麻痹也会被治愈", + effect: "对于麻痹状态下的对手,\n威力会变成2倍。\n但相反对手的麻痹也会被治愈", }, "followMe": { name: "看我嘛", - effect: "引起对手的注意,将对手的\n攻击全部转移到自己身上", + effect: "引起对手的注意,将对手的攻击全\n部转移到自己身上", }, "naturePower": { name: "自然之力", - effect: "用自然之力进行攻击。根据\n所使用场所的不同,使出的\n招式也会有所变化", + effect: "用自然之力进行攻击。\n根据所使用场所的不同,\n使出的招式也会有所变化", }, "charge": { name: "充电", - effect: "变为充电状态,提高下次使\n出的电属性的招式威力。自\n己的特防也会提高", + effect: "变为充电状态,提高下次使出的电\n属性的招式威力。自己的特防也会提高", }, "taunt": { name: "挑衅", - effect: "使对手愤怒。在3回合内让\n对手只能使出给予伤害的招\n式", + effect: "使对手愤怒。在3回合内让对手只\n能使出给予伤害的招式", }, "helpingHand": { name: "帮助", @@ -1083,23 +1083,23 @@ export const move: MoveTranslationEntries = { }, "trick": { name: "戏法", - effect: "抓住对手的空隙,交换自己\n和对手的持有物", + effect: "抓住对手的空隙,交换自己和对手\n的持有物", }, "rolePlay": { name: "扮演", - effect: "扮演对手,让自己的特性变\n得和对手相同", + effect: "扮演对手,让自己的特性变得和对手相同", }, "wish": { name: "祈愿", - effect: "在下一回合回复自己或是替\n换出场的宝可梦最大HP的\n一半", + effect: "在下一回合回复自己或是替换出场\n的宝可梦最大HP的一半", }, "assist": { name: "借助", - effect: "向同伴紧急求助,从我方宝\n可梦已学会的招式中随机使\n用1个", + effect: "向同伴紧急求助,从我方宝可梦已\n学会的招式中随机使用1个", }, "ingrain": { name: "扎根", - effect: "在大地上扎根,每回合回复\n自己的HP。因为扎根了,\n所以不能替换宝可梦", + effect: "在大地上扎根,每回合回复自己的HP。\n因为扎根了,所以不能替换宝可梦", }, "superpower": { name: "蛮力", @@ -1107,11 +1107,11 @@ export const move: MoveTranslationEntries = { }, "magicCoat": { name: "魔法反射", - effect: "当对手使出会变成异常状态\n的招式或寄生种子等时,会\n将对手的招式反射回去", + effect: "当对手使出会变成异常状态的招式\n或寄生种子等时,会将对手的招式\n反射回去", }, "recycle": { name: "回收利用", - effect: "使战斗中已经消耗掉的自己\n的持有物再生,并可以再次\n使用", + effect: "使战斗中已经消耗掉的\n自己的持有物再生,\n并可以再次使用", }, "revenge": { name: "报复", @@ -1119,63 +1119,63 @@ export const move: MoveTranslationEntries = { }, "brickBreak": { name: "劈瓦", - effect: "将手刀猛烈地挥下攻击对手。\n还可以破坏光墙和反射壁\n等", + effect: "将手刀猛烈地挥下攻击对手。\n还可以破坏光墙和反射壁等", }, "yawn": { name: "哈欠", - effect: "打个大哈欠引起睡意。在下\n一回合让对手陷入睡眠状态", + effect: "打个大哈欠引起睡意。\n在下一回合让对手陷入睡眠状态", }, "knockOff": { name: "拍落", - effect: "拍落对手的持有物,直到战\n斗结束都不能使用。对手携\n带道具时会增加伤害", + effect: "拍落对手的持有物,直到战斗结束\n都不能使用。对手携带道具时会增加伤害", }, "endeavor": { name: "蛮干", - effect: "给予伤害,使对手的HP变\n得和自己的HP一样", + effect: "给予伤害,使对手的HP变得和自\n己的HP一样", }, "eruption": { name: "喷火", - effect: "爆发怒火攻击对手。自己的\nHP越少,招式的威力越小", + effect: "爆发怒火攻击对手。自己的HP越少,\n招式的威力越小", }, "skillSwap": { name: "特性互换", - effect: "利用超能力互换自己和对手\n的特性", + effect: "利用超能力互换自己和对手的特性", }, "imprison": { name: "封印", - effect: "如果对手有和自己相同的招\n式,那么只有对手无法使用\n该招式", + effect: "如果对手有和自己相同的招式,\n那么只有对手无法使用该招式", }, "refresh": { name: "焕然一新", - effect: "让身体休息,治愈自己身上\n所中的毒、麻痹、灼伤的异\n常状态", + effect: "让身体休息,治愈自己身上所中的\n毒、麻痹、灼伤的异常状态", }, "grudge": { name: "怨念", - effect: "因对手的招式而陷入昏厥时\n给对手施加怨念,让该招式\n的PP变成0", + effect: "因对手的招式而陷入昏厥时给对手\n施加怨念,让该招式的PP变成0", }, "snatch": { name: "抢夺", - effect: "将对手打算使用的回复招式\n或能力变化招式夺为己用", + effect: "将对手打算使用的回复招式或能力\n变化招式夺为己用", }, "secretPower": { name: "秘密之力", - effect: "根据使用场所不同,该招式\n的追加效果也会有所变化", + effect: "根据使用场所不同,该招式的追加\n效果也会有所变化", }, "dive": { name: "潜水", - effect: "第1回合潜入水中,第2回\n合浮上来进行攻击", + effect: "第1回合潜入水中,第2回合浮上\n来进行攻击", }, "armThrust": { name: "猛推", - effect: "用张开着的双手猛推对手进\n行攻击。连续攻击2~5次", + effect: "用张开着的双手猛推对手进行攻击。\n连续攻击2~5次", }, "camouflage": { name: "保护色", - effect: "根据所在场所不同,如水边\n、草丛和洞窟等,可以改变\n自己的属性", + effect: "根据所在场所不同,如水边、草丛\n和洞窟等,可以改变自己的属性", }, "tailGlow": { name: "萤火", - effect: "凝视闪烁的光芒,集中自己\n的精神,从而巨幅提高特攻", + effect: "凝视闪烁的光芒,集中自己的精神,\n从而巨幅提高特攻", }, "lusterPurge": { name: "洁净光芒", @@ -1183,51 +1183,51 @@ export const move: MoveTranslationEntries = { }, "mistBall": { name: "薄雾球", - effect: "用围绕着雾状羽毛的球进行\n攻击。有时会降低对手的特\n攻", + effect: "用围绕着雾状羽毛的球进行攻击。\n有时会降低对手的特攻", }, "featherDance": { name: "羽毛舞", - effect: "撒出羽毛,笼罩在对手的周\n围。大幅降低对手的攻击", + effect: "撒出羽毛,笼罩在对手的周围。\n大幅降低对手的攻击", }, "teeterDance": { name: "摇晃舞", - effect: "摇摇晃晃地跳起舞蹈,让自\n己周围的宝可梦陷入混乱状\n态", + effect: "摇摇晃晃地跳起舞蹈,\n让自己周围的宝可梦陷入混乱状态", }, "blazeKick": { name: "火焰踢", - effect: "攻击对手后,有时会使其陷\n入灼伤状态。也容易击中要\n害", + effect: "攻击对手后,有时会使其陷入灼伤状态。\n也容易击中要害", }, "mudSport": { name: "玩泥巴", - effect: "一旦使用此招式,周围就会\n弄得到处是泥。在5回合内\n减弱电属性的招式", + effect: "一旦使用此招式,\n周围就会弄得到处是泥。\n在5回合内减弱电属性的招式", }, "iceBall": { name: "冰球", - effect: "在5回合内攻击对手。招式\n每次击中,威力就会提高", + effect: "在5回合内攻击对手。\n招式每次击中,威力就会提高", }, "needleArm": { name: "尖刺臂", - effect: "用带刺的手臂猛烈地挥舞进\n行攻击。有时会使对手畏缩", + effect: "用带刺的手臂猛烈地挥舞进行攻击。\n有时会使对手畏缩", }, "slackOff": { name: "偷懒", - effect: "偷懒休息。回复自己最大\nHP的一半", + effect: "偷懒休息。回复自己最大HP的一半", }, "hyperVoice": { name: "巨声", - effect: "给予对手又吵又响的巨大震\n动进行攻击", + effect: "给予对手又吵又响的巨大震动进行攻击", }, "poisonFang": { name: "剧毒牙", - effect: "用有毒的牙齿咬住对手进行\n攻击。有时会使对手中剧毒", + effect: "用有毒的牙齿咬住对手进行攻击。\n有时会使对手中剧毒", }, "crushClaw": { name: "撕裂爪", - effect: "用坚硬的锐爪劈开对手进行\n攻击。有时会降低对手的防\n御", + effect: "用坚硬的锐爪劈开对手进行攻击。\n有时会降低对手的防御", }, "blastBurn": { name: "爆炸烈焰", - effect: "用爆炸的火焰烧尽对手进行\n攻击。下一回合自己将无法\n动弹", + effect: "用爆炸的火焰烧尽对手进行攻击。\n下一回合自己将无法动弹", }, "hydroCannon": { name: "加农水炮", @@ -1239,15 +1239,15 @@ export const move: MoveTranslationEntries = { }, "astonish": { name: "惊吓", - effect: "用尖叫声等突然惊吓对手进\n行攻击。有时会使对手畏缩", + effect: "用尖叫声等突然惊吓对手进行攻击。\n有时会使对手畏缩", }, "weatherBall": { name: "气象球", - effect: "根据使用时的天气,招式属\n性和威力会改变", + effect: "根据使用时的天气,招式属性和威\n力会改变", }, "aromatherapy": { name: "芳香治疗", - effect: "让同伴闻沁人心脾的香气,\n从而治愈我方全员的异常状\n态", + effect: "让同伴闻沁人心脾的香气,\n从而治愈我方全员的异常状态", }, "fakeTears": { name: "假哭", @@ -1255,19 +1255,19 @@ export const move: MoveTranslationEntries = { }, "airCutter": { name: "空气利刃", - effect: "用锐利的风切斩对手进行攻\n击。容易击中要害", + effect: "用锐利的风切斩对手进行攻击。\n容易击中要害", }, "overheat": { name: "过热", - effect: "使出全部力量攻击对手。使\n用之后会因为反作用力,自\n己的特攻大幅降低", + effect: "使出全部力量攻击对手。\n使用之后会因为反作用力,\n自己的特攻大幅降低", }, "odorSleuth": { name: "气味侦测", - effect: "使出后对幽灵属性宝可梦没\n有效果的招式以及闪避率高\n的对手,变得能够打中", + effect: "使出后对幽灵属性宝可梦没有效果\n的招式以及闪避率高的对手,\n变得能够打中", }, "rockTomb": { name: "岩石封锁", - effect: "投掷岩石进行攻击。封住对\n手的行动,从而降低速度", + effect: "投掷岩石进行攻击。封住对手的行动,\n从而降低速度", }, "silverWind": { name: "银色旋风", @@ -1275,23 +1275,23 @@ export const move: MoveTranslationEntries = { }, "metalSound": { name: "金属音", - effect: "让对手听摩擦金属般讨厌的\n声音。大幅降低对手的特防", + effect: "让对手听摩擦金属般讨厌的声音。\n大幅降低对手的特防", }, "grassWhistle": { name: "草笛", - effect: "让对手听舒适的笛声,从而\n陷入睡眠状态", + effect: "让对手听舒适的笛声,\n从而陷入睡眠状态", }, "tickle": { name: "挠痒", - effect: "给对手挠痒,使其发笑,从\n而降低对手的攻击和防御", + effect: "给对手挠痒,使其发笑,\n从而降低对手的攻击和防御", }, "cosmicPower": { name: "宇宙力量", - effect: "汲取宇宙中神秘的力量,从\n而提高自己的防御和特防", + effect: "汲取宇宙中神秘的力量,\n从而提高自己的防御和特防", }, "waterSpout": { name: "喷水", - effect: "掀起潮水进行攻击。自己的\nHP越少,招式的威力越小", + effect: "掀起潮水进行攻击。自己的HP越少,\n招式的威力越小", }, "signalBeam": { name: "信号光束", @@ -1299,55 +1299,55 @@ export const move: MoveTranslationEntries = { }, "shadowPunch": { name: "暗影拳", - effect: "使出混影之拳。攻击必定会\n命中", + effect: "使出混影之拳。攻击必定会命中", }, "extrasensory": { name: "神通力", - effect: "发出看不见的神奇力量进行\n攻击。有时会使对手畏缩", + effect: "发出看不见的神奇力量进行攻击。\n有时会使对手畏缩", }, "skyUppercut": { name: "冲天拳", - effect: "用冲向天空般高高的上勾拳\n顶起对手进行攻击", + effect: "用冲向天空般高高的上勾拳顶起对\n手进行攻击", }, "sandTomb": { name: "流沙深渊", - effect: "将对手困在铺天盖地的沙暴\n中,在4~5回合内进行攻\n击", + effect: "将对手困在铺天盖地的沙暴中,\n在4~5回合内进行攻击", }, "sheerCold": { name: "绝对零度", - effect: "给对手一击昏厥。如果是冰\n属性以外的宝可梦使用,就\n会难以打中", + effect: "给对手一击昏厥。如果是冰属性以\n外的宝可梦使用,就会难以打中", }, "muddyWater": { name: "浊流", - effect: "向对手喷射浑浊的水进行攻\n击。有时会降低对手的命中\n率", + effect: "向对手喷射浑浊的水进行攻击。\n有时会降低对手的命中率", }, "bulletSeed": { name: "种子机关枪", - effect: "向对手猛烈地发射种子进行\n攻击。连续攻击2~5次", + effect: "向对手猛烈地发射种子进行攻击。\n连续攻击2~5次", }, "aerialAce": { name: "燕返", - effect: "以敏捷的动作戏弄对手后进\n行切斩。攻击必定会命中", + effect: "以敏捷的动作戏弄对手后进行切斩。\n攻击必定会命中", }, "icicleSpear": { name: "冰锥", - effect: "向对手发射锋利的冰柱进行\n攻击。连续攻击2~5次", + effect: "向对手发射锋利的冰柱进行攻击。\n连续攻击2~5次", }, "ironDefense": { name: "铁壁", - effect: "将皮肤变得坚硬如铁,从而\n大幅提高自己的防御", + effect: "将皮肤变得坚硬如铁,\n从而大幅提高自己的防御", }, "block": { name: "挡路", - effect: "张开双手进行阻挡,封住对\n手的退路,使其不能逃走", + effect: "张开双手进行阻挡,封住对手的退路,\n使其不能逃走", }, "howl": { name: "长嚎", - effect: "大声吼叫提高气势,从而提\n高自己和同伴的攻击", + effect: "大声吼叫提高气势,从而提高自己\n和同伴的攻击", }, "dragonClaw": { name: "龙爪", - effect: "用尖锐的巨爪劈开对手进行\n攻击", + effect: "用尖锐的巨爪劈开对手进行攻击", }, "frenzyPlant": { name: "疯狂植物", @@ -1355,11 +1355,11 @@ export const move: MoveTranslationEntries = { }, "bulkUp": { name: "健美", - effect: "使出全身力气绷紧肌肉,从\n而提高自己的攻击和防御", + effect: "使出全身力气绷紧肌肉,\n从而提高自己的攻击和防御", }, "bounce": { name: "弹跳", - effect: "弹跳到高高的空中,第2回\n合攻击对手。有时会让对手\n陷入麻痹状态", + effect: "弹跳到高高的空中,第2回合攻击对手。\n有时会让对手陷入麻痹状态", }, "mudShot": { name: "泥巴射击", @@ -1367,103 +1367,103 @@ export const move: MoveTranslationEntries = { }, "poisonTail": { name: "毒尾", - effect: "用尾巴拍打。有时会让对手\n陷入中毒状态,也容易击中\n要害", + effect: "用尾巴拍打。\n有时会让对手陷入中毒状态,\n也容易击中要害", }, "covet": { name: "渴望", - effect: "一边可爱地撒娇,一边靠近\n对手进行攻击,还能夺取对\n手携带的道具", + effect: "一边可爱地撒娇,\n一边靠近对手进行攻击,\n还能夺取对手携带的道具", }, "voltTackle": { name: "伏特攻击", - effect: "让电流覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入麻痹状\n态", + effect: "让电流覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入麻痹状态", }, "magicalLeaf": { name: "魔法叶", - effect: "散落可以追踪对手的神奇叶\n片。攻击必定会命中", + effect: "散落可以追踪对手的神奇叶片。\n攻击必定会命中", }, "waterSport": { name: "玩水", - effect: "用水湿透周围。在5回合内\n减弱火属性的招式", + effect: "用水湿透周围。在5回合内减弱火\n属性的招式", }, "calmMind": { name: "冥想", - effect: "静心凝神,从而提高自己的\n特攻和特防", + effect: "静心凝神,从而提高自己的特攻和特防", }, "leafBlade": { name: "叶刃", - effect: "像用剑一般操纵叶片切斩对\n手进行攻击。容易击中要害", + effect: "像用剑一般操纵叶片切斩对手进行攻击。\n容易击中要害", }, "dragonDance": { name: "龙之舞", - effect: "激烈地跳起神秘且强有力的\n舞蹈。从而提高自己的攻击\n和速度", + effect: "激烈地跳起神秘且强有力的舞蹈。\n从而提高自己的攻击和速度", }, "rockBlast": { name: "岩石爆击", - effect: "向对手发射坚硬的岩石进行\n攻击。连续攻击2~5次", + effect: "向对手发射坚硬的岩石进行攻击。\n连续攻击2~5次", }, "shockWave": { name: "电击波", - effect: "向对手快速发出电击。攻击\n必定会命中", + effect: "向对手快速发出电击。\n攻击必定会命中", }, "waterPulse": { name: "水之波动", - effect: "用水的震动攻击对手。有时\n会使对手混乱", + effect: "用水的震动攻击对手。\n有时会使对手混乱", }, "doomDesire": { name: "破灭之愿", - effect: "使用招式2回合后,会用无\n数道光束攻击对手", + effect: "使用招式2回合后,会用无数道光\n束攻击对手", }, "psychoBoost": { name: "精神突进", - effect: "使出全部力量攻击对手。使\n用之后会因为反作用力,自\n己的特攻大幅降低", + effect: "使出全部力量攻击对手。\n使用之后会因为反作用力,\n自己的特攻大幅降低", }, "roost": { name: "羽栖", - effect: "降到地面,使身体休息。回\n复自己最大HP的一半", + effect: "降到地面,使身体休息。\n回复自己最大HP的一半", }, "gravity": { name: "重力", - effect: "在5回合内,飘浮特性和飞\n行属性的宝可梦会被地面属\n性的招式击中。飞向空中的\n招式也将无法使用", + effect: "在5回合内,飘浮特性和飞行属性\n的宝可梦会被地面属性的招式击中。\n飞向空中的招式也将无法使用", }, "miracleEye": { name: "奇迹之眼", - effect: "使出后对恶属性宝可梦没有\n效果的招式以及闪避率高的\n对手,变得能够打中", + effect: "使出后对恶属性宝可梦没有效果的\n招式以及闪避率高的对手,\n变得能够打中", }, "wakeUpSlap": { name: "唤醒巴掌", - effect: "给予睡眠状态下的对手较大\n的伤害。但相反对手会从睡\n眠中醒过来", + effect: "给予睡眠状态下的对手较大的伤害。\n但相反对手会从睡眠中醒过来", }, "hammerArm": { name: "臂锤", - effect: "挥舞强力而沉重的拳头,给\n予对手伤害。自己的速度会\n降低", + effect: "挥舞强力而沉重的拳头,\n给予对手伤害。自己的速度会降低", }, "gyroBall": { name: "陀螺球", - effect: "让身体高速旋转并撞击对手。\n速度比对手越慢,威力越\n大", + effect: "让身体高速旋转并撞击对手。\n速度比对手越慢,威力越大", }, "healingWish": { name: "治愈之愿", - effect: "虽然自己陷入昏厥,但可以\n治愈后备上场的宝可梦的异\n常状态以及回复HP", + effect: "虽然自己陷入昏厥,但可以治愈后\n备上场的宝可梦的异常状态以及回复HP", }, "brine": { name: "盐水", - effect: "当对手的HP负伤到一半左\n右时,招式威力会变成2倍", + effect: "当对手的HP负伤到一半左右时,\n招式威力会变成2倍", }, "naturalGift": { name: "自然之恩", - effect: "从树果上获得力量进行攻击。\n根据携带的树果,招式属\n性和威力会改变", + effect: "从树果上获得力量进行攻击。\n根据携带的树果,招式属性和威力会改变", }, "feint": { name: "佯攻", - effect: "能够攻击正在使用守住或看\n穿等招式的对手。解除其守\n护效果", + effect: "能够攻击正在使用守住或看穿等招\n式的对手。解除其守护效果", }, "pluck": { name: "啄食", - effect: "用喙进行攻击。当对手携带\n树果时,可以食用并获得其\n效果", + effect: "用喙进行攻击。当对手携带树果时,\n可以食用并获得其效果", }, "tailwind": { name: "顺风", - effect: "刮起猛烈的旋风,在4回合\n内提高我方全员的速度", + effect: "刮起猛烈的旋风,在4回合内提高\n我方全员的速度", }, "acupressure": { name: "点穴", @@ -1471,35 +1471,35 @@ export const move: MoveTranslationEntries = { }, "metalBurst": { name: "金属爆炸", - effect: "使出招式前,将最后受到的\n招式的伤害大力返还给对手", + effect: "使出招式前,将最后受到的招式的\n伤害大力返还给对手", }, "uTurn": { name: "急速折返", - effect: "在攻击之后急速返回,和后\n备宝可梦进行替换", + effect: "在攻击之后急速返回,\n和后备宝可梦进行替换", }, "closeCombat": { name: "近身战", - effect: "放弃守护,向对手的怀里突\n击。自己的防御和特防会降\n低", + effect: "放弃守护,向对手的怀里突击。\n自己的防御和特防会降低", }, "payback": { name: "以牙还牙", - effect: "蓄力攻击。如果能在对手之\n后攻击,招式的威力会变成\n2倍", + effect: "蓄力攻击。如果能在对手之后攻击,\n招式的威力会变成2倍", }, "assurance": { name: "恶意追击", - effect: "如果此回合内对手已经受到\n伤害的话,招式威力会变成\n2倍", + effect: "如果此回合内对手已经受到伤害的话,\n招式威力会变成2倍", }, "embargo": { name: "查封", - effect: "让对手在5回合内不能使用\n宝可梦携带的道具。训练家\n也不能给那只宝可梦使用道\n具", + effect: "让对手在5回合内不能使用宝可梦\n携带的道具。训练家也不能给那只\n宝可梦使用道具", }, "fling": { name: "投掷", - effect: "快速投掷携带的道具进行攻\n击。根据道具不同,威力和\n效果会改变", + effect: "快速投掷携带的道具进行攻击。\n根据道具不同,威力和效果会改变", }, "psychoShift": { name: "精神转移", - effect: "利用超能力施以暗示,从而\n将自己受到的异常状态转移\n给对手", + effect: "利用超能力施以暗示,\n从而将自己受到的异常状态转移给对手", }, "trumpCard": { name: "王牌", @@ -1507,95 +1507,95 @@ export const move: MoveTranslationEntries = { }, "healBlock": { name: "回复封锁", - effect: "在5回合内无法通过招式、\n特性或携带的道具来回复H\nP", + effect: "在5回合内无法通过招式、特性或\n携带的道具来回复HP", }, "wringOut": { name: "绞紧", - effect: "用力勒紧对手进行攻击。对\n手的HP越多,威力越大", + effect: "用力勒紧对手进行攻击。\n对手的HP越多,威力越大", }, "powerTrick": { name: "力量戏法", - effect: "利用超能力交换自己的攻击\n和防御的力量", + effect: "利用超能力交换自己的攻击和防御的力量", }, "gastroAcid": { name: "胃液", - effect: "将胃液吐向对手的身体。沾\n上的胃液会消除对手的特性\n效果", + effect: "将胃液吐向对手的身体。\n沾上的胃液会消除对手的特性效果", }, "luckyChant": { name: "幸运咒语", - effect: "向天许愿,从而在5回合内\n不会被对手的攻击打中要害", + effect: "向天许愿,从而在5回合内不会被\n对手的攻击打中要害", }, "meFirst": { name: "抢先一步", - effect: "提高威力,抢先使出对手想\n要使出的招式。如果不先使\n出则会失败", + effect: "提高威力,\n抢先使出对手想要使出的招式。\n如果不先使出则会失败", }, "copycat": { name: "仿效", - effect: "模仿对手刚才使出的招式,\n并使出相同招式。如果对手\n还没出招则会失败", + effect: "模仿对手刚才使出的招式,\n并使出相同招式。\n如果对手还没出招则会失败", }, "powerSwap": { name: "力量互换", - effect: "利用超能力互换自己和对手\n的攻击以及特攻的能力变化", + effect: "利用超能力互换自己和对手的攻击\n以及特攻的能力变化", }, "guardSwap": { name: "防守互换", - effect: "利用超能力互换自己和对手\n的防御以及特防的能力变化", + effect: "利用超能力互换自己和对手的防御\n以及特防的能力变化", }, "punishment": { name: "惩罚", - effect: "根据能力变化,对手提高的\n力量越大,招式的威力越大", + effect: "根据能力变化,对手提高的力量越大,\n招式的威力越大", }, "lastResort": { name: "珍藏", - effect: "当战斗中已学会的招式全部\n使用过后,才能开始使出珍\n藏的招式", + effect: "当战斗中已学会的招式全部使用过后,\n才能开始使出珍藏的招式", }, "worrySeed": { name: "烦恼种子", - effect: "种植心神不宁的种子。使对\n手不能入眠,并将特性变成\n不眠", + effect: "种植心神不宁的种子。\n使对手不能入眠,并将特性变成不眠", }, "suckerPunch": { name: "突袭", - effect: "可以比对手先攻击。对手使\n出的招式如果不是攻击招式\n则会失败", + effect: "可以比对手先攻击。对手使出的招\n式如果不是攻击招式则会失败", }, "toxicSpikes": { name: "毒菱", - effect: "在对手的脚下撒毒菱。使对\n手替换出场的宝可梦中毒", + effect: "在对手的脚下撒毒菱。\n使对手替换出场的宝可梦中毒", }, "heartSwap": { name: "心灵互换", - effect: "利用超能力互换自己和对手\n之间的能力变化", + effect: "利用超能力互换自己和对手之间的\n能力变化", }, "aquaRing": { name: "水流环", - effect: "在自己身体的周围覆盖用水\n制造的幕。每回合回复HP", + effect: "在自己身体的周围覆盖用水制造的幕。\n每回合回复HP", }, "magnetRise": { name: "电磁飘浮", - effect: "利用电气产生的磁力浮在空\n中。在5回合内可以飘浮", + effect: "利用电气产生的磁力浮在空中。\n在5回合内可以飘浮", }, "flareBlitz": { name: "闪焰冲锋", - effect: "让火焰覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入灼伤状\n态", + effect: "让火焰覆盖全身猛撞向对手。\n自己也会受到不小的伤害。\n有时会让对手陷入灼伤状态", }, "forcePalm": { name: "发劲", - effect: "向对手的身体发出冲击波进\n行攻击。有时会让对手陷入\n麻痹状态", + effect: "向对手的身体发出冲击波进行攻击。\n有时会让对手陷入麻痹状态", }, "auraSphere": { name: "波导弹", - effect: "从体内产生出波导之力,然\n后向对手发出。攻击必定会\n命中", + effect: "从体内产生出波导之力,\n然后向对手发出。攻击必定会命中", }, "rockPolish": { name: "岩石打磨", - effect: "打磨自己的身体,减少空气\n阻力。可以大幅提高自己的\n速度", + effect: "打磨自己的身体,减少空气阻力。\n可以大幅提高自己的速度", }, "poisonJab": { name: "毒击", - effect: "用带毒的触手或手臂刺入对\n手。有时会让对手陷入中毒\n状态", + effect: "用带毒的触手或手臂刺入对手。\n有时会让对手陷入中毒状态", }, "darkPulse": { name: "恶之波动", - effect: "从体内发出充满恶意的恐怖\n气场。有时会使对手畏缩", + effect: "从体内发出充满恶意的恐怖气场。\n有时会使对手畏缩", }, "nightSlash": { name: "暗袭要害", @@ -1603,19 +1603,19 @@ export const move: MoveTranslationEntries = { }, "aquaTail": { name: "水流尾", - effect: "如惊涛骇浪般挥动大尾巴攻\n击对手", + effect: "如惊涛骇浪般挥动大尾巴攻击对手", }, "seedBomb": { name: "种子炸弹", - effect: "将外壳坚硬的大种子,从上\n方砸下攻击对手", + effect: "将外壳坚硬的大种子,\n从上方砸下攻击对手", }, "airSlash": { name: "空气之刃", - effect: "用连天空也能劈开的空气之\n刃进行攻击。有时会使对手\n畏缩", + effect: "用连天空也能劈开的空气之刃进行攻击。\n有时会使对手畏缩", }, "xScissor": { name: "十字剪", - effect: "将镰刀或爪子像剪刀般地交\n叉,顺势劈开对手", + effect: "将镰刀或爪子像剪刀般地交叉,\n顺势劈开对手", }, "bugBuzz": { name: "虫鸣", @@ -1623,23 +1623,23 @@ export const move: MoveTranslationEntries = { }, "dragonPulse": { name: "龙之波动", - effect: "从大大的口中掀起冲击波攻\n击对手", + effect: "从大大的口中掀起冲击波攻击对手", }, "dragonRush": { name: "龙之俯冲", - effect: "释放出骇人的杀气,一边威\n慑一边撞击对手。有时会使\n对手畏缩", + effect: "释放出骇人的杀气,一边威慑一边\n撞击对手。有时会使对手畏缩", }, "powerGem": { name: "力量宝石", - effect: "发射如宝石般闪耀的光芒攻\n击对手", + effect: "发射如宝石般闪耀的光芒攻击对手", }, "drainPunch": { name: "吸取拳", - effect: "用拳头吸取对手的力量。可\n以回复给予对手伤害的一半\nHP", + effect: "用拳头吸取对手的力量。\n可以回复给予对手伤害的一半HP", }, "vacuumWave": { name: "真空波", - effect: "挥动拳头,掀起真空波。必\n定能够先制攻击", + effect: "挥动拳头,掀起真空波。\n必定能够先制攻击", }, "focusBlast": { name: "真气弹", @@ -1651,7 +1651,7 @@ export const move: MoveTranslationEntries = { }, "braveBird": { name: "勇鸟猛攻", - effect: "收拢翅膀,通过低空飞行突\n击对手。自己也会受到不小\n的伤害", + effect: "收拢翅膀,通过低空飞行突击对手。\n自己也会受到不小的伤害", }, "earthPower": { name: "大地之力", @@ -1659,7 +1659,7 @@ export const move: MoveTranslationEntries = { }, "switcheroo": { name: "掉包", - effect: "用一闪而过的速度交换自己\n和对手的持有物", + effect: "用一闪而过的速度交换自己和对手\n的持有物", }, "gigaImpact": { name: "终极冲击", @@ -1667,107 +1667,107 @@ export const move: MoveTranslationEntries = { }, "nastyPlot": { name: "诡计", - effect: "谋划诡计,激活头脑。大幅\n提高自己的特攻", + effect: "谋划诡计,激活头脑。\n大幅提高自己的特攻", }, "bulletPunch": { name: "子弹拳", - effect: "向对手使出如子弹般快速而\n坚硬的拳头。必定能够先制\n攻击", + effect: "向对手使出如子弹般快速而坚硬的拳头。\n必定能够先制攻击", }, "avalanche": { name: "雪崩", - effect: "如果受到对手的招式攻击,\n就能给予该对手2倍威力的\n攻击", + effect: "如果受到对手的招式攻击,\n就能给予该对手2倍威力的攻击", }, "iceShard": { name: "冰砾", - effect: "瞬间制作冰块,快速地扔向\n对手。必定能够先制攻击", + effect: "瞬间制作冰块,快速地扔向对手。\n必定能够先制攻击", }, "shadowClaw": { name: "暗影爪", - effect: "以影子做成的锐爪,劈开对\n手。容易击中要害", + effect: "以影子做成的锐爪,劈开对手。\n容易击中要害", }, "thunderFang": { name: "雷电牙", - effect: "用蓄满电流的牙齿咬住对手。\n有时会使对手畏缩或陷入\n麻痹状态", + effect: "用蓄满电流的牙齿咬住对手。\n有时会使对手畏缩或陷入麻痹状态", }, "iceFang": { name: "冰冻牙", - effect: "用藏有冷气的牙齿咬住对手。\n有时会使对手畏缩或陷入\n冰冻状态", + effect: "用藏有冷气的牙齿咬住对手。\n有时会使对手畏缩或陷入冰冻状态", }, "fireFang": { name: "火焰牙", - effect: "用覆盖着火焰的牙齿咬住对\n手。有时会使对手畏缩或陷\n入灼伤状态", + effect: "用覆盖着火焰的牙齿咬住对手。\n有时会使对手畏缩或陷入灼伤状态", }, "shadowSneak": { name: "影子偷袭", - effect: "伸长影子,从对手的背后进\n行攻击。必定能够先制攻击", + effect: "伸长影子,从对手的背后进行攻击。\n必定能够先制攻击", }, "mudBomb": { name: "泥巴炸弹", - effect: "向对手发射坚硬的泥弹进行\n攻击。有时会降低对手的命\n中率", + effect: "向对手发射坚硬的泥弹进行攻击。\n有时会降低对手的命中率", }, "psychoCut": { name: "精神利刃", - effect: "用实体化的心之利刃劈开对\n手。容易击中要害", + effect: "用实体化的心之利刃劈开对手。\n容易击中要害", }, "zenHeadbutt": { name: "意念头锤", - effect: "将思念的力量集中在前额进\n行攻击。有时会使对手畏缩", + effect: "将思念的力量集中在前额进行攻击。\n有时会使对手畏缩", }, "mirrorShot": { name: "镜光射击", - effect: "抛光自己的身体,向对手释\n放出闪光之力。有时会降低\n对手的命中率", + effect: "抛光自己的身体,\n向对手释放出闪光之力。\n有时会降低对手的命中率", }, "flashCannon": { name: "加农光炮", - effect: "将身体的光芒聚集在一点释\n放出去。有时会降低对手的\n特防", + effect: "将身体的光芒聚集在一点释放出去。\n有时会降低对手的特防", }, "rockClimb": { name: "攀岩", - effect: "发动猛撞攻击,有时会使对\n手混乱。是宝可表的秘传招\n式之一", + effect: "发动猛撞攻击,有时会使对手混乱。\n是宝可表的秘传招式之一", }, "defog": { name: "清除浓雾", - effect: "用强风吹开对手的反射壁或\n光墙等。也会降低对手的闪\n避率", + effect: "用强风吹开对手的反射壁或光墙等。\n也会降低对手的闪避率", }, "trickRoom": { name: "戏法空间", - effect: "制造出离奇的空间。在5回\n合内速度慢的宝可梦可以先\n行动", + effect: "制造出离奇的空间。在5回合内速\n度慢的宝可梦可以先行动", }, "dracoMeteor": { name: "流星群", - effect: "从天空中向对手落下陨石。\n使用之后因为反作用力,自\n己的特攻会大幅降低", + effect: "从天空中向对手落下陨石。\n使用之后因为反作用力,\n自己的特攻会大幅降低", }, "discharge": { name: "放电", - effect: "用耀眼的电击攻击自己周围\n所有的宝可梦。有时会陷入\n麻痹状态", + effect: "用耀眼的电击攻击\n自己周围所有的宝可梦。\n有时会陷入麻痹状态", }, "lavaPlume": { name: "喷烟", - effect: "用熊熊烈火攻击自己周围所\n有的宝可梦。有时会陷入灼\n伤状态", + effect: "用熊熊烈火攻击自己周围所有的宝可梦。\n有时会陷入灼伤状态", }, "leafStorm": { name: "飞叶风暴", - effect: "用尖尖的叶片向对手卷起风\n暴。使用之后因为反作用力\n自己的特攻会大幅降低", + effect: "用尖尖的叶片向对手卷起风暴。\n使用之后因为反作用力自己的特攻会\n大幅降低", }, "powerWhip": { name: "强力鞭打", - effect: "激烈地挥舞青藤或触手摔打\n对手进行攻击", + effect: "激烈地挥舞青藤或触手摔打对手进行攻击", }, "rockWrecker": { name: "岩石炮", - effect: "向对手发射巨大的岩石进行\n攻击。下一回合自己将无法\n动弹", + effect: "向对手发射巨大的岩石进行攻击。\n下一回合自己将无法动弹", }, "crossPoison": { name: "十字毒刃", - effect: "用毒刃劈开对手。有时会让\n对手陷入中毒状态,也容易\n击中要害", + effect: "用毒刃劈开对手。有时会让对手陷\n入中毒状态,也容易击中要害", }, "gunkShot": { name: "垃圾射击", - effect: "用肮脏的垃圾撞向对手进行\n攻击。有时会让对手陷入中\n毒状态", + effect: "用肮脏的垃圾撞向对手进行攻击。\n有时会让对手陷入中毒状态", }, "ironHead": { name: "铁头", - effect: "用钢铁般坚硬的头部进行攻\n击。有时会使对手畏缩", + effect: "用钢铁般坚硬的头部进行攻击。\n有时会使对手畏缩", }, "magnetBomb": { name: "磁铁炸弹", @@ -1775,83 +1775,83 @@ export const move: MoveTranslationEntries = { }, "stoneEdge": { name: "尖石攻击", - effect: "用尖尖的岩石刺入对手进行\n攻击。容易击中要害", + effect: "用尖尖的岩石刺入对手进行攻击。\n容易击中要害", }, "captivate": { name: "诱惑", - effect: "♂诱惑♀或♀诱惑♂,从而\n大幅降低对手的特攻", + effect: "♂诱惑♀或♀诱惑♂,\n从而大幅降低对手的特攻", }, "stealthRock": { name: "隐形岩", - effect: "将无数岩石悬浮在对手的周\n围,从而对替换出场的对手\n的宝可梦给予伤害", + effect: "将无数岩石悬浮在对手的周围,\n从而对替换出场的对手的宝可梦给予伤害", }, "grassKnot": { name: "打草结", - effect: "用草缠住并绊倒对手。对手\n越重,威力越大", + effect: "用草缠住并绊倒对手。\n对手越重,威力越大", }, "chatter": { name: "喋喋不休", - effect: "用非常烦人的,喋喋不休的\n音波攻击对手。使对手混乱", + effect: "用非常烦人的,\n喋喋不休的音波攻击对手。\n使对手混乱", }, "judgment": { name: "制裁光砾", - effect: "向对手放出无数的光弹。属\n性会根据自己携带的石板不\n同而改变", + effect: "向对手放出无数的光弹。\n属性会根据自己携带的石板不同而改变", }, "bugBite": { name: "虫咬", - effect: "咬住进行攻击。当对手携带\n树果时,可以食用并获得其\n效果", + effect: "咬住进行攻击。当对手携带树果时,\n可以食用并获得其效果", }, "chargeBeam": { name: "充电光束", - effect: "向对手发射电击光束。由于\n蓄满电流,有时会提高自己\n的特攻", + effect: "向对手发射电击光束。\n由于蓄满电流,有时会提高自己的特攻", }, "woodHammer": { name: "木槌", - effect: "用坚硬的躯体撞击对手进行\n攻击。自己也会受到不小的\n伤害", + effect: "用坚硬的躯体撞击对手进行攻击。\n自己也会受到不小的伤害", }, "aquaJet": { name: "水流喷射", - effect: "以迅雷不及掩耳之势扑向对\n手。必定能够先制攻击", + effect: "以迅雷不及掩耳之势扑向对手。\n必定能够先制攻击", }, "attackOrder": { name: "攻击指令", - effect: "召唤手下,让其朝对手发起\n攻击。容易击中要害", + effect: "召唤手下,让其朝对手发起攻击。\n容易击中要害", }, "defendOrder": { name: "防御指令", - effect: "召唤手下,让其附在自己的\n身体上。可以提高自己的防\n御和特防", + effect: "召唤手下,让其附在自己的身体上。\n可以提高自己的防御和特防", }, "healOrder": { name: "回复指令", - effect: "召唤手下疗伤。回复自己最\n大HP的一半", + effect: "召唤手下疗伤。回复自己最大HP的一半", }, "headSmash": { name: "双刃头锤", - effect: "拼命使出浑身力气,向对手\n进行头锤攻击。自己也会受\n到非常大的伤害", + effect: "拼命使出浑身力气,\n向对手进行头锤攻击。\n自己也会受到非常大的伤害", }, "doubleHit": { name: "二连击", - effect: "使用尾巴等拍打对手进行攻\n击。连续2次给予伤害", + effect: "使用尾巴等拍打对手进行攻击。\n连续2次给予伤害", }, "roarOfTime": { name: "时光咆哮", - effect: "释放出扭曲时间般的强大力\n量攻击对手。下一回合自己\n将无法动弹", + effect: "释放出扭曲时间般的强大力量攻击对手。\n下一回合自己将无法动弹", }, "spacialRend": { name: "亚空裂斩", - effect: "将对手连同周围的空间一起\n撕裂并给予伤害。容易击中\n要害", + effect: "将对手连同周围的空间一起撕裂并\n给予伤害。容易击中要害", }, "lunarDance": { name: "新月舞", - effect: "虽然自己陷入昏厥,但可以\n治愈后备上场的宝可梦的全\n部状态", + effect: "虽然自己陷入昏厥,但可以治愈后\n备上场的宝可梦的全部状态", }, "crushGrip": { name: "捏碎", - effect: "用骇人的力量捏碎对手。对\n手剩余的HP越多,威力越\n大", + effect: "用骇人的力量捏碎对手。\n对手剩余的HP越多,威力越大", }, "magmaStorm": { name: "熔岩风暴", - effect: "将对手困在熊熊燃烧的火焰\n中,在4~5回合内进行攻\n击", + effect: "将对手困在熊熊燃烧的火焰中,\n在4~5回合内进行攻击", }, "darkVoid": { name: "暗黑洞", @@ -1859,211 +1859,211 @@ export const move: MoveTranslationEntries = { }, "seedFlare": { name: "种子闪光", - effect: "从身体里产生冲击波。有时\n会大幅降低对手的特防", + effect: "从身体里产生冲击波。\n有时会大幅降低对手的特防", }, "ominousWind": { name: "奇异之风", - effect: "突然刮起毛骨悚然的暴风攻\n击对手。有时会提高自己的\n全部能力", + effect: "突然刮起毛骨悚然的暴风攻击对手。\n有时会提高自己的全部能力", }, "shadowForce": { name: "暗影潜袭", - effect: "第1回合消失踪影,第2回\n合攻击对手。即使对手正受\n保护,也能击中", + effect: "第1回合消失踪影,第2回合攻击对手。\n即使对手正受保护,\n也能击中", }, "honeClaws": { name: "磨爪", - effect: "将爪子磨得更加锋利。提高\n自己的攻击和命中率", + effect: "将爪子磨得更加锋利。\n提高自己的攻击和命中率", }, "wideGuard": { name: "广域防守", - effect: "在1回合内防住击打我方全\n员的攻击", + effect: "在1回合内防住击打我方全员的攻击", }, "guardSplit": { name: "防守平分", - effect: "利用超能力将自己和对手的\n防御和特防相加,再进行平\n分", + effect: "利用超能力将自己和对手的防御和\n特防相加,再进行平分", }, "powerSplit": { name: "力量平分", - effect: "利用超能力将自己和对手的\n攻击和特攻相加,再进行平\n分", + effect: "利用超能力将自己和对手的攻击和\n特攻相加,再进行平分", }, "wonderRoom": { name: "奇妙空间", - effect: "制造出离奇的空间。在5回\n合内互换所有宝可梦的防御\n和特防", + effect: "制造出离奇的空间。在5回合内互\n换所有宝可梦的防御和特防", }, "psyshock": { name: "精神冲击", - effect: "将神奇的念波实体化攻击对\n手。给予物理伤害", + effect: "将神奇的念波实体化攻击对手。\n给予物理伤害", }, "venoshock": { name: "毒液冲击", - effect: "将特殊的毒液泼向对手。对\n处于中毒状态的对手,威力\n会变成2倍", + effect: "将特殊的毒液泼向对手。\n对处于中毒状态的对手,威力会变成2倍", }, "autotomize": { name: "身体轻量化", - effect: "削掉身体上没用的部分。大\n幅提高自己的速度,同时体\n重也会变轻", + effect: "削掉身体上没用的部分。\n大幅提高自己的速度,同时体重也会变轻", }, "ragePowder": { name: "愤怒粉", - effect: "将令人烦躁的粉末撒在自己\n身上,用以吸引对手的注意。\n使对手的攻击全部指向自\n己", + effect: "将令人烦躁的粉末撒在自己身上,\n用以吸引对手的注意。\n使对手的攻击全部指向自己", }, "telekinesis": { name: "意念移物", - effect: "利用超能力使对手浮起来。\n在3回合内攻击会变得容易\n打中对手", + effect: "利用超能力使对手浮起来。\n在3回合内攻击会变得容易打中对手", }, "magicRoom": { name: "魔法空间", - effect: "制造出离奇的空间。在5回\n合内所有宝可梦携带道具的\n效果都会消失", + effect: "制造出离奇的空间。在5回合内所\n有宝可梦携带道具的效果都会消失", }, "smackDown": { name: "击落", - effect: "扔石头或炮弹,攻击飞行的\n对手。对手会被击落,掉到\n地面", + effect: "扔石头或炮弹,攻击飞行的对手。\n对手会被击落,掉到地面", }, "stormThrow": { name: "山岚摔", - effect: "向对手使出强烈的一击。攻\n击必定会击中要害", + effect: "向对手使出强烈的一击。\n攻击必定会击中要害", }, "flameBurst": { name: "烈焰溅射", - effect: "如果击中,爆裂的火焰会攻\n击到对手。爆裂出的火焰还\n会飞溅到旁边的对手", + effect: "如果击中,爆裂的火焰会攻击到对手。\n爆裂出的火焰还会飞溅到旁边的对手", }, "sludgeWave": { name: "污泥波", - effect: "用污泥波攻击自己周围所有\n的宝可梦。有时会陷入中毒\n状态", + effect: "用污泥波攻击自己周围所有的宝可梦。\n有时会陷入中毒状态", }, "quiverDance": { name: "蝶舞", - effect: "轻巧地跳起神秘而又美丽的\n舞蹈。提高自己的特攻、特\n防和速度", + effect: "轻巧地跳起神秘而又美丽的舞蹈。\n提高自己的特攻、特防和速度", }, "heavySlam": { name: "重磅冲撞", - effect: "用沉重的身体撞向对手进行\n攻击。自己比对手越重,威\n力越大", + effect: "用沉重的身体撞向对手进行攻击。\n自己比对手越重,威力越大", }, "synchronoise": { name: "同步干扰", - effect: "用神奇电波对周围所有和自\n己属性相同的宝可梦给予伤\n害", + effect: "用神奇电波对周围所有和自己属性\n相同的宝可梦给予伤害", }, "electroBall": { name: "电球", - effect: "用电气团撞向对手。自己比\n对手速度越快,威力越大", + effect: "用电气团撞向对手。\n自己比对手速度越快,\n威力越大", }, "soak": { name: "浸水", - effect: "将大量的水泼向对手,从而\n使其变成水属性", + effect: "将大量的水泼向对手,\n从而使其变成水属性", }, "flameCharge": { name: "蓄能焰袭", - effect: "让火焰覆盖全身,攻击对手。\n积蓄力量来提高自己的速\n度", + effect: "让火焰覆盖全身,攻击对手。\n积蓄力量来提高自己的速度", }, "coil": { name: "盘蜷", - effect: "盘蜷着集中精神。提高自己\n的攻击、防御和命中率", + effect: "盘蜷着集中精神。提高自己的攻击\n、防御和命中率", }, "lowSweep": { name: "下盘踢", - effect: "以敏捷的动作瞄准对手的脚\n进行攻击。会降低对手的速\n度", + effect: "以敏捷的动作瞄准对手的脚进行攻击。\n会降低对手的速度", }, "acidSpray": { name: "酸液炸弹", - effect: "喷出能溶化对手的液体进行\n攻击。会大幅降低对手的特\n防", + effect: "喷出能溶化对手的液体进行攻击。\n会大幅降低对手的特防", }, "foulPlay": { name: "欺诈", - effect: "利用对手的力量进行攻击。\n正和自己战斗的对手,其攻\n击越高,伤害越大", + effect: "利用对手的力量进行攻击。\n正和自己战斗的对手,其攻击越高,\n伤害越大", }, "simpleBeam": { name: "单纯光束", - effect: "向对手发送谜之念波。接收\n到念波的对手,其特性会变\n为单纯", + effect: "向对手发送谜之念波。\n接收到念波的对手,其特性会变为单纯", }, "entrainment": { name: "找伙伴", - effect: "用神奇的节奏跳舞。使对手\n模仿自己的动作,从而将特\n性变成一样", + effect: "用神奇的节奏跳舞。使对手模仿自\n己的动作,从而将特性变成一样", }, "afterYou": { name: "您先请", - effect: "支援我方或对手的行动,使\n其紧接着此招式之后行动", + effect: "支援我方或对手的行动,\n使其紧接着此招式之后行动", }, "round": { name: "轮唱", - effect: "用歌声攻击对手。大家一起\n轮唱便可以接连使出,威力\n也会提高", + effect: "用歌声攻击对手。大家一起轮唱便\n可以接连使出,威力也会提高", }, "echoedVoice": { name: "回声", - effect: "用回声攻击对手。如果每回\n合都有宝可梦接着使用该招\n式,威力就会提高", + effect: "用回声攻击对手。如果每回合都有\n宝可梦接着使用该招式,\n威力就会提高", }, "chipAway": { name: "逐步击破", - effect: "看准机会稳步攻击。无视对\n手的能力变化,直接给予伤\n害", + effect: "看准机会稳步攻击。\n无视对手的能力变化,\n直接给予伤害", }, "clearSmog": { name: "清除之烟", - effect: "向对手投掷特殊的泥块进行\n攻击。使其能力变回原点", + effect: "向对手投掷特殊的泥块进行攻击。\n使其能力变回原点", }, "storedPower": { name: "辅助力量", - effect: "用蓄积起来的力量攻击对手。\n自己的能力提高得越多,\n威力就越大", + effect: "用蓄积起来的力量攻击对手。\n自己的能力提高得越多,威力就越大", }, "quickGuard": { name: "快速防守", - effect: "守护自己和同伴,以防对手\n的先制攻击", + effect: "守护自己和同伴,以防对手的先制攻击", }, "allySwitch": { name: "交换场地", - effect: "用神奇的力量瞬间移动,互\n换自己和同伴所在的位置。\n连续使出则容易失败", + effect: "用神奇的力量瞬间移动,\n互换自己和同伴所在的位置。\n连续使出则容易失败", }, "scald": { name: "热水", - effect: "向对手喷射煮得翻滚的开水\n进行攻击。有时会让对手陷\n入灼伤状态", + effect: "向对手喷射煮得翻滚的开水进行攻击。\n有时会让对手陷入灼伤状态", }, "shellSmash": { name: "破壳", - effect: "打破外壳,降低自己的防御\n和特防,但大幅提高攻击、\n特攻和速度", + effect: "打破外壳,降低自己的防御和特防,\n但大幅提高攻击、特攻和速度", }, "healPulse": { name: "治愈波动", - effect: "放出治愈波动,从而回复对\n手最大HP的一半", + effect: "放出治愈波动,从而回复对手最大\nHP的一半", }, "hex": { name: "祸不单行", - effect: "接二连三地进行攻击。对处\n于异常状态的对手给予较大\n的伤害", + effect: "接二连三地进行攻击。\n对处于异常状态的对手给予较大的伤害", }, "skyDrop": { name: "自由落体", - effect: "第1回合将对手带到空中,\n第2回合将其摔下进行攻击。\n被带到空中的对手不能动\n弹", + effect: "第1回合将对手带到空中,\n第2回合将其摔下进行攻击。\n被带到空中的对手不能动弹", }, "shiftGear": { name: "换档", - effect: "转动齿轮,不仅提高自己的\n攻击,还会大幅提高速度", + effect: "转动齿轮,不仅提高自己的攻击,\n还会大幅提高速度", }, "circleThrow": { name: "巴投", - effect: "扔飞对手,强制拉后备宝可\n梦上场。如果对手为野生宝\n可梦,战斗将直接结束", + effect: "扔飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", }, "incinerate": { name: "烧净", - effect: "用火焰攻击对手。对手携带\n树果等时,会烧掉,使其不\n能使用", + effect: "用火焰攻击对手。对手携带树果等时,\n会烧掉,使其不能使用", }, "quash": { name: "延后", - effect: "压制对手,从而将其行动顺\n序放到最后", + effect: "压制对手,从而将其行动顺序放到最后", }, "acrobatics": { name: "杂技", - effect: "轻巧地攻击对手。自己没有\n携带道具时,会给予较大的\n伤害", + effect: "轻巧地攻击对手。自己没有携带道具时,\n会给予较大的伤害", }, "reflectType": { name: "镜面属性", - effect: "反射对手的属性,让自己也\n变成一样的属性", + effect: "反射对手的属性,让自己也变成一\n样的属性", }, "retaliate": { name: "报仇", - effect: "为倒下的同伴报仇。如果上\n一回合有同伴倒下,威力就\n会提高", + effect: "为倒下的同伴报仇。如果上一回合\n有同伴倒下,威力就会提高", }, "finalGambit": { name: "搏命", - effect: "拼命攻击对手。虽然自己陷\n入昏厥,但会给予对手和自\n己目前HP等量的伤害", + effect: "拼命攻击对手。虽然自己陷入昏厥,\n但会给予对手和自己目前HP等\n量的伤害", }, "bestow": { name: "传递礼物", - effect: "当对手未携带道具时,能够\n将自己携带的道具交给对手", + effect: "当对手未携带道具时,\n能够将自己携带的道具交给对手", }, "inferno": { name: "烈火深渊", @@ -2071,39 +2071,39 @@ export const move: MoveTranslationEntries = { }, "waterPledge": { name: "水之誓约", - effect: "用水柱进行攻击。如果和火\n组合,威力就会提高,天空\n中会挂上彩虹", + effect: "用水柱进行攻击。如果和火组合,\n威力就会提高,天空中会挂上彩虹", }, "firePledge": { name: "火之誓约", - effect: "用火柱进行攻击。如果和草\n组合,威力就会提高,周围\n会变成火海", + effect: "用火柱进行攻击。如果和草组合,\n威力就会提高,周围会变成火海", }, "grassPledge": { name: "草之誓约", - effect: "用草柱进行攻击。如果和水\n组合,威力就会提高,周围\n会变成湿地", + effect: "用草柱进行攻击。如果和水组合,\n威力就会提高,周围会变成湿地", }, "voltSwitch": { name: "伏特替换", - effect: "在攻击之后急速返回,和后\n备宝可梦进行替换", + effect: "在攻击之后急速返回,\n和后备宝可梦进行替换", }, "struggleBug": { name: "虫之抵抗", - effect: "抵抗并攻击对手。会降低对\n手的特攻", + effect: "抵抗并攻击对手。会降低对手的特攻", }, "bulldoze": { name: "重踏", - effect: "用力踩踏地面并攻击自己周\n围所有的宝可梦。会降低对\n方的速度", + effect: "用力踩踏地面并攻击自己周围所有\n的宝可梦。会降低对方的速度", }, "frostBreath": { name: "冰息", - effect: "将冰冷的气息吹向对手进行\n攻击。必定会击中要害", + effect: "将冰冷的气息吹向对手进行攻击。\n必定会击中要害", }, "dragonTail": { name: "龙尾", - effect: "弹飞对手,强制拉后备宝可\n梦上场。如果对手为野生宝\n可梦,战斗将直接结束", + effect: "弹飞对手,强制拉后备宝可梦上场。\n如果对手为野生宝可梦,\n战斗将直接结束", }, "workUp": { name: "自我激励", - effect: "激励自己,从而提高攻击和\n特攻", + effect: "激励自己,从而提高攻击和特攻", }, "electroweb": { name: "电网", @@ -2111,39 +2111,39 @@ export const move: MoveTranslationEntries = { }, "wildCharge": { name: "疯狂伏特", - effect: "让电流覆盖全身,撞向对手\n进行攻击。自己也会受到少\n许伤害", + effect: "让电流覆盖全身,撞向对手进行攻击。\n自己也会受到少许伤害", }, "drillRun": { name: "直冲钻", - effect: "像钢钻一样,一边旋转身体\n一边撞击对手。容易击中要\n害", + effect: "像钢钻一样,\n一边旋转身体一边撞击对手。\n容易击中要害", }, "dualChop": { name: "二连劈", - effect: "用身体坚硬的部分拍打对手\n进行攻击。连续2次给予伤\n害", + effect: "用身体坚硬的部分拍打对手进行攻击。\n连续2次给予伤害", }, "heartStamp": { name: "爱心印章", - effect: "以可爱的动作使对手疏忽,\n乘机给出强烈的一击。有时\n会使对手畏缩", + effect: "以可爱的动作使对手疏忽,\n乘机给出强烈的一击。有时会使对手畏缩", }, "hornLeech": { name: "木角", - effect: "将角刺入,吸取对手的养分。\n可以回复给予对手伤害的\n一半HP", + effect: "将角刺入,吸取对手的养分。\n可以回复给予对手伤害的一半HP", }, "sacredSword": { name: "圣剑", - effect: "用剑切斩对手进行攻击。无\n视对手的能力变化,直接给\n予伤害", + effect: "用剑切斩对手进行攻击。\n无视对手的能力变化,直接给予伤害", }, "razorShell": { name: "贝壳刃", - effect: "用锋利的贝壳切斩对手进行\n攻击。有时会降低对手的防\n御", + effect: "用锋利的贝壳切斩对手进行攻击。\n有时会降低对手的防御", }, "heatCrash": { name: "高温重压", - effect: "用燃烧的身体撞向对手进行\n攻击。自己比对手越重,威\n力越大", + effect: "用燃烧的身体撞向对手进行攻击。\n自己比对手越重,威力越大", }, "leafTornado": { name: "青草搅拌器", - effect: "用锋利的叶片包裹住对手进\n行攻击。有时会降低对手的\n命中率", + effect: "用锋利的叶片包裹住对手进行攻击。\n有时会降低对手的命中率", }, "steamroller": { name: "疯狂滚压", @@ -2151,7 +2151,7 @@ export const move: MoveTranslationEntries = { }, "cottonGuard": { name: "棉花防守", - effect: "用软绵绵的绒毛包裹住自己\n的身体进行守护。巨幅提高\n自己的防御", + effect: "用软绵绵的绒毛包裹住自己的身体\n进行守护。巨幅提高自己的防御", }, "nightDaze": { name: "暗黑爆破", @@ -2159,91 +2159,91 @@ export const move: MoveTranslationEntries = { }, "psystrike": { name: "精神击破", - effect: "将神奇的念波实体化攻击对\n手。给予物理伤害", + effect: "将神奇的念波实体化攻击对手。\n给予物理伤害", }, "tailSlap": { name: "扫尾拍打", - effect: "用坚硬的尾巴拍打对手进行\n攻击。连续攻击2~5次", + effect: "用坚硬的尾巴拍打对手进行攻击。\n连续攻击2~5次", }, "hurricane": { name: "暴风", - effect: "用强烈的风席卷对手进行攻\n击。有时会使对手混乱", + effect: "用强烈的风席卷对手进行攻击。\n有时会使对手混乱", }, "headCharge": { name: "爆炸头突击", - effect: "用厉害的爆炸头猛撞向对手\n进行攻击。自己也会受到少\n许伤害", + effect: "用厉害的爆炸头猛撞向对手进行攻击。\n自己也会受到少许伤害", }, "gearGrind": { name: "齿轮飞盘", - effect: "向对手投掷钢铁齿轮进行攻\n击。连续2次给予伤害", + effect: "向对手投掷钢铁齿轮进行攻击。\n连续2次给予伤害", }, "searingShot": { name: "火焰弹", - effect: "用熊熊烈火攻击自己周围所\n有的宝可梦。有时会陷入灼\n伤状态", + effect: "用熊熊烈火攻击自己周围所有的宝可梦。\n有时会陷入灼伤状态", }, "technoBlast": { name: "高科技光炮", - effect: "向对手放出光弹。属性会根\n据自己携带的卡带不同而改\n变", + effect: "向对手放出光弹。属性会根据自己\n携带的卡带不同而改变", }, "relicSong": { name: "古老之歌", - effect: "让对手听古老之歌,打动对\n手的内心进行攻击。有时会\n让对手陷入睡眠状态", + effect: "让对手听古老之歌,打动对手的内\n心进行攻击。有时会让对手陷入睡眠状态", }, "secretSword": { name: "神秘之剑", - effect: "用长角切斩对手进行攻击。\n角上拥有的神奇力量将给予\n物理伤害", + effect: "用长角切斩对手进行攻击。\n角上拥有的神奇力量将给予物理伤害", }, "glaciate": { name: "冰封世界", - effect: "将冰冻的冷气吹向对手进行\n攻击。会降低对手的速度", + effect: "将冰冻的冷气吹向对手进行攻击。\n会降低对手的速度", }, "boltStrike": { name: "雷击", - effect: "让强大的电流覆盖全身,猛\n撞向对手进行攻击。有时会\n让对手陷入麻痹状态", + effect: "让强大的电流覆盖全身,\n猛撞向对手进行攻击。\n有时会让对手陷入麻痹状态", }, "blueFlare": { name: "青焰", - effect: "用美丽而激烈的青焰包裹住\n对手进行攻击。有时会让对\n手陷入灼伤状态", + effect: "用美丽而激烈的青焰\n包裹住对手进行攻击。\n有时会让对手陷入灼伤状态", }, "fieryDance": { name: "火之舞", - effect: "让火焰覆盖全身,振翅攻击\n对手。有时会提高自己的特\n攻", + effect: "让火焰覆盖全身,振翅攻击对手。\n有时会提高自己的特攻", }, "freezeShock": { name: "冰冻伏特", - effect: "用覆盖着电流的冰块,在第\n2回合撞向对手。有时会让\n对手陷入麻痹状态", + effect: "用覆盖着电流的冰块,\n在第2回合撞向对手。\n有时会让对手陷入麻痹状态", }, "iceBurn": { name: "极寒冷焰", - effect: "用能够冻结一切的强烈冷气,\n在第2回合包裹住对手。\n有时会让对手陷入灼伤状态", + effect: "用能够冻结一切的强烈冷气,\n在第2回合包裹住对手。有时会让对手\n陷入灼伤状态", }, "snarl": { name: "大声咆哮", - effect: "没完没了地大声斥责,从而\n降低对手的特攻", + effect: "没完没了地大声斥责,\n从而降低对手的特攻", }, "icicleCrash": { name: "冰柱坠击", - effect: "用大冰柱激烈地撞向对手进\n行攻击。有时会使对手畏缩", + effect: "用大冰柱激烈地撞向对手进行攻击。\n有时会使对手畏缩", }, "vCreate": { name: "V热焰", - effect: "从前额产生灼热的火焰,舍\n身撞击对手。防御、特防和\n速度会降低", + effect: "从前额产生灼热的火焰,\n舍身撞击对手。防御、特防和速度会降低", }, "fusionFlare": { name: "交错火焰", - effect: "释放出巨大的火焰。受到巨\n大的闪电影响时,招式威力\n会提高", + effect: "释放出巨大的火焰。受到巨大的闪\n电影响时,招式威力会提高", }, "fusionBolt": { name: "交错闪电", - effect: "释放出巨大的闪电。受到巨\n大的火焰影响时,招式威力\n会提高", + effect: "释放出巨大的闪电。受到巨大的火\n焰影响时,招式威力会提高", }, "flyingPress": { name: "飞身重压", - effect: "从空中俯冲向对手。此招式\n同时带有格斗属性和飞行属\n性", + effect: "从空中俯冲向对手。此招式同时带\n有格斗属性和飞行属性", }, "matBlock": { name: "掀榻榻米", - effect: "将掀起来的榻榻米当作盾牌,\n防住自己和同伴免受招式\n伤害。变化招式无法防住", + effect: "将掀起来的榻榻米当作盾牌,\n防住自己和同伴免受招式伤害。\n变化招式无法防住", }, "belch": { name: "打嗝", @@ -2251,7 +2251,7 @@ export const move: MoveTranslationEntries = { }, "rototiller": { name: "耕地", - effect: "翻耕土地,使草木更容易成\n长。会提高草属性宝可梦的\n攻击和特攻", + effect: "翻耕土地,使草木更容易成长。\n会提高草属性宝可梦的攻击和特攻", }, "stickyWeb": { name: "黏黏网", @@ -2263,79 +2263,79 @@ export const move: MoveTranslationEntries = { }, "phantomForce": { name: "潜灵奇袭", - effect: "第1回合消失在某处,第2\n回合攻击对手。可以无视守\n护进行攻击", + effect: "第1回合消失在某处,\n第2回合攻击对手。\n可以无视守护进行攻击", }, "trickOrTreat": { name: "万圣夜", - effect: "邀请对手参加万圣夜。使对\n手被追加幽灵属性", + effect: "邀请对手参加万圣夜。\n使对手被追加幽灵属性", }, "nobleRoar": { name: "战吼", - effect: "发出战吼威吓对手,从而降\n低对手的攻击和特攻", + effect: "发出战吼威吓对手,从而降低对手\n的攻击和特攻", }, "ionDeluge": { name: "等离子浴", - effect: "将带电粒子扩散开来,使一\n般属性的招式变成电属性", + effect: "将带电粒子扩散开来,\n使一般属性的招式变成电属性", }, "parabolicCharge": { name: "抛物面充电", - effect: "给周围全体宝可梦造成伤害。\n可以回复给予伤害的一半\nHP", + effect: "给周围全体宝可梦造成伤害。\n可以回复给予伤害的一半HP", }, "forestsCurse": { name: "森林咒术", - effect: "向对手施加森林咒术。中了\n咒术的对手会被追加草属性", + effect: "向对手施加森林咒术。\n中了咒术的对手会被追加草属性", }, "petalBlizzard": { name: "落英缤纷", - effect: "猛烈地刮起飞雪般的落花,\n攻击周围所有的宝可梦,并\n给予伤害", + effect: "猛烈地刮起飞雪般的落花,\n攻击周围所有的宝可梦,并给予伤害", }, "freezeDry": { name: "冷冻干燥", - effect: "急剧冷冻对手,有时会让对\n手陷入冰冻状态。对于水属\n性宝可梦也是效果绝佳", + effect: "急剧冷冻对手,有时会让对手陷入\n冰冻状态。对于水属性宝可梦也是\n效果绝佳", }, "disarmingVoice": { name: "魅惑之声", - effect: "发出魅惑的叫声,给予对手\n精神上的伤害。攻击必定会\n命中", + effect: "发出魅惑的叫声,\n给予对手精神上的伤害。\n攻击必定会命中", }, "partingShot": { name: "抛下狠话", - effect: "抛下狠话威吓对手,降低攻\n击和特攻后,和后备宝可梦\n进行替换", + effect: "抛下狠话威吓对手,降低攻击和特攻后,\n和后备宝可梦进行替换", }, "topsyTurvy": { name: "颠倒", - effect: "颠倒对手身上的所有能力变\n化,变成和原来相反的状态", + effect: "颠倒对手身上的所有能力变化,\n变成和原来相反的状态", }, "drainingKiss": { name: "吸取之吻", - effect: "用一个吻吸取对手的HP。\n回复给予对手伤害的一半以\n上的HP", + effect: "用一个吻吸取对手的HP。\n回复给予对手伤害的一半以上的HP", }, "craftyShield": { name: "戏法防守", - effect: "使用神奇的力量防住攻击我\n方的变化招式。但无法防住\n伤害招式的攻击", + effect: "使用神奇的力量防住\n攻击我方的变化招式。\n但无法防住伤害招式的攻击", }, "flowerShield": { name: "鲜花防守", - effect: "使用神奇的力量提高在场的\n所有草属性宝可梦的防御", + effect: "使用神奇的力量提高在场的所有草\n属性宝可梦的防御", }, "grassyTerrain": { name: "青草场地", - effect: "在5回合内变成青草场地。\n地面上的宝可梦每回合都能\n回复。草属性的招式威力还\n会提高", + effect: "在5回合内变成青草场地。\n地面上的宝可梦每回合都能回复。\n草属性的招式威力还会提高", }, "mistyTerrain": { name: "薄雾场地", - effect: "在5回合内,地面上的宝可\n梦不会陷入异常状态。龙属\n性招式的伤害也会减半", + effect: "在5回合内,地面上的宝可梦不会\n陷入异常状态。龙属性招式的伤害\n也会减半", }, "electrify": { name: "输电", - effect: "对手使出招式前,如果输电,\n则该回合对手的招式变成\n电属性", + effect: "对手使出招式前,如果输电,\n则该回合对手的招式变成电属性", }, "playRough": { name: "嬉闹", - effect: "与对手嬉闹并攻击。有时会\n降低对手的攻击", + effect: "与对手嬉闹并攻击。有时会降低对\n手的攻击", }, "fairyWind": { name: "妖精之风", - effect: "刮起妖精之风,吹向对手进\n行攻击", + effect: "刮起妖精之风,吹向对手进行攻击", }, "moonblast": { name: "月亮之力", @@ -2343,83 +2343,83 @@ export const move: MoveTranslationEntries = { }, "boomburst": { name: "爆音波", - effect: "通过震耳欲聋的爆炸声产生\n的破坏力,攻击自己周围所\n有的宝可梦", + effect: "通过震耳欲聋的爆炸声产生的破坏力,\n攻击自己周围所有的宝可梦", }, "fairyLock": { name: "妖精之锁", - effect: "通过封锁,下一回合所有的\n宝可梦都无法逃走", + effect: "通过封锁,下一回合所有的宝可梦\n都无法逃走", }, "kingsShield": { name: "王者盾牌", - effect: "防住对手攻击的同时,自己\n变为防御姿态。能够降低所\n接触到的对手的攻击", + effect: "防住对手攻击的同时,\n自己变为防御姿态。\n能够降低所接触到的对手的攻击", }, "playNice": { name: "和睦相处", - effect: "和对手和睦相处,使其失去\n战斗的气力,从而降低对手\n的攻击", + effect: "和对手和睦相处,使其失去战斗的气力,\n从而降低对手的攻击", }, "confide": { name: "密语", - effect: "和对手进行密语,使其失去\n集中力,从而降低对手的特\n攻", + effect: "和对手进行密语,使其失去集中力,\n从而降低对手的特攻", }, "diamondStorm": { name: "钻石风暴", - effect: "掀起钻石风暴给予伤害。有\n时会大幅提高自己的防御", + effect: "掀起钻石风暴给予伤害。\n有时会大幅提高自己的防御", }, "steamEruption": { name: "蒸汽爆炸", - effect: "将滚烫的蒸汽喷向对手。有\n时会让对手灼伤", + effect: "将滚烫的蒸汽喷向对手。\n有时会让对手灼伤", }, "hyperspaceHole": { name: "异次元洞", - effect: "通过异次元洞,突然出现在\n对手的侧面进行攻击。还可\n以无视守住和看穿等招式", + effect: "通过异次元洞,突然出现在对手的\n侧面进行攻击。还可以无视守住和\n看穿等招式", }, "waterShuriken": { name: "飞水手里剑", - effect: "用粘液制成的手里剑,连续\n攻击2~5次。必定能够先\n制攻击", + effect: "用粘液制成的手里剑,\n连续攻击2~5次。必定能够先制攻击", }, "mysticalFire": { name: "魔法火焰", - effect: "从口中喷出特别灼热的火焰\n进行攻击。降低对手的特攻", + effect: "从口中喷出特别灼热的火焰进行攻击。\n降低对手的特攻", }, "spikyShield": { name: "尖刺防守", - effect: "防住对手攻击的同时,削减\n接触到自己的对手的体力", + effect: "防住对手攻击的同时,\n削减接触到自己的对手的体力", }, "aromaticMist": { name: "芳香薄雾", - effect: "通过神奇的芳香,提高我方\n宝可梦的特防", + effect: "通过神奇的芳香,提高我方宝可梦的特防", }, "eerieImpulse": { name: "怪异电波", - effect: "从身体放射出怪异电波,让\n对手沐浴其中,从而大幅降\n低其特攻", + effect: "从身体放射出怪异电波,\n让对手沐浴其中,从而大幅降低其特攻", }, "venomDrench": { name: "毒液陷阱", - effect: "将特殊的毒液泼向对手。对\n处于中毒状态的对手,其攻\n击、特攻和速度都会降低", + effect: "将特殊的毒液泼向对手。\n对处于中毒状态的对手,其攻击、\n特攻和速度都会降低", }, "powder": { name: "粉尘", - effect: "如果被撒到粉尘的对手使用\n火招式,则会爆炸并给予伤\n害", + effect: "如果被撒到粉尘的对手使用火招式,\n则会爆炸并给予伤害", }, "geomancy": { name: "大地掌控", - effect: "第1回合吸收能量,第2回\n合大幅提高特攻、特防和速\n度", + effect: "第1回合吸收能量,第2回合大幅\n提高特攻、特防和速度", }, "magneticFlux": { name: "磁场操控", - effect: "通过操控磁场,会提高特性\n为正电和负电的宝可梦的防\n御和特防", + effect: "通过操控磁场,会提高特性为正电\n和负电的宝可梦的防御和特防", }, "happyHour": { name: "欢乐时光", - effect: "如果使用欢乐时光,战斗后\n得到的钱会翻倍", + effect: "如果使用欢乐时光,战斗后得到的\n钱会翻倍", }, "electricTerrain": { name: "电气场地", - effect: "在5回合内变成电气场地。\n地面上的宝可梦将无法入眠。\n电属性的招式威力还会提\n高", + effect: "在5回合内变成电气场地。\n地面上的宝可梦将无法入眠。\n电属性的招式威力还会提高", }, "dazzlingGleam": { name: "魔法闪耀", - effect: "向对手发射强光,并给予伤\n害", + effect: "向对手发射强光,并给予伤害", }, "celebrate": { name: "庆祝", @@ -2427,55 +2427,55 @@ export const move: MoveTranslationEntries = { }, "holdHands": { name: "牵手", - effect: "我方宝可梦之间牵手。能带\n来非常幸福的心情", + effect: "我方宝可梦之间牵手。\n能带来非常幸福的心情", }, "babyDollEyes": { name: "圆瞳", - effect: "用圆瞳凝视对手,从而降低\n其攻击。必定能够先制攻击", + effect: "用圆瞳凝视对手,从而降低其攻击。\n必定能够先制攻击", }, "nuzzle": { name: "蹭蹭脸颊", - effect: "将带电的脸颊蹭蹭对手进行\n攻击。让对手陷入麻痹状态", + effect: "将带电的脸颊蹭蹭对手进行攻击。\n让对手陷入麻痹状态", }, "holdBack": { name: "手下留情", - effect: "在攻击的时候手下留情,从\n而使对手的HP至少会留下\n1HP", + effect: "在攻击的时候手下留情,\n从而使对手的HP至少会留下1HP", }, "infestation": { name: "纠缠不休", - effect: "在4~5回合内死缠烂打地\n进行攻击。在此期间对手将\n无法逃走", + effect: "在4~5回合内死缠烂打地进行攻击。\n在此期间对手将无法逃走", }, "powerUpPunch": { name: "增强拳", - effect: "通过反复击打对手,使自己\n的拳头慢慢变硬。打中对手\n攻击就会提高", + effect: "通过反复击打对手,使自己的拳头\n慢慢变硬。打中对手攻击就会提高", }, "oblivionWing": { name: "归天之翼", - effect: "从锁定的对手身上吸取HP。\n回复给予对手伤害的一半\n以上的HP", + effect: "从锁定的对手身上吸取HP。\n回复给予对手伤害的一半以上的HP", }, "thousandArrows": { name: "千箭齐发", - effect: "可以击中浮在空中的宝可梦。\n空中的对手被击落后,会\n掉到地面", + effect: "可以击中浮在空中的宝可梦。\n空中的对手被击落后,会掉到地面", }, "thousandWaves": { name: "千波激荡", - effect: "从地面掀起波浪进行攻击。\n被掀入波浪中的对手,将无\n法从战斗中逃走", + effect: "从地面掀起波浪进行攻击。\n被掀入波浪中的对手,\n将无法从战斗中逃走", }, "landsWrath": { name: "大地神力", - effect: "聚集大地的力量,将此力量\n集中攻击对手,并给予伤害", + effect: "聚集大地的力量,\n将此力量集中攻击对手,\n并给予伤害", }, "lightOfRuin": { name: "破灭之光", - effect: "借用永恒之花的力量,发射\n出强力光线。自己也会受到\n非常大的伤害", + effect: "借用永恒之花的力量,\n发射出强力光线。\n自己也会受到非常大的伤害", }, "originPulse": { name: "根源波动", - effect: "用无数青白色且闪耀的光线\n攻击对手", + effect: "用无数青白色且闪耀的光线攻击对手", }, "precipiceBlades": { name: "断崖之剑", - effect: "将大地的力量变化为利刃攻\n击对手", + effect: "将大地的力量变化为利刃攻击对手", }, "dragonAscent": { name: "画龙点睛", @@ -2483,155 +2483,155 @@ export const move: MoveTranslationEntries = { }, "hyperspaceFury": { name: "异次元猛攻", - effect: "用许多手臂,无视对手的守\n住或看穿等招式进行连续攻\n击,自己的防御会降低", + effect: "用许多手臂,无视对手的守住或看\n穿等招式进行连续攻击,\n自己的防御会降低", }, "breakneckBlitzPhysical": { name: "一般Z究极无敌大冲撞", - effect: "通过Z力量气势猛烈地全力\n撞上对手。威力会根据原来\n的招式而改变", + effect: "通过Z力量气势猛烈地全力撞上对手。\n威力会根据原来的招式而改变", }, "breakneckBlitzSpecial": { name: "一般Z究极无敌大冲撞", - effect: "通过Z力量气势猛烈地全力\n撞上对手。威力会根据原来\n的招式而改变", + effect: "通过Z力量气势猛烈地全力撞上对手。\n威力会根据原来的招式而改变", }, "allOutPummelingPhysical": { name: "格斗Z全力无双激烈拳", - effect: "通过Z力量制造出能量弹,\n全力撞向对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量制造出能量弹,\n全力撞向对手。\n威力会根据原来的招式而改变", }, "allOutPummelingSpecial": { name: "格斗Z全力无双激烈拳", - effect: "通过Z力量制造出能量弹,\n全力撞向对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量制造出能量弹,\n全力撞向对手。\n威力会根据原来的招式而改变", }, "supersonicSkystrikePhysical": { name: "飞行Z极速俯冲轰烈撞", - effect: "通过Z力量猛烈地飞向天空,\n朝对手全力落下。威力会\n根据原来的招式而改变", + effect: "通过Z力量猛烈地飞向天空,\n朝对手全力落下。\n威力会根据原来的招式而改变", }, "supersonicSkystrikeSpecial": { name: "飞行Z极速俯冲轰烈撞", - effect: "通过Z力量猛烈地飞向天空,\n朝对手全力落下。威力会\n根据原来的招式而改变", + effect: "通过Z力量猛烈地飞向天空,\n朝对手全力落下。\n威力会根据原来的招式而改变", }, "acidDownpourPhysical": { name: "毒Z强酸剧毒灭绝雨", - effect: "通过Z力量使毒沼涌起,全\n力让对手沉下去。威力会根\n据原来的招式而改变", + effect: "通过Z力量使毒沼涌起,\n全力让对手沉下去。\n威力会根据原来的招式而改变", }, "acidDownpourSpecial": { name: "毒Z强酸剧毒灭绝雨", - effect: "通过Z力量使毒沼涌起,全\n力让对手沉下去。威力会根\n据原来的招式而改变", + effect: "通过Z力量使毒沼涌起,\n全力让对手沉下去。\n威力会根据原来的招式而改变", }, "tectonicRagePhysical": { name: "地面Z地隆啸天大终结", - effect: "通过Z力量潜入地里最深处,\n全力撞上对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量潜入地里最深处,\n全力撞上对手。\n威力会根据原来的招式而改变", }, "tectonicRageSpecial": { name: "地面Z地隆啸天大终结", - effect: "通过Z力量潜入地里最深处,\n全力撞上对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量潜入地里最深处,\n全力撞上对手。\n威力会根据原来的招式而改变", }, "continentalCrushPhysical": { name: "岩石Z毁天灭地巨岩坠", - effect: "通过Z力量召唤大大的岩山,\n全力撞向对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量召唤大大的岩山,\n全力撞向对手。\n威力会根据原来的招式而改变", }, "continentalCrushSpecial": { name: "岩石Z毁天灭地巨岩坠", - effect: "通过Z力量召唤大大的岩山,\n全力撞向对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量召唤大大的岩山,\n全力撞向对手。\n威力会根据原来的招式而改变", }, "savageSpinOutPhysical": { name: "虫Z绝对捕食回旋斩", - effect: "通过Z力量将吐出的丝线全\n力束缚对手。威力会根据原\n来的招式而改变", + effect: "通过Z力量将吐出的丝线全力束缚对手。\n威力会根据原来的招式而改变", }, "savageSpinOutSpecial": { name: "虫Z绝对捕食回旋斩", - effect: "通过Z力量将吐出的丝线全\n力束缚对手。威力会根据原\n来的招式而改变", + effect: "通过Z力量将吐出的丝线全力束缚对手。\n威力会根据原来的招式而改变", }, "neverEndingNightmarePhysical": { name: "幽灵Z无尽暗夜之诱惑", - effect: "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。威\n力会根据原来的招式而改变", + effect: "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。\n威力会根据原来的招式而改变", }, "neverEndingNightmareSpecial": { name: "幽灵Z无尽暗夜之诱惑", - effect: "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。威\n力会根据原来的招式而改变", + effect: "通过Z力量召唤强烈的怨念,\n全力降临到对手身上。\n威力会根据原来的招式而改变", }, "corkscrewCrashPhysical": { name: "钢Z超绝螺旋连击", - effect: "通过Z力量进行高速旋转,\n全力撞上对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量进行高速旋转,\n全力撞上对手。\n威力会根据原来的招式而改变", }, "corkscrewCrashSpecial": { name: "钢Z超绝螺旋连击", - effect: "通过Z力量进行高速旋转,\n全力撞上对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量进行高速旋转,\n全力撞上对手。\n威力会根据原来的招式而改变", }, "infernoOverdrivePhysical": { name: "火Z超强极限爆焰弹", - effect: "通过Z力量喷出熊熊烈火,\n全力撞向对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量喷出熊熊烈火,\n全力撞向对手。\n威力会根据原来的招式而改变", }, "infernoOverdriveSpecial": { name: "火Z超强极限爆焰弹", - effect: "通过Z力量喷出熊熊烈火,\n全力撞向对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量喷出熊熊烈火,\n全力撞向对手。\n威力会根据原来的招式而改变", }, "hydroVortexPhysical": { name: "水Z超级水流大漩涡", - effect: "通过Z力量制造大大的潮旋,\n全力吞没对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量制造大大的潮旋,\n全力吞没对手。\n威力会根据原来的招式而改变", }, "hydroVortexSpecial": { name: "水Z超级水流大漩涡", - effect: "通过Z力量制造大大的潮旋,\n全力吞没对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量制造大大的潮旋,\n全力吞没对手。\n威力会根据原来的招式而改变", }, "bloomDoomPhysical": { name: "草Z绚烂缤纷花怒放", - effect: "通过Z力量借助花草的能量,\n全力攻击对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量借助花草的能量,\n全力攻击对手。\n威力会根据原来的招式而改变", }, "bloomDoomSpecial": { name: "草Z绚烂缤纷花怒放", - effect: "通过Z力量借助花草的能量,\n全力攻击对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量借助花草的能量,\n全力攻击对手。\n威力会根据原来的招式而改变", }, "gigavoltHavocPhysical": { name: "电Z终极伏特狂雷闪", - effect: "通过Z力量将蓄积的强大电\n流全力撞向对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量将蓄积的强大电流全力\n撞向对手。威力会根据原来的招式而改变", }, "gigavoltHavocSpecial": { name: "电Z终极伏特狂雷闪", - effect: "通过Z力量将蓄积的强大电\n流全力撞向对手。威力会根\n据原来的招式而改变", + effect: "通过Z力量将蓄积的强大电流全力\n撞向对手。威力会根据原来的招式而改变", }, "shatteredPsychePhysical": { name: "超能力Z至高精神破坏波", - effect: "通过Z力量操纵对手,全力\n使其感受到痛苦。威力会根\n据原来的招式而改变", + effect: "通过Z力量操纵对手,\n全力使其感受到痛苦。\n威力会根据原来的招式而改变", }, "shatteredPsycheSpecial": { name: "超能力Z至高精神破坏波", - effect: "通过Z力量操纵对手,全力\n使其感受到痛苦。威力会根\n据原来的招式而改变", + effect: "通过Z力量操纵对手,\n全力使其感受到痛苦。\n威力会根据原来的招式而改变", }, "subzeroSlammerPhysical": { name: "冰Z激狂大地万里冰", - effect: "通过Z力量急剧降低气温,\n全力冰冻对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量急剧降低气温,\n全力冰冻对手。\n威力会根据原来的招式而改变", }, "subzeroSlammerSpecial": { name: "冰Z激狂大地万里冰", - effect: "通过Z力量急剧降低气温,\n全力冰冻对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量急剧降低气温,\n全力冰冻对手。\n威力会根据原来的招式而改变", }, "devastatingDrakePhysical": { name: "龙Z究极巨龙震天地", - effect: "通过Z力量将气场实体化,\n向对手全力发动袭击。威力\n会根据原来的招式而改变", + effect: "通过Z力量将气场实体化,\n向对手全力发动袭击。\n威力会根据原来的招式而改变", }, "devastatingDrakeSpecial": { name: "龙Z究极巨龙震天地", - effect: "通过Z力量将气场实体化,\n向对手全力发动袭击。威力\n会根据原来的招式而改变", + effect: "通过Z力量将气场实体化,\n向对手全力发动袭击。\n威力会根据原来的招式而改变", }, "blackHoleEclipsePhysical": { name: "恶Z黑洞吞噬万物灭", - effect: "通过Z力量收集恶能量,全\n力将对手吸入。威力会根据\n原来的招式而改变", + effect: "通过Z力量收集恶能量,\n全力将对手吸入。\n威力会根据原来的招式而改变", }, "blackHoleEclipseSpecial": { name: "恶Z黑洞吞噬万物灭", - effect: "通过Z力量收集恶能量,全\n力将对手吸入。威力会根据\n原来的招式而改变", + effect: "通过Z力量收集恶能量,\n全力将对手吸入。\n威力会根据原来的招式而改变", }, "twinkleTacklePhysical": { name: "妖精Z可爱星星飞天撞", - effect: "通过Z力量制造魅惑空间,\n全力捉弄对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量制造魅惑空间,\n全力捉弄对手。\n威力会根据原来的招式而改变", }, "twinkleTackleSpecial": { name: "妖精Z可爱星星飞天撞", - effect: "通过Z力量制造魅惑空间,\n全力捉弄对手。威力会根据\n原来的招式而改变", + effect: "通过Z力量制造魅惑空间,\n全力捉弄对手。\n威力会根据原来的招式而改变", }, "catastropika": { name: "皮卡丘Z皮卡皮卡必杀击", - effect: "通过Z力量,皮卡丘全身覆\n盖最强电力,全力猛扑对手", + effect: "通过Z力量,皮卡丘全身覆盖最强电力,\n全力猛扑对手", }, "shoreUp": { name: "集沙", @@ -2639,27 +2639,27 @@ export const move: MoveTranslationEntries = { }, "firstImpression": { name: "迎头一击", - effect: "威力很高的招式,但只有在\n出场战斗时,立刻使出才能\n成功", + effect: "威力很高的招式,但只有在出场战斗时,\n立刻使出才能成功", }, "banefulBunker": { name: "碉堡", - effect: "防住对手攻击的同时,让接\n触到自己的对手中毒", + effect: "防住对手攻击的同时,\n让接触到自己的对手中毒", }, "spiritShackle": { name: "缝影", - effect: "攻击的同时,缝住对手的影\n子,使其无法逃走", + effect: "攻击的同时,缝住对手的影子,\n使其无法逃走", }, "darkestLariat": { name: "DD金勾臂", - effect: "旋转双臂打向对手。无视对\n手的能力变化,直接给予伤\n害", + effect: "旋转双臂打向对手。\n无视对手的能力变化,\n直接给予伤害", }, "sparklingAria": { name: "泡影的咏叹调", - effect: "随着唱歌会放出很多气球。\n受到此招式攻击时,灼伤会\n被治愈", + effect: "随着唱歌会放出很多气球。\n受到此招式攻击时,灼伤会被治愈", }, "iceHammer": { name: "冰锤", - effect: "挥舞强力而沉重的拳头,给\n予对手伤害。自己的速度会\n降低", + effect: "挥舞强力而沉重的拳头,\n给予对手伤害。自己的速度会降低", }, "floralHealing": { name: "花疗", @@ -2671,11 +2671,11 @@ export const move: MoveTranslationEntries = { }, "strengthSap": { name: "吸取力量", - effect: "给自己回复和对手攻击力相\n同数值的HP,然后降低对\n手的攻击", + effect: "给自己回复和对手攻击力\n相同数值的HP,\n然后降低对手的攻击", }, "solarBlade": { name: "日光刃", - effect: "第1回合收集满满的日光,\n第2回合将此力量集中在剑\n上进行攻击", + effect: "第1回合收集满满的日光,\n第2回合将此力量集中在剑上进行攻击", }, "leafage": { name: "树叶", @@ -2683,79 +2683,79 @@ export const move: MoveTranslationEntries = { }, "spotlight": { name: "聚光灯", - effect: "给宝可梦打上聚光灯,该回\n合只能瞄准该宝可梦", + effect: "给宝可梦打上聚光灯,\n该回合只能瞄准该宝可梦", }, "toxicThread": { name: "毒丝", - effect: "将混有毒的丝吐向对手。使\n其中毒,从而降低对手的速\n度", + effect: "将混有毒的丝吐向对手。\n使其中毒,从而降低对手的速度", }, "laserFocus": { name: "磨砺", - effect: "集中精神,下次攻击必定会\n击中要害", + effect: "集中精神,下次攻击必定会击中要害", }, "gearUp": { name: "辅助齿轮", - effect: "启动齿轮,提高特性为正电\n和负电的宝可梦的攻击和特\n攻", + effect: "启动齿轮,提高特性为正电和负电\n的宝可梦的攻击和特攻", }, "throatChop": { name: "深渊突刺", - effect: "受到此招式攻击的对手,会\n因为地狱般的痛苦,在2回\n合内,变得无法使出声音类\n招式", + effect: "受到此招式攻击的对手,\n会因为地狱般的痛苦,在2回合内,\n变得无法使出声音类招式", }, "pollenPuff": { name: "花粉团", - effect: "对敌人使用是会爆炸的团子。\n对我方使用则是给予回复\n的团子", + effect: "对敌人使用是会爆炸的团子。\n对我方使用则是给予回复的团子", }, "anchorShot": { name: "掷锚", - effect: "将锚缠住对手进行攻击。使\n对手无法逃走", + effect: "将锚缠住对手进行攻击。\n使对手无法逃走", }, "psychicTerrain": { name: "精神场地", - effect: "在5回合内,地面上的宝可\n梦不会受到先制招式的攻击。\n超能力属性的招式威力会\n提高", + effect: "在5回合内,地面上的宝可梦不会\n受到先制招式的攻击。\n超能力属性的招式威力会提高", }, "lunge": { name: "猛扑", - effect: "全力猛扑对手进行攻击。从\n而降低对手的攻击", + effect: "全力猛扑对手进行攻击。\n从而降低对手的攻击", }, "fireLash": { name: "火焰鞭", - effect: "用燃烧的鞭子抽打对手。受\n到攻击的对手防御会降低", + effect: "用燃烧的鞭子抽打对手。\n受到攻击的对手防御会降低", }, "powerTrip": { name: "嚣张", - effect: "耀武扬威地攻击对手,自己\n的能力提高得越多,威力就\n越大", + effect: "耀武扬威地攻击对手,\n自己的能力提高得越多,威力就越大", }, "burnUp": { name: "燃尽", - effect: "将自己全身燃烧起火焰来,\n给予对手大大的伤害。自己\n的火属性将会消失", + effect: "将自己全身燃烧起火焰来,\n给予对手大大的伤害。\n自己的火属性将会消失", }, "speedSwap": { name: "速度互换", - effect: "将对手和自己的速度进行互\n换", + effect: "将对手和自己的速度进行互换", }, "smartStrike": { name: "修长之角", - effect: "用尖尖的角刺入对手进行攻\n击。攻击必定会命中", + effect: "用尖尖的角刺入对手进行攻击。\n攻击必定会命中", }, "purify": { name: "净化", - effect: "治愈对手的异常状态。治愈\n后可以回复自己的HP", + effect: "治愈对手的异常状态。\n治愈后可以回复自己的HP", }, "revelationDance": { name: "觉醒之舞", - effect: "全力跳舞进行攻击。此招式\n的属性将变得和自己的属性\n相同", + effect: "全力跳舞进行攻击。此招式的属性\n将变得和自己的属性相同", }, "coreEnforcer": { name: "核心惩罚者", - effect: "如果给予过伤害的对手已经\n结束行动,其特性就会被消\n除", + effect: "如果给予过伤害的对手已经结束行动,\n其特性就会被消除", }, "tropKick": { name: "热带踢", - effect: "向对手使出来自南国的火热\n脚踢。从而降低对手的攻击", + effect: "向对手使出来自南国的火热脚踢。\n从而降低对手的攻击", }, "instruct": { name: "号令", - effect: "向对手下达指示,让其再次\n使出刚才的招式", + effect: "向对手下达指示,让其再次使出刚\n才的招式", }, "beakBlast": { name: "鸟嘴加农炮", @@ -2763,83 +2763,83 @@ export const move: MoveTranslationEntries = { }, "clangingScales": { name: "鳞片噪音", - effect: "摩擦全身鳞片,发出响亮的\n声音进行攻击。攻击后自己\n的防御会降低", + effect: "摩擦全身鳞片,\n发出响亮的声音进行攻击。\n攻击后自己的防御会降低", }, "dragonHammer": { name: "龙锤", - effect: "将身体当作锤子,向对手发\n动袭击,给予伤害", + effect: "将身体当作锤子,向对手发动袭击,\n给予伤害", }, "brutalSwing": { name: "狂舞挥打", - effect: "用自己的身体狂舞挥打,给\n予对手伤害", + effect: "用自己的身体狂舞挥打,\n给予对手伤害", }, "auroraVeil": { name: "极光幕", - effect: "在5回合内减弱物理和特殊\n的伤害。只有下雪时才能使\n出", + effect: "在5回合内减弱物理和特殊的伤害。\n只有下雪时才能使出", }, "sinisterArrowRaid": { name: "狙射树枭Z遮天蔽日暗影箭", - effect: "通过Z力量制造出无数箭的\n狙射树枭将全力射穿对手进\n行攻击", + effect: "通过Z力量制造出无数箭的狙射树\n枭将全力射穿对手进行攻击", }, "maliciousMoonsault": { name: "炽焰咆哮虎Z极恶飞跃粉碎击", - effect: "通过Z力量得到强壮肉体的\n炽焰咆哮虎将全力撞向对手\n进行攻击", + effect: "通过Z力量得到强壮肉体的炽焰咆\n哮虎将全力撞向对手进行攻击", }, "oceanicOperetta": { name: "西狮海壬Z海神庄严交响乐", - effect: "通过Z力量召唤大量水的西\n狮海壬将全力攻击对手", + effect: "通过Z力量召唤大量水的西狮海壬\n将全力攻击对手", }, "guardianOfAlola": { name: "卡璞Z巨人卫士・阿罗拉", - effect: "通过Z力量得到阿罗拉之力\n的土地神宝可梦将全力进行\n攻击。对手的剩余HP会减\n少很多", + effect: "通过Z力量得到阿罗拉之力的土地\n神宝可梦将全力进行攻击。\n对手的剩余HP会减少很多", }, "soulStealing7StarStrike": { name: "玛夏多Z七星夺魂腿", - effect: "得到Z力量的玛夏多将全力\n使出拳头和脚踢的连续招式\n叩打对手", + effect: "得到Z力量的玛夏多将全力使出拳\n头和脚踢的连续招式叩打对手", }, "stokedSparksurfer": { name: "阿罗雷Z驾雷驭电戏冲浪", - effect: "得到Z力量的阿罗拉地区的\n雷丘将全力进行攻击。从而\n让对手陷入麻痹状态", + effect: "得到Z力量的阿罗拉地区的雷丘将\n全力进行攻击。从而让对手陷入麻痹状态", }, "pulverizingPancake": { name: "卡比兽Z认真起来大爆击", - effect: "通过Z力量使得认真起来的\n卡比兽跃动巨大身躯,全力\n向对手发动袭击", + effect: "通过Z力量使得认真起来的卡比兽\n跃动巨大身躯,全力向对手发动袭击", }, "extremeEvoboost": { name: "伊布Z九彩昇华齐聚顶", - effect: "得到Z力量的伊布将借助进\n化后伙伴们的力量,大幅提\n高能力", + effect: "得到Z力量的伊布将借助进化后伙\n伴们的力量,大幅提高能力", }, "genesisSupernova": { name: "梦幻Z起源超新星大爆炸", - effect: "得到Z力量的梦幻将全力攻\n击对手。脚下会变成精神场\n地", + effect: "得到Z力量的梦幻将全力攻击对手。\n脚下会变成精神场地", }, "shellTrap": { name: "陷阱甲壳", - effect: "设下甲壳陷阱。如果对手使\n出物理招式,陷阱就会爆炸\n并给予对手伤害", + effect: "设下甲壳陷阱。如果对手使出物理招式,\n陷阱就会爆炸并给予对手伤害", }, "fleurCannon": { name: "花朵加农炮", - effect: "放出强力光束后,自己的特\n攻会大幅降低", + effect: "放出强力光束后,自己的特攻会大幅降低", }, "psychicFangs": { name: "精神之牙", - effect: "利用精神力量咬住对手进行\n攻击。还可以破坏光墙和反\n射壁等", + effect: "利用精神力量咬住对手进行攻击。\n还可以破坏光墙和反射壁等", }, "stompingTantrum": { name: "跺脚", - effect: "化悔恨为力量进行攻击。如\n果上一回合招式没有打中,\n威力就会翻倍", + effect: "化悔恨为力量进行攻击。\n如果上一回合招式没有打中,\n威力就会翻倍", }, "shadowBone": { name: "暗影之骨", - effect: "用附有灵魂的骨头殴打对手\n进行攻击。有时会降低对手\n的防御", + effect: "用附有灵魂的骨头殴打对手进行攻击。\n有时会降低对手的防御", }, "accelerock": { name: "冲岩", - effect: "迅速撞向对手进行攻击。必\n定能够先制攻击", + effect: "迅速撞向对手进行攻击。\n必定能够先制攻击", }, "liquidation": { name: "水流裂破", - effect: "用水之力量撞向对手进行攻\n击。有时会降低对手的防御", + effect: "用水之力量撞向对手进行攻击。\n有时会降低对手的防御", }, "prismaticLaser": { name: "棱镜镭射", @@ -2851,275 +2851,275 @@ export const move: MoveTranslationEntries = { }, "sunsteelStrike": { name: "流星闪冲", - effect: "以流星般的气势猛撞对手。\n可以无视对手的特性进行攻\n击", + effect: "以流星般的气势猛撞对手。\n可以无视对手的特性进行攻击", }, "moongeistBeam": { name: "暗影之光", - effect: "放出奇怪的光线攻击对手。\n可以无视对手的特性进行攻\n击", + effect: "放出奇怪的光线攻击对手。\n可以无视对手的特性进行攻击", }, "tearfulLook": { name: "泪眼汪汪", - effect: "变得泪眼汪汪,让对手丧失\n斗志。从而降低对手的攻击\n和特攻", + effect: "变得泪眼汪汪,让对手丧失斗志。\n从而降低对手的攻击和特攻", }, "zingZap": { name: "麻麻刺刺", - effect: "撞向对手,并发出强电,使\n其感到麻麻刺刺的。有时会\n使对手畏缩", + effect: "撞向对手,并发出强电,\n使其感到麻麻刺刺的。有时会使对手畏缩", }, "naturesMadness": { name: "自然之怒", - effect: "向对手释放自然之怒。对手\n的HP会减半", + effect: "向对手释放自然之怒。\n对手的HP会减半", }, "multiAttack": { name: "多属性攻击", - effect: "一边覆盖高能量,一边撞向\n对手进行攻击。根据存储碟\n不同,属性会改变", + effect: "一边覆盖高能量,\n一边撞向对手进行攻击。\n根据存储碟不同,\n属性会改变", }, "tenMillionVoltThunderbolt": { name: "智皮卡Z千万伏特", - effect: "戴着帽子的皮卡丘将通过Z\n力量增强的电击全力释放给\n对手。容易击中要害", + effect: "戴着帽子的皮卡丘将通过Z力量增\n强的电击全力释放给对手。\n容易击中要害", }, "mindBlown": { name: "惊爆大头", - effect: "让自己的头爆炸,来攻击周\n围的一切。自己也会受到伤\n害", + effect: "让自己的头爆炸,来攻击周围的一切。\n自己也会受到伤害", }, "plasmaFists": { name: "等离子闪电拳", - effect: "用覆盖着电流的拳头进行攻\n击。使一般属性的招式变成\n电属性", + effect: "用覆盖着电流的拳头进行攻击。\n使一般属性的招式变成电属性", }, "photonGeyser": { name: "光子喷涌", - effect: "用光柱来进行攻击。比较自\n己的攻击和特攻,用数值相\n对较高的一项给予对方伤害", + effect: "用光柱来进行攻击。比较自己的攻\n击和特攻,用数值相对较高的一项\n给予对方伤害", }, "lightThatBurnsTheSky": { name: "究极奈克洛Z焚天灭世炽光爆", - effect: "奈克洛兹玛会无视对手的特\n性效果,在攻击和特攻之间,\n用数值相对较高的一项给\n予对方伤害", + effect: "奈克洛兹玛会无视对手的特性效果,\n在攻击和特攻之间,\n用数值相对较高的一项给予对方伤害", }, "searingSunrazeSmash": { name: "索尔迦雷欧Z日光回旋下苍穹", - effect: "得到Z力量的索尔迦雷欧将\n全力进行攻击。可以无视对\n手的特性效果", + effect: "得到Z力量的索尔迦雷欧\n将全力进行攻击。\n可以无视对手的特性效果", }, "menacingMoonrazeMaelstrom": { name: "露奈雅拉Z月华飞溅落灵霄", - effect: "得到Z力量的露奈雅拉将全\n力进行攻击。可以无视对手\n的特性效果", + effect: "得到Z力量的露奈雅拉将全力进行攻击。\n可以无视对手的特性效果", }, "letsSnuggleForever": { name: "谜拟丘Z亲密无间大乱揍", - effect: "得到Z力量的谜拟Q将全力\n进行乱揍攻击", + effect: "得到Z力量的谜拟Q将全力进行乱揍攻击", }, "splinteredStormshards": { name: "鬃岩狼人Z狼啸石牙飓风暴", - effect: "得到Z力量的鬃岩狼人将全\n力进行攻击。而且会消除场\n地状态", + effect: "得到Z力量的鬃岩狼人将全力进行攻击。\n而且会消除场地状态", }, "clangorousSoulblaze": { name: "杖尾鳞甲龙Z炽魂热舞烈音爆", - effect: "得到Z力量的杖尾鳞甲龙将\n全力攻击对手。并且自己的\n能力会提高", + effect: "得到Z力量的杖尾鳞甲龙\n将全力攻击对手。\n并且自己的能力会提高", }, "zippyZap": { name: "电电加速", - effect: "迅猛无比的电击。必定能够\n先制攻击,并且提高自己的\n闪避率。", + effect: "迅猛无比的电击。必定能够先制攻击,\n并且提高自己的闪避率。", }, "splishySplash": { name: "滔滔冲浪", - effect: "往巨浪中注入电能后冲撞对\n手进行攻击。有时会让对手\n陷入麻痹状态", + effect: "往巨浪中注入电能后冲撞对手进行攻击。\n有时会让对手陷入麻痹状态", }, "floatyFall": { name: "飘飘坠落", - effect: "轻飘飘地浮起来后,再猛地\n俯冲下去进行攻击。有时会\n使对手畏缩", + effect: "轻飘飘地浮起来后,再猛地俯冲下\n去进行攻击。有时会使对手畏缩", }, "pikaPapow": { name: "闪闪雷光", - effect: "皮卡丘越喜欢训练家,电击\n的威力就越强。攻击必定会\n命中", + effect: "皮卡丘越喜欢训练家,\n电击的威力就越强。攻击必定会命中", }, "bouncyBubble": { name: "活活气泡", - effect: "投掷水球进行攻击。吸水后\n能回复等同于造成的伤害\n的HP", + effect: "投掷水球进行攻击。吸水后能回复\n等同于造成的伤害的HP", }, "buzzyBuzz": { name: "麻麻电击", - effect: "放出电击攻击对手。让对手\n陷入麻痹状态", + effect: "放出电击攻击对手。让对手陷入麻痹状态", }, "sizzlySlide": { name: "熊熊火爆", - effect: "用燃起大火的身体猛烈地冲\n撞对手。让对手陷入灼伤状\n态", + effect: "用燃起大火的身体猛烈地冲撞对手。\n让对手陷入灼伤状态", }, "glitzyGlow": { name: "哗哗气场", - effect: "利用念力强攻,粉碎对方信\n心。制造一道能减弱对手特\n殊攻击的神奇墙壁", + effect: "利用念力强攻,粉碎对方信心。\n制造一道能减弱对手特殊攻击的神奇墙壁", }, "baddyBad": { name: "坏坏领域", - effect: "恶行恶相地进行攻击。制造\n一道能减弱对手物理攻击的\n神奇墙壁", + effect: "恶行恶相地进行攻击。\n制造一道能减弱对手物理攻击的神奇墙壁", }, "sappySeed": { name: "茁茁炸弹", - effect: "长出巨大的藤蔓,播撒种子\n进行攻击。种子每回合都会\n吸取对手的HP", + effect: "长出巨大的藤蔓,播撒种子进行攻击。\n种子每回合都会吸取对手的HP", }, "freezyFrost": { name: "冰冰霜冻", - effect: "利用冰冷的黑雾结晶进行攻\n击。使全体宝可梦的能力变\n回原点", + effect: "利用冰冷的黑雾结晶进行攻击。\n使全体宝可梦的能力变回原点", }, "sparklySwirl": { name: "亮亮风暴", - effect: "利用芬芳刺鼻的龙卷风吞噬\n对方。能治愈我方宝可梦的\n异常状态", + effect: "利用芬芳刺鼻的龙卷风吞噬对方。\n能治愈我方宝可梦的异常状态", }, "veeveeVolley": { name: "砰砰击破", - effect: "伊布越喜欢训练家,冲撞的\n威力就越强。攻击必定会命\n中", + effect: "伊布越喜欢训练家,冲撞的威力就越强。\n攻击必定会命中", }, "doubleIronBash": { name: "钢拳双击", - effect: "以胸口的螺帽为中心旋转,\n并连续2次挥动手臂打击对\n手。有时会使对手畏缩", + effect: "以胸口的螺帽为中心旋转,\n并连续2次挥动手臂打击对手。\n有时会使对手畏缩", }, "maxGuard": { name: "极巨防壁", - effect: "完全抵挡对手的攻击。连续\n使出则容易失败", + effect: "完全抵挡对手的攻击。\n连续使出则容易失败", }, "dynamaxCannon": { name: "极巨炮", - effect: "将凝缩在体内的能量从核心\n放出进行攻击", + effect: "将凝缩在体内的能量从核心放出进行攻击,\n对手等级比当前波次的等级上限越高,造成的伤害越高,最多两倍。", }, "snipeShot": { name: "狙击", - effect: "能无视具有吸引对手招式效\n果的特性或招式的影响。可\n以向选定的对手进行攻击", + effect: "能无视具有吸引对手招式效果的特\n性或招式的影响。可以向选定的对\n手进行攻击", }, "jawLock": { name: "紧咬不放", - effect: "使双方直到一方昏厥为止无\n法替换宝可梦。其中一方退\n场则可以解除效果", + effect: "使双方直到一方昏厥为止\n无法替换宝可梦。\n其中一方退场则可以解除效果", }, "stuffCheeks": { name: "大快朵颐", - effect: "吃掉携带的树果,大幅提高\n防御", + effect: "吃掉携带的树果,大幅提高防御", }, "noRetreat": { name: "背水一战", - effect: "提高自己的所有能力,但无\n法替换或逃走", + effect: "提高自己的所有能力,\n但无法替换或逃走", }, "tarShot": { name: "沥青射击", - effect: "泼洒黏糊糊的沥青,降低对\n手的速度。火属性会变成对\n手的弱点", + effect: "泼洒黏糊糊的沥青,降低对手的速度。\n火属性会变成对手的弱点", }, "magicPowder": { name: "魔法粉", - effect: "向对手喷洒魔法粉,使对手\n变为超能力属性", + effect: "向对手喷洒魔法粉,使对手变为超\n能力属性", }, "dragonDarts": { name: "龙箭", - effect: "让多龙梅西亚进行2次攻击。\n如果对手有2只宝可梦,\n则对它们各进行1次攻击", + effect: "让多龙梅西亚进行2次攻击。\n如果对手有2只宝可梦,则对它们各进\n行1次攻击", }, "teatime": { name: "茶会", - effect: "举办一场茶会,场上的所有\n宝可梦都会吃掉自己携带的\n树果", + effect: "举办一场茶会,场上的所有宝可梦\n都会吃掉自己携带的树果", }, "octolock": { name: "蛸固", - effect: "让对手无法逃走。对手被固\n定后,每回合都会降低防御\n和特防", + effect: "让对手无法逃走。对手被固定后,\n每回合都会降低防御和特防", }, "boltBeak": { name: "电喙", - effect: "用带电的喙啄刺对手。如果\n比对手先出手攻击,招式的\n威力会变成2倍", + effect: "用带电的喙啄刺对手。\n如果比对手先出手攻击,\n招式的威力会变成2倍", }, "fishiousRend": { name: "鳃咬", - effect: "用坚硬的腮咬住对手。如果\n比对手先出手攻击,招式的\n威力会变成2倍", + effect: "用坚硬的腮咬住对手。\n如果比对手先出手攻击,\n招式的威力会变成2倍", }, "courtChange": { name: "换场", - effect: "用神奇的力量交换双方的场\n地效果", + effect: "用神奇的力量交换双方的场地效果", }, "maxFlare": { name: "极巨火爆", - effect: "极巨化宝可梦使出的火属性\n攻击。可在5回合内让日照\n变得强烈", + effect: "极巨化宝可梦使出的火属性攻击。\n可在5回合内让日照变得强烈", }, "maxFlutterby": { name: "极巨虫蛊", - effect: "极巨化宝可梦使出的虫属性\n攻击。会降低对手的特攻", + effect: "极巨化宝可梦使出的虫属性攻击。\n会降低对手的特攻", }, "maxLightning": { name: "极巨闪电", - effect: "极巨化宝可梦使出的电属性\n攻击。可在5回合内将脚下\n变成电气场地", + effect: "极巨化宝可梦使出的电属性攻击。\n可在5回合内将脚下变成电气场地", }, "maxStrike": { name: "极巨攻击", - effect: "极巨化宝可梦使出的一般属\n性攻击。会降低对手的速度", + effect: "极巨化宝可梦使出的一般属性攻击。\n会降低对手的速度", }, "maxKnuckle": { name: "极巨拳斗", - effect: "极巨化宝可梦使出的格斗属\n性攻击。会提高我方的攻击", + effect: "极巨化宝可梦使出的格斗属性攻击。\n会提高我方的攻击", }, "maxPhantasm": { name: "极巨幽魂", - effect: "极巨化宝可梦使出的幽灵属\n性攻击。会降低对手的防御", + effect: "极巨化宝可梦使出的幽灵属性攻击。\n会降低对手的防御", }, "maxHailstorm": { name: "极巨寒冰", - effect: "极巨化宝可梦使出的冰属性\n攻击。在5回合内会下雪", + effect: "极巨化宝可梦使出的冰属性攻击。\n在5回合内会下雪", }, "maxOoze": { name: "极巨酸毒", - effect: "极巨化宝可梦使出的毒属性\n攻击。会提高我方的特攻", + effect: "极巨化宝可梦使出的毒属性攻击。\n会提高我方的特攻", }, "maxGeyser": { name: "极巨水流", - effect: "极巨化宝可梦使出的水属性\n攻击。可在5回合内降下大\n雨", + effect: "极巨化宝可梦使出的水属性攻击。\n可在5回合内降下大雨", }, "maxAirstream": { name: "极巨飞冲", - effect: "极巨化宝可梦使出的飞行属\n性攻击。会提高我方的速度", + effect: "极巨化宝可梦使出的飞行属性攻击。\n会提高我方的速度", }, "maxStarfall": { name: "极巨妖精", - effect: "极巨化宝可梦使出的妖精属\n性攻击。可在5回合内将脚\n下变成薄雾场地", + effect: "极巨化宝可梦使出的妖精属性攻击。\n可在5回合内将脚下变成薄雾场地", }, "maxWyrmwind": { name: "极巨龙骑", - effect: "极巨化宝可梦使出的龙属性\n攻击。会降低对手的攻击", + effect: "极巨化宝可梦使出的龙属性攻击。\n会降低对手的攻击", }, "maxMindstorm": { name: "极巨超能", - effect: "极巨化宝可梦使出的超能力\n属性攻击。可在5回合内将\n脚下变成精神场地", + effect: "极巨化宝可梦使出的超能力属性攻击。\n可在5回合内将脚下变成精神场地", }, "maxRockfall": { name: "极巨岩石", - effect: "极巨化宝可梦使出的岩石属\n性攻击。可在5回合内卷起\n沙暴", + effect: "极巨化宝可梦使出的岩石属性攻击。\n可在5回合内卷起沙暴", }, "maxQuake": { name: "极巨大地", - effect: "极巨化宝可梦使出的地面属\n性攻击。会提高我方的特防", + effect: "极巨化宝可梦使出的地面属性攻击。\n会提高我方的特防", }, "maxDarkness": { name: "极巨恶霸", - effect: "极巨化宝可梦使出的恶属性\n攻击。会降低对手的特防", + effect: "极巨化宝可梦使出的恶属性攻击。\n会降低对手的特防", }, "maxOvergrowth": { name: "极巨草原", - effect: "极巨化宝可梦使出的草属性\n攻击。可在5回合内将脚下\n变成青草场地", + effect: "极巨化宝可梦使出的草属性攻击。\n可在5回合内将脚下变成青草场地", }, "maxSteelspike": { name: "极巨钢铁", - effect: "极巨化宝可梦使出的钢属性\n攻击。会提高我方的防御", + effect: "极巨化宝可梦使出的钢属性攻击。\n会提高我方的防御", }, "clangorousSoul": { name: "魂舞烈音爆", - effect: "削减少许自己的HP,使所\n有能力都提高", + effect: "削减少许自己的HP,\n使所有能力都提高", }, "bodyPress": { name: "扑击", - effect: "用身体撞向对手进行攻击。\n防御越高,给予的伤害就越\n高", + effect: "用身体撞向对手进行攻击。\n防御越高,给予的伤害就越高", }, "decorate": { name: "装饰", - effect: "通过装饰,大幅提高对方的\n攻击和特攻", + effect: "通过装饰,大幅提高对方的攻击和特攻", }, "drumBeating": { name: "鼓击", - effect: "用鼓点来控制鼓的根部进行\n攻击,从而降低对手的速度", + effect: "用鼓点来控制鼓的根部进行攻击,\n从而降低对手的速度", }, "snapTrap": { name: "捕兽夹", - effect: "使用捕兽夹,在4~5回合\n内,夹住对手进行攻击", + effect: "使用捕兽夹,在4~5回合内,\n夹住对手进行攻击", }, "pyroBall": { name: "火焰球", - effect: "点燃小石子,形成火球攻击\n对手。有时会使对手陷入灼\n伤状态", + effect: "点燃小石子,形成火球攻击对手。\n有时会使对手陷入灼伤状态", }, "behemothBlade": { name: "巨兽斩", @@ -3127,99 +3127,99 @@ export const move: MoveTranslationEntries = { }, "behemothBash": { name: "巨兽弹", - effect: "将全身变化为坚固的盾,猛\n烈地撞向对手进行攻击", + effect: "将全身变化为坚固的盾,\n猛烈地撞向对手进行攻击", }, "auraWheel": { name: "气场轮", - effect: "用储存在颊囊里的能量进行\n攻击,并提高自己的速度。\n其属性会随着莫鲁贝可的样\n子而改变", + effect: "用储存在颊囊里的能量进行攻击,\n并提高自己的速度。其属性会随着\n莫鲁贝可的样子而改变", }, "breakingSwipe": { name: "广域破坏", - effect: "用坚韧的尾巴猛扫对手进行\n攻击,从而降低对手的攻击", + effect: "用坚韧的尾巴猛扫对手进行攻击,\n从而降低对手的攻击", }, "branchPoke": { name: "木枝突刺", - effect: "使用尖锐的树枝刺向对手进\n行攻击", + effect: "使用尖锐的树枝刺向对手进行攻击", }, "overdrive": { name: "破音", - effect: "奏响吉他和贝斯,释放出发\n出巨响的剧烈震动攻击对手", + effect: "奏响吉他和贝斯,释放出发出巨响\n的剧烈震动攻击对手", }, "appleAcid": { name: "苹果酸", - effect: "使用从酸苹果中提取出来的\n酸性液体进行攻击。降低对\n手的特防", + effect: "使用从酸苹果中提取出来的酸性液\n体进行攻击。降低对手的特防", }, "gravApple": { name: "万有引力", - effect: "从高处落下苹果,给予对手\n伤害。可降低对手的防御", + effect: "从高处落下苹果,给予对手伤害。\n可降低对手的防御", }, "spiritBreak": { name: "灵魂冲击", - effect: "用足以让对手一蹶不振的气\n势进行攻击。会降低对手的\n特攻", + effect: "用足以让对手一蹶不振的气势进行攻击。\n会降低对手的特攻", }, "strangeSteam": { name: "神奇蒸汽", - effect: "喷出烟雾攻击对手。有时会\n使对手混乱", + effect: "喷出烟雾攻击对手。有时会使对手混乱", }, "lifeDew": { name: "生命水滴", - effect: "喷洒出神奇的水,回复自己\n和场上同伴的HP", + effect: "喷洒出神奇的水,回复自己和场上\n同伴的HP", }, "obstruct": { name: "拦堵", - effect: "完全抵挡对手的攻击。连续\n使出则容易失败。一旦触碰,\n防御就会大幅降低", + effect: "完全抵挡对手的攻击。\n连续使出则容易失败。一旦触碰,\n防御就会大幅降低", }, "falseSurrender": { name: "假跪真撞", - effect: "装作低头认错的样子,用凌\n乱的头发进行突刺。攻击必\n定会命中", + effect: "装作低头认错的样子,\n用凌乱的头发进行突刺。攻击必定会命中", }, "meteorAssault": { name: "流星突击", - effect: "大力挥舞粗壮的茎进行攻击。\n但同时自己也会被晃晕,\n下一回合自己将无法动弹", + effect: "大力挥舞粗壮的茎进行攻击。\n但同时自己也会被晃晕,下一回合自己\n将无法动弹", }, "eternabeam": { name: "无极光束", - effect: "无极汰那变回原来的样子后,\n发动的最强攻击。下一回\n合自己将无法动弹", + effect: "无极汰那变回原来的样子后,\n发动的最强攻击。\n下一回合自己将无法动弹", }, "steelBeam": { name: "铁蹄光线", - effect: "将从全身聚集的钢铁化为光\n束,激烈地发射出去。自己\n也会受到伤害", + effect: "将从全身聚集的钢铁化为光束,\n激烈地发射出去。自己也会受到伤害", }, "expandingForce": { name: "广域战力", - effect: "利用精神力量攻击对手。在\n精神场地上威力会有所提高,\n能对所有对手造成伤害", + effect: "利用精神力量攻击对手。\n在精神场地上威力会有所提高,\n能对所有对手造成伤害", }, "steelRoller": { name: "铁滚轮", - effect: "在破坏场地的同时攻击对手。\n如果脚下没有任何场地状\n态存在,使出此招式时便会\n失败", + effect: "在破坏场地的同时攻击对手。\n如果脚下没有任何场地状态存在,\n使出此招式时便会失败", }, "scaleShot": { name: "鳞射", - effect: "发射鳞片进行攻击。连续攻\n击2~5次。速度会提高但\n防御会降低", + effect: "发射鳞片进行攻击。连续攻击2~5次。\n速度会提高但防御会降低", }, "meteorBeam": { name: "流星光束", - effect: "第1回合聚集宇宙之力提高\n特攻,第2回合攻击对手", + effect: "第1回合聚集宇宙之力提高特攻,\n第2回合攻击对手", }, "shellSideArm": { name: "臂贝武器", - effect: "从物理攻击和特殊攻击中选\n择可造成较多伤害的方式进\n行攻击。有时会让对手陷入\n中毒状态", + effect: "从物理攻击和特殊攻击中选择可造\n成较多伤害的方式进行攻击。\n有时会让对手陷入中毒状态", }, "mistyExplosion": { name: "薄雾炸裂", - effect: "对自己周围的所有宝可梦进\n行攻击,但使出后,自己会\n陷入昏厥。在薄雾场地上,\n招式威力会提高", + effect: "对自己周围的所有宝可梦进行攻击,\n但使出后,自己会陷入昏厥。\n在薄雾场地上,招式威力会提高", }, "grassyGlide": { name: "青草滑梯", - effect: "仿佛在地面上滑行般地攻击\n对手。在青草场地上,必定\n能够先制攻击", + effect: "仿佛在地面上滑行般地攻击对手。\n在青草场地上,必定能够先制攻击", }, "risingVoltage": { name: "电力上升", - effect: "用从地面升腾而起的电击进\n行攻击。当对手处于电气场\n地上时,招式威力会变成2\n倍", + effect: "用从地面升腾而起的电击进行攻击。\n当对手处于电气场地上时,\n招式威力会变成2倍", }, "terrainPulse": { name: "大地波动", - effect: "借助场地的力量进行攻击。\n视使出招式时场地状态不同,\n招式的属性和威力会有所\n变化", + effect: "借助场地的力量进行攻击。\n视使出招式时场地状态不同,\n招式的属性和威力会有所变化", }, "skitterSmack": { name: "爬击", @@ -3227,19 +3227,19 @@ export const move: MoveTranslationEntries = { }, "burningJealousy": { name: "妒火", - effect: "用嫉妒的能量攻击对手。会\n让在该回合内能力有所提高\n的宝可梦陷入灼伤状态", + effect: "用嫉妒的能量攻击对手。\n会让在该回合内能力有所提高\n的宝可梦陷入灼伤状态", }, "lashOut": { name: "泄愤", - effect: "攻击对手以发泄对其感到的\n恼怒情绪。如果在该回合内\n自身能力遭到降低,招式的\n威力会变成2倍", + effect: "攻击对手以发泄对其感到的恼怒情绪。\n如果在该回合内自身能力遭到降低,\n招式的威力会变成2倍", }, "poltergeist": { name: "灵骚", - effect: "操纵对手的持有物进行攻击。\n当对手没有携带道具时,\n使出此招式时便会失败", + effect: "操纵对手的持有物进行攻击。\n当对手没有携带道具时,使出此招式时\n便会失败", }, "corrosiveGas": { name: "腐蚀气体", - effect: "用具有强酸性的气体包裹住\n自己周围所有的宝可梦,并\n融化其所携带的道具", + effect: "用具有强酸性的气体包裹住自己周\n围所有的宝可梦,并融化其所携带的道具", }, "coaching": { name: "指导", @@ -3247,7 +3247,7 @@ export const move: MoveTranslationEntries = { }, "flipTurn": { name: "快速折返", - effect: "在攻击之后急速返回,和后\n备宝可梦进行替换", + effect: "在攻击之后急速返回,\n和后备宝可梦进行替换", }, "tripleAxel": { name: "三旋击", @@ -3259,71 +3259,71 @@ export const move: MoveTranslationEntries = { }, "scorchingSands": { name: "热沙大地", - effect: "将滚烫的沙子砸向对手进行\n攻击。有时会让对手陷入灼\n伤状态", + effect: "将滚烫的沙子砸向对手进行攻击。\n有时会让对手陷入灼伤状态", }, "jungleHealing": { name: "丛林治疗", - effect: "与丛林融为一体,回复自己\n和场上同伴的HP和状态", + effect: "与丛林融为一体,回复自己和场上\n同伴的HP和状态", }, "wickedBlow": { name: "暗冥强击", - effect: "将恶之流派修炼至大成的猛\n烈一击。必定会击中要害", + effect: "将恶之流派修炼至大成的猛烈一击。\n必定会击中要害", }, "surgingStrikes": { name: "水流连打", - effect: "将水之流派修炼至大成的仿\n若行云流水般的3次连击。\n必定会击中要害", + effect: "将水之流派修炼至大成的仿若行云\n流水般的3次连击。必定会击中要害", }, "thunderCage": { name: "雷电囚笼", - effect: "将对手困在电流四溅的囚笼\n中,在4~5回合内进行攻\n击", + effect: "将对手困在电流四溅的囚笼中,\n在4~5回合内进行攻击", }, "dragonEnergy": { name: "巨龙威能", - effect: "把生命力转换为力量攻击对\n手。自己的HP越少,招式\n的威力越小", + effect: "把生命力转换为力量攻击对手。\n自己的HP越少,招式的威力越小", }, "freezingGlare": { name: "冰冷视线", - effect: "从双眼发射精神力量进行攻\n击。有时会让对手陷入冰冻\n状态", + effect: "从双眼发射精神力量进行攻击。\n有时会让对手陷入冰冻状态", }, "fieryWrath": { name: "怒火中烧", - effect: "将愤怒转化为火焰般的气场\n进行攻击。有时会使对手畏\n缩", + effect: "将愤怒转化为火焰般的气场进行攻击。\n有时会使对手畏缩", }, "thunderousKick": { name: "雷鸣蹴击", - effect: "以雷电般的动作戏耍对手的\n同时使出脚踢。可降低对手\n的防御", + effect: "以雷电般的动作\n戏耍对手的同时使出脚踢。\n可降低对手的防御", }, "glacialLance": { name: "雪矛", - effect: "向对手投掷掀起暴风雪的冰\n矛进行攻击", + effect: "向对手投掷掀起暴风雪的冰矛进行攻击", }, "astralBarrage": { name: "星碎", - effect: "用大量的小灵体向对手发起\n攻击", + effect: "用大量的小灵体向对手发起攻击", }, "eerieSpell": { name: "诡异咒语", - effect: "用强大的精神力量攻击。让\n对手最后使用的招式减少3\nPP", + effect: "用强大的精神力量攻击。\n让对手最后使用的招式减少3PP", }, "direClaw": { name: "克命爪", - effect: "以破灭之爪进行攻击。有时\n还会让对手陷入中毒、麻痹\n、睡眠之中的一种状态", + effect: "以破灭之爪进行攻击。\n有时还会让对手陷入中毒、麻痹、\n睡眠之中的一种状态", }, "psyshieldBash": { name: "屏障猛攻", - effect: "让意念的能量覆盖全身,撞\n向对手进行攻击。会提高自\n己的防御", + effect: "让意念的能量覆盖全身,\n撞向对手进行攻击。会提高自己的防御", }, "powerShift": { name: "力量转换", - effect: "将自己的攻击与防御互相交\n换", + effect: "将自己的攻击与防御互相交换", }, "stoneAxe": { name: "岩斧", - effect: "用岩石之斧进行攻击。散落\n的岩石碎片会飘浮在对手周\n围", + effect: "用岩石之斧进行攻击。\n散落的岩石碎片会飘浮在对手周围", }, "springtideStorm": { name: "阳春风暴", - effect: "用交织着爱与恨的烈风席卷\n对手进行攻击。有时会降低\n对手的攻击", + effect: "用交织着爱与恨的烈风席卷对手\n进行攻击。有时会降低对手的攻击", }, "mysticalPower": { name: "神秘之力", @@ -3331,7 +3331,7 @@ export const move: MoveTranslationEntries = { }, "ragingFury": { name: "大愤慨", - effect: "在2~3回合内,一边放出\n火焰,一边疯狂乱打。大闹\n一番后自己会陷入混乱", + effect: "在2~3回合内,一边放出火焰,\n一边疯狂乱打。大闹一番后自己会\n陷入混乱", }, "waveCrash": { name: "波动冲", @@ -3339,263 +3339,263 @@ export const move: MoveTranslationEntries = { }, "chloroblast": { name: "叶绿爆震", - effect: "将自己的叶绿素凝聚起来后\n放出去进行攻击。自己也会\n受到伤害", + effect: "将自己的叶绿素凝聚起来后放出去\n进行攻击。自己也会受到伤害", }, "mountainGale": { name: "冰山风", - effect: "将冰山般巨大的冰块砸向对\n手进行攻击。有时会使对手\n畏缩", + effect: "将冰山般巨大的冰块砸向对手进行攻击。\n有时会使对手畏缩", }, "victoryDance": { name: "胜利之舞", - effect: "激烈地跳起唤来胜利的舞蹈,\n提高自己的攻击、防御和\n速度", + effect: "激烈地跳起唤来胜利的舞蹈,\n提高自己的攻击、防御和速度", }, "headlongRush": { name: "突飞猛扑", - effect: "向对手使出灌注了全心全力\n的撞击。自己的防御和特防\n会降低", + effect: "向对手使出灌注了全心全力的撞击。\n自己的防御和特防会降低", }, "barbBarrage": { name: "毒千针", - effect: "用无数的毒针进行攻击。有\n时还会让对手陷入中毒状态。\n攻击处于中毒状态的对手\n时,威力会变成2倍", + effect: "用无数的毒针进行攻击。\n有时还会让对手陷入中毒状态。\n攻击处于中毒状态的对手时,\n威力会变成2倍", }, "esperWing": { name: "气场之翼", - effect: "用经过气场强化的翅膀撕裂\n对手。容易击中要害。会提\n高自己的速度", + effect: "用经过气场强化的翅膀撕裂对手。\n容易击中要害。会提高自己的速度", }, "bitterMalice": { name: "冤冤相报", - effect: "用令人毛骨悚然的怨念进行\n攻击。会降低对手的攻击", + effect: "用令人毛骨悚然的怨念进行攻击。\n会降低对手的攻击", }, "shelter": { name: "闭关", - effect: "将皮肤变得坚硬如铁盾,从\n而大幅提高自己的防御", + effect: "将皮肤变得坚硬如铁盾,\n从而大幅提高自己的防御", }, "tripleArrows": { name: "三连箭", - effect: "使出一记腿技后同时发射3\n箭。有时会降低对手的防御\n或使对手畏缩。容易击中要\n害", + effect: "使出一记腿技后同时发射3箭。\n有时会降低对手的防御或使对手畏缩。\n容易击中要害", }, "infernalParade": { name: "群魔乱舞", - effect: "用无数的火球进行攻击。有\n时会让对手陷入灼伤状态。\n攻击处于异常状态的对手时,\n威力会变成2倍", + effect: "用无数的火球进行攻击。有时会让对手陷\n入灼伤状态。攻击处于异常状态\n的对手时,威力会变成2倍", }, "ceaselessEdge": { name: "秘剑・千重涛", - effect: "用贝壳之剑进行攻击。散落\n的贝壳碎片会散落在对手脚\n下成为撒菱", + effect: "用贝壳之剑进行攻击。\n散落的贝壳碎片会散落\n在对手脚下成为撒菱", }, "bleakwindStorm": { name: "枯叶风暴", - effect: "用足以让身心都止不住颤抖\n的冰冷狂风进行攻击。有时\n会降低对手的速度", + effect: "用足以让身心都止不住颤抖的冰冷\n狂风进行攻击。有时会降低对手的速度", }, "wildboltStorm": { name: "鸣雷风暴", - effect: "呼唤雷云引起风暴,用雷与\n风进行激烈的攻击。有时会\n让对手陷入麻痹状态", + effect: "呼唤雷云引起风暴,用雷与风进行\n激烈的攻击。有时会让对手陷入麻痹状态", }, "sandsearStorm": { name: "热沙风暴", - effect: "用灼热的沙子和强烈的风席\n卷对手进行攻击。有时会让\n对手陷入灼伤状态", + effect: "用灼热的沙子和强烈的风席卷对手\n进行攻击。有时会让对手陷入灼伤状态", }, "lunarBlessing": { name: "新月祈祷", - effect: "向新月献上祈祷,回复自己\n和场上同伴的HP和状态", + effect: "向新月献上祈祷,回复自己和场上\n同伴的HP和状态", }, "takeHeart": { name: "勇气填充", - effect: "鼓起冲劲,治愈自己的异常\n状态,同时提高自己的特攻\n和特防", + effect: "鼓起冲劲,治愈自己的异常状态,\n同时提高自己的特攻和特防", }, "gMaxWildfire": { name: "超极巨深渊灭焰", - effect: "超极巨化的喷火龙使出的火\n属性攻击。可在4回合内给\n予对手伤害", + effect: "超极巨化的喷火龙使出的火属性攻击。\n可在4回合内给予对手伤害", }, "gMaxBefuddle": { name: "超极巨蝶影蛊惑", - effect: "超极巨化的巴大蝶使出的虫\n属性攻击。会让对手陷入中\n毒、麻痹或睡眠状态", + effect: "超极巨化的巴大蝶使出的虫属性攻击。\n会让对手陷入中毒、麻痹或睡眠状态", }, "gMaxVoltCrash": { name: "超极巨万雷轰顶", - effect: "超极巨化的皮卡丘使出的电\n属性攻击。会让对手陷入麻\n痹状态", + effect: "超极巨化的皮卡丘使出的电属性攻击。\n会让对手陷入麻痹状态", }, "gMaxGoldRush": { name: "超极巨特大金币", - effect: "超极巨化的喵喵使出的一般\n属性攻击。会让对手陷入混\n乱状态,并可获得金钱", + effect: "超极巨化的喵喵使出的一般属性攻击。\n会让对手陷入混乱状态,\n并可获得金钱", }, "gMaxChiStrike": { name: "超极巨会心一击", - effect: "超极巨化的怪力使出的格斗\n属性攻击。会变得容易击中\n要害", + effect: "超极巨化的怪力使出的格斗属性攻击。\n会变得容易击中要害", }, "gMaxTerror": { name: "超极巨幻影幽魂", - effect: "超极巨化的耿鬼使出的幽灵\n属性攻击。会踩住对手的影\n子,让其无法被替换", + effect: "超极巨化的耿鬼使出的幽灵属性攻击。\n会踩住对手的影子,\n让其无法被替换", }, "gMaxResonance": { name: "超极巨极光旋律", - effect: "超极巨化的拉普拉斯使出的\n冰属性攻击。可在5回合内\n减弱受到的伤害", + effect: "超极巨化的拉普拉斯使出的冰属性攻击。\n可在5回合内减弱受到的伤害", }, "gMaxCuddle": { name: "超极巨热情拥抱", - effect: "超极巨化的伊布使出的一般\n属性攻击。会让对手陷入着\n迷状态", + effect: "超极巨化的伊布使出的一般属性攻击。\n会让对手陷入着迷状态", }, "gMaxReplenish": { name: "超极巨资源再生", - effect: "超极巨化的卡比兽使出的一\n般属性攻击。会让吃掉的树\n果再生", + effect: "超极巨化的卡比兽使出的一般属性攻击。\n会让吃掉的树果再生", }, "gMaxMalodor": { name: "超极巨臭气冲天", - effect: "超极巨化的灰尘山使出的毒\n属性攻击。会让对手陷入中\n毒状态", + effect: "超极巨化的灰尘山使出的毒属性攻击。\n会让对手陷入中毒状态", }, "gMaxStonesurge": { name: "超极巨岩阵以待", - effect: "超极巨化的暴噬龟使出的水\n属性攻击。会发射无数锐利\n的岩石", + effect: "超极巨化的暴噬龟使出的水属性攻击。\n会发射无数锐利的岩石", }, "gMaxWindRage": { name: "超极巨旋风袭卷", - effect: "超极巨化的钢铠鸦使出的飞\n行属性攻击。可消除反射壁\n和光墙", + effect: "超极巨化的钢铠鸦使出的飞行属性攻击。\n可消除反射壁和光墙", }, "gMaxStunShock": { name: "超极巨异毒电场", - effect: "超极巨化的颤弦蝾螈使出的\n电属性攻击。会让对手陷入\n中毒或麻痹状态", + effect: "超极巨化的颤弦蝾螈使出的电属性攻击。\n会让对手陷入中毒或麻痹状态", }, "gMaxFinale": { name: "超极巨幸福圆满", - effect: "超极巨化的霜奶仙使出的妖\n精属性攻击。可回复我方的\nHP", + effect: "超极巨化的霜奶仙使出的妖精属性攻击。\n可回复我方的HP", }, "gMaxDepletion": { name: "超极巨劣化衰变", - effect: "超极巨化的铝钢龙使出的龙\n属性攻击。可减少对手最后\n使用的招式的PP", + effect: "超极巨化的铝钢龙使出的龙属性攻击。\n可减少对手最后使用的招式的PP", }, "gMaxGravitas": { name: "超极巨天道七星", - effect: "超极巨化的以欧路普使出的\n超能力属性攻击。在5回合\n内重力会产生变化", + effect: "超极巨化的以欧路普使出的超能力\n属性攻击。在5回合内重力会产生变化", }, "gMaxVolcalith": { name: "超极巨炎石喷发", - effect: "超极巨化的巨炭山使出的岩\n石属性攻击。可在4回合内\n给予对手伤害", + effect: "超极巨化的巨炭山使出的岩石属性攻击。\n可在4回合内给予对手伤害", }, "gMaxSandblast": { name: "超极巨沙尘漫天", - effect: "超极巨化的沙螺蟒使出的地\n面属性攻击。在4~5回合\n内会狂刮沙暴", + effect: "超极巨化的沙螺蟒使出的地面属性攻击。\n在4~5回合内会狂刮沙暴", }, "gMaxSnooze": { name: "超极巨睡魔降临", - effect: "超极巨化的长毛巨魔使出的\n恶属性攻击。会通过打大哈\n欠让对手产生睡意", + effect: "超极巨化的长毛巨魔使出的恶属性攻击。\n会通过打大哈欠让对手产生睡意", }, "gMaxTartness": { name: "超极巨酸不溜丢", - effect: "超极巨化的苹裹龙使出的草\n属性攻击。会降低对手的闪\n避率", + effect: "超极巨化的苹裹龙使出的草属性攻击。\n会降低对手的闪避率", }, "gMaxSweetness": { name: "超极巨琼浆玉液", - effect: "超极巨化的丰蜜龙使出的草\n属性攻击。会治愈我方的异\n常状态", + effect: "超极巨化的丰蜜龙使出的草属性攻击。\n会治愈我方的异常状态", }, "gMaxSmite": { name: "超极巨天谴雷诛", - effect: "超极巨化的布莉姆温使出的\n妖精属性攻击。会让对手陷\n入混乱状态", + effect: "超极巨化的布莉姆温使出的\n妖精属性攻击。\n会让对手陷入混乱状态", }, "gMaxSteelsurge": { name: "超极巨钢铁阵法", - effect: "超极巨化的大王铜象使出的\n钢属性攻击。会发射无数锐\n利的刺", + effect: "超极巨化的大王铜象使出的钢属性攻击。\n会发射无数锐利的刺", }, "gMaxMeltdown": { name: "超极巨液金熔击", - effect: "超极巨化的美录梅塔使出的\n钢属性攻击。会让对手无法\n连续使出相同的招式", + effect: "超极巨化的美录梅塔使出的钢属性攻击。\n会让对手无法连续使出相同的招式", }, "gMaxFoamBurst": { name: "超极巨激漩泡涡", - effect: "超极巨化的巨钳蟹使出的水\n属性攻击。会大幅降低对手\n的速度", + effect: "超极巨化的巨钳蟹使出的水属性攻击。\n会大幅降低对手的速度", }, "gMaxCentiferno": { name: "超极巨百火焚野", - effect: "超极巨化的焚焰蚣使出的火\n属性攻击。可在4~5回合\n内将对手困在火焰中", + effect: "超极巨化的焚焰蚣使出的火属性攻击。\n可在4~5回合内将对手困在火焰中", }, "gMaxVineLash": { name: "超极巨灰飞鞭灭", - effect: "超极巨化的妙蛙花使出的草\n属性攻击。可在4回合内给\n予对手伤害", + effect: "超极巨化的妙蛙花使出的草属性攻击。\n可在4回合内给予对手伤害", }, "gMaxCannonade": { name: "超极巨水炮轰灭", - effect: "超极巨化的水箭龟使出的水\n属性攻击。可在4回合内给\n予对手伤害", + effect: "超极巨化的水箭龟使出的水属性攻击。\n可在4回合内给予对手伤害", }, "gMaxDrumSolo": { name: "超极巨狂擂乱打", - effect: "超极巨化的轰擂金刚猩使出\n的草属性攻击。不会受到对\n手特性的干扰", + effect: "超极巨化的轰擂金刚猩使出的\n草属性攻击。\n不会受到对手特性的干扰", }, "gMaxFireball": { name: "超极巨破阵火球", - effect: "超极巨化的闪焰王牌使出的\n火属性攻击。不会受到对手\n特性的干扰", + effect: "超极巨化的闪焰王牌使出的火属性攻击。\n不会受到对手特性的干扰", }, "gMaxHydrosnipe": { name: "超极巨狙击神射", - effect: "超极巨化的千面避役使出的\n水属性攻击。不会受到对手\n特性的干扰", + effect: "超极巨化的千面避役使出的水属性攻击。\n不会受到对手特性的干扰", }, "gMaxOneBlow": { name: "超极巨夺命一击", - effect: "超极巨化的武道熊师使出的\n恶属性攻击。是可以无视极\n巨防壁的一击", + effect: "超极巨化的武道熊师使出的恶属性攻击。\n是可以无视极巨防壁的一击", }, "gMaxRapidFlow": { name: "超极巨流水连击", - effect: "超极巨化的武道熊师使出的\n水属性攻击。是可以无视极\n巨防壁的连击", + effect: "超极巨化的武道熊师使出的水属性攻击。\n是可以无视极巨防壁的连击", }, "teraBlast": { name: "太晶爆发", - effect: "太晶化时,会放出太晶属性\n的能量攻击。比较自己的攻\n击和特攻,用数值相对较高\n的一项给予对方伤害。(其\n他属性)/用攻击和特攻数\n值较高的一项给予伤害。对\n正处于太晶化的对手效果绝\n佳。自己的攻击和特攻会降\n低。(星晶", + effect: "太晶化时,会放出太晶属性的能量攻击。\n比较自己的攻击和特攻,\n用数值相对较高的一项给予对方伤害。\n(其他属性)/用攻击和特攻数\n值较高的一项给予伤害。\n对正处于太晶化的对手效果绝佳。\n自己的攻击和特攻会降低。(星晶", }, "silkTrap": { name: "线阱", - effect: "用丝设置陷阱。防住对方攻\n击的同时,能够降低所接触\n到的对手的速度", + effect: "用丝设置陷阱。防住对方攻击的同时,\n能够降低所接触到的对手的速度", }, "axeKick": { name: "下压踢", - effect: "将踢起的脚跟往下劈向对手\n进行攻击。有时会使对手混\n乱。如果劈偏则自己会受到\n伤害", + effect: "将踢起的脚跟往下劈向对手进行攻击。\n有时会使对手混乱。\n如果劈偏则自己会受到伤害", }, "lastRespects": { name: "扫墓", - effect: "为了化解伙伴的悔恨而进行\n攻击。被打倒的我方宝可梦\n越多,招式的威力越高", + effect: "为了化解伙伴的悔恨而进行攻击。\n被打倒的我方宝可梦越多,\n招式的威力越高", }, "luminaCrash": { name: "琉光冲激", - effect: "放出连精神都能影响到的奇\n妙怪光进行攻击。会大幅降\n低对方的特防", + effect: "放出连精神都能影响到的奇妙怪光\n进行攻击。会大幅降低对方的特防", }, "orderUp": { name: "上菜", - effect: "以潇洒的身手进行攻击。若\n口中有米立龙,会按其样子\n提高能力", + effect: "以潇洒的身手进行攻击。\n若口中有米立龙,会按其样子提高能力", }, "jetPunch": { name: "喷射拳", - effect: "将激流覆盖于拳头,以肉眼\n无法辨识的速度打出拳击。\n必定能够先制攻击", + effect: "将激流覆盖于拳头,以肉眼无法辨\n识的速度打出拳击。必定能够先制攻击", }, "spicyExtract": { name: "辣椒精华", - effect: "放出极为辛辣的精华。对手\n的攻击会大幅提高,防御会\n大幅降低", + effect: "放出极为辛辣的精华。\n对手的攻击会大幅提高,防御会大幅降低", }, "spinOut": { name: "疾速转轮", - effect: "通过往腿上增加负荷,以激\n烈的旋转给予对手伤害。自\n己的速度会大幅降低", + effect: "通过往腿上增加负荷,\n以激烈的旋转给予对手伤害。\n自己的速度会大幅降低", }, "populationBomb": { name: "鼠数儿", - effect: "伙伴们会纷纷赶来集合,以\n群体行动给予对手攻击。连\n续命中1~10次", + effect: "伙伴们会纷纷赶来集合,\n以群体行动给予对手攻击。\n连续命中1~10次", }, "iceSpinner": { name: "冰旋", - effect: "脚上覆盖薄冰,旋转着撞击\n对手。通过旋转的动作破坏\n场地", + effect: "脚上覆盖薄冰,旋转着撞击对手。\n通过旋转的动作破坏场地", }, "glaiveRush": { name: "巨剑突击", - effect: "有勇无谋的舍身突击。使出\n招式后,对手的攻击必定会\n命中,且伤害会变成2倍", + effect: "有勇无谋的舍身突击。使出招式后,\n对手的攻击必定会命中,\n且伤害会变成2倍", }, "revivalBlessing": { name: "复生祈祷", - effect: "通过以慈爱之心祈祷,让陷\n入昏厥的后备宝可梦以回复\n一半HP的状态复活", + effect: "通过以慈爱之心祈祷,\n让陷入昏厥的后备宝可梦\n以回复一半HP的状态复活", }, "saltCure": { name: "盐腌", - effect: "使对手陷入盐腌状态,每回\n合给予对手伤害。对手为钢\n或水属性时会更痛苦", + effect: "使对手陷入盐腌状态,\n每回合给予对手伤害。\n对手为钢或水属性时会更痛苦", }, "tripleDive": { name: "三连钻", - effect: "以默契的跳跃溅起水花击向\n对手。连续3次给予伤害", + effect: "以默契的跳跃溅起水花击向对手。\n连续3次给予伤害", }, "mortalSpin": { name: "晶光转转", - effect: "通过旋转来攻击对手。可以\n摆脱绑紧、紧束、寄生种子\n等招式。还能让对手陷入中\n毒状态", + effect: "通过旋转来攻击对手。\n可以摆脱绑紧、紧束、寄生种子等招式。\n还能让对手陷入中毒状态", }, "doodle": { name: "描绘", @@ -3603,187 +3603,187 @@ export const move: MoveTranslationEntries = { }, "filletAway": { name: "甩肉", - effect: "削减自己的HP,大幅提高\n攻击和特攻以及速度", + effect: "削减自己的HP,大幅提高攻击和\n特攻以及速度", }, "kowtowCleave": { name: "仆刀", - effect: "下跪让对手大意后发起袭击\n劈向对手。攻击必定会命中", + effect: "下跪让对手大意后发起袭击劈向对手。\n攻击必定会命中", }, "flowerTrick": { name: "千变万花", - effect: "将做了手脚的花束扔向对手\n进行攻击。必定会命中,且\n会击中要害", + effect: "将做了手脚的花束扔向对手进行攻击。\n必定会命中,且会击中要害", }, "torchSong": { name: "闪焰高歌", - effect: "如唱歌一样喷出熊熊燃烧的\n火焰烧焦对手。会提高自己\n的特攻", + effect: "如唱歌一样喷出熊熊燃烧的火焰\n烧焦对手。会提高自己的特攻", }, "aquaStep": { name: "流水旋舞", - effect: "以盈盈欲滴的轻快步伐戏耍\n对手并给予其伤害。会提高\n自己的速度", + effect: "以盈盈欲滴的轻快步伐戏耍对手并\n给予其伤害。会提高自己的速度", }, "ragingBull": { name: "怒牛", - effect: "狂怒暴牛的猛烈冲撞。招式\n的属性随形态改变,光墙和\n反射壁等招式也能破坏", + effect: "狂怒暴牛的猛烈冲撞。\n招式的属性随形态改变,\n光墙和反射壁等招式也能破坏", }, "makeItRain": { name: "淘金潮", - effect: "扔出大量硬币攻击。自己的\n特攻会降低,战斗后还可以\n拿到钱", + effect: "扔出大量硬币攻击。自己的特攻会降低,\n战斗后还可以拿到钱", }, "psyblade": { name: "精神剑", - effect: "用无形的利刃劈开对手。处\n于电气场地时,招式威力会\n变成1.5倍", + effect: "用无形的利刃劈开对手。\n处于电气场地时,\n招式威力会变成1.5倍", }, "hydroSteam": { name: "水蒸气", - effect: "将煮得翻滚的开水猛烈地喷\n向对手。日照强烈时,招式\n威力不但不会降低,还会变\n成1.5倍", + effect: "将煮得翻滚的开水猛烈地喷向对手。\n日照强烈时,招式威力不但不会降低,\n还会变成1.5倍", }, "ruination": { name: "大灾难", - effect: "引发毁灭性的灾厄,使对手\n的HP减半", + effect: "引发毁灭性的灾厄,使对手的HP减半", }, "collisionCourse": { name: "全开猛撞", - effect: "边变形边凶暴地落下,并引\n发起古老的大爆炸。若针对\n到弱点,威力会进一步", + effect: "边变形边凶暴地落下,\n并引发起古老的大爆炸。若针对到弱点,\n威力会进一步", }, "electroDrift": { name: "闪电猛冲", - effect: "边变形边高速奔走,并以未\n知的电击贯穿对手。若针对\n到弱点,威力会进一步", + effect: "边变形边高速奔走,并以未知的电\n击贯穿对手。若针对到弱点,\n威力会进一步", }, "shedTail": { name: "断尾", - effect: "削减自己的HP,制造分身\n后会返回,并和后备宝可梦\n进行替换", + effect: "削减自己的HP,制造分身后会返回,\n并和后备宝可梦进行替换", }, "chillyReception": { name: "冷笑话", - effect: "留下冷场的冷笑话后,和后\n备宝可梦进行替换。在5回\n合内会下雪", + effect: "留下冷场的冷笑话后,\n和后备宝可梦进行替换。\n在5回合内会下雪", }, "tidyUp": { name: "大扫除", - effect: "将撒菱、隐形岩、黏黏网、\n毒菱、替身全部扫除掉。自\n己的攻击和速度会提高", + effect: "将撒菱、隐形岩、黏黏网、毒菱、\n替身全部扫除掉。自己的攻击和速\n度会提高", }, "snowscape": { name: "雪景", - effect: "在5回合内会下雪。冰属性\n的防御会提高", + effect: "在5回合内会下雪。冰属性的防御会提高", }, "pounce": { name: "虫扑", - effect: "飞扑向对手攻击。会降低对\n手的速度", + effect: "飞扑向对手攻击。会降低对手的速度", }, "trailblaze": { name: "起草", - effect: "跳出草丛进行攻击。通过轻\n快的步伐会提高自己的速度", + effect: "跳出草丛进行攻击。通过轻快的步\n伐会提高自己的速度", }, "chillingWater": { name: "泼冷水", - effect: "泼洒冰冷得足以让对手失去\n活力的水进行攻击。会降低\n对手的攻击", + effect: "泼洒冰冷得足以让对手失去活力的\n水进行攻击。会降低对手的攻击", }, "hyperDrill": { name: "强力钻", - effect: "急速旋转尖锐的身体部位贯\n穿对手。可以无视守住和看\n穿等招式", + effect: "急速旋转尖锐的身体部位贯穿对手。\n可以无视守住和看穿等招式", }, "twinBeam": { name: "双光束", - effect: "从两眼发射出神奇的光线攻\n击。连续2次给予伤害", + effect: "从两眼发射出神奇的光线攻击。\n连续2次给予伤害", }, "rageFist": { name: "愤怒之拳", - effect: "将愤怒化为力量攻击。受到\n攻击的次数越多,招式的威\n力越高", + effect: "将愤怒化为力量攻击。\n受到攻击的次数越多,招式的威力越高", }, "armorCannon": { name: "铠农炮", - effect: "熊熊燃烧自己的铠甲,将其\n做成炮弹射出攻击。自己的\n防御和特防会降低", + effect: "熊熊燃烧自己的铠甲,\n将其做成炮弹射出攻击。\n自己的防御和特防会降低", }, "bitterBlade": { name: "悔念剑", - effect: "将对世间的留恋聚集于剑尖,\n并斩击对手。可以回复给\n予对手伤害的一半HP", + effect: "将对世间的留恋聚集于剑尖,\n并斩击对手。可以回复给予对手伤害的\n一半HP", }, "doubleShock": { name: "电光双击", - effect: "将全身所有的电力放出,给\n予对手大大的伤害。自己的\n电属性将会消失", + effect: "将全身所有的电力放出,\n给予对手大大的伤害。\n自己的电属性将会消失", }, "gigatonHammer": { name: "巨力锤", - effect: "连同身体转起巨大的锤子进\n行攻击。这个招式无法连续\n使出2次", + effect: "连同身体转起巨大的锤子进行攻击。\n这个招式无法连续使出2次", }, "comeuppance": { name: "复仇", - effect: "使出招式前,将最后受到的\n招式的伤害大力返还给对手", + effect: "使出招式前,将最后受到的招式的\n伤害大力返还给对手", }, "aquaCutter": { name: "水波刀", - effect: "如刀刃般喷射出加压的水切\n开对手。容易击中要害", + effect: "如刀刃般喷射出加压的水切开对手。\n容易击中要害", }, "blazingTorque": { name: "灼热暴冲", - effect: "攻击目标造成伤害,\n有30%的几率使目标陷入\n灼伤状态。", + effect: "攻击目标造成伤害,有30%的几\n率使目标陷入灼伤状态。", }, "wickedTorque": { name: "黑暗暴冲", - effect: "攻击目标造成伤害,\n有30%的几率使目标陷入\n睡眠状态。", + effect: "攻击目标造成伤害,有30%的几\n率使目标陷入睡眠状态。", }, "noxiousTorque": { name: "剧毒暴冲", - effect: "攻击目标造成伤害,\n有30%的几率使目标陷入\n中毒状态。", + effect: "攻击目标造成伤害,有30%的几\n率使目标陷入中毒状态。", }, "combatTorque": { name: "格斗暴冲", - effect: "攻击目标造成伤害,\n有30%的几率使目标陷入\n麻痹状态。此招式可以命中\n幽灵属性的宝可梦。", + effect: "攻击目标造成伤害,有30%的几\n率使目标陷入麻痹状态。\n此招式可以命中幽灵属性的宝可梦。", }, "magicalTorque": { name: "魔法暴冲", - effect: "攻击目标造成伤害,\n有30%的几率使目标陷入\n混乱状态。", + effect: "攻击目标造成伤害,有30%的几\n率使目标陷入混乱状态。", }, "bloodMoon": { name: "血月", - effect: "从赤红如血的满月发射出全\n部的气势。这个招式无法连\n续使出2次", + effect: "从赤红如血的满月发射出全部的气势。\n这个招式无法连续使出2次", }, "matchaGotcha": { name: "刷刷茶炮", - effect: "发射经搅拌的茶的大炮,可\n以回复给予对手伤害的一半\nHP,有时会让对手陷入灼\n伤状态", + effect: "发射经搅拌的茶的大炮,\n可以回复给予对手伤害的一半HP,\n有时会让对手陷入灼伤状态", }, "syrupBomb": { name: "糖浆炸弹", - effect: "使粘稠的麦芽糖浆爆炸,让\n对手陷入满身糖状态,在3\n回合内持续降低其速度", + effect: "使粘稠的麦芽糖浆爆炸,\n让对手陷入满身糖状态,\n在3回合内持续降\n低其速度", }, "ivyCudgel": { name: "棘藤棒", - effect: "用缠有藤蔓的棍棒殴打。属\n性会随所戴的面具而改变。\n容易击中要害", + effect: "用缠有藤蔓的棍棒殴打。\n属性会随所戴的面具而改变。\n容易击中要害", }, "electroShot": { name: "电光束", - effect: "第1回合收集电力提高特攻,\n第2回合将高压的电力发\n射出去。下雨天气时能立刻\n发射", + effect: "第1回合收集电力提高特攻,\n第2回合将高压的电力发射出去。\n下雨天气时能立刻发射", }, "teraStarstorm": { name: "晶光星群", - effect: "照射出结晶的力量来驱逐敌\n人。太乐巴戈斯在星晶形态\n下使出时,能对所有对手造\n成伤害", + effect: "照射出结晶的力量来驱逐敌人。\n太乐巴戈斯在星晶形态下使出时,\n能对所有对手造成伤害", }, "fickleBeam": { name: "随机光", - effect: "发射光线进行攻击。有时其\n他的头也会合力发射镭射,\n让招式威力变成2倍", + effect: "发射光线进行攻击。有时其他的头\n也会合力发射镭射,让招式威力变成2倍", }, "burningBulwark": { name: "火焰守护", - effect: "用超高温的体毛防住对手攻\n击的同时,让接触到自己的\n对手灼伤", + effect: "用超高温的体毛防住对手攻击的同时,\n让接触到自己的对手灼伤", }, "thunderclap": { name: "迅雷", - effect: "可以比对手先使出电击进行\n攻击。对手使出的招式如果\n不是攻击招式则会失败", + effect: "可以比对手先使出电击进行攻击。\n对手使出的招式如果不是攻击招式\n则会失败", }, "mightyCleave": { name: "强刃攻击", - effect: "用积蓄在头部的光来斩切对\n手。可以无视守护进行攻击", + effect: "用积蓄在头部的光来斩切对手。\n可以无视守护进行攻击", }, "tachyonCutter": { name: "迅子利刃", - effect: "接连发射出粒子的利刃,连\n续2次给予伤害。攻击必定\n会命中", + effect: "接连发射出粒子的利刃,\n连续2次给予伤害。攻击必定会命中", }, "hardPress": { name: "硬压", - effect: "用手臂或钳子压迫对手。对\n手剩余的HP越多,威力越\n大", + effect: "用手臂或钳子压迫对手。\n对手剩余的HP越多,威力越大", }, "dragonCheer": { name: "龙声鼓舞", - effect: "以龙之鼓舞提高士气,让我\n方的招式变得容易击中要害。\n对龙属性的鼓舞效果会更\n强", + effect: "以龙之鼓舞提高士气,\n让我方的招式变得容易击中要害。\n对龙属性的鼓舞效果会更强", }, "alluringVoice": { name: "魅诱之声", @@ -3791,22 +3791,22 @@ export const move: MoveTranslationEntries = { }, "temperFlare": { name: "豁出去", - effect: "以自暴自弃的气势进行攻击。\n如果上一回合招式没有命\n中,威力就会翻倍", + effect: "以自暴自弃的气势进行攻击。\n如果上一回合招式没有命中,\n威力就会翻倍", }, "supercellSlam": { name: "闪电强袭", - effect: "让身体带电后压向对手。如\n果没有命中则自己会受到伤\n害", + effect: "让身体带电后压向对手。\n如果没有命中则自己会受到伤害", }, "psychicNoise": { name: "精神噪音", - effect: "用令对手不舒服的音波进行\n攻击。让对手在2回合内无\n法通过招式、特性或携带的\n道具回复HP", + effect: "用令对手不舒服的音波进行攻击。\n让对手在2回合内无法通过招式、\n特性或携带的道具回复HP", }, "upperHand": { name: "快手还击", - effect: "察觉到对手的动作后用掌根\n攻击,让对手畏缩。如果对\n手使出的招式不是先制攻击,\n则会失败", + effect: "察觉到对手的动作后用掌根攻击,\n让对手畏缩。如果对手使出的招式\n不是先制攻击,则会失败", }, "malignantChain": { name: "邪毒锁链", - effect: "用由毒形成的锁链缠住对手\n注入毒素加以侵蚀。有时会\n让对手陷入剧毒状态", + effect: "用由毒形成的锁链缠住对手注入毒\n素加以侵蚀。有时会让对手陷入剧毒状态", } } as const; diff --git a/src/locales/zh_CN/party-ui-handler.ts b/src/locales/zh_CN/party-ui-handler.ts index 52529bf8fa9..7d70ddd1503 100644 --- a/src/locales/zh_CN/party-ui-handler.ts +++ b/src/locales/zh_CN/party-ui-handler.ts @@ -6,5 +6,49 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "取消", "RELEASE": "放生", "APPLY": "应用", - "TEACH": "教授" + "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": "取消", + + // Slot TM text + "able": "能学会!", + "notAble": "无法学习", + "learned": "已习得", + + // Releasing messages + "goodbye": "再见,{{pokemonName}}!", + "byebye": "拜拜,{{pokemonName}}!", + "farewell": "再会了,{{pokemonName}}!", + "soLong": "告辞了,{{pokemonName}}!", + "thisIsWhereWePart": "就此分别吧,{{pokemonName}}!", + "illMissYou": "我会想你的,{{pokemonName}}!", + "illNeverForgetYou": "我不会忘记你的,{{pokemonName}}!", + "untilWeMeetAgain": "下次再见了,{{pokemonName}}!", + "sayonara": "撒由那拉,{{pokemonName}}!", + "smellYaLater": "拜拜了您嘞,{{pokemonName}}!", } as const; diff --git a/src/locales/zh_CN/pokemon-form.ts b/src/locales/zh_CN/pokemon-form.ts new file mode 100644 index 00000000000..8fb82712e64 --- /dev/null +++ b/src/locales/zh_CN/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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}}变成其他样子了。", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "服装", + "pikachuCoolCosplay": "摇滚巨星", + "pikachuBeautyCosplay": "贵妇", + "pikachuCuteCosplay": "流行偶像", + "pikachuSmartCosplay": "博士", + "pikachuToughCosplay": "面罩摔跤手", + "pikachuPartner": "搭档", + "eeveePartner": "搭档", + // 2G + "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": "?", + // 3G + "castformSunny": "晴天", + "castformRainy": "雨天", + "castformSnowy": "雪天", + "deoxysNormal": "普通", + // 4G + "burmyPlant": "草木蓑衣", + "burmySandy": "砂土蓑衣", + "burmyTrash": "垃圾蓑衣", + "shellosEast": "东海", + "shellosWest": "西海", + "rotomHeat": "加热", + "rotomWash": "清洗", + "rotomFrost": "结冰", + "rotomFan": "旋转", + "rotomMow": "切割", + "giratinaAltered": "别种", + "shayminLand": "陆上", + // 5G + "basculinRedStriped": "红条纹", + "basculinBlueStriped": "蓝条纹", + "basculinWhiteStriped": "白条纹", + "deerlingSpring": "春天", + "deerlingSummer": "夏天", + "deerlingAutumn": "秋天", + "deerlingWinter": "冬天", + "tornadusIncarnate": "化身", + "thundurusIncarnate": "化身", + "landorusIncarnate": "化身", + "keldeoOrdinary": "通常", + "meloettaAria": "歌声", + // 6G + "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": "完全体形态", + // 7G + "oricorioBaile": "热辣热辣风格", + "oricorioPompom": "啪滋啪滋风格", + "oricorioPau": "呼拉呼拉风格", + "oricorioSensu": "轻盈轻盈风格", + "rockruffOwnTempo": "特殊岩狗狗", + "miniorRedMeteor": "红色核心", + "miniorOrangeMeteor": "橙色核心", + "miniorYellowMeteor": "黄色核心", + "miniorGreenMeteor": "绿色核心", + "miniorBlueMeteor": "浅蓝色核心", + "miniorIndigoMeteor": "蓝色核心", + "miniorVioletMeteor": "紫色核心", + "miniorRed": "红色", + "miniorOrange": "橙色", + "miniorYellow": "黄色", + "miniorGreen": "绿色", + "miniorBlue": "浅蓝色", + "miniorIndigo": "蓝色", + "miniorViolet": "紫色", + "mimikyuDisguised": "化形", + "mimikyuBusted": "现形", + "magearnaOriginal": "500年前的颜色", + "marshadowZenith": "全力", + // 8G + "sinisteaPhony": "赝品", + "sinisteaAntique": "真品", + "eiscueNoIce": "解冻头", + "indeedeeMale": "雄性", + "indeedeeFemale": "雌性", + "morpekoFullBelly": "满腹花纹", + "zacianHeroOfManyBattles": "百战勇者", + "zamazentaHeroOfManyBattles": "百战勇者", + "zarudeDada": "老爹", + "enamorusIncarnate": "化身", + // 9G + "squawkabillyGreenPlumage": "绿羽毛", + "squawkabillyBluePlumage": "蓝羽毛", + "squawkabillyYellowPlumage": "黄羽毛", + "squawkabillyWhitePlumage": "白羽毛", + "tatsugiriCurly": "上弓姿势", + "tatsugiriDroopy": "下垂姿势", + "tatsugiriStretchy": "平挺姿势", + "gimmighoulChest": "宝箱形态", + "gimmighoulRoaming": "徒步形态", + "koraidonApexBuild": "顶尖形态", + "koraidonLimitedBuild":"限制形态", + "koraidonSprintingBuild":"冲刺形态", + "koraidonSwimmingBuild":"游泳形态", + "koraidonGlidingBuild":"滑翔形态", + "miraidonUltimateMode":"极限模式", + "miraidonLowPowerMode":"节能模式", + "miraidonDriveMode":"驾驶模式", + "miraidonAquaticMode":"水上模式", + "miraidonGlideMode":"滑翔模式", + "poltchageistCounterfeit": "冒牌货", + "poltchageistArtisan": "高档货", + "paldeaTaurosCombat": "斗战种", + "paldeaTaurosBlaze": "火炽种", + "paldeaTaurosAqua": "水澜种", + +} as const; diff --git a/src/locales/zh_CN/pokemon-info-container.ts b/src/locales/zh_CN/pokemon-info-container.ts index f7072276e65..eca518c3806 100644 --- a/src/locales/zh_CN/pokemon-info-container.ts +++ b/src/locales/zh_CN/pokemon-info-container.ts @@ -5,7 +5,4 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "性别:", "ability": "特性:", "nature": "性格:", - "epic": "史诗", - "rare": "稀有", - "common": "常见" } as const; diff --git a/src/locales/zh_CN/pokemon-summary.ts b/src/locales/zh_CN/pokemon-summary.ts new file mode 100644 index 00000000000..24f0fbeed97 --- /dev/null +++ b/src/locales/zh_CN/pokemon-summary.ts @@ -0,0 +1,19 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "宝可梦信息", + "status": "状态", + "powerAccuracyCategory": "威力\n命中率\n类别", + "type": "属性", + "unknownTrainer": "未知", + "ot": "训练师", + "nature": "性格", + "expPoints": "经验值", + "nextLv": "下一级", + "cancel": "取消", + + "memoString": "{{natureFragment}} 性格,\n{{metFragment}}", + "metFragment": { + "apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。", + }, +} as const; diff --git a/src/locales/zh_CN/settings.ts b/src/locales/zh_CN/settings.ts index 3ca6cb435c6..92372deec42 100644 --- a/src/locales/zh_CN/settings.ts +++ b/src/locales/zh_CN/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "控制器", "gamepadSupport": "手柄支持", "showBgmBar": "显示音乐名称", + "shopOverlayOpacity": "商店显示不透明度" } as const; diff --git a/src/locales/zh_CN/splash-messages.ts b/src/locales/zh_CN/splash-messages.ts index 35551cf1163..01efb45cd5a 100644 --- a/src/locales/zh_CN/splash-messages.ts +++ b/src/locales/zh_CN/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "也玩玩看激进红!", "eeveeExpo": "伊布博览会!", "ynoproject": "Yume Nikki 页游项目!", + "breedersInSpace": "饲养员也能上太空?", } as const; diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index 059358078f4..b8c491288e1 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -6,7 +6,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"使用这些宝可梦开始游戏吗?", + "confirmStartTeam": "使用这些宝可梦开始游戏吗?", + "confirmExit": "Do you want to exit?", + "invalidParty": "初始队伍不可用!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,6 +24,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "性格:", "eggMoves": "蛋招式", "addToParty": "加入队伍", + "removeFromParty": "移出队伍", "toggleIVs": "显示个体", "manageMoves": "管理招式", "manageNature": "管理性格", @@ -29,9 +32,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "选择性格", "selectMoveSwapOut": "选择要替换的招式。", "selectMoveSwapWith": "选择要替换成的招式", + "sameSpeciesEgg": "兑换一颗蛋", "unlockPassive": "解锁被动", "reduceCost": "降低花费", - "sameSpeciesEgg": "兑换一颗蛋", "cycleShiny": ": 闪光", "cycleForm": ": 形态", "cycleGender": ": 性别", diff --git a/src/locales/zh_CN/status-effect.ts b/src/locales/zh_CN/status-effect.ts new file mode 100644 index 00000000000..b9df1733bc1 --- /dev/null +++ b/src/locales/zh_CN/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "无", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "中毒", + description: "中毒", + obtain: "{{pokemonNameWithAffix}}中毒了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!", + activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", + overlap: "{{pokemonNameWithAffix}}已经中毒了!", + heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + toxic: { + name: "剧毒", + description: "中毒", + obtain: "{{pokemonNameWithAffix}}中了剧毒!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中了剧毒!", + activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", + overlap: "{{pokemonNameWithAffix}}已经中毒了!", + heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + paralysis: { + name: "麻痹", + description: "麻痹", + obtain: "{{pokemonNameWithAffix}}麻痹了,很难使出招式!", + obtainSource: "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很难使出招式!", + activation: "{{pokemonNameWithAffix}}因身体麻痹而无法行动!", + overlap: "{{pokemonNameWithAffix}}已经麻痹了!", + heal: "{{pokemonNameWithAffix}}的麻痹治愈了!" + }, + sleep: { + name: "睡眠", + description: "睡眠", + obtain: "{{pokemonNameWithAffix}}睡着了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}睡着了!", + activation: "{{pokemonNameWithAffix}}正在呼呼大睡。", + overlap: "{{pokemonNameWithAffix}}已经睡着了!", + heal: "{{pokemonNameWithAffix}}醒了!" + }, + freeze: { + name: "冰冻", + description: "冰冻", + obtain: "{{pokemonNameWithAffix}}冻住了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}冻住了!", + activation: "{{pokemonNameWithAffix}}因冻住了而无法行动!", + overlap: "{{pokemonNameWithAffix}}已经冻住了!", + heal: "{{pokemonNameWithAffix}}治愈了冰冻状态!" + }, + burn: { + name: "灼伤", + description: "灼伤", + obtain: "{{pokemonNameWithAffix}}被灼伤了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}被灼伤了!", + activation: "{{pokemonNameWithAffix}}受到了灼伤的伤害!", + overlap: "{{pokemonNameWithAffix}}已经被灼伤了!", + heal: "{{pokemonNameWithAffix}}的灼伤治愈了!" + }, +} as const; diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 534685d05d1..1d32fdf6e02 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -127,16 +127,33 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "短裤小子", "rocket_grunt": "火箭队手下", "rocket_grunt_female": "火箭队手下", + "rocket_grunts": "火箭队手下们", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "熔岩队手下", "magma_grunt_female": "熔岩队手下", + "magma_grunts": "熔岩队手下们", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "海洋队手下", "aqua_grunt_female": "海洋队手下", + "aqua_grunts": "海洋队手下们", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "银河队手下", "galactic_grunt_female": "银河队手下", + "galactic_grunts": "银河队手下们", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "等离子队手下", "plasma_grunt_female": "等离子队手下", + "plasma_grunts": "等离子队手下们", + "plasma_sage": "Plasma Sage", "flare_grunt": "闪焰队手下", "flare_grunt_female": "闪焰队手下", + "flare_grunts": "闪焰队手下们", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/zh_CN/weather.ts b/src/locales/zh_CN/weather.ts index ad1ecc65007..ea4deffbd55 100644 --- a/src/locales/zh_CN/weather.ts +++ b/src/locales/zh_CN/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "吹起了神秘的乱流!", "strongWindsLapseMessage": "神秘的乱流势头不减。", + "strongWindsEffectMessage": "The mysterious air current weakened the attack!", "strongWindsClearMessage": "神秘的乱流停止了。" }; + +export const terrain: SimpleTranslationEntries = { + "misty": "薄雾", + "mistyStartMessage": "脚下雾气缭绕!", + "mistyClearMessage": "脚下的雾气消失不见了!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}正受到薄雾场地的保护!", + + "electric": "电气", + "electricStartMessage": "脚下电光飞闪!", + "electricClearMessage": "脚下的电光消失不见了!", + + "grassy": "青草", + "grassyStartMessage": "脚下青草如茵!", + "grassyClearMessage": "脚下的青草消失不见了!", + + "psychic": "精神", + "psychicStartMessage": "脚下传来了奇妙的感觉!", + "psychicClearMessage": "脚下的奇妙感觉消失了!", + + "defaultBlockMessage": "{{pokemonNameWithAffix}}正受到{{terrainName}}的的保护!" +}; diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index c436e5021f7..baa20614a44 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -5,7 +5,59 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}} 被折磨着!", "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", + "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", + "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", + "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!", + "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!", + "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}}因太緊張\n而無法食用樹果!", } as const; diff --git a/src/locales/zh_TW/arena-flyout.ts b/src/locales/zh_TW/arena-flyout.ts new file mode 100644 index 00000000000..8a31d37b10c --- /dev/null +++ b/src/locales/zh_TW/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Active Battle Effects", + "player": "Player", + "neutral": "Neutral", + "enemy": "Enemy", + + // WeatherType + "sunny": "Sunny", + "rain": "Rain", + "sandstorm": "Sandstorm", + "hail": "Hail", + "snow": "Snow", + "fog": "Fog", + "heavyRain": "Heavy Rain", + "harshSun": "Harsh Sun", + "strongWinds": "Strong Winds", + + // TerrainType + "misty": "Misty Terrain", + "electric": "Electric Terrain", + "grassy": "Grassy Terrain", + "psychic": "Psychic Terrain", + + // ArenaTagType + "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", +}; diff --git a/src/locales/zh_TW/arena-tag.ts b/src/locales/zh_TW/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/zh_TW/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "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!", + "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.", +} as const; diff --git a/src/locales/zh_TW/battle-info.ts b/src/locales/zh_TW/battle-info.ts new file mode 100644 index 00000000000..684ce4bc26a --- /dev/null +++ b/src/locales/zh_TW/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "第{{generation}}世代", +} as const; diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index 553e37dbab6..4673474d313 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -12,6 +12,7 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", "switchQuestion": "要更換\n{{pokemonName}}嗎?", "trainerDefeated": "你擊敗了\n{{trainerName}}!", + "moneyPickedUp": "撿到了 ₽{{moneyAmount}}!", "pokemonCaught": "{{pokemonName}} 被抓住了!", "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "pokemon": "寶可夢", @@ -22,6 +23,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", "hitResultOneHitKO": "一擊切殺!", "attackFailed": "但是失敗了!", + "attackMissed": "沒有命中{{pokemonNameWithAffix}}!", "attackHitsCount": "擊中 {{count}} 次!", "rewardGain": "You received\n{{modifierName}}!", "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", @@ -51,6 +53,9 @@ export const battle: SimpleTranslationEntries = { "runAwayCannotEscape": "你無法逃脫!", "escapeVerbSwitch": "切換", "escapeVerbFlee": "逃跑", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了{{moveName}}的PP!", + "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了體力!", "notDisabled": "{{moveName}} 不再被禁用!", "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "hpIsFull": "{{pokemonName}}'s\nHP is full!", @@ -63,15 +68,22 @@ export const battle: SimpleTranslationEntries = { "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}} 已經無法再降低了!", + "statsAnd": "and", + "stats": "Stats", + "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!", + "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}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", @@ -118,15 +130,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n變得萬眾矚目了!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因電磁力浮了起來!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n電磁力消失了!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/zh_TW/battler-tags.ts b/src/locales/zh_TW/battler-tags.ts new file mode 100644 index 00000000000..73747e51f61 --- /dev/null +++ b/src/locales/zh_TW/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "束縛", + "flinchedDesc": "畏縮", + "confusedDesc": "混亂", + "infatuatedDesc": "著迷", + "seedDesc": "寄生種子", + "nightmareDesc": "惡夢", + "ingrainDesc": "扎根", + "drowsyDesc": "瞌睡", +} as const; diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts index ef15c6c6dcb..01fb86b281d 100644 --- a/src/locales/zh_TW/bgm-name.ts +++ b/src/locales/zh_TW/bgm-name.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Music", + "music": "Music: ", "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", diff --git a/src/locales/zh_TW/common.ts b/src/locales/zh_TW/common.ts index c3dc42785ee..a2112cc594e 100644 --- a/src/locales/zh_TW/common.ts +++ b/src/locales/zh_TW/common.ts @@ -2,4 +2,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const common: SimpleTranslationEntries = { "start": "開始", + "luckIndicator": "Luck:", + "shinyOnHover": "Shiny", + "commonShiny": "常見", + "rareShiny": "稀有", + "epicShiny": "史詩", } as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 1cbb4e6e2c1..004ed1da1ab 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -1,8 +1,12 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -20,34 +24,46 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; 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 { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; 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 { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/zh_TW/settings.js"; -import { common } from "#app/locales/zh_TW/common.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const zhTwConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -66,27 +82,35 @@ export const zhTwConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/zh_TW/dialogue.ts b/src/locales/zh_TW/dialogue.ts index 0823236bc84..530906eda5b 100644 --- a/src/locales/zh_TW/dialogue.ts +++ b/src/locales/zh_TW/dialogue.ts @@ -390,6 +390,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Team Rocket blasting off again!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: " If you get in the way of Team Magma, don’t expect any mercy!" @@ -398,6 +410,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Huh? I lost?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "No one who crosses Team Aqua gets any mercy, not even kids!" @@ -406,6 +430,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You're kidding me!" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Don't mess with Team Galactic!" @@ -414,6 +450,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Shut down..." }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "We won't tolerate people who have different ideas!" @@ -422,6 +470,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Fashion is most important to us!" @@ -430,6 +490,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "The future doesn't look bright for me." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "So! I must say, I am impressed you got here!" diff --git a/src/locales/zh_TW/egg.ts b/src/locales/zh_TW/egg.ts index eecfcf0b735..666f6758d11 100644 --- a/src/locales/zh_TW/egg.ts +++ b/src/locales/zh_TW/egg.ts @@ -22,4 +22,7 @@ export const egg: SimpleTranslationEntries = { "hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!", "eggMoveUnlock": "蛋招式已解鎖: {{moveName}}", "rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}", + "moveUPGacha": "蛋招式UP!", + "shinyUPGacha": "闪光UP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/zh_TW/filter-bar.ts b/src/locales/zh_TW/filter-bar.ts new file mode 100644 index 00000000000..0290bda62de --- /dev/null +++ b/src/locales/zh_TW/filter-bar.ts @@ -0,0 +1,24 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "世代", + "typeFilter": "屬性", + "dexFilter": "Dex", + "unlocksFilter": "解鎖", + "miscFilter": "混合", + "sortFilter": "排序", + "all": "全部", + "normal": "通常", + "uncaught": "未捕獲", + "passive": "被動", + "passiveUnlocked": "被動解鎖", + "passiveLocked": "被動未解鎖", + "ribbon": "緞帶", + "hasWon": "有緞帶", + "hasNotWon": "無緞帶", + "sortByNumber": "編號", + "sortByCost": "花費", + "sortByCandies": "糖果", + "sortByIVs": "個體值", + "sortByName": "名稱", +}; diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.ts index 21ba10ba30e..e3675b0571e 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "選擇要導出的存檔位。", "importData": "導入數據", "exportData": "導出數據", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "cancel": "取消", "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?", "noEggs": "You are not hatching\nany eggs at the moment!" diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index 6d89bc256c6..d46f3f172de 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "用戶名", "password": "密碼", "login": "登入", + "orUse": "Or use", "register": "注冊", "emptyUsername": "用戶名不能為空", "invalidLoginUsername": "提供的用戶名無效", @@ -54,5 +55,8 @@ export const menu: SimpleTranslationEntries = { "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; diff --git a/src/locales/zh_TW/modifier-select-ui-handler.ts b/src/locales/zh_TW/modifier-select-ui-handler.ts new file mode 100644 index 00000000000..64cf3aa2ba3 --- /dev/null +++ b/src/locales/zh_TW/modifier-select-ui-handler.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifierSelectUiHandler: SimpleTranslationEntries = { + "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}}" +} as const; diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index d31d9b8a53d..3d56deca3d7 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -59,10 +59,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "一隻寶可夢的{{moveType}}系招式威力提升20%。", }, PokemonLevelIncrementModifierType: { - description: "一隻寶可夢等級提升1級。", + description: "Increases a Pokémon's level by {{levels}}.", }, AllPokemonLevelIncrementModifierType: { - description: "所有成員寶可夢等級提升1級。", + description: "Increases all party members' level by {{levels}}.", }, PokemonBaseStatBoosterModifierType: { description: @@ -153,7 +153,11 @@ export const modifierType: ModifierTypeTranslationEntries = { SACRED_ASH: { name: "聖灰" }, REVIVER_SEED: { name: "復活種子", - description: "恢復1隻瀕死寶可夢的HP至1/2。", + description: "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。", + }, + 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: "PP單項小補劑" }, MAX_ETHER: { name: "PP單項全補劑" }, @@ -187,6 +191,14 @@ export const modifierType: ModifierTypeTranslationEntries = { LUCKY_EGG: { name: "幸運蛋" }, GOLDEN_EGG: { name: "金蛋" }, SOOTHE_BELL: { name: "安撫之鈴" }, + SCOPE_LENS: { + name: "焦點鏡", + description: "能看見弱點的鏡片。攜帶它的寶可夢的招式 會變得容易擊中要害。" + }, + LEEK: { + name: "大蔥", + description: "非常長且堅硬的莖。讓大蔥鴨攜帶後,招式會 變得容易擊中要害。" + }, EVIOLITE: { name: "進化奇石", description: "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" diff --git a/src/locales/zh_TW/modifier.ts b/src/locales/zh_TW/modifier.ts new file mode 100644 index 00000000000..7909e8150a0 --- /dev/null +++ b/src/locales/zh_TW/modifier.ts @@ -0,0 +1,14 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const modifier: SimpleTranslationEntries = { + "surviveDamageApply": "{{pokemonNameWithAffix}}用{{typeName}}\n撐住了!", + "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", + "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", + "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", + "moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!", + "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", + "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回復了一些體力!", + "bypassSpeedChanceApply": "{{pokemonName}}用了{{itemName}}後,行動變快了!", +} as const; diff --git a/src/locales/zh_TW/move-trigger.ts b/src/locales/zh_TW/move-trigger.ts new file mode 100644 index 00000000000..019aa84390c --- /dev/null +++ b/src/locales/zh_TW/move-trigger.ts @@ -0,0 +1,62 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}}\n受到了反作用力造成的傷害!", + "cutHpPowerUpMove": "{{pokemonName}}\n削減體力並提升了招式威力!", + "absorbedElectricity": "{{pokemonName}}\n吸收了电力!", + "switchedStatChanges": "{{pokemonName}}和對手互換了\n自身的能力變化!", + "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預知了未來的攻擊!", + "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開始給鳥嘴加熱了!", + "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能力變化復原了!", + "faintCountdown": "{{pokemonName}}\n將在{{turnCount}}回合後滅亡!", + "copyType": "{{pokemonName}}變成了{{targetPokemonName}}的屬性!", + "suppressAbilities": "{{pokemonName}}的特性\n變得無效了!", + "swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果!", +} as const; diff --git a/src/locales/zh_TW/move.ts b/src/locales/zh_TW/move.ts index 0a6321850db..92b70429cfd 100644 --- a/src/locales/zh_TW/move.ts +++ b/src/locales/zh_TW/move.ts @@ -2861,7 +2861,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "極巨炮", - effect: "將凝縮在體內的能量從核心\n放出進行攻擊", + effect: "將凝縮在體內的能量從核心放出進行攻擊,\n對手等級比當前波次的等級上限越高,造成的傷害越高,最多兩倍。", }, snipeShot: { name: "狙擊", diff --git a/src/locales/zh_TW/party-ui-handler.ts b/src/locales/zh_TW/party-ui-handler.ts index dfe1a3629b6..c981e41af0e 100644 --- a/src/locales/zh_TW/party-ui-handler.ts +++ b/src/locales/zh_TW/party-ui-handler.ts @@ -6,5 +6,49 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "取消", "RELEASE": "放生", "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", + + // Slot TM text + "able": "Able", + "notAble": "Not able", + "learned": "Learned", + + // Releasing messages + "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}}!", } as const; diff --git a/src/locales/zh_TW/pokemon-form.ts b/src/locales/zh_TW/pokemon-form.ts new file mode 100644 index 00000000000..aa30840fcc0 --- /dev/null +++ b/src/locales/zh_TW/pokemon-form.ts @@ -0,0 +1,197 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlePokemonForm: SimpleTranslationEntries = { + "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}}變為其他樣子了。", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cool Cosplay", + "pikachuBeautyCosplay": "Beauty Cosplay", + "pikachuCuteCosplay": "Cute Cosplay", + "pikachuSmartCosplay": "Smart Cosplay", + "pikachuToughCosplay": "Thoug Cosplay", + "pikachuPartner": "Partner", + "eeveePartner": "Partner", + // 2G + "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": "?", + // 3G + "castformSunny": "Sunny", + "castformRainy": "Rainy", + "castformSnowy": "Snowy", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Plant", + "burmySandy": "Sandy", + "burmyTrash": "Trash", + "shellosEast": "East", + "shellosWest": "West", + "rotomHeat": "Heat", + "rotomWash": "Wash", + "rotomFrost": "Frost", + "rotomFan": "Fan", + "rotomMow": "Mow", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "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", + // 6G + "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", + // 7G + "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", + // 8G + "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", + // 9G + "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", + +} as const; diff --git a/src/locales/zh_TW/pokemon-info-container.ts b/src/locales/zh_TW/pokemon-info-container.ts index 19cb5219465..eca518c3806 100644 --- a/src/locales/zh_TW/pokemon-info-container.ts +++ b/src/locales/zh_TW/pokemon-info-container.ts @@ -5,7 +5,4 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "gender": "性别:", "ability": "特性:", "nature": "性格:", - "epic": "史詩", - "rare": "稀有", - "common": "常見" } as const; diff --git a/src/locales/zh_TW/pokemon-summary.ts b/src/locales/zh_TW/pokemon-summary.ts new file mode 100644 index 00000000000..484ea2a9d67 --- /dev/null +++ b/src/locales/zh_TW/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "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}}.", + }, +} as const; diff --git a/src/locales/zh_TW/settings.ts b/src/locales/zh_TW/settings.ts index dcb87fafe35..c6c055ed4d2 100644 --- a/src/locales/zh_TW/settings.ts +++ b/src/locales/zh_TW/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "控制器", "gamepadSupport": "手柄支持", "showBgmBar": "Show Music Names", + "shopOverlayOpacity": "Shop Overlay Opacity" } as const; diff --git a/src/locales/zh_TW/splash-messages.ts b/src/locales/zh_TW/splash-messages.ts index 3fbbea71564..734b7a16064 100644 --- a/src/locales/zh_TW/splash-messages.ts +++ b/src/locales/zh_TW/splash-messages.ts @@ -33,5 +33,6 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryEmeraldRogue": "也試試翡翠流氓!", "alsoTryRadicalRed": "也試試激進紅!", "eeveeExpo": "伊布博覽會!", - "ynoproject": "YNO專案!" + "ynoproject": "YNO專案!", + "breedersInSpace": "Breeders in space!", } as const; diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index ae9a4083d20..1202bf45f0e 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -6,7 +6,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"使用這些寶可夢開始嗎?", + "confirmStartTeam": "使用這些寶可夢開始嗎?", + "confirmExit": "Do you want to exit?", + "invalidParty": "此為無效隊伍!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -23,6 +25,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "eggMoves": "孵化招式", "start": "開始", "addToParty": "加入隊伍", + "removeFromParty": "移出隊伍", "toggleIVs": "查看個體值", "manageMoves": "管理技能", "manageNature": "管理性格", @@ -30,9 +33,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "選擇性格", "selectMoveSwapOut": "選擇想要替換走的招式", "selectMoveSwapWith": "選擇想要替換成的招式", + "sameSpeciesEgg": "買蛋", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", - "sameSpeciesEgg": "買蛋", "cycleShiny": ": 閃光", "cycleForm": ": 形態", "cycleGender": ": 性別", diff --git a/src/locales/zh_TW/status-effect.ts b/src/locales/zh_TW/status-effect.ts new file mode 100644 index 00000000000..eb676c08c84 --- /dev/null +++ b/src/locales/zh_TW/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by 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!" + }, +} as const; diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 594363ce009..0efae11bbea 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -118,7 +118,34 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "工人", "worker_female": "工人", "workers": "工人組合", - "youngster": "短褲小子" + "youngster": "短褲小子", + "rocket_grunts": "火箭队手下們", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", + "magma_grunt": "熔岩队手下", + "magma_grunt_female": "熔岩队手下", + "magma_grunts": "熔岩队手下們", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", + "aqua_grunt": "海洋队手下", + "aqua_grunt_female": "海洋队手下", + "aqua_grunts": "海洋队手下們", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", + "galactic_grunt": "银河队手下", + "galactic_grunt_female": "银河队手下", + "galactic_grunts": "银河队手下們", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", + "plasma_grunt": "等离子队手下", + "plasma_grunt_female": "等离子队手下", + "plasma_grunts": "等离子队手下們", + "plasma_sage": "Plasma Sage", + "flare_grunt": "闪焰队手下", + "flare_grunt_female": "闪焰队手下", + "flare_grunts": "闪焰队手下們", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.ts index 7efdc8af0ad..bfc5e0998dc 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.ts @@ -40,5 +40,27 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "吹起了神秘的亂流!", "strongWindsLapseMessage": "神秘的亂流勢頭不減。", + "strongWindsEffectMessage": "The mysterious air current weakened the attack!", "strongWindsClearMessage": "神秘的亂流停止了。" }; + +export const terrain: SimpleTranslationEntries = { + "misty": "薄霧", + "mistyStartMessage": "腳下霧氣繚繞!", + "mistyClearMessage": "腳下的霧氣消失不見了!", + "mistyBlockMessage": "{{pokemonNameWithAffix}}正受到薄霧場地的保護!", + + "electric": "電氣", + "electricStartMessage": "腳下電流飛閃!", + "electricClearMessage": "腳下的電流消失了!", + + "grassy": "青草", + "grassyStartMessage": "腳下青草如茵!", + "grassyClearMessage": "腳下的青草消失不見了!", + + "psychic": "精神", + "psychicStartMessage": "腳下傳來了奇妙的感覺!", + "psychicClearMessage": "腳下的奇妙感覺消失了!", + + "defaultBlockMessage": "{{pokemonNameWithAffix}}正受到{{terrainName}}的保護!" +}; diff --git a/src/messages.ts b/src/messages.ts index 5c465cc08e9..555a6f30ef1 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -2,17 +2,6 @@ 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 @@ -24,17 +13,17 @@ export function getPokemonNameWithAffix(pokemon: Pokemon): string { 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 b99777bb44c..883325ceb45 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,5 +1,5 @@ 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"; @@ -15,18 +15,19 @@ 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.js"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -45,7 +46,6 @@ type NewModifierFunc = (type: ModifierType, args: any[]) => Modifier; export class ModifierType { public id: string; - public generatorId: string; public localeKey: string; public iconImage: string; public group: string; @@ -102,7 +102,7 @@ export class ModifierType { if (!pool.hasOwnProperty(tier)) { continue; } - if (pool[tier].find(m => (m as WeightedModifierType).modifierType.id === (this.generatorId || this.id))) { + if (pool[tier].find(m => (m as WeightedModifierType).modifierType.id === this.id)) { return (this.tier = tier); } } @@ -133,7 +133,6 @@ export class ModifierTypeGenerator extends ModifierType { generateType(party: Pokemon[], pregenArgs?: any[]) { const ret = this.genTypeFunc(party, pregenArgs); if (ret) { - ret.generatorId = ret.id; ret.id = this.id; ret.setTier(this.tier); } @@ -214,10 +213,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); @@ -236,7 +235,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; @@ -554,7 +553,7 @@ export class SpeciesStatBoosterModifierType extends PokemonHeldItemModifierType const item = SpeciesStatBoosterModifierTypeGenerator.items[key]; super(`modifierType:SpeciesBoosterItem.${key}`, key.toLowerCase(), (type, args) => new Modifiers.SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species)); - this.id = this.key = key; + this.key = key; } getPregenArgs(): any[] { @@ -568,7 +567,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 }); } } @@ -578,7 +582,12 @@ 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 }); } } @@ -1019,7 +1028,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { const formChangeItemPool = 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)) + && ((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)) .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); @@ -1156,6 +1166,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), @@ -1190,6 +1252,7 @@ export const modifierTypes = { SACRED_ASH: () => new AllPokemonFullReviveModifierType("modifierType:ModifierType.SACRED_ASH", "sacred_ash"), REVIVER_SEED: () => new PokemonHeldItemModifierType("modifierType:ModifierType.REVIVER_SEED", "reviver_seed", (type, args) => new Modifiers.PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), + WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new Modifiers.PokemonResetNegativeStatStageModifier(type, (args[0] as Pokemon).id)), ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.ETHER", "ether", 10), MAX_ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.MAX_ETHER", "max_ether", -1), @@ -1293,6 +1356,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)), @@ -1329,7 +1395,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)), @@ -1480,6 +1546,11 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), //new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0), new WeightedModifierType(modifierTypes.SPECIES_STAT_BOOSTER, 12), + new WeightedModifierType(modifierTypes.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]; @@ -1492,6 +1563,14 @@ const modifierPool: ModifierPool = { // 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; }, 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.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && + (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(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 2 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier : 0); + }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1515,6 +1594,7 @@ 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), @@ -1557,6 +1637,7 @@ const wildModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 1) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1585,12 +1666,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, 1), ].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), @@ -1603,6 +1684,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; }) @@ -1742,7 +1824,7 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod let i = 0; pool[t].reduce((total: integer, modifierType: WeightedModifierType) => { const weightedModifierType = modifierType as WeightedModifierType; - const existingModifiers = party[0].scene.findModifiers(m => (m.type.generatorId || m.type.id) === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); + const existingModifiers = party[0].scene.findModifiers(m => m.type.id === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); const itemModifierType = weightedModifierType.modifierType instanceof ModifierTypeGenerator ? weightedModifierType.modifierType.generateType(party) : weightedModifierType.modifierType; @@ -1755,7 +1837,7 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod : weightedModifierType.weight as integer : 0; if (weightedModifierType.maxWeight) { - const modifierId = weightedModifierType.modifierType.generatorId || weightedModifierType.modifierType.id; + const modifierId = weightedModifierType.modifierType.id; tierModifierIds.push(modifierId); const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; modifierTableData[modifierId] = { weight: outputWeight, tier: parseInt(t), tierPercent: 0, totalPercent: 0 }; @@ -1818,14 +1900,13 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo } 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; - }); - } + Overrides.ITEM_REWARD_OVERRIDE.forEach((item, i) => { + const override = modifierTypes[item](); + options[i].type = override instanceof ModifierTypeGenerator ? override.generateType(party) : override; + }); + return options; } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index b6d68b03ed7..46d17d9898f 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -9,7 +9,7 @@ import { addTextObject, TextStyle } from "../ui/text"; import { Type } from "../data/type"; import { EvolutionPhase } from "../evolution-phase"; import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; -import { getPokemonMessage } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import * as Utils from "../utils"; import { TempBattleStat } from "../data/temp-battle-stat"; import { getBerryEffectFunc, getBerryPredicate } from "../data/berry"; @@ -20,10 +20,11 @@ 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 { Species } from "#enums/species"; +import i18next from "i18next"; import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; @@ -469,6 +470,7 @@ 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) { super(type, stackCount); @@ -490,10 +492,6 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { 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; - } - isIconVisible(scene: BattleScene): boolean { return this.getPokemon(scene).isOnField(); } @@ -569,6 +567,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { 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); @@ -605,6 +604,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 +648,6 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { return ret; } - getTransferrable(withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.25; } @@ -663,6 +659,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { export class PokemonBaseStatModifier extends PokemonHeldItemModifier { protected stat: Stat; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.PokemonBaseStatBoosterModifierType, pokemonId: integer, stat: Stat, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -694,10 +691,6 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { return true; } - getTransferrable(_withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.1; } @@ -881,6 +874,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 +1049,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 +1088,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 +1151,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)); + Math.max(Math.floor(pokemon.getMaxHp() / 16) * this.stackCount, 1), i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); return true; } @@ -1158,10 +1242,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)); + Math.max(Math.floor(pokemon.turnData.damageDealt / 8) * this.stackCount, 1), i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); } return true; @@ -1296,7 +1380,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)); + Math.max(Math.floor(pokemon.getMaxHp() / 2), 1), i18next.t("modifier:pokemonInstantReviveApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), false, false, true)); pokemon.resetStatus(true, false, true); return true; @@ -1307,6 +1391,47 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for White Herb, which resets negative {@linkcode Stat} changes + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class PokemonResetNegativeStatStageModifier extends PokemonHeldItemModifier { + constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + } + + matchType(modifier: Modifier) { + return modifier instanceof PokemonResetNegativeStatStageModifier; + } + + clone() { + return new PokemonResetNegativeStatStageModifier(this.type, this.pokemonId, this.stackCount); + } + + /** + * Restores any negative stat stages of the mon to 0 + * @param args args[0] is the {@linkcode Pokemon} whose stat stages are being checked + * @returns true if any stat changes were applied (item was used), false otherwise + */ + apply(args: any[]): boolean { + const pokemon = args[0] as Pokemon; + const loweredStats = pokemon.summonData.battleStats.filter(s => s < 0); + if (loweredStats.length) { + for (let s = 0; s < pokemon.summonData.battleStats.length; s++) { + pokemon.summonData.battleStats[s] = Math.max(0, pokemon.summonData.battleStats[s]); + } + pokemon.scene.queueMessage(i18next.t("modifier:pokemonResetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + return true; + } + return false; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 2; + } +} + export abstract class ConsumablePokemonModifier extends ConsumableModifier { public pokemonId: integer; @@ -1451,11 +1576,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; @@ -1690,7 +1815,7 @@ export class PokemonExpBoosterModifier extends PokemonHeldItemModifier { } apply(args: any[]): boolean { - (args[1] as Utils.NumberHolder).value = Math.floor((args[1] as Utils.NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); + (args[1] as Utils.NumberHolder).value += (this.getStackCount() * this.boostMultiplier); return true; } @@ -1877,6 +2002,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 +2041,6 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { return ret; } - getTransferrable(withinParty: boolean) { - return withinParty; - } - getMaxHeldItemCount(pokemon: Pokemon): integer { return 1; } @@ -2012,7 +2134,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, null, true); return true; } @@ -2118,14 +2243,38 @@ export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { } } +/** + * Abstract class for held items that steal other Pokemon's items. + * @see {@linkcode TurnHeldItemTransferModifier} + * @see {@linkcode ContactHeldItemTransferChanceModifier} + */ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); } + /** + * Determines the targets to transfer items from when this applies. + * @param args\[0\] the {@linkcode Pokemon} holding this item + * @returns the opponents of the source {@linkcode Pokemon} + */ + getTargets(args: any[]): Pokemon[] { + const pokemon = args[0]; + + return pokemon instanceof Pokemon + ? pokemon.getOpponents() + : []; + } + + /** + * Steals an item from a set of target Pokemon. + * This prioritizes high-tier held items when selecting the item to steal. + * @param args \[0\] The {@linkcode Pokemon} holding this item + * @returns true if an item was stolen; false otherwise. + */ apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - const opponents = pokemon.getOpponents(); + const opponents = this.getTargets(args); if (!opponents.length) { return false; @@ -2138,12 +2287,11 @@ 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[]; + && 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); let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); @@ -2182,7 +2330,13 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { abstract getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string; } +/** + * Modifier for held items that steal items from the enemy at the end of + * each turn. + * @see {@linkcode modifierTypes[MINI_BLACK_HOLE]} + */ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { + readonly isTransferrable: boolean = true; constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); } @@ -2195,16 +2349,12 @@ 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.name, typeName: this.type.name }); } getMaxHeldItemCount(pokemon: Pokemon): integer { @@ -2212,6 +2362,12 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { } } +/** + * Modifier for held items that add a chance to steal items from the target of a + * successful attack. + * @see {@linkcode modifierTypes[GRIP_CLAW]} + * @see {@linkcode HeldItemTransferModifier} + */ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModifier { private chance: number; @@ -2221,6 +2377,20 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif this.chance = chancePercent / 100; } + /** + * Determines the target to steal items from when this applies. + * @param args\[0\] The {@linkcode Pokemon} holding this item + * @param args\[1\] The {@linkcode Pokemon} the holder is targeting with an attack + * @returns The target (args[1]) stored in array format for use in {@linkcode HeldItemTransferModifier.apply} + */ + getTargets(args: any[]): Pokemon[] { + const target = args[1]; + + return target instanceof Pokemon + ? [ target ] + : []; + } + matchType(modifier: Modifier): boolean { return modifier instanceof ContactHeldItemTransferChanceModifier; } @@ -2238,7 +2408,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: pokemon.name, typeName: this.type.name }); } getMaxHeldItemCount(pokemon: Pokemon): integer { @@ -2393,10 +2563,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; } @@ -2471,7 +2641,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier apply(args: any[]): boolean { const target = (args[0] as Pokemon); if (target.status && Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { - target.scene.queueMessage(getPokemonMessage(target, getStatusEffectHealText(target.status.effect))); + target.scene.queueMessage(getStatusEffectHealText(target.status.effect, getPokemonNameWithAffix(target))); target.resetStatus(); target.updateInfo(); return true; @@ -2614,7 +2784,8 @@ export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, player: 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; + const pregenArgs = "type" in item ? [item.type] : null; + itemModifier = modifierType.generateType(null, pregenArgs).withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; } else { itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; } diff --git a/src/overrides.ts b/src/overrides.ts index 3e894967893..9dd394354aa 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,148 +1,179 @@ -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, type ModifierTypeKeys } 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: integer = 0; + readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; + readonly ARENA_TINT_OVERRIDE: TimeOfDay = null; + /** Multiplies XP gained by this value including 0. Set to null to ignore the override */ + readonly XP_MULTIPLIER_OVERRIDE: number = null; + /** default 1000 */ + readonly STARTING_MONEY_OVERRIDE: integer = 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: 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; + */ + readonly STARTER_SPECIES_OVERRIDE: Species | integer = 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; + readonly MOVESET_OVERRIDE: Array = []; + readonly SHINY_OVERRIDE: boolean = false; + readonly VARIANT_OVERRIDE: Variant = 0; + + // -------------------------- + // OPPONENT / ENEMY OVERRIDES + // -------------------------- + readonly OPP_SPECIES_OVERRIDE: Species | integer = 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; + readonly OPP_MOVESET_OVERRIDE: Array = []; + readonly OPP_SHINY_OVERRIDE: boolean = false; + readonly OPP_VARIANT_OVERRIDE: Variant = 0; + readonly OPP_IVS_OVERRIDE: integer | integer[] = []; + + // ------------- + // EGG OVERRIDES + // ------------- + readonly EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; + readonly EGG_TIER_OVERRIDE: EggTier = null; + readonly EGG_SHINY_OVERRIDE: boolean = false; + readonly EGG_VARIANT_OVERRIDE: VariantTier = 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: Array = []; + readonly OPP_MODIFIER_OVERRIDE: Array = []; + + readonly STARTING_HELD_ITEMS_OVERRIDE: Array = []; + readonly OPP_HELD_ITEMS_OVERRIDE: Array = []; + readonly NEVER_CRIT_OVERRIDE: boolean = false; + + /** + * 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. + */ + readonly ITEM_REWARD_OVERRIDE: Array = []; } -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 index b14a84526c7..362f5f22cc2 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,11 +1,11 @@ import BattleScene, { bypassLogin } from "./battle-scene"; import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; import * as Utils from "./utils"; -import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr, IncrementMovePriorityAttr } from "./data/move"; +import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, 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 { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } 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"; @@ -20,13 +20,12 @@ 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 { 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 { CheckTrappedAbAttr, 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, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -38,7 +37,7 @@ 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 { SpeciesFormChangeActiveTrigger, 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"; @@ -50,7 +49,7 @@ 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 Overrides from "#app/overrides"; import { TextStyle, addTextObject } from "./ui/text"; import { Type } from "./data/type"; import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./events/battle-scene"; @@ -65,6 +64,7 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { applyChallenges, ChallengeType } from "./data/challenge"; const { t } = i18next; @@ -97,7 +97,7 @@ export class LoginPhase extends Phase { const loadData = () => { updateUserInfo().then(success => { if (!success[0]) { - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); return; } @@ -118,7 +118,7 @@ export class LoginPhase extends Phase { this.scene.ui.playSelect(); updateUserInfo().then(success => { if (!success[0]) { - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); return; } @@ -130,11 +130,21 @@ export class LoginPhase extends Phase { } ] }); + }, () => { + 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.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); } else { this.scene.unshiftPhase(new UnavailablePhase(this.scene)); @@ -614,6 +624,7 @@ export class SelectStarterPhase extends Phase { starterPokemon.generateFusionSpecies(true); } starterPokemon.setVisible(false); + applyChallenges(this.scene.gameMode, ChallengeType.STARTER_MODIFY, starterPokemon); party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); }); @@ -858,7 +869,7 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); + console.log(getPokemonNameWithAffix(enemyPokemon), enemyPokemon.species.speciesId, enemyPokemon.stats); }); if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { @@ -960,7 +971,7 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - return i18next.t("battle:bossAppeared", { bossName: enemyField[0].name }); + return i18next.t("battle:bossAppeared", { bossName: getPokemonNameWithAffix(enemyField[0])}); } if (this.scene.currentBattle.battleType === BattleType.TRAINER) { @@ -973,8 +984,8 @@ export class EncounterPhase extends BattlePhase { } return enemyField.length === 1 - ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].name }) - : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name }); + ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].getNameToRender() }) + : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].getNameToRender(), pokemonName2: enemyField[1].getNameToRender() }); } doEncounterCommon(showEncounterMessage: boolean = true) { @@ -1381,10 +1392,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { // 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); + partyMember.leaveField(); } const party = this.getParty(); @@ -1402,11 +1410,11 @@ export class SummonPhase extends PartyMemberPokemonPhase { // 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]); + 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: this.getPokemon().name })); + this.scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); if (this.player) { this.scene.pbTray.hide(); } @@ -1426,7 +1434,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { 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 pokemonName = this.getPokemon().getNameToRender(); const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); this.scene.pbTrayEnemy.hide(); @@ -1545,6 +1553,15 @@ export class SwitchSummonPhase extends SummonPhase { 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); @@ -1584,14 +1601,14 @@ export class SwitchSummonPhase extends SummonPhase { } this.scene.ui.showText(this.player ? - i18next.t("battle:playerComeBack", { pokemonName: pokemon.name }) : + 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.name + pokemonName: getPokemonNameWithAffix(pokemon) }) ); this.scene.playSound("pb_rel"); - pokemon.hideInfo(); + pokemon.hideInfo(); // this is also done by pokemon.leaveField(), but needs to go earlier for animation purposes pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); this.scene.tweens.add({ targets: pokemon, @@ -1599,9 +1616,9 @@ export class SwitchSummonPhase extends SummonPhase { ease: "Sine.easeIn", scale: 0.5, onComplete: () => { - pokemon.setVisible(false); - this.scene.field.remove(pokemon); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + // 250ms delay on leaveField is necessary to avoid calling hideInfo() twice + // and double-animating the stats panel slideout + this.scene.time.delayedCall(250, () => pokemon.leaveField(!this.batonPass)); this.scene.time.delayedCall(750, () => this.switchAndSummon()); } }); @@ -1609,30 +1626,35 @@ export class SwitchSummonPhase extends SummonPhase { switchAndSummon() { const party = this.player ? this.getParty() : this.scene.getEnemyParty(); - const switchedPokemon = party[this.slotIndex]; + const switchedInPokemon = 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)) { + 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 === switchedPokemon.id)) { - this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedPokemon, false); + if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { + this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedInPokemon, false); } } } - if (switchedPokemon) { + if (switchedInPokemon) { party[this.slotIndex] = this.lastPokemon; - party[this.fieldIndex] = switchedPokemon; + party[this.fieldIndex] = switchedInPokemon; const showTextAndSummon = () => { this.scene.ui.showText(this.player ? - i18next.t("battle:playerGo", { pokemonName: switchedPokemon.name }) : + 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().name + 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) { @@ -1789,7 +1811,7 @@ export class CheckSwitchPhase extends BattlePhase { return; } - this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? pokemon.name : i18next.t("battle:pokemon") }), null, () => { + this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? 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); @@ -1809,7 +1831,7 @@ export class SummonMissingPhase extends SummonPhase { } preSummon(): void { - this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: this.getPokemon().name })); + this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); this.scene.time.delayedCall(250, () => this.summon()); } } @@ -1851,14 +1873,11 @@ export class TurnInitPhase extends FieldPhase { 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); + 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.hideInfo(); - p.setVisible(false); - this.scene.field.remove(p); - this.scene.triggerPokemonFormChange(p, SpeciesFormChangeActiveTrigger, true); + p.leaveField(); } if (allowedPokemon.length === 1 && this.scene.currentBattle.double) { this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); @@ -1960,7 +1979,10 @@ export class CommandPhase extends FieldPhase { if (!moveId) { turnCommand.targets = [this.fieldIndex]; } - console.log(moveTargets, playerPokemon.name); + 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; } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { @@ -2076,7 +2098,7 @@ export class CommandPhase extends FieldPhase { } this.scene.ui.showText( i18next.t("battle:noEscapePokemon", { - pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, + pokemonName: getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)), moveName: trapTag.getMoveName(), escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") }), @@ -2140,6 +2162,15 @@ export class CommandPhase extends FieldPhase { } } +/** + * 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; @@ -2158,6 +2189,15 @@ export class EnemyCommandPhase extends FieldPhase { 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(); @@ -2189,6 +2229,7 @@ export class EnemyCommandPhase extends FieldPhase { } } + /** 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] = @@ -2210,13 +2251,13 @@ export class SelectTargetPhase extends PokemonPhase { 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.TARGET_SELECT, this.fieldIndex, move, (targets: BattlerIndex[]) => { this.scene.ui.setMode(Mode.MESSAGE); - if (cursor === -1) { + if (targets.length < 1) { this.scene.currentBattle.turnCommands[this.fieldIndex] = null; this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); } else { - turnCommand.targets = [cursor]; + turnCommand.targets = targets; } if (turnCommand.command === Command.BALL && this.fieldIndex) { this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; @@ -2286,6 +2327,8 @@ export class TurnStartPhase extends FieldPhase { return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0; }); + let orderIndex = 0; + for (const o of moveOrder) { const pokemon = field[o]; @@ -2298,6 +2341,7 @@ export class TurnStartPhase extends FieldPhase { switch (turnCommand.command) { case Command.FIGHT: const queuedMove = turnCommand.move; + pokemon.turnData.order = orderIndex++; if (!queuedMove) { continue; } @@ -2355,6 +2399,11 @@ export class TurnStartPhase extends FieldPhase { 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(); } } @@ -2374,7 +2423,7 @@ export class BerryPhase extends FieldPhase { pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); if (cancelled.value) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is too\nnervous to eat berries!")); + 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) @@ -2626,11 +2675,19 @@ export class MovePhase extends BattlePhase { 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 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(); + 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(); + this.targets[0] = opposingField.find(p => p.hp > 0)?.getBattlerIndex(); + } } } if (this.targets[0] === BattlerIndex.ATTACKER) { @@ -2781,12 +2838,12 @@ export class MovePhase extends BattlePhase { } if (activated) { - this.scene.queueMessage(getPokemonMessage(this.pokemon, getStatusEffectActivationText(this.pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); doMove(); } else { if (healed) { - this.scene.queueMessage(getPokemonMessage(this.pokemon, getStatusEffectHealText(this.pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); this.pokemon.resetStatus(); this.pokemon.updateInfo(); } @@ -2894,7 +2951,7 @@ export class MoveEffectPhase extends PokemonPhase { 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!")); + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(this.getTarget()) })); moveHistoryEntry.result = MoveResult.MISS; applyMoveAttrs(MissEffectAttr, user, null, move); } else { @@ -2912,10 +2969,11 @@ export class MoveEffectPhase extends PokemonPhase { for (const target of targets) { if (!targetHitChecks[target.getBattlerIndex()]) { this.stopMultiHit(target); - this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); + 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; } @@ -2940,7 +2998,7 @@ export class MoveEffectPhase extends PokemonPhase { } applyAttrs.push(new Promise(resolve => { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), + 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(() => { if (hitResult !== HitResult.FAIL) { const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget(), move)); @@ -2966,7 +3024,7 @@ export class MoveEffectPhase extends PokemonPhase { })).then(() => { applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult).then(() => { if (this.move.getMove() instanceof AttackMove) { - this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target.getFieldIndex()); + this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); } resolve(); }); @@ -3010,8 +3068,11 @@ export class MoveEffectPhase extends PokemonPhase { if (--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); - if (hitsTotal > 1) { + if (hitsTotal > 1 || 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); @@ -3043,7 +3104,11 @@ export class MoveEffectPhase extends PokemonPhase { } // If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match - if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + return true; + } + + if (target.getTag(BattlerTagType.ALWAYS_GET_HIT)) { return true; } @@ -3052,54 +3117,16 @@ export class MoveEffectPhase extends PokemonPhase { return false; } - const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy); + const moveAccuracy = this.move.getMove().calculateBattleAccuracy(user, target); - applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy); - applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this.move.getMove(), { value: false }, moveAccuracy); - - if (moveAccuracy.value === -1) { + if (moveAccuracy === -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 accuracyMultiplier = user.getAccuracyMultiplier(target, this.move.getMove()); 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, this.getTarget(), BattleStat.EVA, evasionMultiplier); - - accuracyMultiplier.value /= evasionMultiplier.value; - - return rand <= moveAccuracy.value * accuracyMultiplier.value; + return rand <= moveAccuracy * accuracyMultiplier; } getUserPokemon(): Pokemon { @@ -3224,6 +3251,8 @@ export class ShowAbilityPhase extends PokemonPhase { } } +export type StatChangeCallback = (target: Pokemon, changed: BattleStat[], relativeChanges: number[]) => void; + export class StatChangePhase extends PokemonPhase { private stats: BattleStat[]; private selfTarget: boolean; @@ -3231,8 +3260,10 @@ export class StatChangePhase extends PokemonPhase { private showMessage: boolean; private ignoreAbilities: boolean; private canBeCopied: boolean; + private onChange: StatChangeCallback; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], levels: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true) { + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], levels: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatChangeCallback = null) { super(scene, battlerIndex); this.selfTarget = selfTarget; @@ -3241,6 +3272,7 @@ export class StatChangePhase extends PokemonPhase { this.showMessage = showMessage; this.ignoreAbilities = ignoreAbilities; this.canBeCopied = canBeCopied; + this.onChange = onChange; } start() { @@ -3282,6 +3314,8 @@ export class StatChangePhase extends PokemonPhase { const battleStats = this.getPokemon().summonData.battleStats; const relLevels = filteredStats.map(stat => (levels.value >= 1 ? Math.min(battleStats[stat] + levels.value, 6) : Math.max(battleStats[stat] + levels.value, -6)) - battleStats[stat]); + this.onChange?.(this.getPokemon(), filteredStats, relLevels); + const end = () => { if (this.showMessage) { const messages = this.getStatChangeMessages(filteredStats, levels.value, relLevels); @@ -3302,6 +3336,21 @@ export class StatChangePhase extends PokemonPhase { applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); + // Look for any other stat change phases; if this is the last one, do White Herb check + const existingPhase = this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex); + if (!(existingPhase instanceof StatChangePhase)) { + // Apply White Herb if needed + const whiteHerb = this.scene.applyModifier(PokemonResetNegativeStatStageModifier, this.player, pokemon) as PokemonResetNegativeStatStageModifier; + // If the White Herb was applied, consume it + if (whiteHerb) { + --whiteHerb.stackCount; + if (whiteHerb.stackCount <= 0) { + this.scene.removeModifier(whiteHerb); + } + this.scene.updateModifiers(this.player); + } + } + pokemon.updateInfo(); handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end()); @@ -3411,12 +3460,13 @@ export class StatChangePhase extends PokemonPhase { 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])}`; + ? i18next.t("battle:stats") + : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(", ")}${relLevelStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1,relLevelStats.length)); } else { statsFragment = getBattleStatName(relLevelStats[0]); + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1,relLevelStats.length)); } - messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1)); }); return messages; @@ -3506,7 +3556,7 @@ export class ObtainStatusEffectPhase extends PokemonPhase { } pokemon.updateInfo(true); new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect - 1), pokemon).play(this.scene, () => { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectObtainText(this.statusEffect, this.sourceText))); + this.scene.queueMessage(getStatusEffectObtainText(this.statusEffect, getPokemonNameWithAffix(pokemon), this.sourceText)); if (pokemon.status.isPostTurn()) { this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, this.battlerIndex)); } @@ -3515,7 +3565,7 @@ export class ObtainStatusEffectPhase extends PokemonPhase { return; } } else if (pokemon.status.effect === this.statusEffect) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectOverlapText(this.statusEffect))); + this.scene.queueMessage(getStatusEffectOverlapText(this.statusEffect, getPokemonNameWithAffix(pokemon))); } this.end(); } @@ -3535,7 +3585,7 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectActivationText(pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); let damage: integer = 0; switch (pokemon.status.effect) { case StatusEffect.POISON: @@ -3561,6 +3611,14 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { this.end(); } } + + override end() { + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + this.scene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); + } + } } export class MessagePhase extends Phase { @@ -3616,7 +3674,9 @@ export class DamagePhase extends PokemonPhase { super.start(); if (this.damageResult === HitResult.ONE_HIT_KO) { - this.scene.toggleInvert(true); + if (this.scene.moveAnimations) { + this.scene.toggleInvert(true); + } this.scene.time.delayedCall(Utils.fixedInt(1000), () => { this.scene.toggleInvert(false); this.applyDamage(); @@ -3666,34 +3726,12 @@ export class DamagePhase extends PokemonPhase { } } - 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; + override end() { + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + this.scene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); } - - super.end(); } } @@ -3764,11 +3802,10 @@ export class FaintPhase extends PokemonPhase { 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) { + } else if (nonFaintedPartyMemberCount === 1 && this.scene.currentBattle.double) { this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + } else if (nonFaintedPartyMemberCount >= this.scene.currentBattle.getBattlerCount()) { + this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); } } else { this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); @@ -3898,7 +3935,9 @@ export class VictoryPhase extends PokemonPhase { expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + const modifierBonusExp = new Utils.NumberHolder(1); + this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, modifierBonusExp); + pokemonExp.value *= modifierBonusExp.value; partyMemberExp.push(Math.floor(pokemonExp.value)); } @@ -4123,7 +4162,11 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { 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, () => { + 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); }); @@ -4154,7 +4197,7 @@ export class GameOverPhase extends BattlePhase { } 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.showText(i18next.t("battle:retryBattle"), null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.fadeOut(1250).then(() => { this.scene.reset(); @@ -4324,7 +4367,7 @@ export class EndCardPhase extends Phase { this.endCard.setScale(0.5); this.scene.field.add(this.endCard); - this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, "Congratulations!", TextStyle.SUMMARY, { fontSize: "128px" }); + this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); this.text.setOrigin(0.5); this.scene.field.add(this.text); @@ -4354,7 +4397,7 @@ export class UnlockPhase extends Phase { 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.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); @@ -4425,6 +4468,11 @@ export class SwitchPhase extends BattlePhase { return super.end(); } + // Skip if the fainted party member has been revived already + if (this.isModal && !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(); @@ -4458,7 +4506,7 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase { const exp = new Utils.NumberHolder(this.expValue); this.scene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); - this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: pokemon.name, exp: exp.value }), null, () => { + this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: getPokemonNameWithAffix(pokemon), exp: exp.value }), null, () => { const lastLevel = pokemon.level; pokemon.addExp(exp.value); const newLevel = pokemon.level; @@ -4558,14 +4606,14 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { 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); + 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.level <= 100) { + 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])); @@ -4616,7 +4664,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { .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.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); @@ -4625,15 +4673,15 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { }); } 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: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: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); + 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)); @@ -4652,7 +4700,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { } 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:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), 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)); @@ -4694,7 +4742,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } start() { - if (!this.skipAnim && (this.revive || this.getPokemon().hp) && this.getPokemon().getHpRatio() < 1) { + if (!this.skipAnim && (this.revive || this.getPokemon().hp) && !this.getPokemon().isFullHp()) { super.start(); } else { this.end(); @@ -4709,10 +4757,8 @@ export class PokemonHealPhase extends CommonAnimPhase { return; } - const fullHp = pokemon.getHpRatio() >= 1; - const hasMessage = !!this.message; - const healOrDamage = (!fullHp || this.hpHealed < 0); + const healOrDamage = (!pokemon.isFullHp() || this.hpHealed < 0); let lastStatusEffect = StatusEffect.NONE; if (healOrDamage) { @@ -4757,7 +4803,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } if (this.healStatus && lastStatusEffect && !hasMessage) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(lastStatusEffect))); + this.scene.queueMessage(getStatusEffectHealText(lastStatusEffect, getPokemonNameWithAffix(pokemon))); } if (!healOrDamage && !lastStatusEffect) { @@ -4890,7 +4936,9 @@ export class AttemptCapturePhase extends PokemonPhase { }); } }, - onComplete: () => this.catch() + onComplete: () => { + this.catch(); + } }); }; @@ -4931,7 +4979,6 @@ export class AttemptCapturePhase extends PokemonPhase { catch() { const pokemon = this.getPokemon() as EnemyPokemon; - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); @@ -4955,8 +5002,9 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { const end = () => { + this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); this.scene.pokemonInfoContainer.hide(); this.removePb(); this.end(); @@ -4988,9 +5036,16 @@ export class AttemptCapturePhase extends PokemonPhase { 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.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) { @@ -5005,7 +5060,7 @@ export class AttemptCapturePhase extends PokemonPhase { removePokemon(); end(); }); - }); + }, "fullParty"); }); }; promptRelease(); @@ -5128,9 +5183,11 @@ export class SelectModifierPhase extends BattlePhase { 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); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } this.scene.playSound("buy"); } break; @@ -5138,7 +5195,7 @@ export class SelectModifierPhase extends BattlePhase { this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + && m.isTransferrable && m.pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; const itemModifier = itemModifiers[itemIndex]; this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); } else { @@ -5171,7 +5228,7 @@ export class SelectModifierPhase extends BattlePhase { break; } - if (cost && this.scene.money < cost) { + if (cost && (this.scene.money < cost) && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { this.scene.ui.playError(); return false; } @@ -5181,9 +5238,11 @@ export class SelectModifierPhase extends BattlePhase { if (cost) { result.then(success => { if (success) { - this.scene.money -= cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= cost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } this.scene.playSound("buy"); (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); } else { @@ -5263,7 +5322,9 @@ export class SelectModifierPhase extends BattlePhase { getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { let baseValue = 0; - if (lockRarities) { + 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]; @@ -5448,7 +5509,7 @@ export class ScanIvsPhase extends PokemonPhase { const pokemon = this.getPokemon(); - this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: pokemon.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.clearText(); diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 3bcac101465..b6f242f3e89 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -100,7 +100,7 @@ export async function initI18n(): Promise { detection: { lookupLocalStorage: "prLang" }, - debug: true, + debug: Number(import.meta.env.VITE_I18N_DEBUG) === 1, interpolation: { escapeValue: false, }, 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/system/achv.ts b/src/system/achv.ts index 511ddd1eb8e..0dcf74ce3a5 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -5,7 +5,7 @@ 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 } from "#app/data/challenge.js"; export enum AchvTier { COMMON, @@ -276,6 +276,8 @@ export function getAchievementDescription(localizationKey: string): string { case "MONO_DARK": case "MONO_FAIRY": return i18next.t(`${genderPrefix}achv:MonoType.description` as ParseKeys, {"type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`)}); + case "FRESH_START": + return i18next.t(`${genderPrefix}achv:FRESH_START.description` as ParseKeys); default: return ""; } @@ -303,7 +305,7 @@ export const achvs = { _50_RIBBONS: new RibbonAchv("50_RIBBONS","", 50, "ultra_ribbon", 50).setSecret(true), _75_RIBBONS: new RibbonAchv("75_RIBBONS","", 75, "rogue_ribbon", 75).setSecret(true), _100_RIBBONS: new RibbonAchv("100_RIBBONS","", 100, "master_ribbon", 100).setSecret(true), - TRANSFER_MAX_BATTLE_STAT: new Achv("TRANSFER_MAX_BATTLE_STAT","", "TRANSFER_MAX_BATTLE_STAT.description","stick", 20), + TRANSFER_MAX_BATTLE_STAT: new Achv("TRANSFER_MAX_BATTLE_STAT","", "TRANSFER_MAX_BATTLE_STAT.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), @@ -316,22 +318,22 @@ export const achvs = { 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(), + 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), - 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_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE","", "MONO_GEN_ONE.description", "ribbon_gen1", 100, c => c instanceof SingleGenerationChallenge && c.value === 1), + MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO","", "MONO_GEN_TWO.description", "ribbon_gen2", 100, c => c instanceof SingleGenerationChallenge && c.value === 2), + MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE","", "MONO_GEN_THREE.description", "ribbon_gen3", 100, c => c instanceof SingleGenerationChallenge && c.value === 3), + MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR","", "MONO_GEN_FOUR.description", "ribbon_gen4", 100, c => c instanceof SingleGenerationChallenge && c.value === 4), + MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE","", "MONO_GEN_FIVE.description", "ribbon_gen5", 100, c => c instanceof SingleGenerationChallenge && c.value === 5), + MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX","", "MONO_GEN_SIX.description", "ribbon_gen6", 100, c => c instanceof SingleGenerationChallenge && c.value === 6), + MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN","", "MONO_GEN_SEVEN.description", "ribbon_gen7", 100, c => c instanceof SingleGenerationChallenge && c.value === 7), + MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT","", "MONO_GEN_EIGHT.description", "ribbon_gen8", 100, c => c instanceof SingleGenerationChallenge && c.value === 8), + MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE","", "MONO_GEN_NINE.description", "ribbon_gen9", 100, c => c instanceof SingleGenerationChallenge && c.value === 9), MONO_NORMAL: new ChallengeAchv("MONO_NORMAL","", "MONO_NORMAL.description", "silk_scarf", 100, c => c instanceof SingleTypeChallenge && c.value === 1), MONO_FIGHTING: new ChallengeAchv("MONO_FIGHTING","", "MONO_FIGHTING.description", "black_belt", 100, c => c instanceof SingleTypeChallenge && c.value === 2), MONO_FLYING: new ChallengeAchv("MONO_FLYING","", "MONO_FLYING.description", "sharp_beak", 100, c => c instanceof SingleTypeChallenge && c.value === 3), @@ -350,6 +352,7 @@ export const achvs = { MONO_DRAGON: new ChallengeAchv("MONO_DRAGON","", "MONO_DRAGON.description", "dragon_fang", 100, c => c instanceof SingleTypeChallenge && c.value === 16), MONO_DARK: new ChallengeAchv("MONO_DARK","", "MONO_DARK.description", "black_glasses", 100, c => c instanceof SingleTypeChallenge && c.value === 17), MONO_FAIRY: new ChallengeAchv("MONO_FAIRY","", "MONO_FAIRY.description", "fairy_feather", 100, c => c instanceof SingleTypeChallenge && c.value === 18), + FRESH_START: new ChallengeAchv("FRESH_START","", "FRESH_START.description", "reviver_seed", 100, c => c instanceof FreshStartChallenge && c.value === 1), }; export function initAchievements() { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index ac54c942fc7..161b5a2c49b 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -4,7 +4,7 @@ import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; import { pokemonEvolutions, 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"; @@ -40,6 +40,7 @@ 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.js"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -348,7 +349,7 @@ 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)); @@ -572,6 +573,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) { @@ -1160,7 +1163,7 @@ export class GameData { } const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser.username}`), bypassLogin)) : this.getSessionSaveData(scene); - const maxIntAttrValue = Math.pow(2, 31); + const maxIntAttrValue = 0x80000000; const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)) : this.getSystemSaveData(); const request = { @@ -1365,7 +1368,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; } @@ -1432,10 +1435,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,7 +1474,7 @@ 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)); } } @@ -1542,7 +1545,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); @@ -1634,7 +1637,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,7 +1645,7 @@ export class GameData { } getSpeciesDefaultNatureAttr(species: PokemonSpecies): integer { - return Math.pow(2, this.getSpeciesDefaultNature(species)); + return 1 << (this.getSpeciesDefaultNature(species)); } getDexAttrLuck(dexAttr: bigint): integer { @@ -1652,7 +1655,7 @@ export class GameData { getNaturesForAttr(natureAttr: integer): 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 +1679,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 +1697,7 @@ export class GameData { } getFormAttr(formIndex: integer): bigint { - return BigInt(Math.pow(2, 7 + formIndex)); + return BigInt(1 << (7 + formIndex)); } consolidateDexData(dexData: DexData): void { @@ -1701,7 +1707,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)); } } } 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 d79206d89df..6f169280da1 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -5,7 +5,6 @@ import { GeneratedPersistentModifierType, ModifierTypeGenerator, getModifierType export default class ModifierData { private player: boolean; private typeId: string; - private typeGeneratorId: string; private typePregenArgs: any[]; private args: any[]; private stackCount: integer; @@ -16,7 +15,6 @@ export default class ModifierData { const sourceModifier = source instanceof PersistentModifier ? source as PersistentModifier : null; this.player = player; this.typeId = sourceModifier ? sourceModifier.type.id : source.typeId; - this.typeGeneratorId = sourceModifier ? sourceModifier.type.generatorId : source.typeGeneratorId; if (sourceModifier) { if ("getPregenArgs" in source.type) { this.typePregenArgs = (source.type as GeneratedPersistentModifierType).getPregenArgs(); @@ -38,7 +36,6 @@ export default class ModifierData { try { let type = typeFunc(); type.id = this.typeId; - type.generatorId = this.typeGeneratorId; if (type instanceof ModifierTypeGenerator) { type = (type as ModifierTypeGenerator).generateType(this.player ? scene.getParty() : scene.getEnemyField(), this.typePregenArgs); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index e06f53a1909..8e4abaadd35 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; @@ -37,6 +38,7 @@ export default class PokemonData { public friendship: integer; public metLevel: integer; public metBiome: Biome | -1; + public metSpecies: Species; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -60,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; @@ -82,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; @@ -142,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..af27613136c 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -16,6 +16,13 @@ const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i value: "Mute", label: i18next.t("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", @@ -98,6 +105,7 @@ export const SettingKeys = { SE_Volume: "SE_VOLUME", Music_Preference: "MUSIC_PREFERENCE", Show_BGM_Bar: "SHOW_BGM_BAR", + Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY" }; /** @@ -493,9 +501,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, @@ -535,7 +542,14 @@ export const Setting: Array = [ type: SettingType.AUDIO, requireReload: true }, - + { + key: SettingKeys.Shop_Overlay_Opacity, + label: i18next.t("settings:shopOverlayOpacity"), + options: SHOP_OVERLAY_OPACITY_OPTIONS, + default: 7, + type: SettingType.DISPLAY, + requireReload: false + }, ]; /** @@ -760,6 +774,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/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts new file mode 100644 index 00000000000..0004479ed8c --- /dev/null +++ b/src/test/abilities/ability_timing.test.ts @@ -0,0 +1,53 @@ +import { CommandPhase, MessagePhase, TurnInitPhase } from "#app/phases"; +import i18next, { initI18n } from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import { Mode } from "#app/ui/ui"; +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"; + + +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"); + + game.override.enemySpecies(Species.PIDGEY); + game.override.enemyAbility(Abilities.INTIMIDATE); + game.override.enemyMoveset(SPLASH_ONLY); + + game.override.ability(Abilities.BALL_FETCH); + game.override.moveset([Moves.SPLASH, Moves.ICE_BEAM]); + }); + + it("should trigger after switch check", async() => { + initI18n(); + i18next.changeLanguage("en"); + await game.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..918905fc00a 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.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 { allMoves } from "#app/data/move.js"; import { MoveEffectPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import Move, { allMoves } from "#app/data/move.js"; -import Pokemon from "#app/field/pokemon.js"; -import { FieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; +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("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 +27,38 @@ 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]); + const moveToCheck = allMoves[Moves.MOONBLAST]; + const basePower = moveToCheck.power; + game.override.ability(Abilities.FAIRY_AURA); + vi.spyOn(moveToCheck, "calculateBattlePower"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.MOONBLAST)); - - const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.MOONBLAST]); - await game.phaseInterceptor.to(MoveEffectPhase); - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); - + 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]); + const moveToCheck = allMoves[Moves.DARK_PULSE]; + const basePower = moveToCheck.power; + game.override.ability(Abilities.DARK_AURA); + vi.spyOn(moveToCheck, "calculateBattlePower"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.DARK_PULSE)); - - const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.DARK_PULSE]); - await game.phaseInterceptor.to(MoveEffectPhase); - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); }); }); - -/** - * 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..9c3248f39c0 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 { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Move, { allMoves, MoveCategory } from "#app/data/move.js"; -import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +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("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)); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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 * 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)); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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).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)); + await game.startBattle([Species.CHARJABUG, Species.PIKACHU]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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 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..ce41f9b6603 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -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 { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,19 +27,19 @@ 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, }); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 1b7eb3f7b90..1d58d899565 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 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 { CommandPhase, MessagePhase } from "#app/phases.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "../utils/gameManager"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -27,25 +27,27 @@ 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", 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); + expect(leftPokemon).toBeDefined(); + expect(rightPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.NASTY_PLOT)); await game.phaseInterceptor.to(CommandPhase); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.toNextTurn(); expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); @@ -66,13 +68,13 @@ describe("Abilities - COSTAR", () => { test( "ability copies negative stat changes", 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).toBeDefined(); + expect(rightPokemon).toBeDefined(); expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 297aa33e06c..3a6fd540d27 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -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 { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +27,10 @@ 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"); + game.override.ability(Abilities.DISGUISE); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -39,8 +38,8 @@ describe("Abilities - DISGUISE", () => { async () => { const baseForm = 0, bustedForm = 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.MIMIKYU]: bustedForm, }); @@ -71,11 +70,11 @@ describe("Abilities - DISGUISE", () => { const baseForm = 0, bustedForm = 1; - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.enemyMoveset([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); + game.override.startingLevel(20); + game.override.enemyLevel(20); + game.override.enemySpecies(Species.MAGIKARP); + game.override.starterForms({ [Species.MIMIKYU]: baseForm, }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index bfb8f45a11f..5434974c583 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -1,12 +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 "#app/enums/species.js"; import { TurnEndPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { Species } from "#app/enums/species.js"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Dry Skin", () => { let phaserGame: Phaser.Game; @@ -24,16 +24,17 @@ 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(); @@ -54,7 +55,7 @@ describe("Abilities - Dry Skin", () => { }); 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(); @@ -77,36 +78,34 @@ describe("Abilities - Dry Skin", () => { }); 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); + expect(enemy).toBeDefined(); + 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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(); @@ -121,7 +120,7 @@ describe("Abilities - Dry Skin", () => { }); 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(); @@ -129,7 +128,7 @@ describe("Abilities - Dry Skin", () => { 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)); await game.phaseInterceptor.to(TurnEndPhase); @@ -137,7 +136,7 @@ describe("Abilities - Dry Skin", () => { }); 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(); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts new file mode 100644 index 00000000000..6d78846071d --- /dev/null +++ b/src/test/abilities/hustle.test.ts @@ -0,0 +1,99 @@ +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { Stat } from "#app/enums/stat.js"; +import { DamagePhase, MoveEffectPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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("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); + game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); + game.override.startingLevel(5); + game.override.disableCrits(); + game.override.enemyLevel(5); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyAbility(Abilities.BALL_FETCH); + }); + + it("increases the user's Attack stat by 50%", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + const atk = pikachu.stats[Stat.ATK]; + + vi.spyOn(pikachu, "getBattleStat"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + await game.phaseInterceptor.to(DamagePhase); + + expect(pikachu.getBattleStat).toHaveReturnedWith(atk * 1.5); + }); + + it("lowers the accuracy of the user's physical moves by 20%", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + + vi.spyOn(pikachu, "getAccuracyMultiplier"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8); + }); + + it("does not affect non-physical moves", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + const spatk = pikachu.stats[Stat.SPATK]; + + vi.spyOn(pikachu, "getBattleStat"); + vi.spyOn(pikachu, "getAccuracyMultiplier"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GIGA_DRAIN)); + await game.phaseInterceptor.to(DamagePhase); + + expect(pikachu.getBattleStat).toHaveReturnedWith(spatk); + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); + }); + + it("does not affect OHKO moves", async () => { + game.override.startingLevel(100); + game.override.enemyLevel(30); + + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + + vi.spyOn(pikachu, "getAccuracyMultiplier"); + vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy"); + + game.doAttack(getMovePosition(game.scene, 0, 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/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 7d85f5bbc55..ed04aa8bac2 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -1,19 +1,18 @@ -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 { QuietFormChangePhase } from "#app/form-change-phase"; import { MoveEffectPhase, MoveEndPhase, TurnEndPhase, TurnInitPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; -import { QuietFormChangePhase } from "#app/form-change-phase"; +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 - Ice Face", () => { let phaserGame: Phaser.Game; @@ -33,10 +32,10 @@ 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 () => { @@ -48,14 +47,14 @@ describe("Abilities - Ice Face", () => { 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); }); 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)); @@ -65,7 +64,7 @@ describe("Abilities - Ice Face", () => { // 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(); @@ -109,8 +108,8 @@ describe("Abilities - Ice Face", () => { }); 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]); @@ -120,7 +119,7 @@ describe("Abilities - Ice Face", () => { 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); @@ -131,8 +130,8 @@ describe("Abilities - Ice Face", () => { }); 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]); @@ -143,7 +142,7 @@ describe("Abilities - Ice Face", () => { expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); await game.toNextTurn(); game.doSwitchPokemon(1); @@ -158,8 +157,8 @@ describe("Abilities - Ice Face", () => { }); 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]); @@ -178,7 +177,7 @@ describe("Abilities - Ice Face", () => { }); 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]); @@ -189,7 +188,7 @@ describe("Abilities - Ice Face", () => { expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); await game.toNextTurn(); game.doSwitchPokemon(1); @@ -202,10 +201,10 @@ describe("Abilities - Ice Face", () => { }); 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, }); @@ -227,7 +226,7 @@ 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]); @@ -243,7 +242,7 @@ 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]); @@ -259,7 +258,7 @@ 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]); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 4a690e76b56..3ed7a01b98e 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -1,22 +1,22 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +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 Overrides from "#app/overrides"; +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 { 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 { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; - +import { removeEnemyHeldItems } from "../utils/testUtils"; describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; @@ -34,24 +34,27 @@ 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"); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.INTIMIDATE); + game.override.enemyPassiveAbility(Abilities.HYDRATION); + game.override.ability(Abilities.INTIMIDATE); + game.override.startingWave(3); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); - 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)); + it("single - wild with switch", async () => { + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); + 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; @@ -70,16 +73,19 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.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)); + it("single - boss should only trigger once then switch", async () => { + game.override.startingWave(10); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); + 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); @@ -97,16 +103,19 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.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)); + it("single - trainer should only trigger once with switch", async () => { + game.override.startingWave(5); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); + 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); @@ -124,18 +133,20 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); }, 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)); + it("double - trainer should only trigger once per pokemon", async () => { + game.override.battleType("double"); + game.override.startingWave(5); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); + 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); @@ -149,18 +160,20 @@ describe("Abilities - Intimidate", () => { 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)); + it("double - wild: should only trigger once per pokemon", async () => { + game.override.battleType("double"); + game.override.startingWave(3); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); + 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); @@ -174,18 +187,20 @@ describe("Abilities - Intimidate", () => { 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)); + it("double - boss: should only trigger once per pokemon", async () => { + game.override.battleType("double"); + game.override.startingWave(10); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); + 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); @@ -199,13 +214,11 @@ describe("Abilities - Intimidate", () => { 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, - ]); + it("single - wild next wave opp triger once, us: none", async () => { + game.override.startingWave(2); + game.override.moveset([Moves.AERIAL_ACE]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -228,13 +241,11 @@ describe("Abilities - Intimidate", () => { 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, - ]); + it("single - wild next turn - no retrigger on next turn", async () => { + game.override.startingWave(2); + game.override.moveset([Moves.SPLASH]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -255,14 +266,12 @@ describe("Abilities - Intimidate", () => { 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, - ]); + it("single - trainer should only trigger once and each time he switch", async () => { + game.override.moveset([Moves.SPLASH]); + game.override.enemyMoveset([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); + game.override.startingWave(5); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -282,7 +291,6 @@ describe("Abilities - Intimidate", () => { 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()); }); @@ -298,14 +306,12 @@ describe("Abilities - Intimidate", () => { 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, - ]); + it("single - trainer should only trigger once whatever turn we are", async () => { + game.override.moveset([Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.startingWave(5); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -325,7 +331,6 @@ describe("Abilities - Intimidate", () => { 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()); }); @@ -341,13 +346,12 @@ describe("Abilities - Intimidate", () => { 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, - ]); + it("double - wild vs only 1 on player side", async () => { + game.override.battleType("double"); + game.override.startingWave(3); + vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); + await game.runToSummon([Species.MIGHTYENA]); + removeEnemyHeldItems(game.scene); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -358,18 +362,14 @@ describe("Abilities - Intimidate", () => { 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); + it("double - wild vs only 1 alive on player side", async () => { + game.override.battleType("double"); + game.override.startingWave(3); await game.runToTitle(); game.onNextPrompt("TitlePhase", Mode.TITLE, () => { game.scene.gameMode = getGameMode(GameModes.CLASSIC); - const starters = generateStarter(game.scene, [ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); + const 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); @@ -378,6 +378,7 @@ describe("Abilities - Intimidate", () => { }); await game.phaseInterceptor.run(EncounterPhase); + removeEnemyHeldItems(game.scene); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index 2d51642be70..5292bcd7c82 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.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 {Abilities} from "#enums/abilities"; -import {Species} from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; import { CommandPhase, } from "#app/phases"; -import {BattleStat} from "#app/data/battle-stat"; +import GameManager from "#app/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"; describe("Abilities - Intrepid Sword", () => { @@ -26,10 +25,10 @@ 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() => { diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index a00239a651b..58e67a6ebe6 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -1,18 +1,18 @@ +import { allMoves } from "#app/data/move.js"; +import { Type } from "#app/data/type.js"; +import { Weather, WeatherType } from "#app/data/weather.js"; +import { PlayerPokemon } from "#app/field/pokemon.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +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 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"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -32,17 +32,17 @@ 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]); @@ -60,7 +60,7 @@ 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]); @@ -100,7 +100,7 @@ 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]); @@ -123,8 +123,8 @@ 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]); @@ -146,7 +146,7 @@ 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]); @@ -165,7 +165,7 @@ 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]); @@ -183,8 +183,8 @@ 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]); @@ -197,7 +197,7 @@ describe("Abilities - Protean", () => { await game.phaseInterceptor.to(TurnEndPhase); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.isFullHp()).toBe(true); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); }, TIMEOUT, @@ -206,8 +206,8 @@ 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]); @@ -225,8 +225,8 @@ 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]); @@ -244,7 +244,7 @@ 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]); @@ -263,7 +263,7 @@ 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]); @@ -283,7 +283,7 @@ 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]); @@ -301,7 +301,7 @@ 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]); @@ -319,8 +319,8 @@ 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]); @@ -338,7 +338,7 @@ 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]); diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts new file mode 100644 index 00000000000..60a3cda3b08 --- /dev/null +++ b/src/test/abilities/magic_guard.test.ts @@ -0,0 +1,509 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { TurnEndPhase, MoveEffectPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { ArenaTagSide, getArenaTag } from "#app/data/arena-tag"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { WeatherType } from "#app/data/weather.js"; +import { StatusEffect, getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; +import { BattlerTagType } from "#enums/battler-tag-type"; + +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 */ + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + /** Enemy Pokemon overrides */ + 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, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) + + it( + "ability should prevent damage caused by weather", + async () => { + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SANDSTORM); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 + vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WORRY_SEED,Moves.WORRY_SEED,Moves.WORRY_SEED,Moves.WORRY_SEED]); + vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 () => { + vi.spyOn(overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.BURN); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect (leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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 () => { + vi.spyOn(overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.TOXIC); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect (leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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]); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect (leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CURSE)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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 () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HIGH_JUMP_KICK]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HIGH_JUMP_KICK)); + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(false); + + 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 () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAKE_DOWN]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEEL_BEAM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + + await game.phaseInterceptor.to(TurnEndPhase); + }); +*/ + + it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BELLY_DRUM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 + vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + //enemy pokemon is given Spore just in case player pokemon somehow awakens during test + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BAD_DREAMS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AFTERMATH); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + enemyPokemon.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, 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 + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.IRON_BARBS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIQUID_OOZE); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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 + vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SOLAR_POWER); + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SUNNY); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + game.doAttack(getMovePosition(game.scene, 0, 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/moxie.test.ts b/src/test/abilities/moxie.test.ts index 46fc4e5c34c..469a4e2947f 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -1,20 +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 { BattleStat } from "#app/data/battle-stat"; +import { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; 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"; describe("Abilities - Moxie", () => { @@ -34,13 +33,13 @@ 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([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("MOXIE", async() => { diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 4401ee0d40a..bc7be2fae96 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -1,16 +1,16 @@ +import { BattleStat } from "#app/data/battle-stat.js"; +import { StatusEffect } from "#app/data/status-effect.js"; +import { Type } from "#app/data/type.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +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 * as Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Type } from "#app/data/type.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { StatusEffect } from "#app/data/status-effect.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -30,19 +30,20 @@ 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.INSOMNIA); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.startingLevel(100); + game.override.enemyLevel(100); }); test( "ability 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]); @@ -57,7 +58,6 @@ describe("Abilities - Parental Bond", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); await game.phaseInterceptor.to(DamagePhase); const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; @@ -75,8 +75,8 @@ describe("Abilities - Parental Bond", () => { test( "ability should apply secondary effects to both strikes", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWER_UP_PUNCH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + game.override.moveset([Moves.POWER_UP_PUNCH]); + game.override.enemySpecies(Species.AMOONGUSS); await game.startBattle([Species.CHARIZARD]); @@ -98,7 +98,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -118,7 +118,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -143,7 +143,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -164,7 +164,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -188,7 +188,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -210,8 +210,8 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply multiplier to counter moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.COUNTER]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.moveset([Moves.COUNTER]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([Species.CHARIZARD]); @@ -238,9 +238,8 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-target moves", async () => { - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + game.override.battleType("double"); + game.override.moveset([Moves.EARTHQUAKE]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); @@ -265,7 +264,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -285,7 +284,7 @@ describe("Abilities - Parental Bond", () => { test( "ability 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]); @@ -311,7 +310,7 @@ describe("Abilities - Parental Bond", () => { test( "Burn Up only removes type after second strike with this ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); await game.startBattle([Species.CHARIZARD]); @@ -338,8 +337,8 @@ describe("Abilities - Parental Bond", () => { test( "Moves boosted by this ability and Multi-Lens should strike 4 times", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.moveset([Moves.TACKLE]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -360,8 +359,8 @@ describe("Abilities - Parental Bond", () => { test( "Super Fang boosted by this ability and Multi-Lens should strike twice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUPER_FANG]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.moveset([Moves.SUPER_FANG]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -391,8 +390,8 @@ describe("Abilities - Parental Bond", () => { test( "Seismic Toss boosted by this ability and Multi-Lens should strike twice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SEISMIC_TOSS]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.moveset([Moves.SEISMIC_TOSS]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -422,7 +421,7 @@ describe("Abilities - Parental Bond", () => { test( "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]); @@ -449,10 +448,10 @@ describe("Abilities - Parental Bond", () => { ); /** TODO: Fix TRAPPED tag lapsing incorrectly, then run this test */ - test.skip( + test( "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]); @@ -484,7 +483,7 @@ describe("Abilities - Parental Bond", () => { test( "Smack Down boosted by this ability should only ground the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SMACK_DOWN]); + game.override.moveset([Moves.SMACK_DOWN]); await game.startBattle([Species.CHARIZARD]); @@ -513,7 +512,7 @@ describe("Abilities - Parental Bond", () => { test( "U-turn boosted by this ability should strike twice before forcing a switch", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.U_TURN]); + game.override.moveset([Moves.U_TURN]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -539,8 +538,7 @@ describe("Abilities - Parental Bond", () => { test( "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WAKE_UP_SLAP]); - vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + game.override.moveset([Moves.WAKE_UP_SLAP]).enemyStatusEffect(StatusEffect.SLEEP); await game.startBattle([Species.CHARIZARD]); @@ -569,8 +567,8 @@ describe("Abilities - Parental Bond", () => { test( "ability should not cause user to hit into King's Shield more than once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); await game.startBattle([Species.CHARIZARD]); @@ -591,8 +589,8 @@ describe("Abilities - Parental Bond", () => { test( "ability should not cause user to hit into Storm Drain more than once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STORM_DRAIN); + game.override.moveset([Moves.WATER_GUN]); + game.override.enemyAbility(Abilities.STORM_DRAIN); await game.startBattle([Species.CHARIZARD]); @@ -613,10 +611,9 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-target moves with Multi-Lens", async () => { - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.battleType("double"); + game.override.moveset([Moves.EARTHQUAKE, Moves.SPLASH]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); @@ -636,7 +633,6 @@ describe("Abilities - Parental Bond", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); await game.phaseInterceptor.to(DamagePhase); const enemyFirstHitDamage = enemyStartingHp.map((hp, i) => hp - enemyPokemon[i].hp); diff --git a/src/test/abilities/pastel_veil.test.ts b/src/test/abilities/pastel_veil.test.ts new file mode 100644 index 00000000000..f19b395677f --- /dev/null +++ b/src/test/abilities/pastel_veil.test.ts @@ -0,0 +1,79 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + CommandPhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { StatusEffect } from "#app/data/status-effect.js"; +import { allAbilities } from "#app/data/ability.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; + +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); + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD]); + }); + + it("prevents the user and its allies from being afflicted by poison", async () => { + await game.startBattle([Species.GALAR_PONYTA, Species.MAGIKARP]); + const ponyta = game.scene.getPlayerField()[0]; + + vi.spyOn(ponyta, "getAbility").mockReturnValue(allAbilities[Abilities.PASTEL_VEIL]); + + expect(ponyta.hasAbility(Abilities.PASTEL_VEIL)).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); + + it("it heals the poisoned status condition of allies if user is sent out into battle", async () => { + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.GALAR_PONYTA]); + const ponyta = game.scene.getParty().find(p => p.species.speciesId === Species.GALAR_PONYTA); + + vi.spyOn(ponyta, "getAbility").mockReturnValue(allAbilities[Abilities.PASTEL_VEIL]); + + expect(ponyta.hasAbility(Abilities.PASTEL_VEIL)).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getPlayerField().some(p => p.status?.effect === StatusEffect.POISON)).toBe(true); + + const poisonedMon = game.scene.getPlayerField().find(p => p.status?.effect === StatusEffect.POISON); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, (poisonedMon.getBattlerIndex() as BattlerIndex.PLAYER | BattlerIndex.PLAYER_2), Moves.SPLASH)); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); +}); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 68a360a60a2..769499c0e53 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -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 { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +27,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 +38,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, }); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 0ed2b10f4be..018002fe541 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 { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Move, { allMoves, MoveCategory } from "#app/data/move.js"; -import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +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("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)); + await game.startBattle([Species.PIKACHU, Species.STONJOURNER]); + game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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)); + await game.startBattle([Species.PIKACHU, Species.STONJOURNER]); + game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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)); + await game.startBattle([Species.STONJOURNER, Species.PIKACHU]); + game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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..d02c87662cf 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -1,18 +1,18 @@ +import { allMoves } from "#app/data/move.js"; +import { Type } from "#app/data/type.js"; +import { Weather, WeatherType } from "#app/data/weather.js"; +import { PlayerPokemon } from "#app/field/pokemon.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +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 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"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -32,17 +32,17 @@ 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]); @@ -60,7 +60,7 @@ 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]); @@ -100,7 +100,7 @@ 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]); @@ -123,8 +123,8 @@ 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]); @@ -146,7 +146,7 @@ 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]); @@ -165,7 +165,7 @@ 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]); @@ -183,8 +183,8 @@ 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]); @@ -197,7 +197,7 @@ describe("Abilities - Protean", () => { await game.phaseInterceptor.to(TurnEndPhase); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.isFullHp()).toBe(true); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); }, TIMEOUT, @@ -206,8 +206,8 @@ 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]); @@ -225,8 +225,8 @@ 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]); @@ -244,7 +244,7 @@ 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]); @@ -263,7 +263,7 @@ 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]); @@ -283,7 +283,7 @@ 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]); @@ -301,7 +301,7 @@ 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]); @@ -319,8 +319,8 @@ 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]); @@ -338,7 +338,7 @@ 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]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 884b108381d..e6177639bac 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -1,12 +1,11 @@ -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"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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"; describe("Abilities - Quick Draw", () => { @@ -25,18 +24,22 @@ 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(); @@ -52,8 +55,11 @@ 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(); @@ -67,12 +73,13 @@ describe("Abilities - Quick Draw", () => { 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(); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts new file mode 100644 index 00000000000..4394df3ce97 --- /dev/null +++ b/src/test/abilities/sand_veil.test.ts @@ -0,0 +1,83 @@ +import { BattleStatMultiplierAbAttr, allAbilities } from "#app/data/ability.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { WeatherType } from "#app/data/weather.js"; +import { CommandPhase, MoveEffectPhase, MoveEndPhase } from "#app/phases.js"; +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 { getMovePosition } from "../utils/gameManagerUtils"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Sand 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.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( + "ability should increase the evasiveness of the source", + async () => { + 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) { + statValue.value *= -1; // will make all attacks miss + return true; + } + return false; + } + ); + + 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)); + + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + 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..2ed1df05652 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -1,17 +1,16 @@ -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 { BattleStat } from "#app/data/battle-stat.js"; +import { TerrainType } from "#app/data/terrain.js"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; // See also: TypeImmunityAbAttr describe("Abilities - Sap Sipper", () => { @@ -30,18 +29,18 @@ 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() => { 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([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.DUSKULL); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -59,10 +58,10 @@ describe("Abilities - Sap Sipper", () => { 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([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -78,10 +77,10 @@ describe("Abilities - Sap Sipper", () => { 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([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -98,10 +97,10 @@ describe("Abilities - Sap Sipper", () => { 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([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -119,11 +118,11 @@ describe("Abilities - Sap Sipper", () => { 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([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.NONE); await game.startBattle(); @@ -139,17 +138,16 @@ describe("Abilities - Sap Sipper", () => { 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(); @@ -162,5 +160,4 @@ describe("Abilities - Sap Sipper", () => { expect(startingOppHp - game.scene.getEnemyParty()[0].hp).toBe(0); expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(1); }); - */ }); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index 4fd64b97246..7671534a549 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -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 { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +27,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,8 +38,8 @@ 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, }); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index d790469e952..2d2dc70b907 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 { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { PostSummonPhase, TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; 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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Screen Cleaner", () => { let phaserGame: Phaser.Game; @@ -25,14 +24,14 @@ 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]); @@ -49,7 +48,7 @@ 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]); @@ -66,7 +65,7 @@ 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]); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index cf283ea92a8..13da444454e 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -1,20 +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 {Abilities} from "#enums/abilities"; -import {applyAbAttrs ,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; +import { applyAbAttrs, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; +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"; describe("Abilities - Serene Grace", () => { @@ -34,11 +33,11 @@ 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() => { @@ -76,7 +75,7 @@ describe("Abilities - Serene Grace", () => { 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 ]); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index c01ec176f4d..1e7657611a1 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -1,20 +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 {Abilities} from "#enums/abilities"; -import {applyAbAttrs ,applyPreAttackAbAttrs,applyPostDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; +import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } from "#app/data/ability"; +import { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; +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"; describe("Abilities - Sheer Force", () => { @@ -34,16 +33,16 @@ 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() => { 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 ]); @@ -82,7 +81,7 @@ describe("Abilities - Sheer Force", () => { 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 ]); @@ -121,7 +120,7 @@ describe("Abilities - Sheer Force", () => { 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 ]); @@ -160,9 +159,9 @@ describe("Abilities - Sheer Force", () => { 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 ]); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index f52a1d6c7d4..35e4015e8bc 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -1,20 +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 { Abilities } from "#enums/abilities"; -import {applyAbAttrs ,applyPreDefendAbAttrs,IgnoreMoveEffectsAbAttr,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; +import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; +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"; describe("Abilities - Shield Dust", () => { @@ -34,12 +33,12 @@ 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() => { diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index f35fdd9ed79..64904c80032 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -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 { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +27,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,8 +38,8 @@ 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, }); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts new file mode 100644 index 00000000000..7ac78eb11fa --- /dev/null +++ b/src/test/abilities/steely_spirit.test.ts @@ -0,0 +1,100 @@ +import { allAbilities } from "#app/data/ability.js"; +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { MoveEffectPhase, SelectTargetPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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("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({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + 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' power used by the user and its allies by 50%", async () => { + await game.startBattle([Species.PIKACHU, Species.SHUCKLE]); + const boostSource = game.scene.getPlayerField()[1]; + const enemyToCheck = game.scene.getEnemyPokemon(); + + vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * steelySpiritMultiplier); + }); + + it("stacks if multiple users with this ability are on the field.", async () => { + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const enemyToCheck = game.scene.getEnemyPokemon(); + + game.scene.getPlayerField().forEach(p => { + vi.spyOn(p, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + }); + + expect(game.scene.getPlayerField().every(p => p.hasAbility(Abilities.STEELY_SPIRIT))).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * Math.pow(steelySpiritMultiplier, 2)); + }); + + it("does not take effect when suppressed", async () => { + await game.startBattle([Species.PIKACHU, Species.SHUCKLE]); + const boostSource = game.scene.getPlayerField()[1]; + const enemyToCheck = game.scene.getEnemyPokemon(); + + vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + + boostSource.summonData.abilitySuppressed = true; + + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(false); + expect(boostSource.summonData.abilitySuppressed).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower); + }); +}); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index b9d764971f0..9bfb3bd0085 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -1,16 +1,15 @@ -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 { EnemyPokemon } from "#app/field/pokemon.js"; import { DamagePhase, MoveEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { EnemyPokemon } from "#app/field/pokemon.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -30,15 +29,15 @@ 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( @@ -77,7 +76,7 @@ describe("Abilities - Sturdy", () => { 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,7 +84,7 @@ 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)); diff --git a/src/test/abilities/sweet_veil.test.ts b/src/test/abilities/sweet_veil.test.ts new file mode 100644 index 00000000000..5a8022958ad --- /dev/null +++ b/src/test/abilities/sweet_veil.test.ts @@ -0,0 +1,108 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + CommandPhase, + MoveEffectPhase, + MovePhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; + +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); + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.REST]); + 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.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.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + 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 () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.REST)); + + 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 () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + 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 () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PIKACHU); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + // First pokemon move + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(true); + + // Second pokemon move + await game.phaseInterceptor.to(MovePhase, false); + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(true); + + expect(game.scene.getPlayerField().some(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(true); + + await game.phaseInterceptor.to(TurnEndPhase); + + const drowsyMon = game.scene.getPlayerField().find(p => !!p.getTag(BattlerTagType.DROWSY)); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, (drowsyMon.getBattlerIndex() as BattlerIndex.PLAYER | BattlerIndex.PLAYER_2), Moves.SPLASH)); + game.doSwitchPokemon(2); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); +}); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index c53be8c82a4..2156c5eb588 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -1,12 +1,11 @@ -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.js"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "../utils/gameManager"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { TurnEndPhase } from "#app/phases.js"; const TIMEOUT = 20 * 1000; @@ -26,12 +25,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 +48,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,8 +67,8 @@ 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(); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 86efd1a9d93..419c3a612d5 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -1,16 +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 { BattleStat } from "#app/data/battle-stat.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import { BattleStat } from "#app/data/battle-stat.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; // See also: TypeImmunityAbAttr describe("Abilities - Volt Absorb", () => { @@ -29,19 +28,19 @@ 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(); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index 89957362268..cfdb2e745fe 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -1,15 +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 { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; 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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Power", () => { let phaserGame: Phaser.Game; @@ -27,11 +27,11 @@ 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 () => { @@ -47,8 +47,8 @@ describe("Abilities - Wind Power", () => { }); 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(); @@ -62,8 +62,8 @@ describe("Abilities - Wind Power", () => { }); 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(); @@ -81,7 +81,7 @@ 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(); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 2b9361f5839..88da929fbf1 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -1,15 +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 { BattleStat } from "#app/data/battle-stat.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; +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("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; @@ -27,11 +27,11 @@ 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"); + game.override.enemySpecies(Species.SHIFTRY); + game.override.enemyAbility(Abilities.WIND_RIDER); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => { @@ -44,13 +44,13 @@ describe("Abilities - Wind Rider", () => { await game.phaseInterceptor.to(TurnEndPhase); - expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.isFullHp()).toBe(true); expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); }); it("Attack is increased by one stage when Tailwind is present on its side", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); @@ -65,8 +65,8 @@ describe("Abilities - Wind Rider", () => { }); 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); + game.override.ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -84,7 +84,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not increase Attack when Tailwind is present on opposing side", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -102,13 +102,13 @@ describe("Abilities - Wind Rider", () => { }); 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(); expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); - expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.isFullHp()).toBe(true); game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index 4dc4b1d4282..bc964134e45 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -1,16 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; +import { allAbilities } from "#app/data/ability.js"; +import { allMoves } from "#app/data/move.js"; +import { MoveEffectPhase } from "#app/phases"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import Move, { allMoves } from "#app/data/move.js"; -import { MoveAbilityBypassAbAttr, WonderSkinAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +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("Abilities - Wonder Skin", () => { let phaserGame: Phaser.Game; @@ -28,114 +26,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]; + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).not.toBe(100); - expect(mockedAccuracy).toBe(50); + 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]; + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); + 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.doAttack(getMovePosition(game.scene, 0, 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..8f4c8b42af5 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -1,7 +1,6 @@ -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 { Stat } from "#app/data/pokemon-stat"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase"; import { CommandPhase, DamagePhase, @@ -14,15 +13,15 @@ import { TurnInitPhase, TurnStartPhase, } from "#app/phases"; -import { Mode } from "#app/ui/ui"; -import { Stat } from "#app/data/pokemon-stat"; +import GameManager from "#app/test/utils/gameManager"; 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 { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -43,13 +42,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( @@ -153,8 +152,8 @@ 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, }); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index e0264729125..409fb35a78c 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -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 { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -28,10 +27,10 @@ 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"); + game.override.ability(Abilities.ZERO_TO_HERO); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -39,8 +38,8 @@ describe("Abilities - ZERO TO HERO", () => { async () => { const baseForm = 0, heroForm = 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.PALAFIN]: heroForm, }); diff --git a/src/test/account.spec.ts b/src/test/account.spec.ts new file mode 100644 index 00000000000..28e48ce9933 --- /dev/null +++ b/src/test/account.spec.ts @@ -0,0 +1,74 @@ +import * as battleScene from "#app/battle-scene.js"; +import { describe, expect, it, vi } from "vitest"; +import { initLoggedInUser, loggedInUser, updateUserInfo } from "../account"; +import * as utils from "../utils"; + +describe("account", () => { + describe("initLoggedInUser", () => { + it("should set loggedInUser to Guest and lastSessionSlot to -1", () => { + initLoggedInUser(); + + expect(loggedInUser.username).toBe("Guest"); + expect(loggedInUser.lastSessionSlot).toBe(-1); + }); + }); + + describe("updateUserInfo", () => { + 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); + }); + + it("should fetch user info from the API if bypassLogin is false", async () => { + vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); + vi.spyOn(utils, "apiFetch").mockResolvedValue( + new Response( + JSON.stringify({ + username: "test", + lastSessionSlot: 99, + }), + { + status: 200, + } + ) + ); + + const [success, status] = await updateUserInfo(); + + expect(success).toBe(true); + expect(status).toBe(200); + expect(loggedInUser.username).toBe("test"); + expect(loggedInUser.lastSessionSlot).toBe(99); + }); + + it("should handle resolved API errors", async () => { + vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); + vi.spyOn(utils, "apiFetch").mockResolvedValue( + new Response(null, { status: 401 }) + ); + + const [success, status] = await updateUserInfo(); + + expect(success).toBe(false); + expect(status).toBe(401); + }); + + it("should handle rejected API errors", async () => { + const consoleErrorSpy = vi.spyOn(console, "error"); + vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); + vi.spyOn(utils, "apiFetch").mockRejectedValue(new Error("Api failed!")); + + const [success, status] = await updateUserInfo(); + + expect(success).toBe(false); + expect(status).toBe(500); + expect(consoleErrorSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index f24529187c6..83d24d1f0ee 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -1,11 +1,10 @@ -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 Phaser from "phaser"; +import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import { IntegerHolder, NumberHolder } from "#app/utils.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import BattleScene from "../../battle-scene"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { @@ -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; }); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts new file mode 100644 index 00000000000..f89846dd999 --- /dev/null +++ b/src/test/arena/arena_gravity.test.ts @@ -0,0 +1,82 @@ +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { + MoveEffectPhase, + TurnEndPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +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"); + game.override.moveset([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); + game.override.ability(Abilities.UNNERVE); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.SHUCKLE); + game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); + }); + + 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(30); + }); +}); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts new file mode 100644 index 00000000000..9b0630f5c2b --- /dev/null +++ b/src/test/arena/weather_fog.test.ts @@ -0,0 +1,51 @@ +import { allMoves } from "#app/data/move.js"; +import { WeatherType } from "#app/data/weather.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { + MoveEffectPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +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.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100 * 0.9); + }); +}); 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..6c977401f20 --- /dev/null +++ b/src/test/arena/weather_strong_winds.test.ts @@ -0,0 +1,81 @@ +import { allMoves } from "#app/data/move.js"; +import { + TurnStartPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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"; + +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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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..21d3f689d1c --- /dev/null +++ b/src/test/battle-scene.test.ts @@ -0,0 +1,27 @@ +import { LoadingScene } from "#app/loading-scene.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } 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); + }); +}); diff --git a/src/test/battle-stat.spec.ts b/src/test/battle-stat.spec.ts new file mode 100644 index 00000000000..46f25f66bcd --- /dev/null +++ b/src/test/battle-stat.spec.ts @@ -0,0 +1,149 @@ +import { + BattleStat, + getBattleStatLevelChangeDescription, + getBattleStatName, +} from "#app/data/battle-stat.js"; +import { describe, expect, it } from "vitest"; +import { arrayOfRange, mockI18next } from "./utils/testUtils"; + +const TEST_BATTLE_STAT = -99 as unknown as BattleStat; +const TEST_POKEMON = "Testmon"; +const TEST_STAT = "Teststat"; + +describe("battle-stat", () => { + describe("getBattleStatName", () => { + it("should return the correct name for each BattleStat", () => { + mockI18next(); + + expect(getBattleStatName(BattleStat.ATK)).toBe("pokemonInfo:Stat.ATK"); + expect(getBattleStatName(BattleStat.DEF)).toBe("pokemonInfo:Stat.DEF"); + expect(getBattleStatName(BattleStat.SPATK)).toBe( + "pokemonInfo:Stat.SPATK" + ); + expect(getBattleStatName(BattleStat.SPDEF)).toBe( + "pokemonInfo:Stat.SPDEF" + ); + expect(getBattleStatName(BattleStat.SPD)).toBe("pokemonInfo:Stat.SPD"); + expect(getBattleStatName(BattleStat.ACC)).toBe("pokemonInfo:Stat.ACC"); + expect(getBattleStatName(BattleStat.EVA)).toBe("pokemonInfo:Stat.EVA"); + }); + + it("should fall back to ??? for an unknown BattleStat", () => { + expect(getBattleStatName(TEST_BATTLE_STAT)).toBe("???"); + }); + }); + + describe("getBattleStatLevelChangeDescription", () => { + it("should return battle:statRose for +1", () => { + mockI18next(); + + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + 1, + true + ); + + expect(message).toBe("battle:statRose"); + }); + + it("should return battle:statSharplyRose for +2", () => { + mockI18next(); + + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + 2, + true + ); + + expect(message).toBe("battle:statSharplyRose"); + }); + + it("should return battle:statRoseDrastically for +3 to +6", () => { + mockI18next(); + + arrayOfRange(3, 6).forEach((n) => { + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + n, + true + ); + + expect(message).toBe("battle:statRoseDrastically"); + }); + }); + + it("should return battle:statWontGoAnyHigher for 7 or higher", () => { + mockI18next(); + + arrayOfRange(7, 10).forEach((n) => { + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + n, + true + ); + + expect(message).toBe("battle:statWontGoAnyHigher"); + }); + }); + + it("should return battle:statFell for -1", () => { + mockI18next(); + + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + 1, + false + ); + + expect(message).toBe("battle:statFell"); + }); + + it("should return battle:statHarshlyFell for -2", () => { + mockI18next(); + + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + 2, + false + ); + + expect(message).toBe("battle:statHarshlyFell"); + }); + + it("should return battle:statSeverelyFell for -3 to -6", () => { + mockI18next(); + + arrayOfRange(3, 6).forEach((n) => { + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + n, + false + ); + + expect(message).toBe("battle:statSeverelyFell"); + }); + }); + + it("should return battle:statWontGoAnyLower for -7 or lower", () => { + mockI18next(); + + arrayOfRange(7, 10).forEach((n) => { + const message = getBattleStatLevelChangeDescription( + TEST_POKEMON, + TEST_STAT, + n, + false + ); + + expect(message).toBe("battle:statWontGoAnyLower"); + }); + }); + }); +}); diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 5d8f9d2c98f..14ff1bcec0d 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -1,20 +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 { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; +import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import {Button} from "#enums/buttons"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Battle order", () => { @@ -33,11 +32,11 @@ 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() => { @@ -83,8 +82,7 @@ describe("Battle order", () => { }, 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); + game.override.battleType("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, @@ -126,8 +124,7 @@ describe("Battle order", () => { }, 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); + game.override.battleType("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, @@ -168,8 +165,7 @@ describe("Battle order", () => { }, 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); + game.override.battleType("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 87949be70a8..a91cd1e8352 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -1,9 +1,6 @@ -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 { allSpecies } from "#app/data/pokemon-species"; +import { GameModes } from "#app/game-mode"; +import { getGameMode } from "#app/game-mode.js"; import { CommandPhase, DamagePhase, EncounterPhase, @@ -17,13 +14,15 @@ import { TurnInitPhase, VictoryPhase, } from "#app/phases"; 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, getMovePosition, } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +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"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -90,14 +89,15 @@ describe("Test Battle Phase", () => { }, 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); + 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()); @@ -110,14 +110,14 @@ describe("Test Battle Phase", () => { }, 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); + 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()); @@ -151,8 +151,8 @@ describe("Test Battle Phase", () => { 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); + const rand = game.scene.randBattleSeedInt(16); + expect(rand).toBe(15); } }); @@ -204,10 +204,10 @@ describe("Test Battle Phase", () => { }, 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); + 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, @@ -217,10 +217,10 @@ describe("Test Battle Phase", () => { }, 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); + game.override.battleType("single"); + game.override.enemySpecies(Species.MIGHTYENA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, ]); @@ -229,11 +229,11 @@ describe("Test Battle Phase", () => { }, 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); + 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, @@ -243,11 +243,11 @@ describe("Test Battle Phase", () => { }, 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); + 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, @@ -260,15 +260,15 @@ describe("Test Battle Phase", () => { 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, @@ -289,15 +289,15 @@ describe("Test Battle Phase", () => { 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); @@ -307,15 +307,15 @@ describe("Test Battle Phase", () => { 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); diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts new file mode 100644 index 00000000000..e2d8dee562c --- /dev/null +++ b/src/test/battle/double_battle.test.ts @@ -0,0 +1,64 @@ +import { + BattleEndPhase, + TurnInitPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition, } from "#app/test/utils/gameManagerUtils"; +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 { Status, StatusEffect } from "#app/data/status-effect.js"; + +describe("Test Battle Phase", () => { + 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.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + for (const pokemon of game.scene.getPlayerField()) { + expect(pokemon).toBeDefined(); + + 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..a823887b4f8 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -1,10 +1,9 @@ -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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -23,15 +22,16 @@ 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() => { diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 01ae7d05359..e4243ea1418 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -1,14 +1,13 @@ -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 { Mode } from "#app/ui/ui"; 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"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -26,17 +25,18 @@ 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, @@ -46,8 +46,9 @@ describe("Test Battle Phase", () => { }, 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, @@ -57,8 +58,9 @@ describe("Test Battle Phase", () => { }, 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, @@ -68,8 +70,9 @@ describe("Test Battle Phase", () => { }, 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, @@ -79,8 +82,9 @@ describe("Test Battle Phase", () => { }, 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, @@ -90,8 +94,9 @@ describe("Test Battle Phase", () => { }, 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, @@ -101,8 +106,9 @@ describe("Test Battle Phase", () => { }, 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, ]); @@ -111,8 +117,9 @@ describe("Test Battle Phase", () => { }, 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, @@ -122,8 +129,9 @@ describe("Test Battle Phase", () => { }, 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, diff --git a/src/test/battlerTags/octolock.test.ts b/src/test/battlerTags/octolock.test.ts new file mode 100644 index 00000000000..4c1c58d4345 --- /dev/null +++ b/src/test/battlerTags/octolock.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, it, vi } from "vitest"; +import Pokemon from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene.js"; +import { BattlerTag, BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags.js"; +import { StatChangePhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +jest.mock("#app/battle-scene.js"); + +describe("BattlerTag - OctolockTag", () => { + describe("lapse behavior", () => { + it("unshifts a StatChangePhase with expected stat 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(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(-1); + expect((phase as StatChangePhase)["stats"]).toEqual([BattleStat.DEF, BattleStat.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..5cf07c47ce1 --- /dev/null +++ b/src/test/battlerTags/stockpiling.test.ts @@ -0,0 +1,161 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import Pokemon, { PokemonSummonData } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene.js"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { StatChangePhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import * as messages from "#app/messages.js"; + +beforeEach(() => { + vi.spyOn(messages, "getPokemonNameWithAffix").mockImplementation(() => ""); +}); + +describe("BattlerTag - StockpilingTag", () => { + describe("onAdd", () => { + it("unshifts a StatChangePhase with expected stat 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(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]); + }); + + subject.onAdd(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + + it("unshifts a StatChangePhase 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.battleStats[BattleStat.DEF] = 6; + mockPokemon.summonData.battleStats[BattleStat.SPDEF] = 5; + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]); + }); + + subject.onAdd(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + describe("onOverlap", () => { + it("unshifts a StatChangePhase 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(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.DEF, BattleStat.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.battleStats[BattleStat.DEF] = 5; + mockPokemon.summonData.battleStats[BattleStat.SPDEF] = 4; + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + // def doesn't change + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.SPDEF], [1]); + }); + + subject.onAdd(mockPokemon); + expect(subject.stockpiledCount).toBe(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + // def doesn't change + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.SPDEF], [1]); + }); + + subject.onOverlap(mockPokemon); + expect(subject.stockpiledCount).toBe(2); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + // 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({ [BattleStat.DEF]: 0, [BattleStat.SPDEF]: 2 }); + + // removing tag should reverse stat changes + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(-2); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.SPDEF])); + }); + + 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/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index a098620f5eb..91d1153edfc 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -303,4 +303,11 @@ describe("Egg Generation Tests", () => { 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); + }); }); diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts new file mode 100644 index 00000000000..70682666f32 --- /dev/null +++ b/src/test/evolution.test.ts @@ -0,0 +1,86 @@ +import { pokemonEvolutions } from "#app/data/pokemon-evolutions.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { Species } from "#app/enums/species.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +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.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.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.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.runToSummon([Species.NINCADA]); + + const nincada = game.scene.getPlayerPokemon(); + nincada.abilityIndex = 2; + + 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); + }, TIMEOUT); +}); diff --git a/src/test/evolutions/evolutions.test.ts b/src/test/evolutions/evolutions.test.ts new file mode 100644 index 00000000000..4e38e72bb7c --- /dev/null +++ b/src/test/evolutions/evolutions.test.ts @@ -0,0 +1,48 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import { Species } from "#enums/species"; +import * as Utils from "#app/utils"; + +describe("Evolution tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + it("tandemaus evolution form test", async () => { + /* this test checks to make sure that tandemaus will + * evolve into a 3 family maushold 25% of the time + * and a 4 family maushold the other 75% of the time + * This is done by using the getEvolution method in pokemon.ts + * getEvolution will give back the form that the pokemon can evolve into + * It does this by checking the pokemon conditions in pokemon-forms.ts + * For tandemaus, the conditions are random due to a randSeedInt(4) + * If the value is 0, it's a 3 family maushold, whereas if the value is + * 1, 2 or 3, it's a 4 family maushold + */ + await game.startBattle([Species.TANDEMAUS]); // starts us off with a tandemaus + const playerPokemon = game.scene.getPlayerPokemon(); + playerPokemon.level = 25; // tandemaus evolves at level 25 + vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); // setting the random generator to be 0 to force a three family maushold + const threeForm = playerPokemon.getEvolution(); + expect(threeForm.evoFormKey).toBe("three"); // as per pokemon-forms, the evoFormKey for 3 family mausholds is "three" + for (let f = 1; f < 4; f++) { + vi.spyOn(Utils, "randSeedInt").mockReturnValue(f); // setting the random generator to 1, 2 and 3 to force 4 family mausholds + const fourForm = playerPokemon.getEvolution(); + expect(fourForm.evoFormKey).toBe(null); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is null + } + }, 5000); +}); diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts new file mode 100644 index 00000000000..bc950e45767 --- /dev/null +++ b/src/test/final_boss.test.ts @@ -0,0 +1,89 @@ +import { Biome } from "#app/enums/biome.js"; +import { Species } from "#app/enums/species.js"; +import { GameModes, getGameMode } from "#app/game-mode.js"; +import { EncounterPhase, SelectStarterPhase } from "#app/phases.js"; +import { Mode } from "#app/ui/ui.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "./utils/gameManager"; +import { generateStarter } from "./utils/gameManagerUtils"; + +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(); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should spawn Eternatus on wave 200 in END biome", async () => { + await runToFinalBossEncounter(game, [Species.BIDOOF]); + + 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 runToFinalBossEncounter(game, [Species.BIDOOF]); + + 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 runToFinalBossEncounter(game, [Species.BIDOOF]); + + 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.todo("should change form on direct hit down to last boss fragment", () => {}); +}); + +/** + * Helper function to run to the final boss encounter as it's a bit tricky due to extra dialogue + * @param game - The game manager + */ +async function runToFinalBossEncounter(game: GameManager, species: Species[]) { + console.log("===to final boss encounter==="); + await game.runToTitle(); + + game.onNextPrompt("TitlePhase", Mode.TITLE, () => { + game.scene.gameMode = getGameMode(GameModes.CLASSIC); + const starters = generateStarter(game.scene, species); + const selectStarterPhase = new SelectStarterPhase(game.scene); + game.scene.pushPhase(new EncounterPhase(game.scene, false)); + selectStarterPhase.initBattle(starters); + }); + + game.onNextPrompt("EncounterPhase", Mode.MESSAGE, async () => { + // This will skip all entry dialogue (I can't figure out a way to sequentially handle the 8 chained messages via 1 prompt handler) + game.setMode(Mode.MESSAGE); + const encounterPhase = game.scene.getCurrentPhase() as EncounterPhase; + + // No need to end phase, this will do it for you + encounterPhase.doEncounterCommon(false); + }); + + await game.phaseInterceptor.to(EncounterPhase, true); + console.log("===finished run to final boss encounter==="); +} diff --git a/src/test/game-mode.test.ts b/src/test/game-mode.test.ts new file mode 100644 index 00000000000..04376c20361 --- /dev/null +++ b/src/test/game-mode.test.ts @@ -0,0 +1,52 @@ +import { GameMode, GameModes, getGameMode } from "#app/game-mode.js"; +import { + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; +import GameManager from "./utils/gameManager"; +import * as Utils from "../utils"; +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/internals.test.ts b/src/test/internals.test.ts new file mode 100644 index 00000000000..a54b8b01544 --- /dev/null +++ b/src/test/internals.test.ts @@ -0,0 +1,43 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import { Species } from "#app/enums/species.js"; +import { Abilities } from "#app/enums/abilities.js"; + +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.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.runToSummon([Species.EEVEE]); + const eevee = game.scene.getPlayerPokemon(); + + expect(eevee.abilityIndex).toBeGreaterThanOrEqual(0); + expect(eevee.abilityIndex).toBeLessThanOrEqual(2); + }); +}); diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts index 5b4561d4877..5b18cc3a249 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 { 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 GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; import { Species } from "#enums/species"; +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 diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts new file mode 100644 index 00000000000..e80b12d7fc9 --- /dev/null +++ b/src/test/items/exp_booster.test.ts @@ -0,0 +1,39 @@ +import { Abilities } from "#app/enums/abilities.js"; +import { PokemonExpBoosterModifier } from "#app/modifier/modifier.js"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +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 additively", async() => { + game.override.startingHeldItems([{name: "LUCKY_EGG"}, {name: "GOLDEN_EGG"}]); + await game.startBattle(); + + const partyMember = game.scene.getPlayerPokemon(); + const modifierBonusExp = new Utils.NumberHolder(1); + partyMember.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, modifierBonusExp); + expect(modifierBonusExp.value).toBe(2.4); + }, 20000); +}); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts new file mode 100644 index 00000000000..495bc5de223 --- /dev/null +++ b/src/test/items/grip_claw.test.ts @@ -0,0 +1,78 @@ +import { BattlerIndex } from "#app/battle.js"; +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BerryType } from "#app/enums/berry-type.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { CommandPhase, MoveEndPhase, SelectTargetPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; + +const TIMEOUT = 20 * 1000; // 20 seconds + +describe("Items - Grip Claw", () => { + 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("double") + .moveset([Moves.POPULATION_BOMB, Moves.SPLASH]) + .startingHeldItems([ + { name: "GRIP_CLAW", count: 5 }, + { name: "MULTI_LENS", count: 3 }, + ]) + .enemySpecies(Species.SNORLAX) + .ability(Abilities.KLUTZ) + .enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]) + .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); + }); + + 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()); + + 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)); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon[1].getHeldItems.length).toBe(enemyHeldItemCt[1]); + }, TIMEOUT + ); +}); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts new file mode 100644 index 00000000000..73444a54c30 --- /dev/null +++ b/src/test/items/leek.test.ts @@ -0,0 +1,204 @@ +import { BattlerIndex } from "#app/battle"; +import { CritBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +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); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.disableCrits(); + + game.override.battleType("single"); + }); + + it("LEEK activates in battle correctly", async() => { + game.override.startingHeldItems([{ name: "LEEK" }]); + game.override.moveset([ Moves.POUND ]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.FARFETCHD + ]); + + game.doAttack(0); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(consoleSpy).toHaveBeenCalledWith("Applied", "Leek", ""); + }, 20000); + + it("LEEK held by FARFETCHD", async() => { + await game.startBattle([ + Species.FARFETCHD + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by GALAR_FARFETCHD", async() => { + await game.startBattle([ + Species.GALAR_FARFETCHD + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by SIRFETCHD", async() => { + await game.startBattle([ + Species.SIRFETCHD + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by fused FARFETCHD line (base)", 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 party = game.scene.getParty(); + const partyMember = party[0]; + const ally = party[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by fused FARFETCHD line (part)", 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 party = game.scene.getParty(); + const partyMember = party[0]; + const ally = party[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK not held by FARFETCHD line", async() => { + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + }, 20000); +}); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts new file mode 100644 index 00000000000..8c9195b07af --- /dev/null +++ b/src/test/items/leftovers.test.ts @@ -0,0 +1,64 @@ +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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"; + + +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(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + // We should have full hp + expect(leadPokemon.isFullHp()).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, 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..eb0c6cc044f 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 { 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 GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +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 diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 5aa2c517ac9..937fd8feb62 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 { 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 GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +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 diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index 753f62e36eb..e662b398cd4 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 { 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 GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +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 diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts new file mode 100644 index 00000000000..c9fb3ba52d3 --- /dev/null +++ b/src/test/items/scope_lens.test.ts @@ -0,0 +1,74 @@ +import { BattlerIndex } from "#app/battle"; +import { CritBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +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); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.disableCrits(); + + game.override.battleType("single"); + }, 20000); + + it("SCOPE_LENS activates in battle correctly", async() => { + game.override.startingHeldItems([{ name: "SCOPE_LENS" }]); + game.override.moveset([ Moves.POUND ]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.GASTLY + ]); + + game.doAttack(0); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(consoleSpy).toHaveBeenCalledWith("Applied", "Scope Lens", ""); + }, 20000); + + it("SCOPE_LENS held by random pokemon", async() => { + await game.startBattle([ + Species.GASTLY + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Scope Lens to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SCOPE_LENS().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(1); + }, 20000); +}); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 3356196e8c5..13714c441c0 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 { 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 GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +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 diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 6aacfd0e5e7..2f2b7e4e16a 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -1,20 +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 { StatusEffect } from "#app/data/status-effect"; 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 i18next, { initI18n } from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; 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"; describe("Items - Toxic orb", () => { @@ -35,19 +35,21 @@ 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() => { + initI18n(); + i18next.changeLanguage("en"); const moveToUse = Moves.GROWTH; await game.startBattle([ Species.MIGHTYENA, @@ -70,7 +72,7 @@ describe("Items - Toxic orb", () => { // 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"); diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/localization/battle-stat.test.ts similarity index 54% rename from src/test/lokalisation/battle-stat.test.ts rename to src/test/localization/battle-stat.test.ts index d894d705947..ea2714b3852 100644 --- a/src/test/lokalisation/battle-stat.test.ts +++ b/src/test/localization/battle-stat.test.ts @@ -1,37 +1,38 @@ 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 {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"; +import {KoreanPostpositionProcessor} from "i18next-korean-postposition-processor"; interface BattleStatTestUnit { - stat: BattleStat, - key: string + stat: BattleStat, + key: string } interface BattleStatLevelTestUnit { - levels: integer, - up: boolean, - key: string + levels: integer, + up: boolean, + key: string + changedStats: integer } function testBattleStatName(stat: BattleStat, expectMessage: string) { @@ -40,8 +41,8 @@ function testBattleStatName(stat: BattleStat, expectMessage: string) { expect(message).toBe(expectMessage); } -function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { - const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); +function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string, changedStats: integer) { + const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up, changedStats); console.log(`message ${message}, expected ${expectMessage}`); expect(message).toBe(expectMessage); } @@ -53,28 +54,28 @@ describe("Test for BattleStat Localization", () => { 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" }); + 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" }); + battleStatLevelUnits.push({levels: 1, up: true, key: "statRose_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 2, up: true, key: "statSharplyRose_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 3, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 4, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 5, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 6, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 7, up: true, key: "statWontGoAnyHigher_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 1, up: false, key: "statFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 2, up: false, key: "statHarshlyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 3, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 4, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 5, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 6, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 7, up: false, key: "statWontGoAnyLower_one", changedStats: 1}); }); it("Test getBattleStatName() in English", async () => { @@ -87,7 +88,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in English", async () => { i18next.changeLanguage("en"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key], unit.changedStats); }); }); @@ -101,7 +102,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Español", async () => { i18next.changeLanguage("es"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key], unit.changedStats); }); }); @@ -115,7 +116,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Italiano", async () => { i18next.changeLanguage("it"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key], unit.changedStats); }); }); @@ -129,7 +130,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Français", async () => { i18next.changeLanguage("fr"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key], unit.changedStats); }); }); @@ -143,7 +144,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => { i18next.changeLanguage("de"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key], unit.changedStats); }); }); @@ -157,7 +158,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => { i18next.changeLanguage("pt-BR"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key], unit.changedStats); }); }); @@ -171,7 +172,9 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => { i18next.changeLanguage("zh-CN"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key]); + // In i18next, the pluralization rules are language-specific, and Chinese only supports the _other suffix. + unit.key = unit.key.replace("one", "other"); + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key], unit.changedStats); }); }); @@ -185,7 +188,9 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => { i18next.changeLanguage("zh-TW"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key]); + // In i18next, the pluralization rules are language-specific, and Chinese only supports the _other suffix. + unit.key = unit.key.replace("one", "other"); + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key], unit.changedStats); }); }); @@ -201,7 +206,7 @@ describe("Test for BattleStat Localization", () => { battleStatLevelUnits.forEach(unit => { const processor = new KoreanPostpositionProcessor(); const message = processor.process(koBattleStat[unit.key]); - testBattleStatLevelChangeDescription(unit.levels, unit.up, message); + testBattleStatLevelChangeDescription(unit.levels, unit.up, message, unit.changedStats); }); }); }); diff --git a/src/test/lokalisation/french.test.ts b/src/test/localization/french.test.ts similarity index 100% rename from src/test/lokalisation/french.test.ts rename to src/test/localization/french.test.ts diff --git a/src/test/localization/status-effect.test.ts b/src/test/localization/status-effect.test.ts new file mode 100644 index 00000000000..ad33a59a675 --- /dev/null +++ b/src/test/localization/status-effect.test.ts @@ -0,0 +1,300 @@ +import { beforeAll, describe, afterEach, expect, it, vi } from "vitest"; +import { + StatusEffect, + getStatusEffectActivationText, + getStatusEffectDescriptor, + getStatusEffectHealText, + getStatusEffectObtainText, + getStatusEffectOverlapText, +} from "#app/data/status-effect"; +import i18next from "i18next"; +import { mockI18next } from "../utils/testUtils"; + +const pokemonName = "PKM"; +const sourceText = "SOURCE"; + +describe("status-effect", () => { + beforeAll(() => { + i18next.init(); + }); + + describe("NONE", () => { + const statusEffect = StatusEffect.NONE; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:none.obtain"); + }); + + it("should return the source-obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName, sourceText); + expect(text).toBe("statusEffect:none.obtainSource"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).not.toBe("statusEffect:none.obtainSource"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.activation"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.overlap"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.heal"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:none.description"); + }); + }); + + describe("POISON", () => { + const statusEffect = StatusEffect.POISON; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:poison.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:poison.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.overlap"); + }); + }); + + describe("TOXIC", () => { + const statusEffect = StatusEffect.TOXIC; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:toxic.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:toxic.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.overlap"); + }); + }); + + describe("PARALYSIS", () => { + const statusEffect = StatusEffect.PARALYSIS; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:paralysis.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:paralysis.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.overlap"); + }); + }); + + describe("SLEEP", () => { + const statusEffect = StatusEffect.SLEEP; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:sleep.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:sleep.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.overlap"); + }); + }); + + describe("FREEZE", () => { + const statusEffect = StatusEffect.FREEZE; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:freeze.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:freeze.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.overlap"); + }); + }); + + describe("BURN", () => { + const statusEffect = StatusEffect.BURN; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:burn.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:burn.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.overlap"); + }); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); +}); diff --git a/src/test/localization/terrain.test.ts b/src/test/localization/terrain.test.ts new file mode 100644 index 00000000000..6450d8574be --- /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 GameManager from "#app/test/utils/gameManager"; +import { Species } from "#enums/species"; +import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { mockI18next } from "../utils/testUtils"; + +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).toBe(undefined); + }); + + it("should return the clear text", () => { + mockI18next(); + const text = getTerrainClearMessage(terrainType); + expect(text).toBe(undefined); + }); + + 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/moves/astonish.test.ts b/src/test/moves/astonish.test.ts new file mode 100644 index 00000000000..c8c013026b3 --- /dev/null +++ b/src/test/moves/astonish.test.ts @@ -0,0 +1,72 @@ +import { allMoves } from "#app/data/move.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { BerryPhase, CommandPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +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 { getMovePosition } from "../utils/gameManagerUtils"; + +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(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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..80da8087576 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -1,20 +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 { ArenaTagSide } from "#app/data/arena-tag.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { WeatherType } from "#app/data/weather.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Pokemon from "#app/field/pokemon.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { NumberHolder } from "#app/utils.js"; 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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Aurora Veil", () => { @@ -35,14 +34,14 @@ 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() => { @@ -58,8 +57,7 @@ describe("Moves - Aurora Veil", () => { }); 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); + game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); @@ -87,8 +85,7 @@ describe("Moves - Aurora Veil", () => { }); 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); + game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts new file mode 100644 index 00000000000..751b91fefa3 --- /dev/null +++ b/src/test/moves/beat_up.test.ts @@ -0,0 +1,106 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveEffectPhase } from "#app/phases.js"; +import { StatusEffect } from "#app/enums/status-effect.js"; + +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); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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 () => { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{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.doAttack(getMovePosition(game.scene, 0, 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..5a9ddd41f0f --- /dev/null +++ b/src/test/moves/belly_drum.test.ts @@ -0,0 +1,115 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; + +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); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + 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); + game.override.moveset([Moves.BELLY_DRUM]); + game.override.enemyMoveset([Moves.SPLASH]); + }); + + // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) + + test("Belly Drum raises the user's Attack to its max, at the cost of 1/2 of its maximum HP", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + }, TIMEOUT + ); + + test("Belly Drum will still take effect if an uninvolved stat is at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + // Here - BattleStat.ATK -> -3 and BattleStat.SPATK -> 6 + leadPokemon.summonData.battleStats[BattleStat.ATK] = -3; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + }, TIMEOUT + ); + + test("Belly Drum fails if the pokemon's attack stat is at its maximum", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + }, TIMEOUT + ); + + test("Belly Drum fails if the user's health is less than 1/2", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0); + }, 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..ab3da3d51b8 --- /dev/null +++ b/src/test/moves/ceaseless_edge.test.ts @@ -0,0 +1,136 @@ +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, + TurnEndPhase +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +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 leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.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 leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.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 ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, 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.forceOpponentToSwitch(); + game.doAttack(getMovePosition(game.scene, 0, 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..1b3d16f402f --- /dev/null +++ b/src/test/moves/clangorous_soul.test.ts @@ -0,0 +1,136 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; + +const TIMEOUT = 20 * 1000; +// RATIO : HP Cost of Move +const RATIO = 3; +// PREDAMAGE : 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); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + 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); + game.override.moveset([Moves.CLANGOROUS_SOUL]); + game.override.enemyMoveset([Moves.SPLASH]); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) + + test("Clangorous Soul raises the user's Attack, Defense, Special Attack, Special Defense and Speed by one stage each, at the cost of 1/3 of its maximum HP", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1); + }, TIMEOUT + ); + + test("Clangorous Soul will still take effect if one or more of the involved stats are not at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + //Here - BattleStat.SPD -> 0 and BattleStat.SPDEF -> 4 + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.DEF] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 4; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(5); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1); + }, TIMEOUT + ); + + test("Clangorous Soul fails if all stats involved are at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.DEF] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPD] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6); + }, TIMEOUT + ); + + test("Clangorous Soul fails if the user's health is less than 1/3", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts new file mode 100644 index 00000000000..55820ee957b --- /dev/null +++ b/src/test/moves/double_team.test.ts @@ -0,0 +1,54 @@ +import { BattleStat } from "#app/data/battle-stat.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { + TurnEndPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +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("increases the user's evasion by one stage.", async () => { + await game.startBattle([Species.MAGIKARP]); + + const ally = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "getAccuracyMultiplier"); + expect(ally.summonData.battleStats[BattleStat.EVA]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DOUBLE_TEAM)); + await game.phaseInterceptor.to(TurnEndPhase); + await game.toNextTurn(); + + expect(ally.summonData.battleStats[BattleStat.EVA]).toBe(1); + expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(.75); + }); +}); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts new file mode 100644 index 00000000000..b38a6f16513 --- /dev/null +++ b/src/test/moves/dragon_rage.test.ts @@ -0,0 +1,132 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { Type } from "#app/data/type"; +import { Species } from "#app/enums/species.js"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +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.disableCrits(); + + 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 () => { + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([Type.DRAGON]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores resistances", async () => { + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([Type.STEEL]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores stat changes", async () => { + partyPokemon.summonData.battleStats[BattleStat.SPATK] = 2; + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores stab", async () => { + vi.spyOn(partyPokemon, "getTypes").mockReturnValue([Type.DRAGON]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores criticals", async () => { + partyPokemon.removeTag(BattlerTagType.NO_CRIT); + partyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 99); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores damage modification from abilities such as ice scales", async () => { + game.override.enemyAbility(Abilities.ICE_SCALES); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores multi hit", async () => { + game.scene.addModifier(modifierTypes.MULTI_LENS().newModifier(partyPokemon), false); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); +}); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts new file mode 100644 index 00000000000..4c010484c78 --- /dev/null +++ b/src/test/moves/dynamax_cannon.test.ts @@ -0,0 +1,174 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { DamagePhase, MoveEffectPhase, TurnStartPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(TurnStartPhase, false); + // Force user to act before enemy + vi.spyOn((game.scene.getCurrentPhase() as TurnStartPhase), "getOrder").mockReturnValue([ 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/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts new file mode 100644 index 00000000000..161bba2c284 --- /dev/null +++ b/src/test/moves/fillet_away.test.ts @@ -0,0 +1,124 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; + +const TIMEOUT = 20 * 1000; +// RATIO : HP Cost of Move +const RATIO = 2; +// PREDAMAGE : 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); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + 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); + game.override.moveset([Moves.FILLET_AWAY]); + game.override.enemyMoveset([Moves.SPLASH]); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) + + test("Fillet Away raises the user's Attack, Special Attack, and Speed by two stages each, at the cost of 1/2 of its maximum HP", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(2); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2); + }, TIMEOUT + ); + + test("Fillet Away will still take effect if one or more of the involved stats are not at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + //Here - BattleStat.SPD -> 0 and BattleStat.SPATK -> 3 + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 3; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(5); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2); + }, TIMEOUT + ); + + test("Fillet Away fails if all stats involved are at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPD] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6); + }, TIMEOUT + ); + + test("Fillet Away fails if the user's health is less than 1/2", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts new file mode 100644 index 00000000000..940c32e975a --- /dev/null +++ b/src/test/moves/fissure.test.ts @@ -0,0 +1,90 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { Species } from "#app/enums/species.js"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +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 such as fur coat", async () => { + game.override.ability(Abilities.NO_GUARD); + game.override.enemyAbility(Abilities.FUR_COAT); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + await game.phaseInterceptor.to(DamagePhase, true); + + expect(enemyPokemon.isFainted()).toBe(true); + }); + + it("ignores accuracy stat", async () => { + vi.spyOn(partyPokemon, "getAccuracyMultiplier"); + + enemyPokemon.summonData.battleStats[BattleStat.ACC] = -6; + + game.doAttack(getMovePosition(game.scene, 0, 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 evasion stat", async () => { + vi.spyOn(partyPokemon, "getAccuracyMultiplier"); + + enemyPokemon.summonData.battleStats[BattleStat.EVA] = 6; + + game.doAttack(getMovePosition(game.scene, 0, 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..69d11c79f93 --- /dev/null +++ b/src/test/moves/flame_burst.test.ts @@ -0,0 +1,118 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + SelectTargetPhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#app/enums/abilities.js"; +import { allAbilities } from "#app/data/ability.js"; +import Pokemon from "#app/field/pokemon.js"; + +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); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLAME_BURST, Moves.SPLASH]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(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.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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 () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FLASH_FIRE); + + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + 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..82476ab5b90 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -1,18 +1,18 @@ -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 { BattleStat } from "#app/data/battle-stat.js"; +import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; +import { Type } from "#app/data/type.js"; +import { Biome } from "#app/enums/biome.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Biome } from "#app/enums/biome.js"; -import { Type } from "#app/data/type.js"; -import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; +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 - Flower Shield", () => { let phaserGame: Phaser.Game; @@ -30,15 +30,15 @@ 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); + game.override.enemySpecies(Species.CHERRIM); await game.startBattle([Species.MAGIKARP]); const cherrim = game.scene.getEnemyPokemon(); @@ -55,10 +55,7 @@ describe("Moves - Flower Shield", () => { }); 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); + game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS).battleType("double"); await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); @@ -81,9 +78,9 @@ describe("Moves - Flower Shield", () => { * 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); + 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(); @@ -102,7 +99,7 @@ describe("Moves - Flower Shield", () => { }); it("does nothing if there are no Grass-type pokemon on the field", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon(); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index f0b80ab90c0..eb41bf55a02 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -1,18 +1,17 @@ -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 { BattlerIndex } from "#app/battle.js"; +import { Stat } from "#app/data/pokemon-stat"; +import { Abilities } from "#app/enums/abilities.js"; import { CommandPhase, SelectTargetPhase, TurnEndPhase, } from "#app/phases"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; -import { Abilities } from "#app/enums/abilities.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -32,13 +31,13 @@ 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.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( @@ -101,9 +100,9 @@ describe("Moves - Follow Me", () => { 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 ]); + game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); @@ -136,8 +135,8 @@ describe("Moves - Follow Me", () => { 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 ]); + game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/fusion_bolt.test.ts b/src/test/moves/fusion_bolt.test.ts new file mode 100644 index 00000000000..368c75b0f54 --- /dev/null +++ b/src/test/moves/fusion_bolt.test.ts @@ -0,0 +1,54 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { Abilities } from "#enums/abilities"; + +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); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionBolt ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ROUGH_SKIN); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("should not make contact", async() => { + await game.startBattle([ + Species.ZEKROM, + ]); + + const partyMember = game.scene.getPlayerPokemon(); + const initialHp = partyMember.hp; + + game.doAttack(getMovePosition(game.scene, 0, 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..5ccbd82d25e --- /dev/null +++ b/src/test/moves/fusion_flare.test.ts @@ -0,0 +1,60 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { TurnStartPhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { StatusEffect } from "#app/data/status-effect"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; + +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); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("should thaw freeze status condition", async() => { + await game.startBattle([ + Species.RESHIRAM, + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + game.doAttack(getMovePosition(game.scene, 0, 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..83c7c0e5993 --- /dev/null +++ b/src/test/moves/fusion_flare_bolt.test.ts @@ -0,0 +1,323 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { MoveEffectPhase, MovePhase, MoveEndPhase, TurnStartPhase, DamagePhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#app/data/pokemon-stat"; +import { allMoves } from "#app/data/move"; +import { BattlerIndex } from "#app/battle"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; + +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); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionBolt.id ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + 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.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force user party to act before enemy party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force user party to act before enemy party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(0); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(0); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act (and fail) in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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() => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.PLAYER); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force user party to act before enemy party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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() => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ 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.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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() => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ 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.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.PLAYER); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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..0ffa8d9180b 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -1,15 +1,15 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import { BattlerIndex } from "#app/battle.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { Abilities } from "#app/enums/abilities.js"; 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 { MoveResult } from "#app/field/pokemon.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "../utils/gameManager"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -29,14 +29,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 () => { @@ -68,11 +68,11 @@ describe("Moves - Gastro Acid", () => { 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(); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts new file mode 100644 index 00000000000..9548694183c --- /dev/null +++ b/src/test/moves/glaive_rush.test.ts @@ -0,0 +1,131 @@ +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + + +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"); + game.override.disableCrits(); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); + game.override.starterSpecies(Species.KLINK); + game.override.ability(Abilities.UNNERVE); + game.override.passiveAbility(Abilities.FUR_COAT); + game.override.moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); + }); + + it("takes double damage from attacks", async() => { + await game.startBattle(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); + game.doAttack(getMovePosition(game.scene, 0, Moves.SHADOW_SNEAK)); + await game.phaseInterceptor.to(DamagePhase); + const damageDealt = 1000 - enemy.hp; + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.SHADOW_SNEAK)); + await game.phaseInterceptor.to(DamagePhase); + expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); + + }, 20000); + + it("always gets hit by attacks", async() => { + await game.startBattle(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + + allMoves[Moves.AVALANCHE].accuracy = 0; + game.doAttack(getMovePosition(game.scene, 0, Moves.AVALANCHE)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeLessThan(1000); + + }, 20000); + + it("interacts properly with multi-lens", async() => { + game.override.startingHeldItems([{name: "MULTI_LENS", count: 2}]); + game.override.enemyMoveset(Array(4).fill(Moves.AVALANCHE)); + await game.startBattle(); + const player = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + player.hp = 1000; + + allMoves[Moves.AVALANCHE].accuracy = 0; + game.doAttack(getMovePosition(game.scene, 0, Moves.GLAIVE_RUSH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBeLessThan(1000); + player.hp = 1000; + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(1000); + + }, 20000); + + it("secondary effects only last until next move", async() => { + game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + await game.startBattle(); + const player = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + player.hp = 1000; + allMoves[Moves.SHADOW_SNEAK].accuracy = 0; + + game.doAttack(getMovePosition(game.scene, 0, Moves.GLAIVE_RUSH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(1000); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + const damagedHp = player.hp; + expect(player.hp).toBeLessThan(1000); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(damagedHp); + + }, 20000); + + it("secondary effects are removed upon switching", async() => { + game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.starterSpecies(0); + await game.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.doAttack(getMovePosition(game.scene, 0, 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()); + + }, 20000); +}); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 4e5add26207..3d4a37fda73 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -1,20 +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 { BattleStat } from "#app/data/battle-stat"; +import { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; 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"; describe("Moves - Growth", () => { @@ -34,13 +33,13 @@ 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.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.MOXIE); + game.override.ability(Abilities.INSOMNIA); + game.override.startingLevel(2000); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("GROWTH", async() => { diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts new file mode 100644 index 00000000000..89f8e14169f --- /dev/null +++ b/src/test/moves/hard_press.test.ts @@ -0,0 +1,88 @@ +import { allMoves } from "#app/data/move.js"; +import { + MoveEffectPhase +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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"; + +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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, Moves.HARD_PRESS)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(1); + }); +}); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts new file mode 100644 index 00000000000..623b24dbb3c --- /dev/null +++ b/src/test/moves/hyper_beam.test.ts @@ -0,0 +1,71 @@ +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { BerryPhase, TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; + +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.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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 30a27ce4412..52c1b85fa7a 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -1,19 +1,18 @@ -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 { ArenaTagSide } from "#app/data/arena-tag.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Pokemon from "#app/field/pokemon.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { NumberHolder } from "#app/utils.js"; 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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Light Screen", () => { @@ -34,13 +33,13 @@ 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() => { @@ -57,8 +56,7 @@ describe("Moves - Light Screen", () => { }); 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); + game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index 7ed5b84654c..e5dfb94468e 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -1,10 +1,9 @@ -import {beforeAll, afterEach, beforeEach, describe, vi, it, expect} from "vitest"; -import Phaser from "phaser"; +import { CommandPhase, TurnEndPhase } from "#app/phases.js"; 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 { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Magnet Rise", () => { let phaserGame: Phaser.Game; @@ -23,13 +22,13 @@ 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 () => { diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index a700ff10aae..83543c4e530 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -1,17 +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 { BattleStat } from "#app/data/battle-stat.js"; import { CommandPhase, MoveEndPhase, StatChangePhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; +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"; const TIMEOUT = 20 * 1000; @@ -31,13 +31,13 @@ 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 () => { @@ -62,9 +62,8 @@ describe("Moves - Make It Rain", () => { }, 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]); @@ -83,7 +82,7 @@ describe("Moves - Make It Rain", () => { }, 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]); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts new file mode 100644 index 00000000000..b7c4303afb3 --- /dev/null +++ b/src/test/moves/multi_target.test.ts @@ -0,0 +1,182 @@ +import { getMoveTargets } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { Species } from "#app/enums/species.js"; +import { TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Multi target", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + afterTrial(game); + }); + + beforeEach(() => { + game = beforeTrial(phaserGame); + }); + + it("2v2 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, false, true), TIMEOUT); + + it("2v2 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, false, true), TIMEOUT); + + it("2v1 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, true, true), TIMEOUT); + + it("2v1 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, true, true), TIMEOUT); + + it("1v2 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, true, false, true), TIMEOUT); + + it("1v2 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, true, false, true), TIMEOUT); + + it("1v1 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, true, true, false), TIMEOUT); + + it("2v2 (immune) - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, false, true, Abilities.LEVITATE), TIMEOUT); + + it("2v2 (immune) - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, false, true, Abilities.LEVITATE), TIMEOUT); + + it("2v2 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, false, true), TIMEOUT); + + it("2v2 - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, false, true), TIMEOUT); + + it("2v1 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, true, false), TIMEOUT); + + it("2v1 - target all near enemies - no damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, true, false), TIMEOUT); + + it("1v2 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, true, false, true), TIMEOUT); + + it("1v2 - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, true, false, true), TIMEOUT); + + it("1v1 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, true, true, false), TIMEOUT); + + it("2v2 (immune) - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, false, true, Abilities.SOUNDPROOF), TIMEOUT); + + it("2v2 (immune) - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, false, true, Abilities.SOUNDPROOF), TIMEOUT); + +}); + +async function checkTargetMultiplier(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldMultiplied: boolean, oppAbility?: Abilities) { + // play an attack and check target count + game.override.enemyAbility(oppAbility ? oppAbility : Abilities.BALL_FETCH); + await game.startBattle(); + + const playerPokemonRepr = game.scene.getPlayerField(); + expect(playerPokemonRepr).not.toBeUndefined(); + + killAllyAndEnemy(game, killAlly, killSecondEnemy); + + const targetCount = getMoveTargets(playerPokemonRepr[0], attackMove).targets.length; + const targetMultiplier = targetCount > 1 ? 0.75 : 1; + + if (shouldMultiplied) { + expect(targetMultiplier).toBe(0.75); + } else { + expect(targetMultiplier).toBe(1); + } +} + +async function checkDamageDecrease(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldDecreased: boolean, ability?: Abilities) { + // Tested combination on first turn, 1v1 on second turn + await game.runToSummon([Species.EEVEE, Species.EEVEE]); + + if (ability !== undefined) { + game.scene.getPlayerField()[1].abilityIndex = ability; + game.scene.getEnemyField()[1].abilityIndex = ability; + } + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + + await game.phaseInterceptor.to(TurnEndPhase); + + killAllyAndEnemy(game, killAlly, killSecondEnemy); + await game.toNextTurn(); + + const initialHp = game.scene.getEnemyField()[0].hp; + game.doAttack(getMovePosition(game.scene, 0, attackMove)); + if (!killAlly) { + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + } + + await game.phaseInterceptor.to(TurnEndPhase); + const afterHp = game.scene.getEnemyField()[0].hp; + + killAllyAndEnemy(game, true, true); + await game.toNextTurn(); + + game.scene.getEnemyField()[0].hp = initialHp; + + const initialHp1v1 = game.scene.getEnemyField()[0].hp; + game.doAttack(getMovePosition(game.scene, 0, attackMove)); + + await game.phaseInterceptor.to(TurnEndPhase); + const afterHp1v1 = game.scene.getEnemyField()[0].hp; + + if (shouldDecreased) { + expect(initialHp - afterHp).toBeLessThan(0.75 * (initialHp1v1 - afterHp1v1) + 2); + expect(initialHp - afterHp).toBeGreaterThan(0.75 * (initialHp1v1 - afterHp1v1) - 2); + } else { + expect(initialHp - afterHp).toBeLessThan(initialHp1v1 - afterHp1v1 + 2); + expect(initialHp - afterHp).toBeGreaterThan(initialHp1v1 - afterHp1v1 - 2); + } + +} + +// To simulate the situation where all of the enemies or the player's Pokemons dies except for one. +function killAllyAndEnemy(game: GameManager, killAlly: boolean, killSecondEnemy: boolean) { + if (killAlly) { + leaveOnePlayerPokemon(game); + expect(game.scene.getPlayerField().filter(p => p.isActive()).length).toBe(1); + } + if (killSecondEnemy) { + leaveOneEnemyPokemon(game); + expect(game.scene.getEnemyField().filter(p => p.isActive()).length).toBe(1); + } +} + +function leaveOnePlayerPokemon(game: GameManager) { + const playerPokemons = game.scene.getParty(); + for (let i = 1; i < playerPokemons.length; i++) { + playerPokemons[i].hp = 0; + } + expect(playerPokemons.filter(pokemon => pokemon.hp > 0).length).toBe(1); +} + +function leaveOneEnemyPokemon(game: GameManager) { + const enemyPokemons = game.scene.getEnemyParty(); + for (let i = 1; i < enemyPokemons.length; i++) { + enemyPokemons[i].hp = 0; + } +} + +function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { + const game = new GameManager(phaserGame); + game.override + .battleType("double") + .moveset([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .passiveAbility(Abilities.UNNERVE) + .enemyMoveset(SPLASH_ONLY) + .disableCrits() + .startingLevel(50) + .enemyLevel(40) + .enemySpecies(Species.EEVEE); + return game; +} + +function afterTrial(game: GameManager) { + game.phaseInterceptor.restoreOg(); +} diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts new file mode 100644 index 00000000000..8ef161d2131 --- /dev/null +++ b/src/test/moves/octolock.test.ts @@ -0,0 +1,80 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { TrappedTag } from "#app/data/battler-tags.js"; +import { CommandPhase, MoveEndPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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 { removeEnemyHeldItems, SPLASH_ONLY } from "../utils/testUtils"; + +describe("Moves - Octolock", () => { + 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.BALL_FETCH); + + game.override.startingLevel(2000); + game.override.moveset([Moves.OCTOLOCK, Moves.SPLASH]); + game.override.ability(Abilities.BALL_FETCH); + }); + + it("Reduces DEf and SPDEF by 1 each turn", { timeout: 10000 }, async () => { + await game.startBattle([Species.GRAPPLOCT]); + removeEnemyHeldItems(game.scene); + + const enemyPokemon = game.scene.getEnemyField(); + + // use Octolock and advance to init phase of next turn to check for stat changes + game.doAttack(getMovePosition(game.scene, 0, Moves.OCTOLOCK)); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(enemyPokemon[0].summonData.battleStats[BattleStat.DEF]).toBe(-1); + expect(enemyPokemon[0].summonData.battleStats[BattleStat.SPDEF]).toBe(-1); + + // take a second turn to make sure stat changes occur again + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnInitPhase); + expect(enemyPokemon[0].summonData.battleStats[BattleStat.DEF]).toBe(-2); + expect(enemyPokemon[0].summonData.battleStats[BattleStat.SPDEF]).toBe(-2); + }); + + it("Traps the target pokemon", { timeout: 10000 }, async () => { + await game.startBattle([Species.GRAPPLOCT]); + removeEnemyHeldItems(game.scene); + + const enemyPokemon = game.scene.getEnemyField(); + + // before Octolock - enemy should not be trapped + expect(enemyPokemon[0].findTag(t => t instanceof TrappedTag)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.OCTOLOCK)); + + // after Octolock - enemy should be trapped + await game.phaseInterceptor.to(MoveEndPhase); + expect(enemyPokemon[0].findTag(t => t instanceof TrappedTag)).toBeDefined(); + }); + }); +}); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 21ebb3d5515..cbc107a3def 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -1,15 +1,14 @@ -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 { Status, StatusEffect } from "#app/data/status-effect.js"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; import { MoveEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -29,15 +28,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( @@ -55,7 +54,7 @@ describe("Moves - Purify", () => { await game.phaseInterceptor.to(MoveEndPhase); expect(enemyPokemon.status).toBe(undefined); - expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(playerPokemon.isFullHp()).toBe(true); }, TIMEOUT ); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 1116810f743..bc533e1313e 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -1,17 +1,16 @@ -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 { BattlerIndex } from "#app/battle.js"; import { CommandPhase, SelectTargetPhase, TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -31,19 +30,19 @@ 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.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.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( "move effect should be bypassed by Grass type", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); await game.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); @@ -76,8 +75,8 @@ describe("Moves - Rage Powder", () => { 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); + game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); // Test with two non-Grass type player Pokemon await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 00fb9a69f2f..6fcd2268d12 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -1,19 +1,18 @@ -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 { ArenaTagSide } from "#app/data/arena-tag.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Pokemon from "#app/field/pokemon.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { NumberHolder } from "#app/utils.js"; 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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Reflect", () => { @@ -34,13 +33,13 @@ 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() => { @@ -56,8 +55,7 @@ describe("Moves - Reflect", () => { }); 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); + game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts new file mode 100644 index 00000000000..73457c9dcce --- /dev/null +++ b/src/test/moves/rollout.test.ts @@ -0,0 +1,81 @@ +import { allMoves } from "#app/data/move.js"; +import { CommandPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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"; + +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.NONE); + game.override.enemySpecies(Species.BIDOOF); + game.override.enemyAbility(Abilities.NONE); + 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.doAttack(getMovePosition(game.scene, 0, 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..fe89a0a0a10 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 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 { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; 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( diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index 0544442f31e..a19c28b2c1e 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.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 { CommandPhase } from "#app/phases"; +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 } from "vitest"; describe("Moves - Spikes", () => { @@ -27,15 +26,15 @@ 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"); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyAbility(Abilities.HYDRATION); + game.override.enemyPassiveAbility(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); + game.override.passiveAbility(Abilities.HYDRATION); + game.override.startingWave(3); + game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + game.override.moveset([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); }); it("single - wild - stay on field - no damage", async() => { @@ -86,7 +85,7 @@ describe("Moves - Spikes", () => { }, 20000); it("trainer - wild - force switch opponent - should take damage", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); // player set spikes on the field and do splash for 3 turns // opponent do splash for 4 turns // nobody should take damage @@ -104,9 +103,9 @@ describe("Moves - Spikes", () => { }, 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); + game.override.startingWave(5); + game.override.startingLevel(5000); + game.override.enemySpecies(0); // turn 1: player set spikes, opponent do splash // turn 2: player do splash, opponent switch pokemon // opponent pokemon should trigger spikes and lose HP diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts new file mode 100644 index 00000000000..0fc01821838 --- /dev/null +++ b/src/test/moves/spit_up.test.ts @@ -0,0 +1,201 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { allMoves } from "#app/data/move.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { MovePhase, TurnInitPhase } from "#app/phases"; +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"; + +describe("Moves - Spit 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.RATTATA); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyAbility(Abilities.NONE); + game.override.enemyLevel(2000); + + game.override.moveset([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); + game.override.ability(Abilities.NONE); + }); + + 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); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + expect(allMoves[Moves.SPIT_UP].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); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + expect(allMoves[Moves.SPIT_UP].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); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + expect(allMoves[Moves.SPIT_UP].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(); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.FAIL }); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).not.toHaveBeenCalled(); + }); + + 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(); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(MovePhase); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1); + + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS }); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(pokemon.summonData.battleStats[BattleStat.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 = { + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }; + + expect(stockpilingTag.statChangeCounts).toMatchObject({ + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS }); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.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..8170c42dfec 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -1,17 +1,16 @@ -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 { BattlerIndex } from "#app/battle.js"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, SelectTargetPhase, TurnEndPhase, } from "#app/phases"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -31,13 +30,13 @@ 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.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( @@ -73,7 +72,7 @@ describe("Moves - Spotlight", () => { 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 ]); + game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts new file mode 100644 index 00000000000..81bd65ce582 --- /dev/null +++ b/src/test/moves/stockpile.test.ts @@ -0,0 +1,116 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { CommandPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +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"; + +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 increases DEF and SPDEF 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.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + + // use Stockpile four times + for (let i = 0; i < 4; i++) { + if (i !== 0) { + await game.phaseInterceptor.to(CommandPhase); + } + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOCKPILE)); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTag = user.getTag(StockpilingTag); + const def = user.summonData.battleStats[BattleStat.DEF]; + const spdef = user.summonData.battleStats[BattleStat.SPDEF]; + + if (i < 3) { // first three uses should behave normally + expect(def).toBe(i + 1); + expect(spdef).toBe(i + 1); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(i + 1); + + } else { // fourth should have failed + expect(def).toBe(3); + expect(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 DEF and SPDEF are at +6", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const user = game.scene.getPlayerPokemon(); + + user.summonData.battleStats[BattleStat.DEF] = 6; + user.summonData.battleStats[BattleStat.SPDEF] = 6; + + expect(user.getTag(StockpilingTag)).toBeUndefined(); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOCKPILE)); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTag = user.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(1); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + + // do it again, just for good measure + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOCKPILE)); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTagAgain = user.getTag(StockpilingTag); + expect(stockpilingTagAgain).toBeDefined(); + expect(stockpilingTagAgain.stockpiledCount).toBe(2); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + }); + }); +}); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts new file mode 100644 index 00000000000..7c3d3ae1613 --- /dev/null +++ b/src/test/moves/swallow.test.ts @@ -0,0 +1,197 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { MovePhase, TurnInitPhase } from "#app/phases"; +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"; + +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.doAttack(0); + 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.doAttack(0); + 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.doAttack(0); + 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.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.FAIL }); + }); + + 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.doAttack(0); + await game.phaseInterceptor.to(MovePhase); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1); + + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS }); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + + expect(pokemon.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 = { + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }; + + expect(stockpilingTag.statChangeCounts).toMatchObject({ + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS }); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(-2); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); +}); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index dabf7db5f7e..94eee4f20fa 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -1,17 +1,16 @@ -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 { Stat } from "#app/data/pokemon-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Tackle", () => { @@ -31,18 +30,18 @@ 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() => { const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GENGAR); + game.override.enemySpecies(Species.GENGAR); await game.startBattle([ Species.MIGHTYENA, ]); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 3e89e9cb14e..539829f4003 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -1,19 +1,18 @@ -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 { BattleStat } from "#app/data/battle-stat"; 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 GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; 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"; describe("Moves - Tail whip", () => { @@ -33,13 +32,13 @@ 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([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("TAIL_WHIP", async() => { diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts index efba97f8fe1..d2a90dd2ed5 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -1,16 +1,16 @@ -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 { ArenaTagSide } from "#app/data/arena-tag.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; 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 { 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("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; @@ -28,9 +28,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 () => { @@ -55,8 +55,7 @@ describe("Abilities - Wind Rider", () => { }); 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]); @@ -79,8 +78,7 @@ describe("Abilities - Wind Rider", () => { }); 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]); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index c641643593e..a7fbee3bebd 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -1,16 +1,15 @@ -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 { Abilities } from "#app/enums/abilities.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { - MoveEffectPhase, - TurnEndPhase + BerryPhase, + MoveEffectPhase } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { Abilities } from "#app/enums/abilities.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const TIMEOUT = 20 * 1000; @@ -30,26 +29,20 @@ 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 ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - - const enemyStartingHp = enemyPokemon.hp; game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); @@ -57,28 +50,22 @@ describe("Moves - Thousand Arrows", () => { // 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 ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - - const enemyStartingHp = enemyPokemon.hp; game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); @@ -86,10 +73,31 @@ describe("Moves - Thousand Arrows", () => { // 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, null, Moves.MAGNET_RISE); + + game.doAttack(getMovePosition(game.scene, 0, 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/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 78b72492e04..b1292de0d27 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 { BattleStat } from "#app/data/battle-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { MoveEndPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; 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 Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Tidy Up", () => { @@ -27,19 +27,19 @@ 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]); + 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)); @@ -51,8 +51,8 @@ describe("Moves - Tidy Up", () => { }, 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]); + 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)); @@ -64,8 +64,8 @@ describe("Moves - Tidy Up", () => { }, 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]); + 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)); @@ -77,8 +77,8 @@ describe("Moves - Tidy Up", () => { }, 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]); + 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(); @@ -91,8 +91,8 @@ describe("Moves - Tidy Up", () => { }, 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]); + game.override.moveset([Moves.SUBSTITUTE, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.startBattle(); 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/sprites/pokemonSprite.test.ts b/src/test/sprites/pokemonSprite.test.ts index 5c1db85fa6f..0fd725b2f58 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 { beforeAll, describe, expect, it } from "vitest"; import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; import fs from "fs"; import path from "path"; -import {getAppRootDir} from "#app/test/sprites/spritesUtils"; +import { getAppRootDir } from "#app/test/sprites/spritesUtils"; -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}`; @@ -34,11 +35,11 @@ describe("check if every variant's sprite are correctly set", () => { expect(backVariant).not.toBeUndefined(); }); - 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 +102,12 @@ describe("check if every variant's sprite are correctly set", () => { return errors; } - function getMissingFiles(keys, dirPath) { + function getMissingFiles(keys: Record, dirPath: string): string[] { const errors = []; 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..95a4605fd68 100644 --- a/src/test/ui/starter-select.test.ts +++ b/src/test/ui/starter-select.test.ts @@ -54,6 +54,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.ACTION); game.phaseInterceptor.unlock(); }); @@ -113,6 +114,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.ACTION); game.phaseInterceptor.unlock(); @@ -174,6 +176,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); @@ -237,6 +240,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.ACTION); game.phaseInterceptor.unlock(); @@ -297,6 +301,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_SHINY); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); @@ -356,6 +361,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.V); handler.processInput(Button.V); handler.processInput(Button.ACTION); @@ -416,6 +422,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.V); handler.processInput(Button.V); handler.processInput(Button.V); @@ -479,7 +486,6 @@ 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(); }); @@ -509,10 +515,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,7 +550,6 @@ 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(); @@ -575,10 +580,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..c00e40b8ebd --- /dev/null +++ b/src/test/ui/transfer-item.test.ts @@ -0,0 +1,99 @@ +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, + SelectModifierPhase +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +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 Phaser from "phaser"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; + + +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.doAttack(getMovePosition(game.scene, 0, 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/utils/TextInterceptor.ts b/src/test/utils/TextInterceptor.ts index 34b55aa30ac..a49f41f6be0 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/src/test/utils/TextInterceptor.ts @@ -11,6 +11,11 @@ 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(); } diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 84d39024dc9..1938d57dfd1 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -8,7 +8,8 @@ import { LoginPhase, NewBattlePhase, SelectStarterPhase, - TitlePhase, TurnInitPhase, + SelectTargetPhase, + TitlePhase, TurnEndPhase, TurnInitPhase, TurnStartPhase, } from "#app/phases"; import BattleScene from "#app/battle-scene.js"; @@ -33,6 +34,8 @@ 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 { OverridesHelper } from "./overridesHelper"; +import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type.js"; /** * Class to manage the game state and transitions between phases. @@ -43,6 +46,7 @@ export default class GameManager { public phaseInterceptor: PhaseInterceptor; public textInterceptor: TextInterceptor; public inputsHandler: InputsHandler; + public readonly override: OverridesHelper; /** * Creates an instance of GameManager. @@ -58,6 +62,7 @@ export default class GameManager { this.phaseInterceptor = new PhaseInterceptor(this.scene); this.textInterceptor = new TextInterceptor(this.scene); this.gameWrapper.setScene(this.scene); + this.override = new OverridesHelper(this); } /** @@ -170,6 +175,15 @@ export default class GameManager { this.onNextPrompt("CommandPhase", Mode.FIGHT, () => { (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); }); + + // Confirm target selection if move is multi-target + this.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { + const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; + const move = (this.scene.getCurrentPhase() as SelectTargetPhase).getPokemon().getMoveset()[movePosition].getMove(); + if (move.isMultiTarget()) { + handler.processInput(Button.ACTION); + } + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnEndPhase)); } /** @@ -315,4 +329,15 @@ export default class GameManager { (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, pokemonIndex, false); }); } + + /** + * Revive pokemon, currently player's 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); + } } diff --git a/src/test/utils/gameManagerUtils.ts b/src/test/utils/gameManagerUtils.ts index db9ba7174a9..74a73bb7875 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 { 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 { Moves } from "#app/enums/moves"; +import BattleScene from "#app/battle-scene"; +/** Function to convert Blob to string */ export function blobToString(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -79,9 +81,10 @@ 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); return index; } diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index b1b00c8e15d..de32215fabb 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -25,6 +25,7 @@ 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"; +import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -223,13 +224,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(); } } 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/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 2eb77f81302..fb7f84741e8 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -31,6 +31,7 @@ export default class MockSprite { }; this.anims = { pause: () => null, + stop: () => null, }; } @@ -90,6 +91,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..f4513e20926 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -8,6 +8,7 @@ export default class MockText { private textureManager; public list = []; public style; + public text = ""; constructor(textureManager, x, y, content, styleOptions) { this.scene = textureManager.scene; @@ -17,6 +18,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 +153,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) { diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts new file mode 100644 index 00000000000..2858076e3b6 --- /dev/null +++ b/src/test/utils/overridesHelper.ts @@ -0,0 +1,271 @@ +import { StatusEffect } from "#app/data/status-effect.js"; +import { Weather, WeatherType } from "#app/data/weather"; +import { Abilities } from "#app/enums/abilities.js"; +import { Biome } from "#app/enums/biome"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import * as GameMode from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; +import { ModifierOverride } from "#app/modifier/modifier-type.js"; +import Overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; +import { vi } from "vitest"; + +/** + * Helper to handle overrides in tests + */ +export class OverridesHelper { + private readonly game: GameManager; + + constructor(game: GameManager) { + this.game = game; + } + + /** + * 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 (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 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"): 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; + } + + private log(...params: any[]) { + console.log("Overrides:", ...params); + } +} 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 @@ -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 \ No newline at end of file +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 \ 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..4a807c7d892 --- /dev/null +++ b/src/test/utils/testUtils.ts @@ -0,0 +1,37 @@ +import BattleScene from "#app/battle-scene.js"; +import { Moves } from "#app/enums/moves.js"; +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); +} + +/** + * Removes all held items from enemy pokemon + * @param scene `game.scene` + */ +export function removeEnemyHeldItems(scene: BattleScene) { + scene.clearEnemyHeldItemModifiers(); + scene.clearEnemyModifiers(); +} diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 2caa82289d9..7cddf4bf3b7 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -13,7 +13,17 @@ import { initAchievements } from "#app/system/achv.js"; import { initVouchers } from "#app/system/voucher.js"; 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/ui/ability-bar.ts b/src/ui/ability-bar.ts index a0b249695b9..7a4ae559975 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,3 +1,4 @@ +import { getPokemonNameWithAffix } from "#app/messages.js"; import BattleScene from "../battle-scene"; import Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; @@ -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/arena-flyout.ts b/src/ui/arena-flyout.ts index 9c0a2e7c8ce..882c15d3d8c 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -9,6 +9,7 @@ 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/battle-flyout.ts b/src/ui/battle-flyout.ts index 5b34a6b5411..fdce9661793 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -7,6 +7,7 @@ import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/b import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { UiTheme } from "#enums/ui-theme"; +import { getPokemonNameWithAffix } from "#app/messages.js"; /** 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); diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index c246af73d07..d78b05a569f 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -10,6 +10,7 @@ import { getVariantTint } from "#app/data/variant"; import { BattleStat } from "#app/data/battle-stat"; import BattleFlyout from "./battle-flyout"; import { WindowVariant, addWindow } from "./ui-theme"; +import i18next from "i18next"; const battleStatOrder = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD ]; @@ -117,7 +118,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); } @@ -277,8 +278,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container { 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); @@ -315,9 +316,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(null, `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`)); this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } @@ -328,6 +329,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(null, 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 +346,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); } @@ -501,7 +510,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 +541,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); @@ -628,7 +637,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 +652,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 { diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index 5bca9632012..076eec26a8e 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", null, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); this.bg.setOrigin(0, 0); this.add(this.bg); - this.noteText = addTextObject(this.scene, 5, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); - this.noteText.setOrigin(0, 0); - this.add(this.noteText); - - this.musicText = addTextObject(this.scene, 30, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); + this.musicText = 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/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index dce04276a4d..6dcc359ef31 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -6,7 +6,7 @@ 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.js"; import * as Utils from "../utils"; import { Challenges } from "#app/enums/challenges.js"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; @@ -27,7 +27,8 @@ 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; @@ -120,33 +121,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, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + 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); @@ -181,32 +179,39 @@ 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); + } + // 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}` : ""); @@ -221,6 +226,7 @@ export default class GameChallengesUiHandler extends UiHandler { this.setCursor(0); this.initLabels(); + this.updateText(); this.getUi().moveTo(this.challengesContainer, this.getUi().length - 1); diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 8ccd05675c8..f083acd2f5b 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -6,6 +6,7 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import i18next from "i18next"; import {Button} from "#enums/buttons"; +import { getPokemonNameWithAffix } from "#app/messages.js"; export enum Command { FIGHT = 0, @@ -66,7 +67,7 @@ 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); + messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon())}), 0); this.setCursor(this.getCursor()); return true; 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/dropdown.ts b/src/ui/dropdown.ts new file mode 100644 index 00000000000..4338e11e0c6 --- /dev/null +++ b/src/ui/dropdown.ts @@ -0,0 +1,578 @@ +import BattleScene from "#app/battle-scene.js"; +import { SceneBase } from "#app/scene-base.js"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow, WindowVariant } from "./ui-theme"; +import i18next from "i18next"; + +export enum DropDownState { + ON = 0, + OFF = 1, + EXCLUDE = 2 +} + +export enum DropDownType { + SINGLE = 0, + MULTI = 1, + HYBRID = 2, + RADIAL = 3 +} + +export enum SortDirection { + ASC = -1, + DESC = 1 +} + +export class DropDownLabel { + public state: DropDownState; + public text: string; + public sprite?: Phaser.GameObjects.Sprite; + + constructor(label: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { + this.text = label || ""; + this.sprite = sprite; + this.state = state || DropDownState.ON; + } +} + + +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; + + 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; + } + } + + /** + * 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 { + 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; + private dropDownType: DropDownType = DropDownType.MULTI; + public cursor: number = 0; + public defaultCursor: number = 0; + private onChange: () => void; + private lastDir: SortDirection = SortDirection.ASC; + private defaultValues: 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.defaultValues = this.getVals(); + + // 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, null, null, 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() && this.cursor > 0) { + return false; + } + 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.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 }; + }); + } + } + + /** + * 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.getVals(); + + switch (this.dropDownType) { + case DropDownType.MULTI: + case DropDownType.HYBRID: + return currentValues.length === this.defaultValues.length && currentValues.every((value, index) => value === this.defaultValues[index]); + + case DropDownType.RADIAL: + return currentValues.every((value, index) => value["val"] === this.defaultValues[index]["val"] && value["state"] === this.defaultValues[index]["state"]); + + case DropDownType.SINGLE: + return currentValues[0]["dir"] === this.defaultValues[0]["dir"] && currentValues[0]["val"] === this.defaultValues[0]["val"]; + + default: + return false; + } + } + + /** + * Set all values to their default state + */ + public resetToDefault(): void { + this.setCursor(this.defaultCursor); + + for (let i = 0; i < this.options.length; i++) { + const option = this.options[i]; + // reset values + switch (this.dropDownType) { + case DropDownType.HYBRID: + case DropDownType.MULTI: + if (this.defaultValues.includes(option.val)) { + option.setOptionState(DropDownState.ON); + } else { + option.setOptionState(DropDownState.OFF); + } + break; + case DropDownType.RADIAL: + const targetValue = this.defaultValues.find(value => value.val === option.val); + option.setOptionState(targetValue.state); + break; + case DropDownType.SINGLE: + if (option.val === this.defaultValues[0].val) { + if (option.state !== DropDownState.ON) { + this.toggleOptionState(i); + } + if (option.dir !== this.defaultValues[0].dir) { + this.toggleOptionState(i); + } + } + break; + } + } + + // Select or unselect "ALL" button if applicable + if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { + if (this.checkForAllOn()) { + this.options[0].setOptionState(DropDownState.ON); + } else { + this.options[0].setOptionState(DropDownState.OFF); + } + } + + } + + /** + * 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(); + } + } + 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-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 0081b589288..ae9d531a245 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -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"; @@ -96,25 +96,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; + 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; diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts new file mode 100644 index 00000000000..e163284bad3 --- /dev/null +++ b/src/ui/filter-bar.ts @@ -0,0 +1,209 @@ +import BattleScene from "#app/battle-scene.js"; +import { DropDown } 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, + DEX, + 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, null, null, 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/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 3b75c6f7c13..971bef6ea6b 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -3,8 +3,65 @@ 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.js"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow } from "./ui-theme"; export default class LoginFormUiHandler extends FormModalUiHandler { + private googleImage: Phaser.GameObjects.Image; + private discordImage: Phaser.GameObjects.Image; + private externalPartyContainer: Phaser.GameObjects.Container; + private externalPartyBg: Phaser.GameObjects.NineSlice; + private externalPartyTitle: Phaser.GameObjects.Text; + constructor(scene: BattleScene, mode?: Mode) { + super(scene, mode); + } + + setup(): void { + + super.setup(); + 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); + + const googleImage = this.scene.add.image(0, 0, "google"); + googleImage.setOrigin(0, 0); + googleImage.setScale(0.07); + googleImage.setInteractive(); + googleImage.setName("google-icon"); + 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"); + }); + this.googleImage = googleImage; + + const discordImage = this.scene.add.image(20, 0, "discord"); + discordImage.setOrigin(0, 0); + discordImage.setScale(0.07); + discordImage.setInteractive(); + discordImage.setName("discord-icon"); + 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.discordImage = discordImage; + + 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); + } + getModalTitle(config?: ModalConfig): string { return i18next.t("menu:login"); } @@ -22,7 +79,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:login"), i18next.t("menu:register") ]; + return [ i18next.t("menu:login"), i18next.t("menu:register")]; } getReadableErrorMessage(error: string): string { @@ -46,8 +103,10 @@ export default class LoginFormUiHandler extends FormModalUiHandler { show(args: any[]): boolean { if (super.show(args)) { - const config = args[0] as ModalConfig; + this.processExternalProvider(); + + const config = args[0] as ModalConfig; const originalLoginAction = this.submitAction; this.submitAction = (_) => { // Prevent overlapping overrides on action modification @@ -83,4 +142,33 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return false; } + + clear() { + super.clear(); + this.externalPartyContainer.setVisible(false); + + this.discordImage.off("pointerdown"); + this.googleImage.off("pointerdown"); + } + + processExternalProvider() : 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.externalPartyContainer.setAlpha(0); + this.scene.tweens.add({ + targets: this.externalPartyContainer, + duration: Utils.fixedInt(1000), + ease: "Sine.easeInOut", + y: "-=24", + alpha: 1 + }); + } } diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 571a09f3b37..4710c575ce9 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -6,7 +6,7 @@ import { addWindow } 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 { GameDataType } from "#enums/game-data-type"; @@ -22,7 +22,7 @@ enum MenuOptions { MANAGE_DATA, COMMUNITY, SAVE_AND_QUIT, - LOG_OUT + LOG_OUT, } let wikiUrl = "https://wiki.pokerogue.net/start"; @@ -40,8 +40,8 @@ export default class MenuUiHandler extends MessageUiHandler { private cursorObj: Phaser.GameObjects.Image; - protected ignoredMenuOptions: MenuOptions[]; - protected menuOptions: MenuOptions[]; + private excludedMenus: () => ConditionalMenu[]; + private menuOptions: MenuOptions[]; protected manageDataConfig: OptionSelectConfig; protected communityConfig: OptionSelectConfig; @@ -52,13 +52,19 @@ export default class MenuUiHandler extends MessageUiHandler { constructor(scene: BattleScene, mode?: Mode) { 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); @@ -80,10 +86,25 @@ export default class MenuUiHandler extends MessageUiHandler { 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: ![Mode.COMMAND, Mode.TITLE].includes(ui.getModeChain()[0]), 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); @@ -108,10 +129,12 @@ export default class MenuUiHandler extends MessageUiHandler { menuMessageBox.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageBox); + const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); + menuMessageText.setWordWrapWidth(1224); + menuMessageText.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageText); - this.menuContainer.add(this.bgmBar); - this.message = menuMessageText; this.menuContainer.add(this.menuMessageBoxContainer); @@ -146,7 +169,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 +200,7 @@ export default class MenuUiHandler extends MessageUiHandler { }, keepOpen: true }); - if (Utils.isLocal) { + if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ label: i18next.t("menuUiHandler:importData"), handler: () => { @@ -188,23 +211,36 @@ export default class MenuUiHandler extends MessageUiHandler { keepOpen: true }); } - manageDataOptions.push( - { - label: i18next.t("menuUiHandler:exportData"), - handler: () => { - this.scene.gameData.tryExportData(GameDataType.SYSTEM); - return true; - }, - keepOpen: true - }, - { - label: i18next.t("menuUiHandler:cancel"), - handler: () => { - this.scene.ui.revertMode(); - return true; - } + manageDataOptions.push({ + label: i18next.t("menuUiHandler:exportData"), + handler: () => { + this.scene.gameData.tryExportData(GameDataType.SYSTEM); + return true; } - ); + }, + { + label: "Consent Preferences", + 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 + }, + { + label: i18next.t("menuUiHandler:cancel"), + handler: () => { + this.scene.ui.revertMode(); + return true; + }, + keepOpen: true + }); this.manageDataConfig = { xOffset: 98, @@ -257,16 +293,19 @@ export default class MenuUiHandler extends MessageUiHandler { 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); @@ -292,11 +331,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) { @@ -332,6 +375,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; @@ -363,7 +451,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)); }); }; @@ -448,3 +536,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.cursorObj = null; } } + +interface ConditionalMenu { + condition: boolean; + options: MenuOptions[]; +} diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index c403dc28abb..b10bcbb18f6 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,8 @@ 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"; export const SHOP_OPTIONS_ROW_LIMIT = 6; @@ -27,6 +29,8 @@ 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[][]; @@ -46,22 +50,29 @@ 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); + 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 +82,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 +97,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); @@ -126,7 +137,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); @@ -390,16 +401,16 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } } 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 +467,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)); } @@ -716,11 +727,12 @@ class ModifierOption extends Phaser.GameObjects.Container { 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/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 1b6b9bab034..623b60fda87 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,12 +1,12 @@ import { CommandPhase, SelectModifierPhase } from "../phases"; import BattleScene from "../battle-scene"; import { PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { addTextObject, TextStyle } from "./text"; +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 { PokemonBaseStatModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier"; import { allMoves } from "../data/move"; import { getGenderColor, getGenderSymbol } from "../data/gender"; import { StatusEffect } from "../data/status-effect"; @@ -19,9 +19,11 @@ import {Button} from "#enums/buttons"; import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; +import { getPokemonNameWithAffix } from "#app/messages.js"; -const defaultMessage = i18next.t("menu:choosePokemon"); +const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); export enum PartyUiMode { SWITCH, @@ -51,6 +53,7 @@ export enum PartyOption { SPLICE, UNSPLICE, RELEASE, + RENAME, SCROLL_UP = 1000, SCROLL_DOWN = 1001, FORM_CHANGE_ITEM = 2000, @@ -58,7 +61,7 @@ export enum PartyOption { MOVE_2, MOVE_3, MOVE_4, - ALL = 4000 + ALL = 4000, } export type PartySelectCallback = (cursor: integer, option: PartyOption) => void; @@ -85,7 +88,8 @@ 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 options: integer[]; @@ -113,14 +117,14 @@ export default class PartyUiHandler extends MessageUiHandler { 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 +138,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 +148,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); @@ -284,6 +288,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; @@ -300,11 +334,11 @@ export default class PartyUiHandler extends MessageUiHandler { } 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; 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)) { @@ -376,18 +410,18 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = !pokemon.pauseEvolutions; - this.showText(`Evolutions have been ${pokemon.pauseEvolutions?"":"un"}paused for ${pokemon.name}.`, null, () => this.showText(null, 0), null, true); + this.showText(i18next.t("partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => this.showText(null, 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 }), null, () => { ui.setMode(Mode.PARTY); this.showText(null, 0); }, null, true); @@ -401,7 +435,7 @@ export default class PartyUiHandler extends MessageUiHandler { 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.showText(i18next.t("partyUiHandler:releaseConfirmation", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { ui.setModeWithoutClear(Mode.CONFIRM, () => { ui.setMode(Mode.PARTY); this.doRelease(this.cursor); @@ -411,9 +445,28 @@ export default class PartyUiHandler extends MessageUiHandler { }); }); } 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(null, 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 +533,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()); } @@ -651,20 +704,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; } @@ -697,7 +750,7 @@ 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[] + && m.isTransferrable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[] : null; if (this.options.length) { @@ -760,6 +813,7 @@ export default class PartyUiHandler extends MessageUiHandler { } this.options.push(PartyOption.SUMMARY); + this.options.push(PartyOption.RENAME); if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId)) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); @@ -819,7 +873,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)]; @@ -847,7 +901,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 (option === PartyOption.UNPAUSE_EVOLUTION) { optionName = `${pokemon.pauseEvolutions ? "Unpause" : "Pause"} Evolution`; } else { @@ -863,27 +917,42 @@ 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 */ + if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && this.transferQuantitiesMax[option] > 1) { + const itemModifier = itemModifiers[option]; + + /** Not sure why getMaxHeldItemCount had an error, but it only checks the Pokemon parameter if the modifier is PokemonBaseStatModifier */ + if (itemModifier === undefined || itemModifier instanceof PokemonBaseStatModifier) { + continue; + } + + 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); @@ -910,10 +979,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]; @@ -934,25 +1009,25 @@ export default class PartyUiHandler extends MessageUiHandler { 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 }); } } @@ -1004,6 +1079,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; @@ -1020,6 +1101,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(); @@ -1044,7 +1129,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); @@ -1058,19 +1143,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)); @@ -1081,7 +1166,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); @@ -1095,7 +1180,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); @@ -1115,7 +1200,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); @@ -1130,42 +1215,56 @@ 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"; + slotTmText = i18next.t("partyUiHandler:notAble"); break; case (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0): - slotTmText = "Learned"; + slotTmText = i18next.t("partyUiHandler:learned"); break; default: - slotTmText = "Able"; + slotTmText = i18next.t("partyUiHandler:able"); break; } - 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); } } @@ -1232,7 +1331,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/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 9ab3028b564..b2ee5a9164a 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -216,7 +216,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { 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 +229,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)); @@ -266,7 +266,7 @@ 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; @@ -281,7 +281,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, this.scene.uiTheme)); const dexNatures = pokemon.scene.gameData.dexData[pokemon.species.speciesId].natureAttr; - const newNature = Math.pow(2, pokemon.nature + 1); + const newNature = 1 << (pokemon.nature + 1); if (!(dexNatures & newNature)) { this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); @@ -300,13 +300,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(null, `${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)); @@ -364,13 +364,14 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { }); } - makeRoomForConfirmUi(speedMultiplier: number = 1): Promise { + 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/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts new file mode 100644 index 00000000000..35127564b60 --- /dev/null +++ b/src/ui/rename-form-ui-handler.ts @@ -0,0 +1,58 @@ +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { ModalConfig } from "./modal-ui-handler"; +import i18next from "i18next"; +import { PlayerPokemon } from "#app/field/pokemon.js"; + +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; + this.inputs[0].text = (args[1] as PlayerPokemon).getNameToRender(); + + this.submitAction = (_) => { + this.sanitizeInputs(); + // const onFail = () => { + // this.scene.ui.setModeWithoutClear(Mode.RENAME_POKEMON, Object.assign(config)); + // this.scene.ui.playError(); + // }; + // if (!this.inputs[0].text) { + // return onFail(); + // } + const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); + config.buttonActions[0](sanitizedName); + return true; + }; + return true; + } + return false; + } +} diff --git a/src/ui/scroll-bar.ts b/src/ui/scroll-bar.ts new file mode 100644 index 00000000000..02282edb4cd --- /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) / this.pages; + + this.setVisible(this.pages > 1); + } +} diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 6763c8d3d85..3ffd32cf842 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -375,6 +375,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/starter-container.ts b/src/ui/starter-container.ts new file mode 100644 index 00000000000..ae589d138b9 --- /dev/null +++ b/src/ui/starter-container.ts @@ -0,0 +1,101 @@ +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 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; + + // classic win icon + const classicWinIcon = this.scene.add.image(2, 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 db014432b13..22ce5cb7531 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -28,7 +28,7 @@ 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"; @@ -39,6 +39,11 @@ 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 AwaitableUiHandler from "./awaitable-ui-handler"; +import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType } from "./dropdown"; +import { StarterContainer } from "./starter-container"; +import { DropDownColumn, FilterBar } from "./filter-bar"; +import { ScrollBar } from "./scroll-bar"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -114,6 +119,14 @@ const starterCandyCosts: { passive: integer, costReduction: [integer, integer], { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 ]; +// 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 +140,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,7 +248,6 @@ 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 instructionsContainer: Phaser.GameObjects.Container; private shinyIconElement: Phaser.GameObjects.Sprite; @@ -222,22 +269,23 @@ 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 abilityCursor: number = -1; + private natureCursor: number = -1; + private filterBarCursor: integer = 0; private starterMoveset: StarterMoveset; + 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[] = []; @@ -258,17 +306,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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 @@ -309,13 +356,114 @@ 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, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + 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)); + + // shiny 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 shinyOptions = [ + 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.DEX, i18next.t("filterBar:dexFilter"), new DropDown(this.scene, 0, 0, shinyOptions, 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:passiveLocked"), undefined, DropDownState.EXCLUDE), + ]; + const unlocksOptions = [ + new DropDownOption(this.scene, "PASSIVE", passiveLabels), + ]; + + this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); + + // misc filter + 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 miscOptions = [ + new DropDownOption(this.scene, "WIN", winLabels), + ]; + 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, 0, new DropDownLabel(i18next.t("filterBar:sortByNumber"))), + new DropDownOption(this.scene, 1, new DropDownLabel(i18next.t("filterBar:sortByCost"), undefined, DropDownState.OFF)), + new DropDownOption(this.scene, 2, new DropDownLabel(i18next.t("filterBar:sortByCandies"), undefined, DropDownState.OFF)), + new DropDownOption(this.scene, 3, new DropDownLabel(i18next.t("filterBar:sortByIVs"), undefined, DropDownState.OFF)), + new DropDownOption(this.scene, 4, new DropDownLabel(i18next.t("filterBar:sortByName"), undefined, DropDownState.OFF)) + ]; + 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.offsetFirstFilter(); + if (!this.scene.uiTheme) { starterContainerWindow.setVisible(false); } @@ -391,27 +539,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", null, 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 +572,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,70 +613,6 @@ 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); @@ -565,7 +627,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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); @@ -757,12 +819,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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; @@ -772,17 +832,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { generateSpecies(); - for (let pc = 0; pc < c; pc++) { - if (this.pokerusGens[pc] === species.generation -1 && this.pokerusCursors[pc] === pokerusCursor) { + for (let ps = 0; ps < c; ps++) { + if (this.pokerusSpecies[ps] === species) { 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)); + this.pokerusSpecies.push(species); } }, 0, date.getTime().toString()); @@ -803,6 +861,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)); @@ -821,28 +880,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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]; + + 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 +909,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + /** + * Set the selections for all filters to their default starting value + */ + resetFilters() : void { + const genDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.GEN); + if (this.scene.gameMode.isChallenge) { + // In challenge mode all gens are selected by default + genDropDown.defaultCursor = 0; + } else { + // in other modes, gen 1 is selected by default, and all options disabled + genDropDown.defaultCursor = 1; + } + + this.filterBar.setValsToDefault(); + + // for all modes except challenge, disable all gen options to enable hovering behavior + if (!this.scene.gameMode.isChallenge) { + genDropDown.unselectAllOptions(); + } + } + showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); @@ -931,8 +1010,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,14 +1021,14 @@ 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 @@ -972,34 +1050,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } /** - * 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 if (this.scene.candyUpgradeNotification === 1) { - this.candyUpgradeIcon[index].setVisible(slotVisible && passiveAvailable); - this.candyUpgradeOverlayIcon[index].setVisible(slotVisible && this.candyUpgradeIcon[index].visible); + starter.candyUpgradeIcon.setVisible(slotVisible && passiveAvailable); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); // 'On' mode } else if (this.scene.candyUpgradeNotification === 2) { - this.candyUpgradeIcon[index].setVisible( + starter.candyUpgradeIcon.setVisible( slotVisible && ( passiveAvailable || this.isValueReductionAvailable(species.speciesId))); - this.candyUpgradeOverlayIcon[index].setVisible(slotVisible && this.candyUpgradeIcon[index].visible); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); } } @@ -1015,21 +1088,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 +1108,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 +1131,31 @@ 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 (this.startCursorObj.visible) { // this checks to see if the start button is selected switch (button) { case Button.ACTION: if (this.tryStart(true)) { @@ -1078,106 +1166,163 @@ 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 { 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 + + let species; + + // this gets the correct generation and pokemon cursor depending on whether you're in the starter screen or the party icons + if (!this.starterIconsCursorObj.visible) { + species = this.filteredStarterContainers[this.cursor].species; + } else { + species = this.starterSpecies[this.starterIconsCursorIndex]; + } + const ui = this.getUi(); + let options = []; + + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(species); // 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); + if (isPartyValid) { + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), this.starterSpecies.length !== 0); + } else { + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), this.starterSpecies.length !== 0, false, false); + } + + 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(species.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(species.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(species, 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 +1330,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 +1345,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); @@ -1232,6 +1380,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { maxOptions: 8, yOffset: 19 }); + this.blockInput = false; }); }); return true; @@ -1257,6 +1406,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { maxOptions: 8, yOffset: 19 }); + this.blockInput = false; }); }); }; @@ -1268,11 +1418,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); } + const starterContainer = this.filteredStarterContainers[this.cursor]; 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); @@ -1283,14 +1437,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 +1454,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { this.clearText(); ui.setMode(Mode.STARTER_SELECT); + this.blockInput = false; return true; } }), @@ -1319,7 +1474,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,7 +1497,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); } } - const showUseCandies = () => { + const showUseCandies = () => { // this lets you use your candies const options = []; if (!(passiveAttr & PassiveAttr.UNLOCKED)) { const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]); @@ -1365,11 +1520,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Update the candy upgrade display if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(this.cursor); + this.setUpgradeIcon(starterContainer); } 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); + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); } return true; @@ -1397,7 +1551,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return this.scene.reset(true); } }); - this.updateStarterValueLabel(this.cursor); + this.updateStarterValueLabel(starterContainer); this.tryUpdateValue(0); ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("buy"); @@ -1405,11 +1559,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // 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); + this.setUpgradeIcon(starterContainer); } 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); + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); } } @@ -1445,17 +1598,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("buy"); - // If the notification setting is set to 'On', update the candy upgrade display - // if (this.scene.candyUpgradeNotification === 2) { - // if (this.isUpgradeIconEnabled() ) { - // this.setUpgradeIcon(this.cursor); - // } - // if (this.isUpgradeAnimationEnabled()) { - // const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - // this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); - // } - // } - return true; } return false; @@ -1499,15 +1641,11 @@ 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] = {}; + starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; } switch (button) { case Button.CYCLE_SHINY: @@ -1561,9 +1699,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else if (newAbilityIndex === 1) { - if (abilityAttr & (this.lastSpecies.ability2 ? AbilityAttr.ABILITY_2 : AbilityAttr.ABILITY_HIDDEN)) { - break; + if (this.lastSpecies.ability1 === this.lastSpecies.ability2) { + newAbilityIndex = (newAbilityIndex + 1) % abilityCount; } + break; } else { if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) { break; @@ -1605,6 +1744,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } } while (newVariant !== props.variant); + starterAttributes.variant = newVariant; // store the selected variant this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant); @@ -1614,49 +1754,135 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } 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,6 +1898,36 @@ 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(); + } + switchMoveHandler(i: number, newMove: Moves, move: Moves) { const speciesId = this.lastSpecies.speciesId; const existingMoveIndex = this.starterMoveset.indexOf(newMove); @@ -1704,6 +1960,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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; + } + }); + } } updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { @@ -1800,61 +2066,184 @@ 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 isValidForChallenge = new Utils.BooleanHolder(true); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(container.species, this.scene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true); + if (isValidForChallenge.value) { + this.validStarterContainers.push(container); + } else { + container.setVisible(false); } - this.starterValueLabels[s].setVisible(slotVisible); + }); + } else { + this.validStarterContainers = this.starterContainers; + } + + // 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 caughtVariants = this.scene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); + + // Define the variables based on whether their respective variants have been caught + const isVariant3Caught = !!(caughtVariants & DexAttr.VARIANT_3); + const isVariant2Caught = !!(caughtVariants & DexAttr.VARIANT_2); + const isVariantCaught = !!(caughtVariants & DexAttr.SHINY); + const isCaught = !!(caughtVariants & DexAttr.NON_SHINY); + const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; + const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0; + const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0; + const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0; + const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined; + + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + + const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + + const fitsShiny = this.filterBar.getVals(DropDownColumn.DEX).some(variant => { + if (variant === "SHINY3") { + return isVariant3Caught; + } else if (variant === "SHINY2") { + return isVariant2Caught && !isVariant3Caught; + } else if (variant === "SHINY") { + return isVariantCaught && !isVariant2Caught && !isVariant3Caught; + } else if (variant === "NORMAL") { + return isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; + } else if (variant === "UNCAUGHT") { + return isUncaught; + } + }); + + const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { + return isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + return !isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (container.species.speciesId < 10) { + } + if (misc.val === "WIN" && misc.state === DropDownState.ON) { + return isWin; + } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + return isNotWin || isUndefined; + } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + return true; + } + }); + + if (fitsGen && fitsType && fitsShiny && fitsPassive && fitsWin) { + this.filteredStarterContainers.push(container); + } + }); + + this.starterSelectScrollBar.setPages(Math.ceil((this.filteredStarterContainers.length - 81) / 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 0: + return (a.species.speciesId - b.species.speciesId) * -sort.dir; + case 1: + return (a.cost - b.cost) * -sort.dir; + case 2: + const candyCountA = this.scene.gameData.starterData[a.species.speciesId].candyCount; + const candyCountB = this.scene.gameData.starterData[b.species.speciesId].candyCount; + return (candyCountA - candyCountB) * -sort.dir; + case 3: + const avgIVsA = this.scene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = this.scene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[b.species.speciesId].ivs.length; + return (avgIVsA - avgIVsB) * -sort.dir; + case 4: + 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); // 'Candy Icon' mode if (this.scene.candyUpgradeDisplay === 0) { @@ -1865,66 +2254,61 @@ 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.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(); + } 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); } @@ -1934,7 +2318,17 @@ 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) { this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; @@ -2009,14 +2403,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.lastSpecies) { const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies, false, true); 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()); } @@ -2077,9 +2470,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon, this.pokemonHatchedCountText ].map(c => c.setVisible(false)); - } else if (species.speciesId === Species.ETERNATUS) { - this.pokemonHatchedIcon.setVisible(false); - this.pokemonHatchedCountText.setVisible(false); + this.pokemonFormText.setY(25); } else { this.pokemonCaughtHatchedContainer.setY(25); this.pokemonShinyIcon.setY(117); @@ -2091,6 +2482,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyCountText.setText(`x${this.scene.gameData.starterData[species.speciesId].candyCount}`); this.pokemonCandyCountText.setVisible(true); this.pokemonFormText.setVisible(true); + this.pokemonFormText.setY(42); this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); @@ -2112,30 +2504,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // 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; @@ -2163,7 +2545,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setTypeIcons(speciesForm.type1, speciesForm.type2); this.pokemonSprite.clearTint(); - if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.getGenCursorWithScroll())) { + if (this.pokerusSpecies.includes(species)) { handleTutorial(this.scene, Tutorial.Pokerus); } } else { @@ -2288,16 +2670,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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; @@ -2323,11 +2696,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!this.starterSpecies.length); + const starterSprite = this.filteredStarterContainers[this.cursor].icon 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.filteredStarterContainers[this.cursor].checkIconId(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; @@ -2367,10 +2739,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } else { levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; } - this.speciesStarterMoves.push(...levelMoves.filter(lm => lm[0] <= 5).map(lm => lm[1])); + 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]); } } @@ -2382,7 +2754,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ? speciesMoveData as StarterMoveset : (speciesMoveData as StarterFormMoveData)[formIndex] : 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) { @@ -2396,14 +2768,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex); + const formText = Utils.capitalizeString(species?.forms[formIndex]?.formKey, "-", false, false); - 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); } else { this.pokemonAbilityText.setText(""); @@ -2437,7 +2811,7 @@ 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 : "???"); } @@ -2465,28 +2839,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.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + 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: @@ -2500,12 +2903,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; @@ -2520,45 +2925,67 @@ 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.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), !!(this.starterSpecies.length), false, 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); + if (isPartyValid) { // we have two checks here - one for the party being valid and one for not. This comes from mono type challenges - if the party is valid it will check pokemon's evolutions and forms, and if it's not valid it won't check their evolutions and forms + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.scene.gameData.getSpeciesDefaultDexAttr(this.allSpecies[s], false, true)), !!(this.starterSpecies.length + (add ? 1 : 0))); + } else { + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.scene.gameData.getSpeciesDefaultDexAttr(this.allSpecies[s], false, true)), !!(this.starterSpecies.length + (add ? 1 : 0)), false, false); + } - 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); } } @@ -2566,8 +2993,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; } @@ -2576,39 +3029,60 @@ 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(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) + }; + })); + }; + 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(null, 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.dexAttrCursor), this.starterSpecies.length !== 0, false, false); + canStart = canStart || isValidForChallenge.value; + } + return canStart; + } + toggleStatsMode(on?: boolean): void { if (on === undefined) { on = !this.statsMode; @@ -2664,8 +3138,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) { diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 73edda0ba44..405429fcd3f 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -15,7 +15,7 @@ import { Stat, getStatName } from "../data/pokemon-stat"; import { PokemonHeldItemModifier } from "../modifier/modifier"; import { StatusEffect } from "../data/status-effect"; import { getBiomeName } from "../data/biomes"; -import { 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"; @@ -93,6 +93,8 @@ export default class SummaryUiHandler extends UiHandler { private moveCursorBlinkTimer: Phaser.Time.TimerEvent; private pokemon: PlayerPokemon; + 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; private moveSelectFunction: Function; private transitioning: boolean; @@ -102,6 +104,7 @@ export default class SummaryUiHandler extends UiHandler { private moveSelect: boolean; private moveCursor: integer; private selectedMoveIndex: integer; + private selectCallback: Function; constructor(scene: BattleScene) { super(scene, Mode.SUMMARY); @@ -122,7 +125,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); @@ -207,7 +210,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 +230,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 +272,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); @@ -302,7 +312,7 @@ export default class SummaryUiHandler extends UiHandler { }); this.pokemon.cry(); - this.nameText.setText(this.pokemon.name); + this.nameText.setText(this.pokemon.getNameToRender()); const isFusion = this.pokemon.isFusion(); @@ -345,9 +355,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(null, `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } @@ -368,6 +378,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,7 +410,7 @@ export default class SummaryUiHandler extends UiHandler { } const ui = this.getUi(); - + const fromPartyMode = ui.handlers[Mode.PARTY].active; let success = false; let error = false; @@ -485,7 +498,17 @@ export default class SummaryUiHandler extends UiHandler { 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,6 +518,8 @@ 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(); @@ -677,12 +702,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,12 +710,12 @@ 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"); if (tera) { @@ -717,7 +737,7 @@ export default class SummaryUiHandler extends UiHandler { } if (this.pokemon.getLuck()) { - const luckLabelText = addTextObject(this.scene, 141, 28, "Luck:", TextStyle.SUMMARY_ALT); + const luckLabelText = addTextObject(this.scene, 141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); luckLabelText.setOrigin(0, 0); profileContainer.add(luckLabelText); @@ -796,7 +816,20 @@ export default class SummaryUiHandler extends UiHandler { 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()]); + const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon.getNature())), TextStyle.SUMMARY_RED)}${closeFragment}`; + + 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}`, + level: `${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${closeFragment}`, + }), + natureFragment: + i18next.exists(`pokemonSummary:natureFragment.${rawNature}`) ? + i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) : + nature, + }); const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); @@ -809,9 +842,7 @@ export default class SummaryUiHandler extends UiHandler { const stats = Utils.getEnumValues(Stat) as Stat[]; stats.forEach((stat, s) => { - const statName = stat !== Stat.HP - ? getStatName(stat) - : "HP"; + const statName = getStatName(stat); const rowIndex = s % 3; const colIndex = Math.floor(s / 3); @@ -831,7 +862,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) => { @@ -848,11 +879,11 @@ export default class SummaryUiHandler extends UiHandler { const relLvExp = getLevelRelExp(this.pokemon.level + 1, this.pokemon.species.growthRate); const expRatio = this.pokemon.level < this.scene.getMaxExpLevel() ? this.pokemon.levelExp / relLvExp : 0; - const expLabel = addTextObject(this.scene, 6, 112, "EXP. Points", TextStyle.SUMMARY); + 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); @@ -893,7 +924,7 @@ 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.name : i18next.t("pokemonSummary:cancel"), this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); extraRowText.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowText); diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 772500e8901..48799473343 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -6,17 +6,20 @@ 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.js"; -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 targetsHighlighted: Pokemon[]; private targetFlashTween: Phaser.Tweens.Tween; - private targetBattleInfoMoveTween: Phaser.Tweens.Tween; + private targetBattleInfoMoveTween: Phaser.Tweens.Tween[] = []; constructor(scene: BattleScene) { super(scene, Mode.TARGET_SELECT); @@ -37,13 +40,15 @@ 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.setCursor(this.targets.includes(this.cursor) ? this.cursor : this.targets[0]); return true; } @@ -54,8 +59,11 @@ 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: @@ -89,73 +97,71 @@ 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); } } - const target = this.scene.getField()[cursor]; - this.targetFlashTween = this.scene.tweens.add({ - targets: [ target ], + targets: this.targetsHighlighted, alpha: 0, loop: -1, duration: Utils.fixedInt(250), ease: "Sine.easeIn", yoyo: true, onUpdate: t => { - if (target) { + for (const target of this.targetsHighlighted) { target.setAlpha(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); } - 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(); } } diff --git a/src/ui/text.ts b/src/ui/text.ts index dd1ac57523a..2a12e883deb 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -1,10 +1,10 @@ +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"; export enum TextStyle { MESSAGE, @@ -33,7 +33,9 @@ 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 } export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text { @@ -82,7 +84,7 @@ 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): [ number, Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, number, number ] { let shadowXpos = 4; let shadowYpos = 5; const scale = 0.1666666667; @@ -140,6 +142,16 @@ 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); @@ -227,6 +239,10 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui 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/ui.ts b/src/ui/ui.ts index ce834a83645..6061baf3b4a 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -46,6 +46,7 @@ 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"; export enum Mode { MESSAGE, @@ -83,7 +84,8 @@ export enum Mode { SESSION_RELOAD, UNAVAILABLE, OUTDATED, - CHALLENGE_SELECT + CHALLENGE_SELECT, + RENAME_POKEMON } const transitionModes = [ @@ -119,7 +121,8 @@ const noTransitionModes = [ Mode.LOADING, Mode.SESSION_RELOAD, Mode.UNAVAILABLE, - Mode.OUTDATED + Mode.OUTDATED, + Mode.RENAME_POKEMON ]; export default class UI extends Phaser.GameObjects.Container { @@ -180,7 +183,8 @@ 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), ]; } @@ -231,8 +235,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 { @@ -532,4 +536,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..c864801d9b4 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -58,7 +58,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { this.scene.playSound("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/utils.ts b/src/utils.ts index 5a67df314d2..ede0a4bd78a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -165,40 +165,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) ]; } @@ -288,18 +268,29 @@ export const isLocal = ( export const localServerUrl = import.meta.env.VITE_SERVER_URL ?? `http://${window.location.hostname}:${window.location.port+1}`; // Set the server URL based on whether it's local or not -export const serverUrl = isLocal ? localServerUrl : ""; -export const apiUrl = isLocal ? serverUrl : "https://api.pokerogue.net"; +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 { + 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++) { @@ -410,6 +401,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); @@ -528,4 +526,24 @@ 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; +} 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..546ea2a9d12 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -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..f5c95aa56bd 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,12 @@ -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv } 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 }, + plugins: [ + tsconfigPaths() as any, + minifyJsonPlugin(["images", "battle-anims"], true) + ], clearScreen: false, build: { minify: 'esbuild' as const, @@ -21,10 +24,17 @@ export const defaultConfig = { }; -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..d1827103807 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,9 +1,12 @@ -import { defineConfig } from 'vitest/config'; +import { defineProject } from 'vitest/config'; import { defaultConfig } from './vite.config'; -export default defineConfig(({mode}) => ({ +export default defineProject(({ mode }) => ({ ...defaultConfig, test: { + name: "main", + include: ["./src/test/**/*.{test,spec}.ts"], + exclude: ["./src/test/pre.test.ts"], setupFiles: ['./src/test/vitest.setup.ts'], server: { deps: { diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 00000000000..38121942004 --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,14 @@ +import { defineWorkspace } from "vitest/config"; +import { defaultConfig } from "./vite.config"; + +export default defineWorkspace([ + { + ...defaultConfig, + test: { + name: "pre", + include: ["src/test/pre.test.ts"], + environment: "jsdom", + }, + }, + "./vitest.config.ts", +]);