diff --git a/.env.beta b/.env.beta new file mode 100644 index 00000000000..8d1e93b3277 --- /dev/null +++ b/.env.beta @@ -0,0 +1,3 @@ +VITE_BYPASS_LOGIN=0 +VITE_BYPASS_TUTORIAL=0 +VITE_SERVER_URL=https://api.beta.pokerogue.net \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 00000000000..74818d41a12 --- /dev/null +++ b/.env.production @@ -0,0 +1,3 @@ +VITE_BYPASS_LOGIN=0 +VITE_BYPASS_TUTORIAL=0 +VITE_SERVER_URL=https://api.pokerogue.net \ No newline at end of file diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml new file mode 100644 index 00000000000..d954d9bb865 --- /dev/null +++ b/.github/workflows/deploy-beta.yml @@ -0,0 +1,33 @@ +name: Deploy Beta + +on: + push: {} + pull_request: {} + +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 + if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch + run: | + mkdir ~/.ssh + echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub + 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 + if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch + run: | + rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }} \ No newline at end of file diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml index 32c0ca7707a..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..802ed65a18f 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: 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/README.md b/README.md index 839bfa3ae45..d1b46e630bf 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - Pokémon Ultra Sun/Ultra Moon - Pokémon Sword/Shield - Pokémon Scarlet/Violet - - Firel (Custom Metropolis and Laboratory biome music) + - Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music) - Lmz (Custom Jungle biome music) ### 🎵 Sound Effects diff --git a/index.html b/index.html index a86f7832fc7..3722bdd3422 100644 --- a/index.html +++ b/index.html @@ -31,11 +31,6 @@ font-family: 'emerald'; src: url('./fonts/pokemon-emerald-pro.ttf') format('truetype'); } - @font-face { - font-family: 'unifont'; - src: url('./fonts/unifont-15.1.05.otf') format('opentype'); - size-adjust: 70%; - } @font-face { font-family: 'pkmnems'; diff --git a/package-lock.json b/package-lock.json index 45ce400ca2e..638a173d7e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8365,9 +8365,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 29a956f19c6..160ca965bc8 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "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", diff --git a/public/audio/bgm/abyss.mp3 b/public/audio/bgm/abyss.mp3 index 3347d89d7e5..08882ac7e09 100644 Binary files a/public/audio/bgm/abyss.mp3 and b/public/audio/bgm/abyss.mp3 differ diff --git a/public/audio/bgm/badlands.mp3 b/public/audio/bgm/badlands.mp3 index 40b3cf94156..386cf09c6a3 100644 Binary files a/public/audio/bgm/badlands.mp3 and b/public/audio/bgm/badlands.mp3 differ diff --git a/public/audio/bgm/battle_alola_champion.mp3 b/public/audio/bgm/battle_alola_champion.mp3 index 94173ca69fd..9fdefa52414 100644 Binary files a/public/audio/bgm/battle_alola_champion.mp3 and b/public/audio/bgm/battle_alola_champion.mp3 differ diff --git a/public/audio/bgm/battle_alola_elite.mp3 b/public/audio/bgm/battle_alola_elite.mp3 index d87a4a89968..2d595c25f1e 100644 Binary files a/public/audio/bgm/battle_alola_elite.mp3 and b/public/audio/bgm/battle_alola_elite.mp3 differ diff --git a/public/audio/bgm/battle_aqua_magma_boss.mp3 b/public/audio/bgm/battle_aqua_magma_boss.mp3 new file mode 100644 index 00000000000..1bee013e5c5 Binary files /dev/null and b/public/audio/bgm/battle_aqua_magma_boss.mp3 differ diff --git a/public/audio/bgm/battle_aqua_magma_grunt.mp3 b/public/audio/bgm/battle_aqua_magma_grunt.mp3 new file mode 100644 index 00000000000..019d7d40e35 Binary files /dev/null and b/public/audio/bgm/battle_aqua_magma_grunt.mp3 differ diff --git a/public/audio/bgm/battle_bb_elite.mp3 b/public/audio/bgm/battle_bb_elite.mp3 index e0ec0dbd518..64420ab3b96 100644 Binary files a/public/audio/bgm/battle_bb_elite.mp3 and b/public/audio/bgm/battle_bb_elite.mp3 differ diff --git a/public/audio/bgm/battle_champion_alder.mp3 b/public/audio/bgm/battle_champion_alder.mp3 index 8b58b5ad6de..001d442c461 100644 Binary files a/public/audio/bgm/battle_champion_alder.mp3 and b/public/audio/bgm/battle_champion_alder.mp3 differ diff --git a/public/audio/bgm/battle_champion_geeta.mp3 b/public/audio/bgm/battle_champion_geeta.mp3 index 1b654e33ee2..4deb395e1d1 100644 Binary files a/public/audio/bgm/battle_champion_geeta.mp3 and b/public/audio/bgm/battle_champion_geeta.mp3 differ diff --git a/public/audio/bgm/battle_champion_iris.mp3 b/public/audio/bgm/battle_champion_iris.mp3 index 7583574e8e0..e412925cebc 100644 Binary files a/public/audio/bgm/battle_champion_iris.mp3 and b/public/audio/bgm/battle_champion_iris.mp3 differ diff --git a/public/audio/bgm/battle_champion_kieran.mp3 b/public/audio/bgm/battle_champion_kieran.mp3 index e43a1c904cd..d6896e401a3 100644 Binary files a/public/audio/bgm/battle_champion_kieran.mp3 and b/public/audio/bgm/battle_champion_kieran.mp3 differ diff --git a/public/audio/bgm/battle_champion_nemona.mp3 b/public/audio/bgm/battle_champion_nemona.mp3 index 9d835030e49..9174fca4284 100644 Binary files a/public/audio/bgm/battle_champion_nemona.mp3 and b/public/audio/bgm/battle_champion_nemona.mp3 differ diff --git a/public/audio/bgm/battle_final.mp3 b/public/audio/bgm/battle_final.mp3 index 6f5cb5d1265..31a79f5eaee 100644 Binary files a/public/audio/bgm/battle_final.mp3 and b/public/audio/bgm/battle_final.mp3 differ diff --git a/public/audio/bgm/battle_final_encounter.mp3 b/public/audio/bgm/battle_final_encounter.mp3 index 818e84cc264..a0fe790e433 100644 Binary files a/public/audio/bgm/battle_final_encounter.mp3 and b/public/audio/bgm/battle_final_encounter.mp3 differ diff --git a/public/audio/bgm/battle_flare_boss.mp3 b/public/audio/bgm/battle_flare_boss.mp3 new file mode 100644 index 00000000000..fd2e2a544d9 Binary files /dev/null and b/public/audio/bgm/battle_flare_boss.mp3 differ diff --git a/public/audio/bgm/battle_flare_grunt.mp3 b/public/audio/bgm/battle_flare_grunt.mp3 new file mode 100644 index 00000000000..7e2805f8675 Binary files /dev/null and b/public/audio/bgm/battle_flare_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galactic_boss.mp3 b/public/audio/bgm/battle_galactic_boss.mp3 new file mode 100644 index 00000000000..3d6c624130e Binary files /dev/null and b/public/audio/bgm/battle_galactic_boss.mp3 differ diff --git a/public/audio/bgm/battle_galactic_grunt.mp3 b/public/audio/bgm/battle_galactic_grunt.mp3 new file mode 100644 index 00000000000..17d8295c50c Binary files /dev/null and b/public/audio/bgm/battle_galactic_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galar_champion.mp3 b/public/audio/bgm/battle_galar_champion.mp3 index 9dd43f9bbc8..01e089de9d2 100644 Binary files a/public/audio/bgm/battle_galar_champion.mp3 and b/public/audio/bgm/battle_galar_champion.mp3 differ diff --git a/public/audio/bgm/battle_galar_elite.mp3 b/public/audio/bgm/battle_galar_elite.mp3 index 34587edcbd1..5074172310d 100644 Binary files a/public/audio/bgm/battle_galar_elite.mp3 and b/public/audio/bgm/battle_galar_elite.mp3 differ diff --git a/public/audio/bgm/battle_galar_gym.mp3 b/public/audio/bgm/battle_galar_gym.mp3 index a10b284cf4b..539b389bb3a 100644 Binary files a/public/audio/bgm/battle_galar_gym.mp3 and b/public/audio/bgm/battle_galar_gym.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_champion.mp3 b/public/audio/bgm/battle_hoenn_champion.mp3 index 0fd09d5f4cd..37fd25b6a7b 100644 Binary files a/public/audio/bgm/battle_hoenn_champion.mp3 and b/public/audio/bgm/battle_hoenn_champion.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_elite.mp3 b/public/audio/bgm/battle_hoenn_elite.mp3 index 7d352d4332a..798d8c34241 100644 Binary files a/public/audio/bgm/battle_hoenn_elite.mp3 and b/public/audio/bgm/battle_hoenn_elite.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_gym.mp3 b/public/audio/bgm/battle_hoenn_gym.mp3 index 9bf06628c6a..02b36ebefea 100644 Binary files a/public/audio/bgm/battle_hoenn_gym.mp3 and b/public/audio/bgm/battle_hoenn_gym.mp3 differ diff --git a/public/audio/bgm/battle_johto_champion.mp3 b/public/audio/bgm/battle_johto_champion.mp3 index 47c4af88e23..dcc64a13502 100644 Binary files a/public/audio/bgm/battle_johto_champion.mp3 and b/public/audio/bgm/battle_johto_champion.mp3 differ diff --git a/public/audio/bgm/battle_johto_gym.mp3 b/public/audio/bgm/battle_johto_gym.mp3 index 3cb7e075428..6b9a51b5401 100644 Binary files a/public/audio/bgm/battle_johto_gym.mp3 and b/public/audio/bgm/battle_johto_gym.mp3 differ diff --git a/public/audio/bgm/battle_kalos_champion.mp3 b/public/audio/bgm/battle_kalos_champion.mp3 index c9dd6b80133..eab36818e27 100644 Binary files a/public/audio/bgm/battle_kalos_champion.mp3 and b/public/audio/bgm/battle_kalos_champion.mp3 differ diff --git a/public/audio/bgm/battle_kalos_elite.mp3 b/public/audio/bgm/battle_kalos_elite.mp3 index f4a0181544d..3c4d2dfed02 100644 Binary files a/public/audio/bgm/battle_kalos_elite.mp3 and b/public/audio/bgm/battle_kalos_elite.mp3 differ diff --git a/public/audio/bgm/battle_kalos_gym.mp3 b/public/audio/bgm/battle_kalos_gym.mp3 index 9031274519f..46c3fd04eb7 100644 Binary files a/public/audio/bgm/battle_kalos_gym.mp3 and b/public/audio/bgm/battle_kalos_gym.mp3 differ diff --git a/public/audio/bgm/battle_kanto_champion.mp3 b/public/audio/bgm/battle_kanto_champion.mp3 index c084453287c..a98c3a3c0da 100644 Binary files a/public/audio/bgm/battle_kanto_champion.mp3 and b/public/audio/bgm/battle_kanto_champion.mp3 differ diff --git a/public/audio/bgm/battle_kanto_gym.mp3 b/public/audio/bgm/battle_kanto_gym.mp3 index 3d9a9c30e19..82c705fc05a 100644 Binary files a/public/audio/bgm/battle_kanto_gym.mp3 and b/public/audio/bgm/battle_kanto_gym.mp3 differ diff --git a/public/audio/bgm/battle_legendary_arceus.mp3 b/public/audio/bgm/battle_legendary_arceus.mp3 index 03dab3878f2..ee060912ddf 100644 Binary files a/public/audio/bgm/battle_legendary_arceus.mp3 and b/public/audio/bgm/battle_legendary_arceus.mp3 differ diff --git a/public/audio/bgm/battle_legendary_birds_galar.mp3 b/public/audio/bgm/battle_legendary_birds_galar.mp3 index 79bedb5c500..807a38fe095 100644 Binary files a/public/audio/bgm/battle_legendary_birds_galar.mp3 and b/public/audio/bgm/battle_legendary_birds_galar.mp3 differ diff --git a/public/audio/bgm/battle_legendary_calyrex.mp3 b/public/audio/bgm/battle_legendary_calyrex.mp3 index 8d22a5df963..7fd44b5e9c6 100644 Binary files a/public/audio/bgm/battle_legendary_calyrex.mp3 and b/public/audio/bgm/battle_legendary_calyrex.mp3 differ diff --git a/public/audio/bgm/battle_legendary_deoxys.mp3 b/public/audio/bgm/battle_legendary_deoxys.mp3 index da91a5f76bc..351b4bb02b4 100644 Binary files a/public/audio/bgm/battle_legendary_deoxys.mp3 and b/public/audio/bgm/battle_legendary_deoxys.mp3 differ diff --git a/public/audio/bgm/battle_legendary_dia_pal.mp3 b/public/audio/bgm/battle_legendary_dia_pal.mp3 index 07998098afe..4cb361933fc 100644 Binary files a/public/audio/bgm/battle_legendary_dia_pal.mp3 and b/public/audio/bgm/battle_legendary_dia_pal.mp3 differ diff --git a/public/audio/bgm/battle_legendary_dusk_dawn.mp3 b/public/audio/bgm/battle_legendary_dusk_dawn.mp3 index 20b883a4ca7..b7340af5d4b 100644 Binary files a/public/audio/bgm/battle_legendary_dusk_dawn.mp3 and b/public/audio/bgm/battle_legendary_dusk_dawn.mp3 differ diff --git a/public/audio/bgm/battle_legendary_entei.mp3 b/public/audio/bgm/battle_legendary_entei.mp3 index 30d1f87748c..993a513689e 100644 Binary files a/public/audio/bgm/battle_legendary_entei.mp3 and b/public/audio/bgm/battle_legendary_entei.mp3 differ diff --git a/public/audio/bgm/battle_legendary_giratina.mp3 b/public/audio/bgm/battle_legendary_giratina.mp3 index 87674e003ca..5b9894fc346 100644 Binary files a/public/audio/bgm/battle_legendary_giratina.mp3 and b/public/audio/bgm/battle_legendary_giratina.mp3 differ diff --git a/public/audio/bgm/battle_legendary_glas_spec.mp3 b/public/audio/bgm/battle_legendary_glas_spec.mp3 index 52988510ea6..a11e9c0dc1b 100644 Binary files a/public/audio/bgm/battle_legendary_glas_spec.mp3 and b/public/audio/bgm/battle_legendary_glas_spec.mp3 differ diff --git a/public/audio/bgm/battle_legendary_gro_kyo.mp3 b/public/audio/bgm/battle_legendary_gro_kyo.mp3 index b3401da3f6e..49ecc6b0496 100644 Binary files a/public/audio/bgm/battle_legendary_gro_kyo.mp3 and b/public/audio/bgm/battle_legendary_gro_kyo.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ho_oh.mp3 b/public/audio/bgm/battle_legendary_ho_oh.mp3 index 46740297f77..ae41e2196be 100644 Binary files a/public/audio/bgm/battle_legendary_ho_oh.mp3 and b/public/audio/bgm/battle_legendary_ho_oh.mp3 differ diff --git a/public/audio/bgm/battle_legendary_kanto.mp3 b/public/audio/bgm/battle_legendary_kanto.mp3 index 0b9946ec9fe..aa7cfdec1c5 100644 Binary files a/public/audio/bgm/battle_legendary_kanto.mp3 and b/public/audio/bgm/battle_legendary_kanto.mp3 differ diff --git a/public/audio/bgm/battle_legendary_kor_mir.mp3 b/public/audio/bgm/battle_legendary_kor_mir.mp3 new file mode 100644 index 00000000000..4b18a94d423 Binary files /dev/null and b/public/audio/bgm/battle_legendary_kor_mir.mp3 differ diff --git a/public/audio/bgm/battle_legendary_kyurem.mp3 b/public/audio/bgm/battle_legendary_kyurem.mp3 index f2a325d427c..d7ad9630031 100644 Binary files a/public/audio/bgm/battle_legendary_kyurem.mp3 and b/public/audio/bgm/battle_legendary_kyurem.mp3 differ diff --git a/public/audio/bgm/battle_legendary_lake_trio.mp3 b/public/audio/bgm/battle_legendary_lake_trio.mp3 index dc6bb08d13f..dddcc34712f 100644 Binary files a/public/audio/bgm/battle_legendary_lake_trio.mp3 and b/public/audio/bgm/battle_legendary_lake_trio.mp3 differ diff --git a/public/audio/bgm/battle_legendary_loyal_three.mp3 b/public/audio/bgm/battle_legendary_loyal_three.mp3 index d753e58a0a7..d37930b33bf 100644 Binary files a/public/audio/bgm/battle_legendary_loyal_three.mp3 and b/public/audio/bgm/battle_legendary_loyal_three.mp3 differ diff --git a/public/audio/bgm/battle_legendary_lugia.mp3 b/public/audio/bgm/battle_legendary_lugia.mp3 index 37031c8a642..a68f3df6557 100644 Binary files a/public/audio/bgm/battle_legendary_lugia.mp3 and b/public/audio/bgm/battle_legendary_lugia.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ogerpon.mp3 b/public/audio/bgm/battle_legendary_ogerpon.mp3 index 2ac0d9756a8..0e26dafb5aa 100644 Binary files a/public/audio/bgm/battle_legendary_ogerpon.mp3 and b/public/audio/bgm/battle_legendary_ogerpon.mp3 differ diff --git a/public/audio/bgm/battle_legendary_pecharunt.mp3 b/public/audio/bgm/battle_legendary_pecharunt.mp3 index 48f205d97d1..21383c2ea0e 100644 Binary files a/public/audio/bgm/battle_legendary_pecharunt.mp3 and b/public/audio/bgm/battle_legendary_pecharunt.mp3 differ diff --git a/public/audio/bgm/battle_legendary_raikou.mp3 b/public/audio/bgm/battle_legendary_raikou.mp3 index 8daa7083faa..e89ac31d678 100644 Binary files a/public/audio/bgm/battle_legendary_raikou.mp3 and b/public/audio/bgm/battle_legendary_raikou.mp3 differ diff --git a/public/audio/bgm/battle_legendary_rayquaza.mp3 b/public/audio/bgm/battle_legendary_rayquaza.mp3 index 843596779bd..3747edef71b 100644 Binary files a/public/audio/bgm/battle_legendary_rayquaza.mp3 and b/public/audio/bgm/battle_legendary_rayquaza.mp3 differ diff --git a/public/audio/bgm/battle_legendary_regis_g5.mp3 b/public/audio/bgm/battle_legendary_regis_g5.mp3 index 227d544d91b..f7b18dc9170 100644 Binary files a/public/audio/bgm/battle_legendary_regis_g5.mp3 and b/public/audio/bgm/battle_legendary_regis_g5.mp3 differ diff --git a/public/audio/bgm/battle_legendary_regis_g6.mp3 b/public/audio/bgm/battle_legendary_regis_g6.mp3 index ebe1a44d18a..c87d61d0b79 100644 Binary files a/public/audio/bgm/battle_legendary_regis_g6.mp3 and b/public/audio/bgm/battle_legendary_regis_g6.mp3 differ diff --git a/public/audio/bgm/battle_legendary_res_zek.mp3 b/public/audio/bgm/battle_legendary_res_zek.mp3 index 4df08c10df8..5e26b7822ff 100644 Binary files a/public/audio/bgm/battle_legendary_res_zek.mp3 and b/public/audio/bgm/battle_legendary_res_zek.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ruinous.mp3 b/public/audio/bgm/battle_legendary_ruinous.mp3 index dc1aeeaee26..804b0f39a6f 100644 Binary files a/public/audio/bgm/battle_legendary_ruinous.mp3 and b/public/audio/bgm/battle_legendary_ruinous.mp3 differ diff --git a/public/audio/bgm/battle_legendary_sinnoh.mp3 b/public/audio/bgm/battle_legendary_sinnoh.mp3 index 6332a3e1cc2..6345689ebb3 100644 Binary files a/public/audio/bgm/battle_legendary_sinnoh.mp3 and b/public/audio/bgm/battle_legendary_sinnoh.mp3 differ diff --git a/public/audio/bgm/battle_legendary_sol_lun.mp3 b/public/audio/bgm/battle_legendary_sol_lun.mp3 index 4aa9d5111b8..9793c1b6560 100644 Binary files a/public/audio/bgm/battle_legendary_sol_lun.mp3 and b/public/audio/bgm/battle_legendary_sol_lun.mp3 differ diff --git a/public/audio/bgm/battle_legendary_suicune.mp3 b/public/audio/bgm/battle_legendary_suicune.mp3 index 7e7e4901386..4df599bbbc1 100644 Binary files a/public/audio/bgm/battle_legendary_suicune.mp3 and b/public/audio/bgm/battle_legendary_suicune.mp3 differ diff --git a/public/audio/bgm/battle_legendary_tapu.mp3 b/public/audio/bgm/battle_legendary_tapu.mp3 index 7f251a387a2..7536065ddfb 100644 Binary files a/public/audio/bgm/battle_legendary_tapu.mp3 and b/public/audio/bgm/battle_legendary_tapu.mp3 differ diff --git a/public/audio/bgm/battle_legendary_terapagos.mp3 b/public/audio/bgm/battle_legendary_terapagos.mp3 index b820d7dba6a..3cfea347224 100644 Binary files a/public/audio/bgm/battle_legendary_terapagos.mp3 and b/public/audio/bgm/battle_legendary_terapagos.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ub.mp3 b/public/audio/bgm/battle_legendary_ub.mp3 index 7a6bdb3a678..3aefc713441 100644 Binary files a/public/audio/bgm/battle_legendary_ub.mp3 and b/public/audio/bgm/battle_legendary_ub.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ultra_nec.mp3 b/public/audio/bgm/battle_legendary_ultra_nec.mp3 index 63d8b0fa505..e24c93cd4c2 100644 Binary files a/public/audio/bgm/battle_legendary_ultra_nec.mp3 and b/public/audio/bgm/battle_legendary_ultra_nec.mp3 differ diff --git a/public/audio/bgm/battle_legendary_unova.mp3 b/public/audio/bgm/battle_legendary_unova.mp3 index e4977d5b3b3..3bae8a6a49f 100644 Binary files a/public/audio/bgm/battle_legendary_unova.mp3 and b/public/audio/bgm/battle_legendary_unova.mp3 differ diff --git a/public/audio/bgm/battle_legendary_xern_yvel.mp3 b/public/audio/bgm/battle_legendary_xern_yvel.mp3 index 856bebb0f61..2487f60b28b 100644 Binary files a/public/audio/bgm/battle_legendary_xern_yvel.mp3 and b/public/audio/bgm/battle_legendary_xern_yvel.mp3 differ diff --git a/public/audio/bgm/battle_legendary_zac_zam.mp3 b/public/audio/bgm/battle_legendary_zac_zam.mp3 index 6725625bedf..5a8b8471c5b 100644 Binary files a/public/audio/bgm/battle_legendary_zac_zam.mp3 and b/public/audio/bgm/battle_legendary_zac_zam.mp3 differ diff --git a/public/audio/bgm/battle_paldea_elite.mp3 b/public/audio/bgm/battle_paldea_elite.mp3 index 9a598dfaf64..f3a71ee8340 100644 Binary files a/public/audio/bgm/battle_paldea_elite.mp3 and b/public/audio/bgm/battle_paldea_elite.mp3 differ diff --git a/public/audio/bgm/battle_paldea_gym.mp3 b/public/audio/bgm/battle_paldea_gym.mp3 index eb9a19bacfe..2cef63209fb 100644 Binary files a/public/audio/bgm/battle_paldea_gym.mp3 and b/public/audio/bgm/battle_paldea_gym.mp3 differ diff --git a/public/audio/bgm/battle_plasma_boss.mp3 b/public/audio/bgm/battle_plasma_boss.mp3 new file mode 100644 index 00000000000..124b8f4a230 Binary files /dev/null and b/public/audio/bgm/battle_plasma_boss.mp3 differ diff --git a/public/audio/bgm/battle_plasma_grunt.mp3 b/public/audio/bgm/battle_plasma_grunt.mp3 index fe371f21f9f..7d1bf710bc5 100644 Binary files a/public/audio/bgm/battle_plasma_grunt.mp3 and b/public/audio/bgm/battle_plasma_grunt.mp3 differ diff --git a/public/audio/bgm/battle_rival.mp3 b/public/audio/bgm/battle_rival.mp3 index 3ccf4898491..82ff586576a 100644 Binary files a/public/audio/bgm/battle_rival.mp3 and b/public/audio/bgm/battle_rival.mp3 differ diff --git a/public/audio/bgm/battle_rival_2.mp3 b/public/audio/bgm/battle_rival_2.mp3 index 3f19f990dce..7f063ed5fd0 100644 Binary files a/public/audio/bgm/battle_rival_2.mp3 and b/public/audio/bgm/battle_rival_2.mp3 differ diff --git a/public/audio/bgm/battle_rival_3.mp3 b/public/audio/bgm/battle_rival_3.mp3 index f6254c24cf4..911438b4f83 100644 Binary files a/public/audio/bgm/battle_rival_3.mp3 and b/public/audio/bgm/battle_rival_3.mp3 differ diff --git a/public/audio/bgm/battle_rocket_boss.mp3 b/public/audio/bgm/battle_rocket_boss.mp3 new file mode 100644 index 00000000000..757eaa38c70 Binary files /dev/null and b/public/audio/bgm/battle_rocket_boss.mp3 differ diff --git a/public/audio/bgm/battle_rocket_grunt.mp3 b/public/audio/bgm/battle_rocket_grunt.mp3 new file mode 100644 index 00000000000..e8f5faf86d7 Binary files /dev/null and b/public/audio/bgm/battle_rocket_grunt.mp3 differ diff --git a/public/audio/bgm/battle_sinnoh_champion.mp3 b/public/audio/bgm/battle_sinnoh_champion.mp3 index e6240c5a02a..a662ca20cbb 100644 Binary files a/public/audio/bgm/battle_sinnoh_champion.mp3 and b/public/audio/bgm/battle_sinnoh_champion.mp3 differ diff --git a/public/audio/bgm/battle_sinnoh_gym.mp3 b/public/audio/bgm/battle_sinnoh_gym.mp3 index 3bf7e96f77f..280c33a09e5 100644 Binary files a/public/audio/bgm/battle_sinnoh_gym.mp3 and b/public/audio/bgm/battle_sinnoh_gym.mp3 differ diff --git a/public/audio/bgm/battle_trainer.mp3 b/public/audio/bgm/battle_trainer.mp3 index 1155d72a53c..d90c7bd845f 100644 Binary files a/public/audio/bgm/battle_trainer.mp3 and b/public/audio/bgm/battle_trainer.mp3 differ diff --git a/public/audio/bgm/battle_unova_elite.mp3 b/public/audio/bgm/battle_unova_elite.mp3 index cab27a0de59..8c150acb9e3 100644 Binary files a/public/audio/bgm/battle_unova_elite.mp3 and b/public/audio/bgm/battle_unova_elite.mp3 differ diff --git a/public/audio/bgm/battle_unova_gym.mp3 b/public/audio/bgm/battle_unova_gym.mp3 index 3995e675bfe..46a4600bbca 100644 Binary files a/public/audio/bgm/battle_unova_gym.mp3 and b/public/audio/bgm/battle_unova_gym.mp3 differ diff --git a/public/audio/bgm/battle_wild.mp3 b/public/audio/bgm/battle_wild.mp3 index 98f7fe20150..f8d484ab51e 100644 Binary files a/public/audio/bgm/battle_wild.mp3 and b/public/audio/bgm/battle_wild.mp3 differ diff --git a/public/audio/bgm/battle_wild_strong.mp3 b/public/audio/bgm/battle_wild_strong.mp3 index 166ac3825c5..cf02ef8d1d5 100644 Binary files a/public/audio/bgm/battle_wild_strong.mp3 and b/public/audio/bgm/battle_wild_strong.mp3 differ diff --git a/public/audio/bgm/beach.mp3 b/public/audio/bgm/beach.mp3 index a22386a9dc3..af0486a0c78 100644 Binary files a/public/audio/bgm/beach.mp3 and b/public/audio/bgm/beach.mp3 differ diff --git a/public/audio/bgm/bw/evolution.mp3 b/public/audio/bgm/bw/evolution.mp3 index 0d7ae190bda..ecfd085da26 100644 Binary files a/public/audio/bgm/bw/evolution.mp3 and b/public/audio/bgm/bw/evolution.mp3 differ diff --git a/public/audio/bgm/bw/evolution_fanfare.mp3 b/public/audio/bgm/bw/evolution_fanfare.mp3 index cb394470f1f..6f554a4189e 100644 Binary files a/public/audio/bgm/bw/evolution_fanfare.mp3 and b/public/audio/bgm/bw/evolution_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/heal.mp3 b/public/audio/bgm/bw/heal.mp3 index 22b2d9fb8a3..9300bf35099 100644 Binary files a/public/audio/bgm/bw/heal.mp3 and b/public/audio/bgm/bw/heal.mp3 differ diff --git a/public/audio/bgm/bw/item_fanfare.mp3 b/public/audio/bgm/bw/item_fanfare.mp3 index 336a12dc1a6..7f128ff1c22 100644 Binary files a/public/audio/bgm/bw/item_fanfare.mp3 and b/public/audio/bgm/bw/item_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/level_up_fanfare.mp3 b/public/audio/bgm/bw/level_up_fanfare.mp3 index 3e4bdbdc947..9501092f9dd 100644 Binary files a/public/audio/bgm/bw/level_up_fanfare.mp3 and b/public/audio/bgm/bw/level_up_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/minor_fanfare.mp3 b/public/audio/bgm/bw/minor_fanfare.mp3 index 464a579a38f..2e6104022f1 100644 Binary files a/public/audio/bgm/bw/minor_fanfare.mp3 and b/public/audio/bgm/bw/minor_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/victory_champion.mp3 b/public/audio/bgm/bw/victory_champion.mp3 index 2f6e6096bcb..3711aadcc53 100644 Binary files a/public/audio/bgm/bw/victory_champion.mp3 and b/public/audio/bgm/bw/victory_champion.mp3 differ diff --git a/public/audio/bgm/bw/victory_gym.mp3 b/public/audio/bgm/bw/victory_gym.mp3 index 5968b154ed6..9b93a90dd5d 100644 Binary files a/public/audio/bgm/bw/victory_gym.mp3 and b/public/audio/bgm/bw/victory_gym.mp3 differ diff --git a/public/audio/bgm/bw/victory_team_plasma.mp3 b/public/audio/bgm/bw/victory_team_plasma.mp3 new file mode 100644 index 00000000000..1f2c6229f5d Binary files /dev/null and b/public/audio/bgm/bw/victory_team_plasma.mp3 differ diff --git a/public/audio/bgm/bw/victory_trainer.mp3 b/public/audio/bgm/bw/victory_trainer.mp3 index c8ab465a7b9..f5adb6deacc 100644 Binary files a/public/audio/bgm/bw/victory_trainer.mp3 and b/public/audio/bgm/bw/victory_trainer.mp3 differ diff --git a/public/audio/bgm/cave.mp3 b/public/audio/bgm/cave.mp3 index f27d110d341..59f4063867c 100644 Binary files a/public/audio/bgm/cave.mp3 and b/public/audio/bgm/cave.mp3 differ diff --git a/public/audio/bgm/construction_site.mp3 b/public/audio/bgm/construction_site.mp3 index 841f623a2d5..a5c5f5b1879 100644 Binary files a/public/audio/bgm/construction_site.mp3 and b/public/audio/bgm/construction_site.mp3 differ diff --git a/public/audio/bgm/desert.mp3 b/public/audio/bgm/desert.mp3 index 546cc0c3377..febbacc0100 100644 Binary files a/public/audio/bgm/desert.mp3 and b/public/audio/bgm/desert.mp3 differ diff --git a/public/audio/bgm/dojo.mp3 b/public/audio/bgm/dojo.mp3 index cb4a67b831c..d8621b5b7fc 100644 Binary files a/public/audio/bgm/dojo.mp3 and b/public/audio/bgm/dojo.mp3 differ diff --git a/public/audio/bgm/encounter_ace_trainer.mp3 b/public/audio/bgm/encounter_ace_trainer.mp3 index 835d7fbb56d..ea507898900 100644 Binary files a/public/audio/bgm/encounter_ace_trainer.mp3 and b/public/audio/bgm/encounter_ace_trainer.mp3 differ diff --git a/public/audio/bgm/encounter_backpacker.mp3 b/public/audio/bgm/encounter_backpacker.mp3 index c1e3d7f0ad5..1b95c48c1f8 100644 Binary files a/public/audio/bgm/encounter_backpacker.mp3 and b/public/audio/bgm/encounter_backpacker.mp3 differ diff --git a/public/audio/bgm/encounter_clerk.mp3 b/public/audio/bgm/encounter_clerk.mp3 index 8542a641edc..8e1a45f43d2 100644 Binary files a/public/audio/bgm/encounter_clerk.mp3 and b/public/audio/bgm/encounter_clerk.mp3 differ diff --git a/public/audio/bgm/encounter_cyclist.mp3 b/public/audio/bgm/encounter_cyclist.mp3 index 3603947d999..dda81f48b71 100644 Binary files a/public/audio/bgm/encounter_cyclist.mp3 and b/public/audio/bgm/encounter_cyclist.mp3 differ diff --git a/public/audio/bgm/encounter_final.mp3 b/public/audio/bgm/encounter_final.mp3 index 34e37132e90..ea47aa4bea4 100644 Binary files a/public/audio/bgm/encounter_final.mp3 and b/public/audio/bgm/encounter_final.mp3 differ diff --git a/public/audio/bgm/encounter_lass.mp3 b/public/audio/bgm/encounter_lass.mp3 index 2f8be45c5ea..31ea20e3c02 100644 Binary files a/public/audio/bgm/encounter_lass.mp3 and b/public/audio/bgm/encounter_lass.mp3 differ diff --git a/public/audio/bgm/encounter_parasol_lady.mp3 b/public/audio/bgm/encounter_parasol_lady.mp3 index 1eb632a403c..1fca7bae31a 100644 Binary files a/public/audio/bgm/encounter_parasol_lady.mp3 and b/public/audio/bgm/encounter_parasol_lady.mp3 differ diff --git a/public/audio/bgm/encounter_plasma_grunt.mp3 b/public/audio/bgm/encounter_plasma_grunt.mp3 index 478d3f8edc5..53e73cc0106 100644 Binary files a/public/audio/bgm/encounter_plasma_grunt.mp3 and b/public/audio/bgm/encounter_plasma_grunt.mp3 differ diff --git a/public/audio/bgm/encounter_pokefan.mp3 b/public/audio/bgm/encounter_pokefan.mp3 index 9c8f60aac0f..cc3fafb158b 100644 Binary files a/public/audio/bgm/encounter_pokefan.mp3 and b/public/audio/bgm/encounter_pokefan.mp3 differ diff --git a/public/audio/bgm/encounter_psychic.mp3 b/public/audio/bgm/encounter_psychic.mp3 index 75a2808569b..111e41833a2 100644 Binary files a/public/audio/bgm/encounter_psychic.mp3 and b/public/audio/bgm/encounter_psychic.mp3 differ diff --git a/public/audio/bgm/encounter_rich.mp3 b/public/audio/bgm/encounter_rich.mp3 index cca97e6188e..2df9dfcceab 100644 Binary files a/public/audio/bgm/encounter_rich.mp3 and b/public/audio/bgm/encounter_rich.mp3 differ diff --git a/public/audio/bgm/encounter_rival.mp3 b/public/audio/bgm/encounter_rival.mp3 index 613c1b552cf..b814879b70e 100644 Binary files a/public/audio/bgm/encounter_rival.mp3 and b/public/audio/bgm/encounter_rival.mp3 differ diff --git a/public/audio/bgm/encounter_roughneck.mp3 b/public/audio/bgm/encounter_roughneck.mp3 index 9e239191133..630e1d0263d 100644 Binary files a/public/audio/bgm/encounter_roughneck.mp3 and b/public/audio/bgm/encounter_roughneck.mp3 differ diff --git a/public/audio/bgm/encounter_scientist.mp3 b/public/audio/bgm/encounter_scientist.mp3 index 8cb180cd6ab..a2d2ce7754d 100644 Binary files a/public/audio/bgm/encounter_scientist.mp3 and b/public/audio/bgm/encounter_scientist.mp3 differ diff --git a/public/audio/bgm/encounter_twins.mp3 b/public/audio/bgm/encounter_twins.mp3 index cb6b0ef8a26..8564a101dbe 100644 Binary files a/public/audio/bgm/encounter_twins.mp3 and b/public/audio/bgm/encounter_twins.mp3 differ diff --git a/public/audio/bgm/encounter_youngster.mp3 b/public/audio/bgm/encounter_youngster.mp3 index 33e900b28d0..8ad8bd158e9 100644 Binary files a/public/audio/bgm/encounter_youngster.mp3 and b/public/audio/bgm/encounter_youngster.mp3 differ diff --git a/public/audio/bgm/end.mp3 b/public/audio/bgm/end.mp3 index 83b1273627a..c37973fd9cc 100644 Binary files a/public/audio/bgm/end.mp3 and b/public/audio/bgm/end.mp3 differ diff --git a/public/audio/bgm/end_summit.mp3 b/public/audio/bgm/end_summit.mp3 index 840d888bdd5..413fb4af384 100644 Binary files a/public/audio/bgm/end_summit.mp3 and b/public/audio/bgm/end_summit.mp3 differ diff --git a/public/audio/bgm/factory.mp3 b/public/audio/bgm/factory.mp3 index 78f21dc44d6..72304168306 100644 Binary files a/public/audio/bgm/factory.mp3 and b/public/audio/bgm/factory.mp3 differ diff --git a/public/audio/bgm/fairy_cave.mp3 b/public/audio/bgm/fairy_cave.mp3 index 5de3f702b21..4e1c9ea0eb4 100644 Binary files a/public/audio/bgm/fairy_cave.mp3 and b/public/audio/bgm/fairy_cave.mp3 differ diff --git a/public/audio/bgm/forest.mp3 b/public/audio/bgm/forest.mp3 index 0f5af3b56f3..a1d9ecb4b28 100644 Binary files a/public/audio/bgm/forest.mp3 and b/public/audio/bgm/forest.mp3 differ diff --git a/public/audio/bgm/grass.mp3 b/public/audio/bgm/grass.mp3 index f9555ec2a7d..898da6d42c5 100644 Binary files a/public/audio/bgm/grass.mp3 and b/public/audio/bgm/grass.mp3 differ diff --git a/public/audio/bgm/graveyard.mp3 b/public/audio/bgm/graveyard.mp3 index 343ad3eda98..48092fa3ec2 100644 Binary files a/public/audio/bgm/graveyard.mp3 and b/public/audio/bgm/graveyard.mp3 differ diff --git a/public/audio/bgm/heal.mp3 b/public/audio/bgm/heal.mp3 index 22b2d9fb8a3..9300bf35099 100644 Binary files a/public/audio/bgm/heal.mp3 and b/public/audio/bgm/heal.mp3 differ diff --git a/public/audio/bgm/ice_cave.mp3 b/public/audio/bgm/ice_cave.mp3 index bc23973b9ee..5d1b9e9e354 100644 Binary files a/public/audio/bgm/ice_cave.mp3 and b/public/audio/bgm/ice_cave.mp3 differ diff --git a/public/audio/bgm/island.mp3 b/public/audio/bgm/island.mp3 index 08aecab84a9..27d5ff64562 100644 Binary files a/public/audio/bgm/island.mp3 and b/public/audio/bgm/island.mp3 differ diff --git a/public/audio/bgm/jungle.mp3 b/public/audio/bgm/jungle.mp3 index 5db42ba8d0d..3a21c9bdb41 100644 Binary files a/public/audio/bgm/jungle.mp3 and b/public/audio/bgm/jungle.mp3 differ diff --git a/public/audio/bgm/laboratory.mp3 b/public/audio/bgm/laboratory.mp3 index 38b2b71b62a..e2b617e590a 100644 Binary files a/public/audio/bgm/laboratory.mp3 and b/public/audio/bgm/laboratory.mp3 differ diff --git a/public/audio/bgm/lake.mp3 b/public/audio/bgm/lake.mp3 index e93228ba565..c61fef15e42 100644 Binary files a/public/audio/bgm/lake.mp3 and b/public/audio/bgm/lake.mp3 differ diff --git a/public/audio/bgm/meadow.mp3 b/public/audio/bgm/meadow.mp3 index 5990f79e5da..1c9b6c47325 100644 Binary files a/public/audio/bgm/meadow.mp3 and b/public/audio/bgm/meadow.mp3 differ diff --git a/public/audio/bgm/menu.mp3 b/public/audio/bgm/menu.mp3 index a57ba45bd14..286e986d570 100644 Binary files a/public/audio/bgm/menu.mp3 and b/public/audio/bgm/menu.mp3 differ diff --git a/public/audio/bgm/metropolis.mp3 b/public/audio/bgm/metropolis.mp3 index ff67771bdb9..98c2eb396b6 100644 Binary files a/public/audio/bgm/metropolis.mp3 and b/public/audio/bgm/metropolis.mp3 differ diff --git a/public/audio/bgm/mountain.mp3 b/public/audio/bgm/mountain.mp3 index d71cd687057..e4ca51cf4fd 100644 Binary files a/public/audio/bgm/mountain.mp3 and b/public/audio/bgm/mountain.mp3 differ diff --git a/public/audio/bgm/plains.mp3 b/public/audio/bgm/plains.mp3 index 3deb8f4b27d..6c7a008bce6 100644 Binary files a/public/audio/bgm/plains.mp3 and b/public/audio/bgm/plains.mp3 differ diff --git a/public/audio/bgm/power_plant.mp3 b/public/audio/bgm/power_plant.mp3 index a7ab54305c2..9813ad40a11 100644 Binary files a/public/audio/bgm/power_plant.mp3 and b/public/audio/bgm/power_plant.mp3 differ diff --git a/public/audio/bgm/rse/evolution.mp3 b/public/audio/bgm/rse/evolution.mp3 index 5f1b739f14f..a74cbedb594 100644 Binary files a/public/audio/bgm/rse/evolution.mp3 and b/public/audio/bgm/rse/evolution.mp3 differ diff --git a/public/audio/bgm/rse/evolution_fanfare.mp3 b/public/audio/bgm/rse/evolution_fanfare.mp3 index 165d1d2d8eb..8acfb2f3a95 100644 Binary files a/public/audio/bgm/rse/evolution_fanfare.mp3 and b/public/audio/bgm/rse/evolution_fanfare.mp3 differ diff --git a/public/audio/bgm/rse/level_up_fanfare.mp3 b/public/audio/bgm/rse/level_up_fanfare.mp3 index bc85163c15e..78aea15156d 100644 Binary files a/public/audio/bgm/rse/level_up_fanfare.mp3 and b/public/audio/bgm/rse/level_up_fanfare.mp3 differ diff --git a/public/audio/bgm/rse/victory.mp3 b/public/audio/bgm/rse/victory.mp3 index 871889af615..7bf1d7a5282 100644 Binary files a/public/audio/bgm/rse/victory.mp3 and b/public/audio/bgm/rse/victory.mp3 differ diff --git a/public/audio/bgm/ruins.mp3 b/public/audio/bgm/ruins.mp3 index 096161d8bef..62f31893423 100644 Binary files a/public/audio/bgm/ruins.mp3 and b/public/audio/bgm/ruins.mp3 differ diff --git a/public/audio/bgm/sea.mp3 b/public/audio/bgm/sea.mp3 index 0bf44bcc3e4..8bdaaa696f1 100644 Binary files a/public/audio/bgm/sea.mp3 and b/public/audio/bgm/sea.mp3 differ diff --git a/public/audio/bgm/seabed.mp3 b/public/audio/bgm/seabed.mp3 index afa282cb4db..d0c405b4e1d 100644 Binary files a/public/audio/bgm/seabed.mp3 and b/public/audio/bgm/seabed.mp3 differ diff --git a/public/audio/bgm/slum.mp3 b/public/audio/bgm/slum.mp3 index 2df06608e64..1315c7838fc 100644 Binary files a/public/audio/bgm/slum.mp3 and b/public/audio/bgm/slum.mp3 differ diff --git a/public/audio/bgm/snowy_forest.mp3 b/public/audio/bgm/snowy_forest.mp3 index c0e94538910..1469ef56bde 100644 Binary files a/public/audio/bgm/snowy_forest.mp3 and b/public/audio/bgm/snowy_forest.mp3 differ diff --git a/public/audio/bgm/space.mp3 b/public/audio/bgm/space.mp3 index 9585351c9af..87a53fb84ff 100644 Binary files a/public/audio/bgm/space.mp3 and b/public/audio/bgm/space.mp3 differ diff --git a/public/audio/bgm/swamp.mp3 b/public/audio/bgm/swamp.mp3 index e92045d18d2..eb42c8a7a46 100644 Binary files a/public/audio/bgm/swamp.mp3 and b/public/audio/bgm/swamp.mp3 differ diff --git a/public/audio/bgm/tall_grass.mp3 b/public/audio/bgm/tall_grass.mp3 index 68c587547cf..ba2200b64fc 100644 Binary files a/public/audio/bgm/tall_grass.mp3 and b/public/audio/bgm/tall_grass.mp3 differ diff --git a/public/audio/bgm/temple.mp3 b/public/audio/bgm/temple.mp3 index 810b9f97311..81fa4416575 100644 Binary files a/public/audio/bgm/temple.mp3 and b/public/audio/bgm/temple.mp3 differ diff --git a/public/audio/bgm/title.mp3 b/public/audio/bgm/title.mp3 index 373b56e3acd..86d4be0da35 100644 Binary files a/public/audio/bgm/title.mp3 and b/public/audio/bgm/title.mp3 differ diff --git a/public/audio/bgm/town.mp3 b/public/audio/bgm/town.mp3 index dd8d3fa6666..fb197ade121 100644 Binary files a/public/audio/bgm/town.mp3 and b/public/audio/bgm/town.mp3 differ diff --git a/public/audio/bgm/volcano.mp3 b/public/audio/bgm/volcano.mp3 index 8e5a6ff8d95..093bb86813b 100644 Binary files a/public/audio/bgm/volcano.mp3 and b/public/audio/bgm/volcano.mp3 differ diff --git a/public/audio/bgm/wasteland.mp3 b/public/audio/bgm/wasteland.mp3 index ee068ac2eac..646cbd89a1f 100644 Binary files a/public/audio/bgm/wasteland.mp3 and b/public/audio/bgm/wasteland.mp3 differ diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 852815800eb..d514814d3f6 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -29,8 +29,8 @@ "15-mega", "150-mega", "150-mega", - "150-mega", - "150-mega", + "150-mega-x", + "150-mega-y", "18-mega", "18-mega", "181-mega", @@ -185,8 +185,8 @@ "531-mega", "6-mega", "6-mega", - "6-mega", - "6-mega", + "6-mega-x", + "6-mega-y", "6058", "6058", "6059", @@ -621,7 +621,7 @@ "777", "778-busted", "778-busted", - "778", + "778-disguised", "778", "779", "779", @@ -1161,8 +1161,8 @@ "15b-mega", "150b-mega", "150b-mega", - "150b-mega", - "150b-mega", + "150b-mega-x", + "150b-mega-y", "18b-mega", "18b-mega", "181b-mega", @@ -1317,8 +1317,8 @@ "531b-mega", "6b-mega", "6b-mega", - "6b-mega", - "6b-mega", + "6b-mega-x", + "6b-mega-y", "6058b", "6058b", "6059b", @@ -1753,7 +1753,7 @@ "777b", "778b-busted", "778b-busted", - "778b", + "778b-disguised", "778b", "779b", "779b", @@ -2295,8 +2295,8 @@ "15sb-mega", "150sb-mega", "150sb-mega", - "150sb-mega", - "150sb-mega", + "150sb-mega-x", + "150sb-mega-y", "18sb-mega", "18sb-mega", "181sb-mega", @@ -2451,8 +2451,8 @@ "531sb-mega", "6sb-mega", "6sb-mega", - "6sb-mega", - "6sb-mega", + "6sb-mega-x", + "6sb-mega-y", "6058sb", "6058sb", "6059sb", @@ -2885,7 +2885,7 @@ "777sb", "778sb-busted", "778sb-busted", - "778sb", + "778sb-disguised", "778sb", "779sb", "779sb", @@ -3432,8 +3432,8 @@ "15s-mega", "150s-mega", "150s-mega", - "150s-mega", - "150s-mega", + "150s-mega-x", + "150s-mega-y", "18s-mega", "18s-mega", "181s-mega", @@ -3588,8 +3588,8 @@ "531s-mega", "6s-mega", "6s-mega", - "6s-mega", - "6s-mega", + "6s-mega-x", + "6s-mega-y", "6058s", "6058s", "6059s", @@ -4024,7 +4024,7 @@ "777s", "778s-busted", "778s-busted", - "778s", + "778s-disguised", "778s", "779s", "779s", diff --git a/public/images/items.json b/public/images/items.json index 6af2029efd9..33dcf8f5e9a 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,13 +4,13 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 414, - "h": 414 + "w": 415, + "h": 415 }, "scale": 1, "frames": [ { - "filename": "relic_gold", + "filename": "galarica_cuff", "rotated": false, "trimmed": true, "sourceSize": { @@ -18,20 +18,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 + "x": 1, + "y": 1, + "w": 29, + "h": 30 }, "frame": { "x": 0, "y": 0, - "w": 15, - "h": 11 + "w": 29, + "h": 30 } }, { - "filename": "ability_capsule", + "filename": "galarica_wreath", "rotated": false, "trimmed": true, "sourceSize": { @@ -39,545 +39,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 15, - "y": 0, - "w": 24, - "h": 14 - } - }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 39, - "y": 0, - "w": 16, - "h": 15 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 55, - "y": 0, - "w": 15, - "h": 15 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 70, - "y": 0, - "w": 24, - "h": 15 - } - }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 94, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 110, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 126, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 142, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 158, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "altarianite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 174, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 190, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "audinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 206, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "banettite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 222, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "beedrillite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 238, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "blastoisinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 254, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "blazikenite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 270, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "cameruptite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 286, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "charizardite_x", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 302, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "charizardite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 318, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "diancite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 334, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "galladite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 350, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "garchompite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 366, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "gardevoirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 382, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "gengarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 398, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { "x": 0, - "y": 11, - "w": 12, - "h": 17 - } - }, - { - "filename": "glalitite", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 3, "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "h": 27 }, "frame": { - "x": 12, - "y": 14, - "w": 16, - "h": 16 + "x": 29, + "y": 0, + "w": 32, + "h": 27 } }, { - "filename": "gyaradosite", + "filename": "max_mushrooms", "rotated": false, "trimmed": true, "sourceSize": { @@ -585,503 +60,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 28, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "heracronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 44, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "houndoominite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 60, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "kangaskhanite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 76, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 92, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 108, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "lopunnite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 124, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "lucarionite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 140, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "manectite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 156, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mawilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 172, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "medichamite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 188, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 204, - "y": 16, - "w": 20, - "h": 16 - } - }, - { - "filename": "metagrossite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 224, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_x", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 240, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 256, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 272, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "pidgeotite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 288, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "pinsirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 304, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "rayquazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 320, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 336, - "y": 16, - "w": 17, - "h": 16 - } - }, - { - "filename": "sablenite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 353, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "salamencite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 369, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "sceptilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 385, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "scizorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 1, + "y": 3, + "w": 29, + "h": 28 }, "frame": { "x": 0, "y": 30, - "w": 16, - "h": 16 + "w": 29, + "h": 28 } }, { - "filename": "sharpedonite", + "filename": "bronze_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -1089,20 +81,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 5, + "y": 1, + "w": 22, + "h": 31 }, "frame": { - "x": 16, - "y": 31, - "w": 16, - "h": 16 + "x": 29, + "y": 27, + "w": 22, + "h": 31 } }, { - "filename": "slowbronite", + "filename": "great_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -1110,419 +102,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 32, - "y": 31, - "w": 16, - "h": 16 - } - }, - { - "filename": "soul_dew", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 48, - "y": 31, - "w": 16, - "h": 16 - } - }, - { - "filename": "steelixite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 64, - "y": 31, - "w": 16, - "h": 16 - } - }, - { - "filename": "strawberry_sweet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 16, - "h": 16 - }, - "frame": { - "x": 80, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "swampertite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 96, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "tyranitarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 112, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "venusaurite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 128, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 144, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 167, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 190, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 213, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 236, - "y": 32, - "w": 20, - "h": 17 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 256, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 279, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 302, - "y": 32, - "w": 18, - "h": 18 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 320, - "y": 32, - "w": 24, - "h": 18 - } - }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 344, - "y": 32, - "w": 18, - "h": 18 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 362, - "y": 32, - "w": 24, - "h": 18 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 386, - "y": 32, - "w": 18, - "h": 18 - } - }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 + "x": 5, + "y": 1, + "w": 22, + "h": 31 }, "frame": { "x": 0, - "y": 46, - "w": 16, - "h": 18 + "y": 58, + "w": 22, + "h": 31 } }, { - "filename": "light_stone", + "filename": "linking_cord", "rotated": false, "trimmed": true, "sourceSize": { @@ -1530,20 +123,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 + "x": 3, + "y": 3, + "w": 27, + "h": 26 }, "frame": { - "x": 16, - "y": 47, - "w": 18, - "h": 18 + "x": 61, + "y": 0, + "w": 27, + "h": 26 } }, { - "filename": "masterpiece_teacup", + "filename": "master_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -1552,670 +145,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 34, - "y": 47, - "w": 21, - "h": 18 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 55, - "y": 47, - "w": 23, - "h": 18 - } - }, - { - "filename": "sharp_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 78, - "y": 48, - "w": 21, - "h": 18 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 99, - "y": 48, - "w": 18, - "h": 18 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 117, - "y": 48, - "w": 21, - "h": 18 - } - }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 138, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 158, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 178, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 198, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 218, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 238, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 258, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 278, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 298, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 318, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 338, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 358, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ice_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 378, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 398, - "y": 50, - "w": 15, - "h": 22 - } - }, - { - "filename": "wl_item_drop", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 + "y": 1, + "w": 22, + "h": 31 }, "frame": { "x": 0, - "y": 65, - "w": 20, - "h": 18 + "y": 89, + "w": 22, + "h": 31 } }, { - "filename": "wl_item_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 20, - "y": 65, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 40, - "y": 65, - "w": 20, - "h": 18 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 60, - "y": 65, - "w": 18, - "h": 19 - } - }, - { - "filename": "wl_max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 78, - "y": 66, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 98, - "y": 66, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 118, - "y": 66, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_paralyze_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 138, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 158, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_reset_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 178, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 198, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 218, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 238, - "y": 67, - "w": 19, - "h": 19 - } - }, - { - "filename": "blunder_policy", + "filename": "rogue_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -2224,61 +166,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 1, "w": 22, - "h": 19 + "h": 31 }, "frame": { - "x": 257, - "y": 67, + "x": 22, + "y": 58, "w": 22, - "h": 19 + "h": 31 } }, { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 279, - "y": 67, - "w": 19, - "h": 19 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 298, - "y": 68, - "w": 23, - "h": 19 - } - }, - { - "filename": "dubious_disc", + "filename": "ultra_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -2287,103 +187,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 1, "w": 22, - "h": 19 - }, - "frame": { - "x": 321, - "y": 68, - "w": 22, - "h": 19 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 343, - "y": 68, - "w": 23, - "h": 19 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 366, - "y": 68, - "w": 20, - "h": 19 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 386, - "y": 72, - "w": 21, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "h": 31 }, "frame": { "x": 0, - "y": 83, - "w": 23, - "h": 19 + "y": 120, + "w": 22, + "h": 31 } }, { - "filename": "pair_of_tickets", + "filename": "cornerstone_mask", "rotated": false, "trimmed": true, "sourceSize": { @@ -2392,166 +208,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 23, - "y": 83, - "w": 23, - "h": 19 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 46, - "y": 84, - "w": 20, - "h": 19 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 66, - "y": 84, - "w": 22, - "h": 19 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 + "y": 3, + "w": 24, + "h": 26 }, "frame": { "x": 88, - "y": 84, - "w": 19, - "h": 20 + "y": 0, + "w": 24, + "h": 26 } }, { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 107, - "y": 84, - "w": 20, - "h": 20 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 127, - "y": 85, - "w": 23, - "h": 20 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 150, - "y": 85, - "w": 20, - "h": 20 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 170, - "y": 85, - "w": 19, - "h": 20 - } - }, - { - "filename": "chipped_pot", + "filename": "ability_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -2560,40 +229,19 @@ }, "spriteSourceSize": { "x": 3, - "y": 6, - "w": 26, - "h": 20 + "y": 3, + "w": 23, + "h": 26 }, "frame": { - "x": 189, - "y": 85, - "w": 26, - "h": 20 + "x": 112, + "y": 0, + "w": 23, + "h": 26 } }, { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 215, - "y": 85, - "w": 22, - "h": 20 - } - }, - { - "filename": "cracked_pot", + "filename": "map", "rotated": false, "trimmed": true, "sourceSize": { @@ -2602,710 +250,17 @@ }, "spriteSourceSize": { "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 237, - "y": 86, - "w": 26, - "h": 20 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 263, - "y": 86, - "w": 22, - "h": 20 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 285, - "y": 87, - "w": 20, - "h": 20 - } - }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 305, - "y": 87, - "w": 17, - "h": 20 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 322, - "y": 87, - "w": 19, - "h": 20 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 341, - "y": 87, - "w": 24, - "h": 20 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 365, - "y": 87, - "w": 17, - "h": 20 - } - }, - { - "filename": "legend_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 25, - "h": 20 - }, - "frame": { - "x": 382, - "y": 91, - "w": 25, - "h": 20 - } - }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 0, - "y": 102, - "w": 20, - "h": 20 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 20, - "y": 102, - "w": 22, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 42, - "y": 103, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 62, - "y": 103, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 82, - "y": 104, - "w": 20, - "h": 20 - } - }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 102, - "y": 104, - "w": 18, - "h": 20 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 120, - "y": 105, - "w": 20, - "h": 20 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 140, - "y": 105, - "w": 23, - "h": 20 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 163, - "y": 105, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 187, - "y": 105, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 211, - "y": 105, - "w": 24, - "h": 20 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 235, - "y": 106, - "w": 23, - "h": 20 - } - }, - { - "filename": "smooth_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 258, - "y": 106, - "w": 20, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 278, - "y": 107, - "w": 24, - "h": 20 - } - }, - { - "filename": "strange_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 302, - "y": 107, - "w": 20, - "h": 20 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 322, - "y": 107, - "w": 22, - "h": 20 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 344, - "y": 107, - "w": 20, - "h": 20 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, "y": 5, - "w": 18, + "w": 27, "h": 22 }, "frame": { - "x": 364, - "y": 107, - "w": 18, + "x": 135, + "y": 0, + "w": 27, "h": 22 } }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 382, - "y": 111, - "w": 23, - "h": 21 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 0, - "y": 122, - "w": 23, - "h": 21 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 23, - "y": 122, - "w": 19, - "h": 21 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 42, - "y": 123, - "w": 23, - "h": 21 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 65, - "y": 124, - "w": 20, - "h": 21 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 85, - "y": 124, - "w": 22, - "h": 21 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 107, - "y": 125, - "w": 21, - "h": 21 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 128, - "y": 125, - "w": 22, - "h": 21 - } - }, { "filename": "mint_atk", "rotated": false, @@ -3321,8 +276,8 @@ "h": 21 }, "frame": { - "x": 150, - "y": 125, + "x": 162, + "y": 0, "w": 28, "h": 21 } @@ -3342,8 +297,8 @@ "h": 21 }, "frame": { - "x": 178, - "y": 125, + "x": 190, + "y": 0, "w": 28, "h": 21 } @@ -3363,8 +318,8 @@ "h": 21 }, "frame": { - "x": 206, - "y": 125, + "x": 218, + "y": 0, "w": 28, "h": 21 } @@ -3384,8 +339,8 @@ "h": 21 }, "frame": { - "x": 234, - "y": 126, + "x": 246, + "y": 0, "w": 28, "h": 21 } @@ -3405,8 +360,8 @@ "h": 21 }, "frame": { - "x": 262, - "y": 127, + "x": 274, + "y": 0, "w": 28, "h": 21 } @@ -3426,56 +381,14 @@ "h": 21 }, "frame": { - "x": 290, - "y": 127, + "x": 302, + "y": 0, "w": 28, "h": 21 } }, { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 318, - "y": 127, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 341, - "y": 127, - "w": 23, - "h": 21 - } - }, - { - "filename": "metronome", + "filename": "exp_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -3484,19 +397,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, + "y": 1, "w": 17, - "h": 22 + "h": 31 }, "frame": { - "x": 364, - "y": 129, + "x": 22, + "y": 89, "w": 17, - "h": 22 + "h": 31 } }, { - "filename": "n_solarizer", + "filename": "golden_exp_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -3504,62 +417,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 381, - "y": 132, - "w": 23, - "h": 21 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 + "x": 7, + "y": 1, + "w": 17, + "h": 31 }, "frame": { "x": 0, - "y": 143, - "w": 21, - "h": 21 + "y": 151, + "w": 17, + "h": 31 } }, { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 21, - "y": 143, - "w": 21, - "h": 21 - } - }, - { - "filename": "spell_tag", + "filename": "super_exp_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -3568,19 +439,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, - "w": 19, - "h": 21 + "y": 1, + "w": 17, + "h": 31 }, "frame": { - "x": 42, - "y": 144, - "w": 19, - "h": 21 + "x": 22, + "y": 120, + "w": 17, + "h": 31 } }, { - "filename": "sweet_apple", + "filename": "black_augurite", "rotated": false, "trimmed": true, "sourceSize": { @@ -3589,19 +460,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 3, "w": 22, - "h": 21 + "h": 25 }, "frame": { - "x": 61, - "y": 145, + "x": 17, + "y": 151, "w": 22, - "h": 21 + "h": 25 } }, { - "filename": "syrupy_apple", + "filename": "prison_bottle", "rotated": false, "trimmed": true, "sourceSize": { @@ -3609,41 +480,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 + "x": 7, + "y": 1, + "w": 17, + "h": 30 }, "frame": { - "x": 83, - "y": 145, - "w": 22, - "h": 21 + "x": 0, + "y": 182, + "w": 17, + "h": 30 } }, { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 105, - "y": 146, - "w": 22, - "h": 21 - } - }, - { - "filename": "wellspring_mask", + "filename": "big_root", "rotated": false, "trimmed": true, "sourceSize": { @@ -3652,19 +502,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 23, - "h": 21 + "h": 24 }, "frame": { - "x": 127, - "y": 146, + "x": 17, + "y": 176, "w": 23, - "h": 21 + "h": 24 } }, { - "filename": "zoom_lens", + "filename": "chipped_pot", "rotated": false, "trimmed": true, "sourceSize": { @@ -3672,20 +522,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 3, "y": 6, - "w": 21, - "h": 21 + "w": 26, + "h": 20 }, "frame": { - "x": 150, - "y": 146, - "w": 21, - "h": 21 + "x": 330, + "y": 0, + "w": 26, + "h": 20 } }, { - "filename": "blank_memory", + "filename": "cracked_pot", "rotated": false, "trimmed": true, "sourceSize": { @@ -3693,20 +543,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 3, + "y": 6, + "w": 26, + "h": 20 }, "frame": { - "x": 171, - "y": 146, - "w": 22, - "h": 22 + "x": 356, + "y": 0, + "w": 26, + "h": 20 } }, { - "filename": "bug_memory", + "filename": "legend_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,20 +564,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 3, + "y": 6, + "w": 25, + "h": 20 }, "frame": { - "x": 193, - "y": 146, - "w": 22, - "h": 22 + "x": 382, + "y": 0, + "w": 25, + "h": 20 } }, { - "filename": "lock_capsule", + "filename": "blank_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,20 +585,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 215, - "y": 146, - "w": 19, - "h": 22 + "x": 0, + "y": 212, + "w": 24, + "h": 24 } }, { - "filename": "charcoal", + "filename": "choice_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -3756,20 +606,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 234, - "y": 147, - "w": 22, - "h": 22 + "x": 0, + "y": 236, + "w": 24, + "h": 24 } }, { - "filename": "dark_memory", + "filename": "draco_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3777,20 +627,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 256, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 260, + "w": 24, + "h": 24 } }, { - "filename": "dire_hit", + "filename": "dread_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,20 +648,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 278, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 284, + "w": 24, + "h": 24 } }, { - "filename": "dna_splicers", + "filename": "earth_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3819,20 +669,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 300, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 308, + "w": 24, + "h": 24 } }, { - "filename": "dragon_memory", + "filename": "fist_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3840,20 +690,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 322, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 332, + "w": 24, + "h": 24 } }, { - "filename": "hard_meteorite", + "filename": "flame_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3861,20 +711,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 344, - "y": 148, - "w": 20, - "h": 22 + "x": 0, + "y": 356, + "w": 24, + "h": 24 } }, { - "filename": "soothe_bell", + "filename": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 0, + "y": 380, + "w": 24, + "h": 24 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 0, + "y": 404, + "w": 15, + "h": 11 + } + }, + { + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -3883,19 +775,838 @@ }, "spriteSourceSize": { "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 51, + "y": 27, + "w": 16, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 67, + "y": 26, + "w": 24, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 91, + "y": 26, + "w": 24, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 115, + "y": 26, + "w": 21, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 136, + "y": 22, + "w": 24, + "h": 24 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 44, + "y": 58, + "w": 16, + "h": 24 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 39, + "y": 89, + "w": 18, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 39, + "y": 113, + "w": 18, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 39, + "y": 137, + "w": 18, + "h": 24 + } + }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 39, + "y": 161, + "w": 24, + "h": 15 + } + }, + { + "filename": "icicle_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 40, + "y": 176, + "w": 24, + "h": 24 + } + }, + { + "filename": "insect_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 200, + "w": 24, + "h": 24 + } + }, + { + "filename": "iron_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 224, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 248, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 272, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 296, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 320, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 344, + "w": 24, + "h": 24 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 368, + "w": 24, + "h": 24 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 24, + "y": 392, + "w": 24, + "h": 23 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 48, + "y": 200, + "w": 16, + "h": 24 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 48, + "y": 224, + "w": 16, + "h": 24 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 48, + "y": 248, + "w": 23, + "h": 24 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 272, + "w": 24, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 296, + "w": 24, + "h": 24 + } + }, + { + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 320, + "w": 24, + "h": 24 + } + }, + { + "filename": "salac_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 344, + "w": 24, + "h": 24 + } + }, + { + "filename": "scanner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 368, + "w": 24, + "h": 24 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 48, + "y": 392, + "w": 24, + "h": 23 + } + }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 136, + "y": 46, + "w": 24, + "h": 14 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, "w": 17, - "h": 22 + "h": 24 }, "frame": { - "x": 364, - "y": 151, + "x": 160, + "y": 22, "w": 17, - "h": 22 + "h": 24 } }, { - "filename": "electirizer", + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 177, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "sky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 201, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "splash_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 225, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 249, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 273, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 297, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 321, + "y": 21, + "w": 18, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 339, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 363, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -3904,19 +1615,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, + "y": 4, "w": 22, - "h": 22 + "h": 24 }, "frame": { - "x": 381, - "y": 153, + "x": 387, + "y": 20, "w": 22, - "h": 22 + "h": 24 } }, { - "filename": "electric_memory", + "filename": "adamant_crystal", "rotated": false, "trimmed": true, "sourceSize": { @@ -3924,100 +1635,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 0, - "y": 164, - "w": 22, - "h": 22 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 22, - "y": 164, - "w": 19, - "h": 22 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 41, - "y": 165, - "w": 20, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 61, - "y": 166, - "w": 22, - "h": 22 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 83, - "y": 166, - "w": 22, - "h": 22 + "x": 160, + "y": 46, + "w": 23, + "h": 21 } }, { @@ -4035,8 +1662,8 @@ "h": 22 }, "frame": { - "x": 105, - "y": 167, + "x": 183, + "y": 45, "w": 24, "h": 22 } @@ -4056,14 +1683,266 @@ "h": 22 }, "frame": { - "x": 129, - "y": 167, + "x": 207, + "y": 45, "w": 24, "h": 22 } }, { - "filename": "fighting_memory", + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 231, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 255, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 279, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 303, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 327, + "y": 45, + "w": 23, + "h": 23 + } + }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 350, + "y": 44, + "w": 23, + "h": 24 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 373, + "y": 44, + "w": 24, + "h": 23 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 397, + "y": 44, + "w": 18, + "h": 24 + } + }, + { + "filename": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 373, + "y": 67, + "w": 24, + "h": 18 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 397, + "y": 68, + "w": 18, + "h": 24 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 67, + "y": 50, + "w": 24, + "h": 18 + } + }, + { + "filename": "icy_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 91, + "y": 50, + "w": 24, + "h": 20 + } + }, + { + "filename": "dragon_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -4073,18 +1952,81 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, + "w": 21, + "h": 23 + }, + "frame": { + "x": 115, + "y": 50, + "w": 21, + "h": 23 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 136, + "y": 60, + "w": 24, + "h": 20 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, "h": 22 }, "frame": { - "x": 153, - "y": 168, - "w": 22, + "x": 160, + "y": 67, + "w": 24, "h": 22 } }, { - "filename": "fire_memory", + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 184, + "y": 67, + "w": 23, + "h": 23 + } + }, + { + "filename": "griseous_core", "rotated": false, "trimmed": true, "sourceSize": { @@ -4094,18 +2036,333 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, + "w": 23, + "h": 23 + }, + "frame": { + "x": 207, + "y": 67, + "w": 23, + "h": 23 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, "h": 22 }, "frame": { - "x": 175, - "y": 168, - "w": 22, + "x": 230, + "y": 68, + "w": 23, "h": 22 } }, { - "filename": "flying_memory", + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 253, + "y": 68, + "w": 23, + "h": 23 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 276, + "y": 68, + "w": 23, + "h": 23 + } + }, + { + "filename": "stick", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 299, + "y": 68, + "w": 23, + "h": 23 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 322, + "y": 68, + "w": 22, + "h": 23 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 344, + "y": 68, + "w": 22, + "h": 23 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 60, + "y": 68, + "w": 24, + "h": 20 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 134, + "w": 22, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 84, + "y": 70, + "w": 24, + "h": 20 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 79, + "y": 90, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 79, + "y": 113, + "w": 22, + "h": 23 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 79, + "y": 136, + "w": 23, + "h": 21 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 63, + "y": 157, + "w": 23, + "h": 19 + } + }, + { + "filename": "fire_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4116,13 +2373,139 @@ "x": 5, "y": 5, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 197, - "y": 168, + "x": 64, + "y": 176, "w": 22, - "h": 22 + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 64, + "y": 199, + "w": 22, + "h": 23 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 64, + "y": 222, + "w": 22, + "h": 23 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 86, + "y": 157, + "w": 17, + "h": 24 + } + }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 86, + "y": 181, + "w": 21, + "h": 24 + } + }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 86, + "y": 205, + "w": 21, + "h": 24 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 86, + "y": 229, + "w": 23, + "h": 21 } }, { @@ -4140,14 +2523,329 @@ "h": 23 }, "frame": { - "x": 219, - "y": 168, + "x": 71, + "y": 245, "w": 15, "h": 23 } }, { - "filename": "ganlon_berry", + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 86, + "y": 250, + "w": 23, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 108, + "y": 73, + "w": 24, + "h": 20 + } + }, + { + "filename": "focus_sash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 101, + "y": 93, + "w": 22, + "h": 23 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 101, + "y": 116, + "w": 22, + "h": 20 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 102, + "y": 136, + "w": 22, + "h": 21 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 103, + "y": 157, + "w": 20, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 107, + "y": 181, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 107, + "y": 205, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 109, + "y": 229, + "w": 16, + "h": 24 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 109, + "y": 253, + "w": 19, + "h": 20 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 123, + "y": 93, + "w": 16, + "h": 24 + } + }, + { + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 139, + "y": 80, + "w": 21, + "h": 23 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 160, + "y": 89, + "w": 24, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 184, + "y": 90, + "w": 24, + "h": 20 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 208, + "y": 90, + "w": 23, + "h": 21 + } + }, + { + "filename": "blank_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4161,14 +2859,14 @@ "h": 22 }, "frame": { - "x": 234, - "y": 169, + "x": 231, + "y": 90, "w": 22, "h": 22 } }, { - "filename": "ghost_memory", + "filename": "n_lunarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,20 +2874,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 256, - "y": 170, - "w": 22, - "h": 22 + "x": 253, + "y": 91, + "w": 23, + "h": 21 } }, { - "filename": "grass_memory", + "filename": "n_solarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4197,20 +2895,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 278, - "y": 170, - "w": 22, - "h": 22 + "x": 276, + "y": 91, + "w": 23, + "h": 21 } }, { - "filename": "ground_memory", + "filename": "rusted_sword", "rotated": false, "trimmed": true, "sourceSize": { @@ -4218,20 +2916,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, + "w": 23, "h": 22 }, "frame": { - "x": 300, - "y": 170, - "w": 22, + "x": 299, + "y": 91, + "w": 23, "h": 22 } }, { - "filename": "guard_spec", + "filename": "bug_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4246,8 +2944,890 @@ }, "frame": { "x": 322, + "y": 91, + "w": 22, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 344, + "y": 91, + "w": 22, + "h": 22 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 139, + "y": 103, + "w": 21, + "h": 21 + } + }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 123, + "y": 117, + "w": 16, + "h": 18 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 160, + "y": 109, + "w": 23, + "h": 17 + } + }, + { + "filename": "burn_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 183, + "y": 110, + "w": 23, + "h": 17 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 366, + "y": 85, + "w": 22, + "h": 23 + } + }, + { + "filename": "chill_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 206, + "y": 111, + "w": 23, + "h": 17 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 229, + "y": 112, + "w": 23, + "h": 17 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 252, + "y": 112, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 275, + "y": 112, + "w": 23, + "h": 19 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 298, + "y": 113, + "w": 23, + "h": 19 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 321, + "y": 113, + "w": 23, + "h": 20 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 344, + "y": 113, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 366, + "y": 108, + "w": 22, + "h": 23 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 124, + "y": 135, + "w": 18, + "h": 22 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 123, + "y": 157, + "w": 22, + "h": 23 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 123, + "y": 180, + "w": 22, + "h": 23 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 123, + "y": 203, + "w": 22, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 125, + "y": 226, + "w": 21, + "h": 23 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 128, + "y": 249, + "w": 20, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 388, + "y": 92, + "w": 22, + "h": 23 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 388, + "y": 115, + "w": 22, + "h": 19 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 142, + "y": 124, + "w": 18, + "h": 23 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 160, + "y": 126, + "w": 23, + "h": 21 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 183, + "y": 127, + "w": 23, + "h": 20 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 206, + "y": 128, + "w": 23, + "h": 18 + } + }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 229, + "y": 129, + "w": 23, + "h": 17 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 252, + "y": 131, + "w": 23, + "h": 17 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 132, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 133, + "w": 22, + "h": 22 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 341, + "y": 135, + "w": 22, + "h": 22 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 145, + "y": 147, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 167, + "y": 147, + "w": 22, + "h": 23 + } + }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 145, "y": 170, "w": 22, + "h": 23 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 145, + "y": 193, + "w": 22, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 167, + "y": 170, + "w": 22, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 167, + "y": 193, + "w": 22, + "h": 23 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 189, + "y": 147, + "w": 17, + "h": 24 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 206, + "y": 146, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 228, + "y": 146, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 148, + "w": 22, "h": 22 } }, @@ -4266,14 +3846,14 @@ "h": 23 }, "frame": { - "x": 344, - "y": 170, + "x": 189, + "y": 171, "w": 17, "h": 23 } }, { - "filename": "mystic_water", + "filename": "wide_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -4281,20 +3861,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, + "x": 5, + "y": 4, + "w": 22, "h": 23 }, "frame": { - "x": 361, - "y": 173, - "w": 20, + "x": 206, + "y": 169, + "w": 22, "h": 23 } }, { - "filename": "healing_charm", + "filename": "enigma_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -4304,13 +3884,265 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 23, + "w": 22, "h": 22 }, "frame": { - "x": 381, + "x": 228, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 154, + "w": 22, + "h": 22 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 272, "y": 175, - "w": 23, + "w": 22, + "h": 19 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 294, + "y": 176, + "w": 22, + "h": 20 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 157, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 179, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 189, + "y": 194, + "w": 22, + "h": 22 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 211, + "y": 192, + "w": 17, + "h": 23 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 191, + "w": 22, "h": 22 } }, @@ -4328,237 +4160,6 @@ "w": 22, "h": 22 }, - "frame": { - "x": 0, - "y": 186, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 22, - "y": 187, - "w": 22, - "h": 22 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 44, - "y": 188, - "w": 22, - "h": 22 - } - }, - { - "filename": "map", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 27, - "h": 22 - }, - "frame": { - "x": 66, - "y": 188, - "w": 27, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 93, - "y": 189, - "w": 22, - "h": 22 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 115, - "y": 189, - "w": 24, - "h": 22 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 139, - "y": 190, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 161, - "y": 190, - "w": 22, - "h": 22 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 183, - "y": 190, - "w": 22, - "h": 22 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 205, - "y": 191, - "w": 22, - "h": 22 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 227, - "y": 191, - "w": 23, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, "frame": { "x": 250, "y": 192, @@ -4567,7 +4168,7 @@ } }, { - "filename": "scroll_of_waters", + "filename": "ice_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4582,7 +4183,238 @@ }, "frame": { "x": 272, - "y": 192, + "y": 194, + "w": 22, + "h": 22 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 294, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 199, + "w": 22, + "h": 22 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 338, + "y": 201, + "w": 22, + "h": 20 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 146, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 168, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 190, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 212, + "y": 215, + "w": 16, + "h": 24 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 213, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 217, "w": 22, "h": 22 } @@ -4602,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 294, - "y": 192, + "x": 316, + "y": 221, "w": 22, "h": 22 } @@ -4623,12 +4455,33 @@ "h": 22 }, "frame": { - "x": 316, - "y": 192, + "x": 338, + "y": 221, "w": 22, "h": 22 } }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 148, + "y": 238, + "w": 21, + "h": 23 + } + }, { "filename": "steel_memory", "rotated": false, @@ -4644,14 +4497,77 @@ "h": 22 }, "frame": { - "x": 338, - "y": 193, + "x": 169, + "y": 238, "w": 22, "h": 22 } }, { - "filename": "dragon_fang", + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 191, + "y": 238, + "w": 21, + "h": 23 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 212, + "y": 239, + "w": 20, + "h": 22 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 232, + "y": 235, + "w": 17, + "h": 23 + } + }, + { + "filename": "thick_club", "rotated": false, "trimmed": true, "sourceSize": { @@ -4661,14 +4577,77 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 21, - "h": 23 + "w": 22, + "h": 22 }, "frame": { - "x": 360, - "y": 196, - "w": 21, - "h": 23 + "x": 249, + "y": 236, + "w": 22, + "h": 22 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 271, + "y": 238, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 293, + "y": 239, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 315, + "y": 243, + "w": 22, + "h": 21 } }, { @@ -4686,12 +4665,54 @@ "h": 22 }, "frame": { - "x": 381, - "y": 197, + "x": 337, + "y": 243, "w": 22, "h": 22 } }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 148, + "y": 261, + "w": 21, + "h": 18 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 169, + "y": 260, + "w": 22, + "h": 20 + } + }, { "filename": "tm_bug", "rotated": false, @@ -4707,12 +4728,33 @@ "h": 22 }, "frame": { - "x": 0, - "y": 208, + "x": 191, + "y": 261, "w": 22, "h": 22 } }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 213, + "y": 261, + "w": 19, + "h": 22 + } + }, { "filename": "tm_dark", "rotated": false, @@ -4728,12 +4770,33 @@ "h": 22 }, "frame": { - "x": 22, - "y": 209, + "x": 232, + "y": 258, "w": 22, "h": 22 } }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 254, + "y": 258, + "w": 17, + "h": 22 + } + }, { "filename": "tm_dragon", "rotated": false, @@ -4749,8 +4812,8 @@ "h": 22 }, "frame": { - "x": 44, - "y": 210, + "x": 271, + "y": 259, "w": 22, "h": 22 } @@ -4770,8 +4833,8 @@ "h": 22 }, "frame": { - "x": 66, - "y": 210, + "x": 293, + "y": 260, "w": 22, "h": 22 } @@ -4791,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 88, - "y": 211, + "x": 315, + "y": 264, "w": 22, "h": 22 } @@ -4812,8 +4875,8 @@ "h": 22 }, "frame": { - "x": 110, - "y": 211, + "x": 337, + "y": 265, "w": 22, "h": 22 } @@ -4833,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 132, - "y": 212, + "x": 366, + "y": 131, "w": 22, "h": 22 } @@ -4854,12 +4917,54 @@ "h": 22 }, "frame": { - "x": 154, - "y": 212, + "x": 388, + "y": 134, "w": 22, "h": 22 } }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 128, + "y": 272, + "w": 20, + "h": 20 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 148, + "y": 279, + "w": 21, + "h": 19 + } + }, { "filename": "tm_ghost", "rotated": false, @@ -4875,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 176, - "y": 212, + "x": 169, + "y": 280, "w": 22, "h": 22 } @@ -4896,12 +5001,33 @@ "h": 22 }, "frame": { - "x": 198, - "y": 213, + "x": 191, + "y": 283, "w": 22, "h": 22 } }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 213, + "y": 283, + "w": 19, + "h": 22 + } + }, { "filename": "tm_ground", "rotated": false, @@ -4917,12 +5043,33 @@ "h": 22 }, "frame": { - "x": 220, - "y": 213, + "x": 232, + "y": 280, "w": 22, "h": 22 } }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 254, + "y": 280, + "w": 17, + "h": 22 + } + }, { "filename": "tm_ice", "rotated": false, @@ -4938,8 +5085,8 @@ "h": 22 }, "frame": { - "x": 242, - "y": 214, + "x": 271, + "y": 281, "w": 22, "h": 22 } @@ -4959,8 +5106,8 @@ "h": 22 }, "frame": { - "x": 264, - "y": 214, + "x": 293, + "y": 282, "w": 22, "h": 22 } @@ -4980,8 +5127,8 @@ "h": 22 }, "frame": { - "x": 286, - "y": 214, + "x": 315, + "y": 286, "w": 22, "h": 22 } @@ -5001,8 +5148,8 @@ "h": 22 }, "frame": { - "x": 308, - "y": 214, + "x": 337, + "y": 287, "w": 22, "h": 22 } @@ -5022,8 +5169,8 @@ "h": 22 }, "frame": { - "x": 330, - "y": 215, + "x": 72, + "y": 270, "w": 22, "h": 22 } @@ -5043,8 +5190,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 219, + "x": 72, + "y": 292, "w": 22, "h": 22 } @@ -5064,33 +5211,12 @@ "h": 22 }, "frame": { - "x": 374, - "y": 219, + "x": 72, + "y": 314, "w": 22, "h": 22 } }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 396, - "y": 219, - "w": 17, - "h": 23 - } - }, { "filename": "water_memory", "rotated": false, @@ -5106,8 +5232,8 @@ "h": 22 }, "frame": { - "x": 0, - "y": 230, + "x": 72, + "y": 336, "w": 22, "h": 22 } @@ -5127,8 +5253,8 @@ "h": 22 }, "frame": { - "x": 22, - "y": 231, + "x": 72, + "y": 358, "w": 22, "h": 22 } @@ -5148,12 +5274,54 @@ "h": 22 }, "frame": { - "x": 44, - "y": 232, + "x": 72, + "y": 380, "w": 22, "h": 22 } }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 94, + "y": 270, + "w": 15, + "h": 22 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 109, + "y": 273, + "w": 19, + "h": 19 + } + }, { "filename": "x_attack", "rotated": false, @@ -5169,8 +5337,8 @@ "h": 22 }, "frame": { - "x": 66, - "y": 232, + "x": 94, + "y": 292, "w": 22, "h": 22 } @@ -5190,8 +5358,8 @@ "h": 22 }, "frame": { - "x": 88, - "y": 233, + "x": 116, + "y": 292, "w": 22, "h": 22 } @@ -5211,8 +5379,8 @@ "h": 22 }, "frame": { - "x": 110, - "y": 233, + "x": 94, + "y": 314, "w": 22, "h": 22 } @@ -5232,8 +5400,8 @@ "h": 22 }, "frame": { - "x": 132, - "y": 234, + "x": 94, + "y": 336, "w": 22, "h": 22 } @@ -5253,14 +5421,14 @@ "h": 22 }, "frame": { - "x": 154, - "y": 234, + "x": 116, + "y": 314, "w": 22, "h": 22 } }, { - "filename": "black_belt", + "filename": "poison_barb", "rotated": false, "trimmed": true, "sourceSize": { @@ -5269,292 +5437,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 176, - "y": 234, - "w": 22, - "h": 23 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 198, - "y": 235, - "w": 23, - "h": 23 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, + "y": 6, "w": 21, - "h": 23 + "h": 21 }, "frame": { - "x": 221, - "y": 235, + "x": 94, + "y": 358, "w": 21, - "h": 23 + "h": 21 } }, { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 242, - "y": 236, - "w": 22, - "h": 23 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 264, - "y": 236, - "w": 24, - "h": 23 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 288, - "y": 236, - "w": 24, - "h": 23 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 312, - "y": 236, - "w": 18, - "h": 23 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 330, - "y": 237, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 352, - "y": 241, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 374, - "y": 241, - "w": 22, - "h": 23 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 396, - "y": 242, - "w": 17, - "h": 23 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 0, - "y": 252, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 22, - "y": 253, - "w": 22, - "h": 23 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 44, - "y": 254, - "w": 23, - "h": 23 - } - }, - { - "filename": "leaf_stone", + "filename": "shiny_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5563,19 +5458,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, + "y": 6, "w": 21, - "h": 23 + "h": 21 }, "frame": { - "x": 67, - "y": 254, + "x": 116, + "y": 336, "w": 21, - "h": 23 + "h": 21 } }, { - "filename": "expert_belt", + "filename": "sitrus_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5583,41 +5478,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 + "x": 6, + "y": 5, + "w": 20, + "h": 22 }, "frame": { - "x": 88, - "y": 255, - "w": 24, - "h": 23 + "x": 94, + "y": 379, + "w": 20, + "h": 22 } }, { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 112, - "y": 255, - "w": 16, - "h": 24 - } - }, - { - "filename": "fire_stone", + "filename": "zoom_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -5626,1447 +5500,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 128, - "y": 256, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 150, - "y": 256, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 172, - "y": 257, - "w": 22, - "h": 23 - } - }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 194, - "y": 258, - "w": 22, - "h": 23 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 216, - "y": 258, - "w": 22, - "h": 23 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 238, - "y": 259, - "w": 22, - "h": 23 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 260, - "y": 259, - "w": 23, - "h": 23 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 283, - "y": 259, - "w": 22, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 305, - "y": 259, - "w": 24, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 329, - "y": 260, - "w": 22, - "h": 23 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 351, - "y": 264, - "w": 24, - "h": 23 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, + "y": 6, "w": 21, - "h": 23 + "h": 21 }, "frame": { - "x": 375, - "y": 264, - "w": 21, - "h": 23 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 396, - "y": 265, - "w": 16, - "h": 24 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 0, - "y": 275, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 22, - "y": 276, - "w": 22, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 44, - "y": 277, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 66, - "y": 277, - "w": 22, - "h": 23 - } - }, - { - "filename": "psychic_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 88, - "y": 278, - "w": 22, - "h": 23 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 110, - "y": 279, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 133, - "y": 279, - "w": 23, - "h": 23 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 156, - "y": 279, - "w": 16, - "h": 24 - } - }, - { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 172, - "y": 280, - "w": 22, - "h": 23 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 194, - "y": 281, - "w": 22, - "h": 23 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 216, - "y": 281, - "w": 22, - "h": 23 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 238, - "y": 282, - "w": 24, - "h": 23 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 262, - "y": 282, - "w": 22, - "h": 23 - } - }, - { - "filename": "stick", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 284, - "y": 282, - "w": 23, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 307, - "y": 282, - "w": 22, - "h": 23 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 329, - "y": 283, - "w": 21, - "h": 23 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 350, - "y": 287, - "w": 24, - "h": 23 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 374, - "y": 287, - "w": 22, - "h": 23 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 396, - "y": 289, - "w": 18, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 0, + "x": 138, "y": 298, "w": 21, - "h": 24 + "h": 21 } }, { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 21, - "y": 299, - "w": 23, - "h": 24 - } - }, - { - "filename": "blank_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 300, - "w": 24, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 68, - "y": 300, - "w": 18, - "h": 24 - } - }, - { - "filename": "choice_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 86, - "y": 301, - "w": 24, - "h": 24 - } - }, - { - "filename": "draco_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 110, - "y": 302, - "w": 24, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 134, - "y": 302, - "w": 18, - "h": 24 - } - }, - { - "filename": "dread_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 152, - "y": 303, - "w": 24, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 176, - "y": 303, - "w": 16, - "h": 24 - } - }, - { - "filename": "earth_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 192, - "y": 304, - "w": 24, - "h": 24 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 216, - "y": 304, - "w": 17, - "h": 24 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 233, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "flame_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 257, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 281, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 305, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 329, - "y": 306, - "w": 18, - "h": 24 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 347, - "y": 310, - "w": 24, - "h": 24 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 371, - "y": 310, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 395, - "y": 313, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 0, - "y": 322, - "w": 17, - "h": 24 - } - }, - { - "filename": "icicle_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 17, - "y": 323, - "w": 24, - "h": 24 - } - }, - { - "filename": "insect_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 41, - "y": 324, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 65, - "y": 324, - "w": 18, - "h": 24 - } - }, - { - "filename": "iron_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 83, - "y": 325, - "w": 24, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 107, - "y": 326, - "w": 23, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 130, - "y": 326, - "w": 16, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 146, - "y": 327, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 170, - "y": 327, - "w": 22, - "h": 24 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 192, - "y": 328, - "w": 24, - "h": 24 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 216, - "y": 328, - "w": 16, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 232, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_ultra", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 256, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 280, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "meadow_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 304, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 328, - "y": 330, - "w": 16, - "h": 24 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 344, - "y": 334, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 368, - "y": 334, - "w": 24, - "h": 24 - } - }, - { - "filename": "oval_charm", + "filename": "sharp_meteorite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7075,61 +5521,40 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, + "y": 8, "w": 21, - "h": 24 + "h": 18 }, "frame": { - "x": 392, + "x": 138, + "y": 319, + "w": 21, + "h": 18 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 137, "y": 337, - "w": 21, - "h": 24 + "w": 22, + "h": 19 } }, { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 0, - "y": 346, - "w": 16, - "h": 24 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 16, - "y": 347, - "w": 24, - "h": 24 - } - }, - { - "filename": "red_orb", + "filename": "dawn_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -7138,82 +5563,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, + "y": 6, "w": 20, - "h": 24 + "h": 21 }, "frame": { - "x": 40, - "y": 348, + "x": 159, + "y": 302, "w": 20, - "h": 24 + "h": 21 } }, { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 60, - "y": 348, - "w": 16, - "h": 24 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 76, - "y": 349, - "w": 23, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 99, - "y": 350, - "w": 24, - "h": 24 - } - }, - { - "filename": "shiny_charm", + "filename": "blue_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7222,19 +5584,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, - "w": 21, - "h": 24 + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 123, - "y": 350, - "w": 21, - "h": 24 + "x": 159, + "y": 323, + "w": 20, + "h": 20 } }, { - "filename": "scanner", + "filename": "everstone", "rotated": false, "trimmed": true, "sourceSize": { @@ -7242,20 +5604,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 6, + "y": 8, + "w": 20, + "h": 17 }, "frame": { - "x": 144, - "y": 351, - "w": 24, - "h": 24 + "x": 159, + "y": 343, + "w": 20, + "h": 17 } }, { - "filename": "silk_scarf", + "filename": "revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -7263,37 +5625,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 10, + "y": 8, + "w": 12, + "h": 17 }, "frame": { - "x": 168, - "y": 351, - "w": 24, - "h": 24 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 192, - "y": 352, - "w": 24, - "h": 24 + "x": 179, + "y": 302, + "w": 12, + "h": 17 } }, { @@ -7311,14 +5652,14 @@ "h": 24 }, "frame": { - "x": 216, - "y": 352, + "x": 179, + "y": 319, "w": 16, "h": 24 } }, { - "filename": "splash_plate", + "filename": "candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -7326,79 +5667,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 7, + "y": 11, + "w": 18, + "h": 18 }, "frame": { - "x": 232, - "y": 353, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 256, - "y": 353, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 280, - "y": 353, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 304, - "y": 353, - "w": 24, - "h": 24 + "x": 179, + "y": 343, + "w": 18, + "h": 18 } }, { @@ -7416,75 +5694,12 @@ "h": 24 }, "frame": { - "x": 328, - "y": 354, + "x": 360, + "y": 157, "w": 16, "h": 24 } }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 344, - "y": 358, - "w": 17, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 361, - "y": 358, - "w": 24, - "h": 24 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 385, - "y": 361, - "w": 24, - "h": 24 - } - }, { "filename": "zinc", "rotated": false, @@ -7500,14 +5715,14 @@ "h": 24 }, "frame": { - "x": 0, - "y": 370, + "x": 360, + "y": 181, "w": 16, "h": 24 } }, { - "filename": "black_augurite", + "filename": "quick_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -7515,20 +5730,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 22, - "h": 25 + "x": 6, + "y": 6, + "w": 19, + "h": 21 }, "frame": { - "x": 16, - "y": 371, - "w": 22, - "h": 25 + "x": 360, + "y": 205, + "w": 19, + "h": 21 } }, { - "filename": "ability_charm", + "filename": "candy_jar", "rotated": false, "trimmed": true, "sourceSize": { @@ -7536,20 +5751,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 23, - "h": 26 + "x": 6, + "y": 6, + "w": 19, + "h": 20 }, "frame": { - "x": 38, - "y": 372, - "w": 23, - "h": 26 + "x": 360, + "y": 226, + "w": 19, + "h": 20 } }, { - "filename": "cornerstone_mask", + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7557,20 +5772,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 24, - "h": 26 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 61, - "y": 373, - "w": 24, - "h": 26 + "x": 359, + "y": 246, + "w": 20, + "h": 20 } }, { - "filename": "linking_cord", + "filename": "magnet", "rotated": false, "trimmed": true, "sourceSize": { @@ -7578,20 +5793,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 27, - "h": 26 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 85, - "y": 374, - "w": 27, - "h": 26 + "x": 359, + "y": 266, + "w": 20, + "h": 20 } }, { - "filename": "galarica_wreath", + "filename": "mb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7599,20 +5814,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 32, - "h": 27 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 112, - "y": 374, - "w": 32, - "h": 27 + "x": 359, + "y": 286, + "w": 20, + "h": 20 } }, { - "filename": "max_mushrooms", + "filename": "pb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7620,20 +5835,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 29, - "h": 28 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 144, - "y": 375, - "w": 29, - "h": 28 + "x": 376, + "y": 156, + "w": 20, + "h": 20 } }, { - "filename": "prison_bottle", + "filename": "spell_tag", "rotated": false, "trimmed": true, "sourceSize": { @@ -7642,19 +5857,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 1, - "w": 17, - "h": 30 + "y": 6, + "w": 19, + "h": 21 }, "frame": { - "x": 173, - "y": 375, - "w": 17, - "h": 30 + "x": 396, + "y": 156, + "w": 19, + "h": 21 } }, { - "filename": "galarica_cuff", + "filename": "pb_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -7662,20 +5877,1091 @@ "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 29, - "h": 30 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 190, + "x": 376, + "y": 176, + "w": 20, + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 396, + "y": 177, + "w": 19, + "h": 20 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 379, + "y": 196, + "w": 17, + "h": 20 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 396, + "y": 197, + "w": 19, + "h": 19 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 216, + "w": 20, + "h": 20 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 216, + "w": 16, + "h": 16 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 236, + "w": 20, + "h": 20 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 232, + "w": 16, + "h": 16 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 248, + "w": 16, + "h": 16 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 256, + "w": 20, + "h": 20 + } + }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 264, + "w": 16, + "h": 16 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 276, + "w": 20, + "h": 20 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 280, + "w": 16, + "h": 16 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 379, + "y": 296, + "w": 21, + "h": 18 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 400, + "y": 296, + "w": 15, + "h": 15 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 400, + "y": 311, + "w": 15, + "h": 15 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 359, + "y": 306, + "w": 20, + "h": 19 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 379, + "y": 314, + "w": 20, + "h": 16 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 326, + "w": 16, + "h": 16 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 195, + "y": 305, + "w": 20, + "h": 19 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 195, + "y": 324, + "w": 18, + "h": 19 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 215, + "y": 305, + "w": 17, + "h": 20 + } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 232, + "y": 302, + "w": 18, + "h": 20 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 250, + "y": 302, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 270, + "y": 303, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 213, + "y": 325, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 197, + "y": 343, + "w": 20, + "h": 18 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 217, + "y": 343, + "w": 18, + "h": 18 + } + }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 290, + "y": 304, + "w": 20, + "h": 18 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 233, + "y": 322, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 251, + "y": 320, + "w": 18, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 321, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, + "y": 322, + "w": 20, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 235, + "y": 340, + "w": 18, + "h": 18 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 253, + "y": 338, + "w": 16, + "h": 16 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 339, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, + "y": 340, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 310, + "y": 308, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 309, + "y": 326, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 309, + "y": 344, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ice_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 330, + "y": 309, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_drop", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 327, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 345, + "w": 20, + "h": 18 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 253, + "y": 354, + "w": 16, + "h": 16 + } + }, + { + "filename": "wl_max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 357, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, + "y": 358, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 309, + "y": 362, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 363, + "w": 20, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 235, + "y": 358, + "w": 18, + "h": 18 + } + }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 253, + "y": 370, + "w": 16, + "h": 16 + } + }, + { + "filename": "wl_paralyze_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 375, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, "y": 376, - "w": 29, - "h": 30 + "w": 20, + "h": 18 } }, { - "filename": "bronze_ribbon", + "filename": "wl_reset_urge", "rotated": false, "trimmed": true, "sourceSize": { @@ -7683,20 +6969,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 6, + "y": 8, + "w": 20, + "h": 18 }, "frame": { - "x": 219, - "y": 377, - "w": 22, - "h": 31 + "x": 309, + "y": 380, + "w": 20, + "h": 18 } }, { - "filename": "exp_charm", + "filename": "wl_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 381, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 116, + "y": 357, + "w": 20, + "h": 18 + } + }, + { + "filename": "relic_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -7705,19 +7033,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 1, + "y": 9, "w": 17, - "h": 31 + "h": 16 }, "frame": { - "x": 241, - "y": 377, + "x": 115, + "y": 375, "w": 17, - "h": 31 + "h": 16 } }, { - "filename": "golden_exp_charm", + "filename": "beedrillite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7725,20 +7053,209 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 114, + "y": 391, + "w": 16, + "h": 16 + } + }, + { + "filename": "blastoisinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 130, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "blazikenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 146, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "cameruptite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 162, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "charizardite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 178, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "charizardite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 194, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "diancite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 210, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "galladite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 226, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "garchompite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 242, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "gardevoirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { "x": 258, - "y": 377, - "w": 17, - "h": 31 + "y": 399, + "w": 16, + "h": 16 } }, { - "filename": "great_ribbon", + "filename": "gengarite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7746,20 +7263,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 275, - "y": 377, - "w": 22, - "h": 31 + "x": 274, + "y": 399, + "w": 16, + "h": 16 } }, { - "filename": "master_ribbon", + "filename": "glalitite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7767,20 +7284,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 297, - "y": 377, - "w": 22, - "h": 31 + "x": 290, + "y": 399, + "w": 16, + "h": 16 } }, { - "filename": "rogue_ribbon", + "filename": "gyaradosite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7788,58 +7305,646 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 319, + "x": 306, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "heracronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 322, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "houndoominite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 338, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "kangaskhanite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 132, + "y": 375, + "w": 16, + "h": 16 + } + }, + { + "filename": "candy_overlay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 136, + "y": 360, + "w": 16, + "h": 15 + } + }, + { + "filename": "latiasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 152, + "y": 360, + "w": 16, + "h": 16 + } + }, + { + "filename": "latiosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 148, + "y": 376, + "w": 16, + "h": 16 + } + }, + { + "filename": "lopunnite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 168, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "lucarionite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 184, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "manectite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 200, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "mawilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 216, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "medichamite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 164, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "metagrossite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 180, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 196, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 212, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 228, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "pidgeotite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 327, + "w": 16, + "h": 16 + } + }, + { + "filename": "pinsirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 343, + "w": 16, + "h": 16 + } + }, + { + "filename": "rayquazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 359, + "w": 16, + "h": 16 + } + }, + { + "filename": "sablenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 375, + "w": 16, + "h": 16 + } + }, + { + "filename": "salamencite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 354, + "y": 391, + "w": 16, + "h": 16 + } + }, + { + "filename": "sceptilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 365, + "y": 330, + "w": 16, + "h": 16 + } + }, + { + "filename": "scizorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 381, + "y": 330, + "w": 16, + "h": 16 + } + }, + { + "filename": "sharpedonite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 365, + "y": 346, + "w": 16, + "h": 16 + } + }, + { + "filename": "slowbronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 365, + "y": 362, + "w": 16, + "h": 16 + } + }, + { + "filename": "soul_dew", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 381, + "y": 346, + "w": 16, + "h": 16 + } + }, + { + "filename": "steelixite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 381, + "y": 362, + "w": 16, + "h": 16 + } + }, + { + "filename": "strawberry_sweet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 16, + "h": 16 + }, + "frame": { + "x": 397, + "y": 342, + "w": 16, + "h": 16 + } + }, + { + "filename": "swampertite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 397, + "y": 358, + "w": 16, + "h": 16 + } + }, + { + "filename": "tyranitarite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 397, + "y": 374, + "w": 16, + "h": 16 + } + }, + { + "filename": "venusaurite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 370, "y": 378, - "w": 22, - "h": 31 - } - }, - { - "filename": "super_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 341, - "y": 382, - "w": 17, - "h": 31 - } - }, - { - "filename": "ultra_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 358, - "y": 382, - "w": 22, - "h": 31 + "w": 16, + "h": 16 } } ] @@ -7848,6 +7953,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b516eabbda93be0375a8d45471c54e6c:5bf73f118de19726fc5d5a538ddc6f22:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:60db8f4653a650759cd9189e91c38a40:439307cbef9c000f6c45603b2d82d107:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 51d692b1c73..6d9434d0454 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/eviolite.png b/public/images/items/eviolite.png new file mode 100644 index 00000000000..8eb195ece2a Binary files /dev/null and b/public/images/items/eviolite.png differ diff --git a/public/images/items/light_ball.png b/public/images/items/light_ball.png new file mode 100644 index 00000000000..cd421446608 Binary files /dev/null and b/public/images/items/light_ball.png differ diff --git a/public/images/items/metal_powder.png b/public/images/items/metal_powder.png new file mode 100644 index 00000000000..11c3a39314c Binary files /dev/null and b/public/images/items/metal_powder.png differ diff --git a/public/images/items/quick_powder.png b/public/images/items/quick_powder.png new file mode 100644 index 00000000000..c73ec09eb05 Binary files /dev/null and b/public/images/items/quick_powder.png differ diff --git a/public/images/items/thick_club.png b/public/images/items/thick_club.png new file mode 100644 index 00000000000..a4459aa7701 Binary files /dev/null and b/public/images/items/thick_club.png differ diff --git a/public/images/pokemon/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/431.json b/public/images/pokemon/431.json index 532fee12a28..53197576127 100644 --- a/public/images/pokemon/431.json +++ b/public/images/pokemon/431.json @@ -4,1206 +4,51 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 417, + "h": 417 }, "scale": 1, "frames": [ { - "filename": "0011.png", + "filename": "0072.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 54, - "h": 48 + "y": 10, + "w": 72, + "h": 57 }, "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 + "w": 72, + "h": 57 } }, { - "filename": "0049.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { @@ -1212,229 +57,229 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { - "filename": "0028.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0072.png", + "filename": "0074.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0039.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0102.png", + "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0040.png", + "filename": "0087.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 2, + "w": 58, + "h": 65 + }, + "frame": { + "x": 1, + "y": 256, + "w": 58, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 1, + "y": 323, + "w": 55, + "h": 65 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 62, + "h": 61 + }, + "frame": { + "x": 75, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 62, + "h": 61 } }, { - "filename": "0084.png", + "filename": "0085.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 5, + "w": 57, + "h": 62 + }, + "frame": { + "x": 139, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 57, + "h": 62 } }, { - "filename": "0107.png", + "filename": "0086.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 57, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 139, + "y": 1, + "w": 57, + "h": 62 } }, { - "filename": "0108.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 54, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 198, + "y": 1, + "w": 54, + "h": 62 } }, { @@ -1443,19 +288,1006 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 8, "w": 56, - "h": 55 + "h": 59 }, "frame": { - "x": 267, - "y": 208, + "x": 254, + "y": 1, "w": 56, - "h": 55 + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 15, + "w": 46, + "h": 52 + }, + "frame": { + "x": 370, + "y": 1, + "w": 46, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 298, + "y": 62, + "w": 56, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 51, + "h": 58 + }, + "frame": { + "x": 356, + "y": 122, + "w": 51, + "h": 58 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 52, + "h": 58 + }, + "frame": { + "x": 61, + "y": 187, + "w": 52, + "h": 58 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 } }, { @@ -1464,101 +1296,248 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 53, + "h": 56 + }, + "frame": { + "x": 231, + "y": 188, + "w": 53, + "h": 56 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0022.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0023.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0043.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0044.png", + "filename": "0094.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } @@ -1569,502 +1548,124 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0065.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0066.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0067.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0087.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0088.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 + "x": 111, + "y": 362, + "w": 55, + "h": 53 } }, { @@ -2073,711 +1674,438 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 111, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 280, - "y": 263, + "x": 286, + "y": 188, "w": 56, "h": 55 } }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 286, + "y": 188, + "w": 56, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, { "filename": "0042.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, + "y": 360, + "w": 48, "h": 55 } }, { - "filename": "0085.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, - "h": 55 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, + "y": 360, + "w": 48, "h": 55 } } @@ -2787,6 +2115,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a9e29c91fa37ffaea686ff7357e6ad1e:1cbeeb823df6c103f770105557067022:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:d8465d4aec9ba28092cd923067d60408:7d16f4c01fa5addbf3868ea484affc7a:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/431.png b/public/images/pokemon/431.png index 45fca814c3f..e56ee99b0a2 100644 Binary files a/public/images/pokemon/431.png and b/public/images/pokemon/431.png differ diff --git a/public/images/pokemon/678ms.png b/public/images/pokemon/678ms.png deleted file mode 100644 index d2b6f348a0b..00000000000 Binary files a/public/images/pokemon/678ms.png and /dev/null differ diff --git a/public/images/pokemon/678msb.json b/public/images/pokemon/678msb.json deleted file mode 100644 index 78125f1c5ee..00000000000 --- a/public/images/pokemon/678msb.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "678msb.png", - "format": "RGBA8888", - "size": { - "w": 55, - "h": 55 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 46, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:979291307687f1a4af47bc4d29542ccf:f61247ececc23f282bb95c5bfe49e179:bbcc2663448733722c64bc1ebafbf9c6$" - } -} diff --git a/public/images/pokemon/678msb.png b/public/images/pokemon/678msb.png deleted file mode 100644 index c32e3064451..00000000000 Binary files a/public/images/pokemon/678msb.png and /dev/null differ diff --git a/public/images/pokemon/778-busted.png b/public/images/pokemon/778-busted.png index 689da764398..dbc478381cd 100644 Binary files a/public/images/pokemon/778-busted.png and b/public/images/pokemon/778-busted.png differ diff --git a/public/images/pokemon/778.json b/public/images/pokemon/778-disguised.json similarity index 95% rename from public/images/pokemon/778.json rename to public/images/pokemon/778-disguised.json index fb77b7834af..fb56a6612d0 100644 --- a/public/images/pokemon/778.json +++ b/public/images/pokemon/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 48, diff --git a/public/images/pokemon/778.png b/public/images/pokemon/778-disguised.png similarity index 100% rename from public/images/pokemon/778.png rename to public/images/pokemon/778-disguised.png diff --git a/public/images/pokemon/back/431.json b/public/images/pokemon/back/431.json index 41b5acaa48c..298dfa78b58 100644 --- a/public/images/pokemon/back/431.json +++ b/public/images/pokemon/back/431.json @@ -4,954 +4,114 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 442, + "h": 442 }, "scale": 1, "frames": [ { - "filename": "0103.png", + "filename": "0079.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 71, + "y": 11, + "w": 70, "h": 53 }, "frame": { - "x": 0, - "y": 0, - "w": 71, + "x": 1, + "y": 1, + "w": 70, "h": 53 } }, { - "filename": "0104.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 71, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 53 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, + "x": 1, + "y": 11, "w": 69, "h": 53 }, "frame": { - "x": 0, - "y": 53, + "x": 1, + "y": 56, "w": 69, "h": 53 } }, { - "filename": "0106.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 69, - "h": 53 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 10, + "w": 65, + "h": 54 + }, + "frame": { + "x": 1, + "y": 111, + "w": 65, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, "w": 66, "h": 52 }, "frame": { - "x": 71, - "y": 0, + "x": 73, + "y": 1, "w": 66, "h": 52 } }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 66, - "h": 52 - }, - "frame": { - "x": 71, - "y": 0, - "w": 66, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, { "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 + "x": 6, + "y": 11, + "w": 64, + "h": 53 }, "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 + "x": 1, + "y": 167, + "w": 64, + "h": 53 } }, { @@ -960,522 +120,18 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, + "x": 7, + "y": 11, + "w": 63, "h": 53 }, "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, + "x": 1, + "y": 222, + "w": 63, "h": 53 } }, @@ -1485,166 +141,292 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, + "x": 9, + "y": 10, + "w": 61, "h": 54 }, "frame": { - "x": 119, - "y": 320, - "w": 52, + "x": 1, + "y": 277, + "w": 61, "h": 54 } }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, { "filename": "0092.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, - "h": 54 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 119, - "y": 320, - "w": 52, - "h": 54 + "x": 1, + "y": 333, + "w": 59, + "h": 55 } }, { - "filename": "0113.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0051.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0008.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 9, + "y": 11, + "w": 61, "h": 53 }, "frame": { - "x": 123, - "y": 160, - "w": 58, + "x": 141, + "y": 1, + "w": 61, "h": 53 } }, { - "filename": "0052.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, - "h": 53 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 123, - "y": 160, - "w": 58, - "h": 53 + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 } }, { @@ -1653,81 +435,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0062.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0015.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 249, - "y": 54, - "w": 58, - "h": 53 + "x": 60, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0059.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 60, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 2, + "w": 52, + "h": 62 + }, + "frame": { + "x": 387, + "y": 1, + "w": 52, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 249, - "y": 54, - "w": 58, + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, "h": 53 } }, @@ -1737,145 +708,145 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0060.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0009.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0053.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0010.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0054.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0013.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { @@ -1884,40 +855,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { - "filename": "0014.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { @@ -1926,40 +897,103 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { - "filename": "0027.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 } }, { @@ -1968,334 +1002,19 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 295, - "y": 211, - "w": 57, - "h": 52 + "x": 255, + "y": 113, + "w": 59, + "h": 55 } }, { @@ -2304,18 +1023,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 316, + "y": 115, + "w": 59, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 295, - "y": 211, - "w": 57, + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, "h": 52 } }, @@ -2325,375 +1296,39 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, { - "filename": "0100.png", + "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, - "h": 52 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, @@ -2703,19 +1338,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 56, - "h": 50 + "x": 12, + "y": 12, + "w": 58, + "h": 52 }, "frame": { - "x": 365, - "y": 366, - "w": 56, - "h": 50 + "x": 67, + "y": 220, + "w": 58, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 67, + "y": 220, + "w": 58, + "h": 52 } }, { @@ -2724,62 +1380,566 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 66, + "y": 274, + "w": 57, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 125, + "y": 275, + "w": 57, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 }, "spriteSourceSize": { "x": 14, - "y": 9, + "y": 6, + "w": 56, + "h": 58 + }, + "frame": { + "x": 184, + "y": 277, + "w": 56, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 52, + "h": 61 + }, + "frame": { + "x": 242, + "y": 278, + "w": 52, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 365, - "y": 366, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0034.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0078.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 19, + "y": 6, + "w": 51, + "h": 58 + }, + "frame": { + "x": 296, + "y": 278, + "w": 51, + "h": 58 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 362, + "y": 229, "w": 56, "h": 50 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 56, + "h": 50 + }, + "frame": { + "x": 362, + "y": 229, + "w": 56, + "h": 50 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 48, + "h": 59 + }, + "frame": { + "x": 349, + "y": 281, + "w": 48, + "h": 59 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 47, + "h": 64 + }, + "frame": { + "x": 296, + "y": 338, + "w": 47, + "h": 64 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 5, + "w": 47, + "h": 59 + }, + "frame": { + "x": 345, + "y": 342, + "w": 47, + "h": 59 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 27, + "y": 7, + "w": 45, + "h": 57 + }, + "frame": { + "x": 394, + "y": 342, + "w": 45, + "h": 57 + } } ] } @@ -2787,6 +1947,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d859178994686d479f3197554b49a5d0:4865cb1c68e23bfe2c333b4936466c12:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:58e51c630d2f71df7e68c399b2be62b4:05493809e98cbba93f8bf51723c495a4:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/back/431.png b/public/images/pokemon/back/431.png index b727d199975..f67604890f0 100644 Binary files a/public/images/pokemon/back/431.png and b/public/images/pokemon/back/431.png differ diff --git a/public/images/pokemon/back/778.json b/public/images/pokemon/back/778-disguised.json similarity index 95% rename from public/images/pokemon/back/778.json rename to public/images/pokemon/back/778-disguised.json index 7e7176217f0..a5818c08d03 100644 --- a/public/images/pokemon/back/778.json +++ b/public/images/pokemon/back/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 51, diff --git a/public/images/pokemon/back/778.png b/public/images/pokemon/back/778-disguised.png similarity index 100% rename from public/images/pokemon/back/778.png rename to public/images/pokemon/back/778-disguised.png diff --git a/public/images/pokemon/back/shiny/431.json b/public/images/pokemon/back/shiny/431.json index 93318f104cd..dc406e42b59 100644 --- a/public/images/pokemon/back/shiny/431.json +++ b/public/images/pokemon/back/shiny/431.json @@ -4,954 +4,114 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 442, + "h": 442 }, "scale": 1, "frames": [ { - "filename": "0103.png", + "filename": "0079.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 71, + "y": 11, + "w": 70, "h": 53 }, "frame": { - "x": 0, - "y": 0, - "w": 71, + "x": 1, + "y": 1, + "w": 70, "h": 53 } }, { - "filename": "0104.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 71, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 53 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, + "x": 1, + "y": 11, "w": 69, "h": 53 }, "frame": { - "x": 0, - "y": 53, + "x": 1, + "y": 56, "w": 69, "h": 53 } }, { - "filename": "0106.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 69, - "h": 53 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 10, + "w": 65, + "h": 54 + }, + "frame": { + "x": 1, + "y": 111, + "w": 65, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, "w": 66, "h": 52 }, "frame": { - "x": 71, - "y": 0, + "x": 73, + "y": 1, "w": 66, "h": 52 } }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 66, - "h": 52 - }, - "frame": { - "x": 71, - "y": 0, - "w": 66, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, { "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 + "x": 6, + "y": 11, + "w": 64, + "h": 53 }, "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 + "x": 1, + "y": 167, + "w": 64, + "h": 53 } }, { @@ -960,522 +120,18 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, + "x": 7, + "y": 11, + "w": 63, "h": 53 }, "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, + "x": 1, + "y": 222, + "w": 63, "h": 53 } }, @@ -1485,166 +141,292 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, + "x": 9, + "y": 10, + "w": 61, "h": 54 }, "frame": { - "x": 119, - "y": 320, - "w": 52, + "x": 1, + "y": 277, + "w": 61, "h": 54 } }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, { "filename": "0092.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, - "h": 54 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 119, - "y": 320, - "w": 52, - "h": 54 + "x": 1, + "y": 333, + "w": 59, + "h": 55 } }, { - "filename": "0113.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0051.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0008.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 9, + "y": 11, + "w": 61, "h": 53 }, "frame": { - "x": 123, - "y": 160, - "w": 58, + "x": 141, + "y": 1, + "w": 61, "h": 53 } }, { - "filename": "0052.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, - "h": 53 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 123, - "y": 160, - "w": 58, - "h": 53 + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 } }, { @@ -1653,81 +435,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0062.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0015.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 249, - "y": 54, - "w": 58, - "h": 53 + "x": 60, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0059.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 60, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 2, + "w": 52, + "h": 62 + }, + "frame": { + "x": 387, + "y": 1, + "w": 52, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 249, - "y": 54, - "w": 58, + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, "h": 53 } }, @@ -1737,145 +708,145 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0060.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0009.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0053.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0010.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0054.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0013.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { @@ -1884,40 +855,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { - "filename": "0014.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { @@ -1926,40 +897,103 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { - "filename": "0027.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 } }, { @@ -1968,334 +1002,19 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 295, - "y": 211, - "w": 57, - "h": 52 + "x": 255, + "y": 113, + "w": 59, + "h": 55 } }, { @@ -2304,18 +1023,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 316, + "y": 115, + "w": 59, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 295, - "y": 211, - "w": 57, + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, "h": 52 } }, @@ -2325,375 +1296,39 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, { - "filename": "0100.png", + "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, - "h": 52 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, @@ -2703,19 +1338,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 56, - "h": 50 + "x": 12, + "y": 12, + "w": 58, + "h": 52 }, "frame": { - "x": 365, - "y": 366, - "w": 56, - "h": 50 + "x": 67, + "y": 220, + "w": 58, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 67, + "y": 220, + "w": 58, + "h": 52 } }, { @@ -2724,62 +1380,566 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 66, + "y": 274, + "w": 57, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 125, + "y": 275, + "w": 57, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 }, "spriteSourceSize": { "x": 14, - "y": 9, + "y": 6, + "w": 56, + "h": 58 + }, + "frame": { + "x": 184, + "y": 277, + "w": 56, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 52, + "h": 61 + }, + "frame": { + "x": 242, + "y": 278, + "w": 52, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 365, - "y": 366, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0034.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0078.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 19, + "y": 6, + "w": 51, + "h": 58 + }, + "frame": { + "x": 296, + "y": 278, + "w": 51, + "h": 58 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 362, + "y": 229, "w": 56, "h": 50 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 56, + "h": 50 + }, + "frame": { + "x": 362, + "y": 229, + "w": 56, + "h": 50 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 48, + "h": 59 + }, + "frame": { + "x": 349, + "y": 281, + "w": 48, + "h": 59 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 47, + "h": 64 + }, + "frame": { + "x": 296, + "y": 338, + "w": 47, + "h": 64 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 5, + "w": 47, + "h": 59 + }, + "frame": { + "x": 345, + "y": 342, + "w": 47, + "h": 59 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 27, + "y": 7, + "w": 45, + "h": 57 + }, + "frame": { + "x": 394, + "y": 342, + "w": 45, + "h": 57 + } } ] } @@ -2787,6 +1947,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9ebc8034f2bcafe3ce6ab17b95a0f671:79e5c7024ab4d617b896435d49ee6160:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:e3e0553fc99b75c9f0a499716eabc86f:42d213ec7c63d2c551ed86c1abf4ffa6:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/back/shiny/431.png b/public/images/pokemon/back/shiny/431.png index e44ada40ef6..26248938782 100644 Binary files a/public/images/pokemon/back/shiny/431.png and b/public/images/pokemon/back/shiny/431.png differ diff --git a/public/images/pokemon/back/shiny/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/778.json b/public/images/pokemon/back/shiny/778-disguised.json similarity index 95% rename from public/images/pokemon/back/shiny/778.json rename to public/images/pokemon/back/shiny/778-disguised.json index b4a769a5fcc..5e6ab612903 100644 --- a/public/images/pokemon/back/shiny/778.json +++ b/public/images/pokemon/back/shiny/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 51, diff --git a/public/images/pokemon/back/shiny/778.png b/public/images/pokemon/back/shiny/778-disguised.png similarity index 100% rename from public/images/pokemon/back/shiny/778.png rename to public/images/pokemon/back/shiny/778-disguised.png diff --git a/public/images/pokemon/exp/130-mega.png b/public/images/pokemon/exp/130-mega.png index 4785caffc9f..00fc5316581 100644 Binary files a/public/images/pokemon/exp/130-mega.png and b/public/images/pokemon/exp/130-mega.png differ diff --git a/public/images/pokemon/exp/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/778-busted.png b/public/images/pokemon/exp/778-busted.png index 98a02bdad69..67740699c02 100644 Binary files a/public/images/pokemon/exp/778-busted.png and b/public/images/pokemon/exp/778-busted.png differ diff --git a/public/images/pokemon/exp/778.json b/public/images/pokemon/exp/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/778.json rename to public/images/pokemon/exp/778-disguised.json index d3e2f8680b0..9668c6d8d59 100644 --- a/public/images/pokemon/exp/778.json +++ b/public/images/pokemon/exp/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 219, diff --git a/public/images/pokemon/exp/778-disguised.png b/public/images/pokemon/exp/778-disguised.png new file mode 100644 index 00000000000..ba26b8db997 Binary files /dev/null and b/public/images/pokemon/exp/778-disguised.png differ diff --git a/public/images/pokemon/exp/778.png b/public/images/pokemon/exp/778.png deleted file mode 100644 index 7830266be07..00000000000 Binary files a/public/images/pokemon/exp/778.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/778.json b/public/images/pokemon/exp/back/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/back/778.json rename to public/images/pokemon/exp/back/778-disguised.json index 72555e22d19..04d18782d0d 100644 --- a/public/images/pokemon/exp/back/778.json +++ b/public/images/pokemon/exp/back/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 210, diff --git a/public/images/pokemon/exp/back/778.png b/public/images/pokemon/exp/back/778-disguised.png similarity index 100% rename from public/images/pokemon/exp/back/778.png rename to public/images/pokemon/exp/back/778-disguised.png diff --git a/public/images/pokemon/exp/back/shiny/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/778.json b/public/images/pokemon/exp/back/shiny/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/back/shiny/778.json rename to public/images/pokemon/exp/back/shiny/778-disguised.json index 77ae7d76ba7..53684eb62dc 100644 --- a/public/images/pokemon/exp/back/shiny/778.json +++ b/public/images/pokemon/exp/back/shiny/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 210, diff --git a/public/images/pokemon/exp/back/shiny/778.png b/public/images/pokemon/exp/back/shiny/778-disguised.png similarity index 100% rename from public/images/pokemon/exp/back/shiny/778.png rename to public/images/pokemon/exp/back/shiny/778-disguised.png diff --git a/public/images/pokemon/exp/shiny/130-mega.png b/public/images/pokemon/exp/shiny/130-mega.png index eb87c24325b..fb4f81bf629 100644 Binary files a/public/images/pokemon/exp/shiny/130-mega.png and b/public/images/pokemon/exp/shiny/130-mega.png differ diff --git a/public/images/pokemon/exp/shiny/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/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/778.json b/public/images/pokemon/exp/shiny/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/shiny/778.json rename to public/images/pokemon/exp/shiny/778-disguised.json index 44a236b129d..1ba5c6899c4 100644 --- a/public/images/pokemon/exp/shiny/778.json +++ b/public/images/pokemon/exp/shiny/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 219, diff --git a/public/images/pokemon/exp/shiny/778.png b/public/images/pokemon/exp/shiny/778-disguised.png similarity index 100% rename from public/images/pokemon/exp/shiny/778.png rename to public/images/pokemon/exp/shiny/778-disguised.png diff --git a/public/images/pokemon/icons/7/778.png b/public/images/pokemon/icons/7/778-disguised.png similarity index 100% rename from public/images/pokemon/icons/7/778.png rename to public/images/pokemon/icons/7/778-disguised.png diff --git a/public/images/pokemon/icons/7/778s.png b/public/images/pokemon/icons/7/778s-disguised.png similarity index 100% rename from public/images/pokemon/icons/7/778s.png rename to public/images/pokemon/icons/7/778s-disguised.png diff --git a/public/images/pokemon/icons/variant/7/778_2.png b/public/images/pokemon/icons/variant/7/778-disguised_2.png similarity index 100% rename from public/images/pokemon/icons/variant/7/778_2.png rename to public/images/pokemon/icons/variant/7/778-disguised_2.png diff --git a/public/images/pokemon/icons/variant/7/778_3.png b/public/images/pokemon/icons/variant/7/778-disguised_3.png similarity index 100% rename from public/images/pokemon/icons/variant/7/778_3.png rename to public/images/pokemon/icons/variant/7/778-disguised_3.png diff --git a/public/images/pokemon/shiny/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/431.json b/public/images/pokemon/shiny/431.json index cd49a96600d..027f15263b8 100644 --- a/public/images/pokemon/shiny/431.json +++ b/public/images/pokemon/shiny/431.json @@ -4,1206 +4,51 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 417, + "h": 417 }, "scale": 1, "frames": [ { - "filename": "0011.png", + "filename": "0072.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 54, - "h": 48 + "y": 10, + "w": 72, + "h": 57 }, "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 + "w": 72, + "h": 57 } }, { - "filename": "0049.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { @@ -1212,229 +57,229 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { - "filename": "0028.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0072.png", + "filename": "0074.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0039.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0102.png", + "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0040.png", + "filename": "0087.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 2, + "w": 58, + "h": 65 + }, + "frame": { + "x": 1, + "y": 256, + "w": 58, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 1, + "y": 323, + "w": 55, + "h": 65 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 62, + "h": 61 + }, + "frame": { + "x": 75, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 62, + "h": 61 } }, { - "filename": "0084.png", + "filename": "0085.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 5, + "w": 57, + "h": 62 + }, + "frame": { + "x": 139, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 57, + "h": 62 } }, { - "filename": "0107.png", + "filename": "0086.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 57, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 139, + "y": 1, + "w": 57, + "h": 62 } }, { - "filename": "0108.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 54, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 198, + "y": 1, + "w": 54, + "h": 62 } }, { @@ -1443,19 +288,1006 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 8, "w": 56, - "h": 55 + "h": 59 }, "frame": { - "x": 267, - "y": 208, + "x": 254, + "y": 1, "w": 56, - "h": 55 + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 15, + "w": 46, + "h": 52 + }, + "frame": { + "x": 370, + "y": 1, + "w": 46, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 298, + "y": 62, + "w": 56, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 51, + "h": 58 + }, + "frame": { + "x": 356, + "y": 122, + "w": 51, + "h": 58 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 52, + "h": 58 + }, + "frame": { + "x": 61, + "y": 187, + "w": 52, + "h": 58 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 } }, { @@ -1464,101 +1296,248 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 53, + "h": 56 + }, + "frame": { + "x": 231, + "y": 188, + "w": 53, + "h": 56 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0022.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0023.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0043.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0044.png", + "filename": "0094.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } @@ -1569,502 +1548,124 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0065.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0066.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0067.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0087.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0088.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 + "x": 111, + "y": 362, + "w": 55, + "h": 53 } }, { @@ -2073,711 +1674,438 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 111, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 280, - "y": 263, + "x": 286, + "y": 188, "w": 56, "h": 55 } }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 286, + "y": 188, + "w": 56, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, { "filename": "0042.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, + "y": 360, + "w": 48, "h": 55 } }, { - "filename": "0085.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, - "h": 55 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, + "y": 360, + "w": 48, "h": 55 } } @@ -2787,6 +2115,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9d1aec9d42e64e77286a76abe5dbf02d:e582b0881efa16424743e0ecc7e8a9e9:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:6ae8e0153c224f59d2b8e14aafe30b2d:75902c7192d93b439a34817a7b78859e:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/shiny/431.png b/public/images/pokemon/shiny/431.png index 6eae96da2f2..9ada8fdb6f1 100644 Binary files a/public/images/pokemon/shiny/431.png and b/public/images/pokemon/shiny/431.png differ diff --git a/public/images/pokemon/shiny/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/778.json b/public/images/pokemon/shiny/778-disguised.json similarity index 93% rename from public/images/pokemon/shiny/778.json rename to public/images/pokemon/shiny/778-disguised.json index 0d4975c4ec7..eafdd271342 100644 --- a/public/images/pokemon/shiny/778.json +++ b/public/images/pokemon/shiny/778-disguised.json @@ -1,10 +1,10 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { - "w": 48, + "w": 39, "h": 48 }, "scale": 1, diff --git a/public/images/pokemon/shiny/778-disguised.png b/public/images/pokemon/shiny/778-disguised.png new file mode 100644 index 00000000000..941fc6c284e Binary files /dev/null and b/public/images/pokemon/shiny/778-disguised.png differ diff --git a/public/images/pokemon/shiny/778.png b/public/images/pokemon/shiny/778.png deleted file mode 100644 index f6c14926a12..00000000000 Binary files a/public/images/pokemon/shiny/778.png and /dev/null differ diff --git a/public/images/pokemon/variant/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/778-busted.json b/public/images/pokemon/variant/778-busted.json new file mode 100644 index 00000000000..c3f37914667 --- /dev/null +++ b/public/images/pokemon/variant/778-busted.json @@ -0,0 +1,26 @@ +{ + "1": { + "101010": "000000", + "404040": "3a200c", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "542c21", + "f28b24": "d9ae6c", + "a55c18": "c58850", + "4d361f": "a0561d", + "b37d47": "fabc5f", + "404039": "381a15" + }, + "2": { + "101010": "000000", + "404040": "0c123a", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "1b1031", + "f28b24": "69a3cb", + "a55c18": "5b8abd", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "404039": "ff766e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/778.json b/public/images/pokemon/variant/778-disguised.json similarity index 99% rename from public/images/pokemon/variant/778.json rename to public/images/pokemon/variant/778-disguised.json index 3b8eca6ee7f..3fb6d0c98c2 100644 --- a/public/images/pokemon/variant/778.json +++ b/public/images/pokemon/variant/778-disguised.json @@ -31,4 +31,4 @@ "805933": "6d80a4", "3c3838": "ff766e" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 9be4a71316d..e2feeaa9e55 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -2464,7 +2464,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -3260,6 +3265,11 @@ 1, 1 ], + "123": [ + 1, + 1, + 1 + ], "129": [ 0, 1, @@ -3290,6 +3300,11 @@ 1, 1 ], + "307": [ + 0, + 1, + 1 + ], "308": [ 0, 1, @@ -5832,7 +5847,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -6628,6 +6648,11 @@ 1, 1 ], + "123": [ + 1, + 1, + 1 + ], "129": [ 0, 1, @@ -6658,6 +6683,11 @@ 1, 1 ], + "307": [ + 0, + 1, + 1 + ], "308": [ 0, 1, @@ -7371,10 +7401,15 @@ 1, 1 ], - "778": [ + "778-busted": [ 0, 1, - 2 + 1 + ], + "778-disguised": [ + 0, + 1, + 1 ], "779": [ 0, @@ -8653,7 +8688,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -9320,4 +9360,4 @@ 1 ] } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/307.json b/public/images/pokemon/variant/back/307.json index 3c2ef92171c..3bdadaa8e16 100644 --- a/public/images/pokemon/variant/back/307.json +++ b/public/images/pokemon/variant/back/307.json @@ -1,15 +1,5 @@ { "1": { - "7b6b6b": "314b76", - "b5adad": "677d98", - "e6dede": "c2cfdb", - "000000": "000000", - "3a84b5": "51876e", - "3a4a5a": "113926", - "6bcee6": "7edfb7", - "5aa5ce": "66c3a3" - }, - "2": { "7b6b6b": "7a5f5f", "b5adad": "9f8383", "e6dede": "deccc3", @@ -18,5 +8,15 @@ "3a4a5a": "5a2859", "6bcee6": "f4a8c8", "5aa5ce": "ce7bb0" + }, + "2": { + "7b6b6b": "314b76", + "b5adad": "677d98", + "e6dede": "c2cfdb", + "000000": "000000", + "3a84b5": "51876e", + "3a4a5a": "113926", + "6bcee6": "7edfb7", + "5aa5ce": "66c3a3" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/778-busted.json b/public/images/pokemon/variant/back/778-busted.json new file mode 100644 index 00000000000..70c365d1ff7 --- /dev/null +++ b/public/images/pokemon/variant/back/778-busted.json @@ -0,0 +1,22 @@ +{ + "1": { + "101010": "101010", + "404040": "2d1818", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "542c21", + "4d361f": "844b20", + "b37d47": "fabc5f", + "805933": "b97d2c" + }, + "2": { + "101010": "000000", + "404040": "0c123a", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "1b1031", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/778.json b/public/images/pokemon/variant/back/778-disguised.json similarity index 99% rename from public/images/pokemon/variant/back/778.json rename to public/images/pokemon/variant/back/778-disguised.json index 2c6ce68a299..9b8340c7562 100644 --- a/public/images/pokemon/variant/back/778.json +++ b/public/images/pokemon/variant/back/778-disguised.json @@ -19,4 +19,4 @@ "b37d47": "8eb5cd", "805933": "6d80a4" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/982-three-segment_3.png b/public/images/pokemon/variant/back/982-three-segment_3.png index b6b0ef0c2f4..3286d3331a5 100644 Binary files a/public/images/pokemon/variant/back/982-three-segment_3.png and b/public/images/pokemon/variant/back/982-three-segment_3.png differ diff --git a/public/images/pokemon/variant/back/982_3.png b/public/images/pokemon/variant/back/982_3.png index 3286d3331a5..b6b0ef0c2f4 100644 Binary files a/public/images/pokemon/variant/back/982_3.png and b/public/images/pokemon/variant/back/982_3.png differ diff --git a/public/images/pokemon/variant/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/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/exp/130-mega.json b/public/images/pokemon/variant/exp/130-mega.json index e2b765e489d..a2818168ba8 100644 --- a/public/images/pokemon/variant/exp/130-mega.json +++ b/public/images/pokemon/variant/exp/130-mega.json @@ -1,92 +1,36 @@ -{ - "1": { - "207cc1": "c67429", - "44b4f4": "eea747", - "1d5486": "923d13", - "826c4d": "dd493b", - "f8eaba": "fff3ec", - "cdac7b": "bd9b8e", - "0d0d0d": "101010", - "090909": "101010", - "3b3f47": "c32625", - "3c3f47": "c32625", - "1f2025": "101010", - "202226": "101010", - "5e5f62": "dd493b", - "1c5486": "923d13", - "1f7cc1": "c67429", - "826b4d": "dd493b", - "992137": "8691d5", - "e6414a": "c9d4ff", - "000000": "101010", - "f4f4f4": "f8f8f8", - "992035": "8691d5", - "2b2d33": "682a23", - "2a2c31": "682a23", - "282a2e": "682a23", - "e0e0e0": "f37754", - "030303": "101010", - "393f47": "c32625", - "1c1d22": "101010", - "195486": "923d13", - "1c7cc1": "c67429", - "82694d": "dd493b", - "991d31": "8691d5", - "ffffff": "f8f8f8", - "26282c": "682a23", - "060606": "101010", - "3a3f47": "c32625", - "1d1f24": "101010", - "1a5486": "923d13", - "1d7cc1": "c67429", - "826a4d": "dd493b", - "991f33": "8691d5", - "292b2f": "682a23", - "27292d": "682a23" - }, - "2": { - "207cc1": "582c81", - "44b4f4": "7b43a1", - "1d5486": "411f70", - "826c4d": "f2a366", - "f8eaba": "ffedf4", - "cdac7b": "d7aec0", - "0d0d0d": "101010", - "090909": "101010", - "3b3f47": "bc6532", - "3c3f47": "bc6532", - "1f2025": "101010", - "202226": "101010", - "5e5f62": "f2a366", - "1c5486": "411f70", - "1f7cc1": "582c81", - "826b4d": "f2a366", - "992137": "a62869", - "e6414a": "e15693", - "000000": "101010", - "f4f4f4": "f8f8f8", - "992035": "a62869", - "2b2d33": "202b47", - "2a2c31": "202b47", - "282a2e": "202b47", - "e0e0e0": "ffdb85", - "030303": "101010", - "393f47": "bc6532", - "1c1d22": "101010", - "195486": "411f70", - "1c7cc1": "582c81", - "82694d": "f2a366", - "991d31": "a62869", - "ffffff": "f8f8f8", - "26282c": "202b47", - "060606": "101010", - "3a3f47": "bc6532", - "1d1f24": "101010", - "1a5486": "411f70", - "1d7cc1": "582c81", - "826a4d": "f2a366", - "991f33": "a62869", - "292b2f": "202b47", - "27292d": "202b47" - } +{ + "1": { + "44b4f4": "eea747", + "826c4d": "dd493b", + "f8eaba": "fff3ec", + "cdac7b": "bd9b8e", + "5e5f62": "dd493b", + "1f7cc1": "c67429", + "e6414a": "c9d4ff", + "f4f4f4": "f8f8f8", + "e0e0e0": "f37754", + "991d31": "8691d5", + "060606": "101010", + "3a3f47": "c32625", + "1a5486": "923d13", + "1d7cc1": "c67429", + "27292d": "682a23" + }, + "2": { + "44b4f4": "7b43a1", + "826c4d": "f2a366", + "f8eaba": "ffedf4", + "cdac7b": "d7aec0", + "5e5f62": "f2a366", + "1f7cc1": "582c81", + "e6414a": "e15693", + "f4f4f4": "f8f8f8", + "e0e0e0": "ffdb85", + "991d31": "a62869", + "060606": "101010", + "3a3f47": "bc6532", + "1a5486": "411f70", + "1d7cc1": "582c81", + "27292d": "202b47" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778-busted.json b/public/images/pokemon/variant/exp/778-busted.json new file mode 100644 index 00000000000..679ebbb5f31 --- /dev/null +++ b/public/images/pokemon/variant/exp/778-busted.json @@ -0,0 +1,30 @@ +{ + "1": { + "000000": "000000", + "101010": "101010", + "404040": "180c05", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "382313", + "f28b24": "d9ae6c", + "b3671b": "c58850", + "4d361f": "a0561d", + "b37d47": "fabc5f", + "805933": "d18e33", + "404039": "180c05" + }, + "2": { + "000000": "000000", + "101010": "000000", + "404040": "0b1231", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "25213a", + "f28b24": "69a3cb", + "b3671b": "5b8abd", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4", + "404039": "ff766e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778-disguised.json b/public/images/pokemon/variant/exp/778-disguised.json new file mode 100644 index 00000000000..7dfb153ed7e --- /dev/null +++ b/public/images/pokemon/variant/exp/778-disguised.json @@ -0,0 +1,28 @@ +{ + "1": { + "000000": "000000", + "404040": "180c05", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "382313", + "f28b24": "d9ae6c", + "b3671b": "c58850", + "4d361f": "a0561d", + "b37d47": "fabc5f", + "805933": "d18e33", + "404039": "180c05" + }, + "2": { + "000000": "000000", + "404040": "0b1231", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "25213a", + "f28b24": "69a3cb", + "b3671b": "5b8abd", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4", + "404039": "ff766e" + } +} diff --git a/public/images/pokemon/variant/exp/778.json b/public/images/pokemon/variant/exp/778.json deleted file mode 100644 index 5b4d0baa505..00000000000 --- a/public/images/pokemon/variant/exp/778.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "1": { - "000000": "000000", - "404040": "180c05", - "b3a76b": "8d4f3d", - "f2e291": "aa6f46", - "665f3d": "382313", - "f28b24": "d9ae6c", - "b3671b": "c58850", - "4d361f": "a0561d", - "b37d47": "fabc5f", - "805933": "d18e33" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778_3.json b/public/images/pokemon/variant/exp/778_3.json deleted file mode 100644 index a51f14647c1..00000000000 --- a/public/images/pokemon/variant/exp/778_3.json +++ /dev/null @@ -1,1343 +0,0 @@ -{ - "textures": [ - { - "image": "778_3.png", - "format": "RGBA8888", - "size": { - "w": 219, - "h": 219 - }, - "scale": 1, - "frames": [ - { - "filename": "0056.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 60, - "h": 48 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 60, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 60, - "h": 47 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 48 - }, - "frame": { - "x": 60, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 95, - "w": 54, - "h": 48 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 52, - "h": 48 - }, - "frame": { - "x": 117, - "y": 0, - "w": 52, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 48, - "h": 48 - }, - "frame": { - "x": 0, - "y": 143, - "w": 48, - "h": 48 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 12, - "y": 0, - "w": 47, - "h": 48 - }, - "frame": { - "x": 169, - "y": 0, - "w": 47, - "h": 48 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 15, - "y": 0, - "w": 44, - "h": 48 - }, - "frame": { - "x": 54, - "y": 95, - "w": 44, - "h": 48 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 15, - "y": 0, - "w": 44, - "h": 48 - }, - "frame": { - "x": 48, - "y": 143, - "w": 44, - "h": 48 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 42, - "h": 48 - }, - "frame": { - "x": 147, - "y": 48, - "w": 42, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 92, - "y": 144, - "w": 41, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 92, - "y": 144, - "w": 41, - "h": 48 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 133, - "y": 144, - "w": 41, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cf70bf2fa66c37035eb9b4da1a4c93ff:11ac0c3ddb365960d306dba5909a72c7:92ecadef6e0cb53020b8cd41fbeaf2cd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778_3.png b/public/images/pokemon/variant/exp/778_3.png deleted file mode 100644 index 87a4cbefc8d..00000000000 Binary files a/public/images/pokemon/variant/exp/778_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/778-busted.json b/public/images/pokemon/variant/exp/back/778-busted.json new file mode 100644 index 00000000000..21f796f0657 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/778-busted.json @@ -0,0 +1,26 @@ +{ + "1": { + "000000": "000000", + "101010": "101010", + "404040": "2d1818", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "542c21", + "000000": "101010", + "4d361f": "844b20", + "b37d47": "fabc5f", + "805933": "b97d2c" + }, + "2": { + "000000": "000000", + "101010": "000000", + "404040": "0c123a", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "1b1031", + "000000": "000000", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/778.json b/public/images/pokemon/variant/exp/back/778-disguised.json similarity index 99% rename from public/images/pokemon/variant/exp/back/778.json rename to public/images/pokemon/variant/exp/back/778-disguised.json index d1171e22173..3ebf48117fb 100644 --- a/public/images/pokemon/variant/exp/back/778.json +++ b/public/images/pokemon/variant/exp/back/778-disguised.json @@ -21,4 +21,4 @@ "b37d47": "8eb5cd", "805933": "6d80a4" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/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/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_icons_6v.json b/public/images/pokemon_icons_6v.json index ce9ab89be5b..d6c7c38304c 100644 --- a/public/images/pokemon_icons_6v.json +++ b/public/images/pokemon_icons_6v.json @@ -219,48 +219,6 @@ "h": 23 } }, - { - "filename": "354-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 176, - "w": 26, - "h": 30 - } - }, - { - "filename": "354-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 206, - "w": 26, - "h": 30 - } - }, { "filename": "666-archipelago_2", "rotated": false, @@ -1479,27 +1437,6 @@ "h": 24 } }, - { - "filename": "779_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 107, - "y": 155, - "w": 21, - "h": 20 - } - }, { "filename": "673_2", "rotated": false, @@ -1521,27 +1458,6 @@ "h": 22 } }, - { - "filename": "779_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 107, - "y": 175, - "w": 21, - "h": 20 - } - }, { "filename": "666-tundra_3", "rotated": false, @@ -1794,48 +1710,6 @@ "h": 22 } }, - { - "filename": "743_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 78, - "y": 358, - "w": 20, - "h": 22 - } - }, - { - "filename": "743_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 78, - "y": 380, - "w": 20, - "h": 22 - } - }, { "filename": "690_3", "rotated": false, @@ -1857,48 +1731,6 @@ "h": 21 } }, - { - "filename": "742_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 78, - "y": 423, - "w": 19, - "h": 20 - } - }, - { - "filename": "742_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 78, - "y": 443, - "w": 19, - "h": 20 - } - }, { "filename": "720_1", "rotated": false, @@ -2214,48 +2046,6 @@ "h": 17 } }, - { - "filename": "777_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 111, - "y": 396, - "w": 17, - "h": 19 - } - }, - { - "filename": "777_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 111, - "y": 415, - "w": 17, - "h": 19 - } - }, { "filename": "712_2", "rotated": false, diff --git a/public/images/pokemon_icons_6v.png b/public/images/pokemon_icons_6v.png index 481d23953bf..8b0ecd85af5 100644 Binary files a/public/images/pokemon_icons_6v.png and b/public/images/pokemon_icons_6v.png differ diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index bd9f404eb26..0523a232d79 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5260,7 +5260,7 @@ } }, { - "filename": "778", + "filename": "778-disguised", "rotated": false, "trimmed": true, "sourceSize": { @@ -5281,7 +5281,7 @@ } }, { - "filename": "778s", + "filename": "778s-disguised", "rotated": false, "trimmed": true, "sourceSize": { diff --git a/public/images/pokemon_icons_7v.json b/public/images/pokemon_icons_7v.json index 431a8b6dc39..ceb7a0b991f 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1,2477 +1,2687 @@ -{ - "textures": [ - { - "image": "pokemon_icons_7v.png", - "format": "RGBA8888", - "size": { - "w": 126, - "h": 614 - }, - "scale": 1, - "frames": [ - { - "filename": "809_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 28 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 28 - } - }, - { - "filename": "809_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 28 - }, - "frame": { - "x": 0, - "y": 28, - "w": 40, - "h": 28 - } - }, - { - "filename": "800-dusk-mane_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 34, - "h": 30 - }, - "frame": { - "x": 40, - "y": 0, - "w": 34, - "h": 30 - } - }, - { - "filename": "800-dusk-mane_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 34, - "h": 30 - }, - "frame": { - "x": 0, - "y": 56, - "w": 34, - "h": 30 - } - }, - { - "filename": "800-ultra_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 35, - "h": 28 - }, - "frame": { - "x": 74, - "y": 0, - "w": 35, - "h": 28 - } - }, - { - "filename": "797_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 86, - "w": 32, - "h": 30 - } - }, - { - "filename": "797_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 116, - "w": 32, - "h": 30 - } - }, - { - "filename": "778_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 109, - "y": 0, - "w": 17, - "h": 22 - } - }, - { - "filename": "800-dawn-wings_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 146, - "w": 31, - "h": 30 - } - }, - { - "filename": "800-dawn-wings_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 176, - "w": 31, - "h": 30 - } - }, - { - "filename": "798_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 29 - }, - "frame": { - "x": 0, - "y": 206, - "w": 31, - "h": 29 - } - }, - { - "filename": "798_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 29 - }, - "frame": { - "x": 0, - "y": 235, - "w": 31, - "h": 29 - } - }, - { - "filename": "800-ultra_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 35, - "h": 28 - }, - "frame": { - "x": 40, - "y": 30, - "w": 35, - "h": 28 - } - }, - { - "filename": "800_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 264, - "w": 28, - "h": 30 - } - }, - { - "filename": "800_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 294, - "w": 28, - "h": 30 - } - }, - { - "filename": "773-bug_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-bug_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 354, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 384, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 414, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 444, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 474, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 504, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 534, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fairy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 564, - "w": 26, - "h": 30 - } - }, - { - "filename": "789_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 0, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "809-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 28 - }, - "frame": { - "x": 75, - "y": 28, - "w": 30, - "h": 28 - } - }, - { - "filename": "763_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 105, - "y": 28, - "w": 21, - "h": 24 - } - }, - { - "filename": "809-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 28 - }, - "frame": { - "x": 34, - "y": 58, - "w": 30, - "h": 28 - } - }, - { - "filename": "791_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 86, - "w": 29, - "h": 28 - } - }, - { - "filename": "791_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 114, - "w": 29, - "h": 28 - } - }, - { - "filename": "763_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 105, - "y": 52, - "w": 21, - "h": 24 - } - }, - { - "filename": "789_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 23, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "772_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 64, - "y": 58, - "w": 25, - "h": 28 - } - }, - { - "filename": "773-fairy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 61, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "730_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 61, - "y": 116, - "w": 28, - "h": 27 - } - }, - { - "filename": "761_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 89, - "y": 56, - "w": 16, - "h": 19 - } - }, - { - "filename": "773-fighting_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 87, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "730_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 89, - "y": 116, - "w": 28, - "h": 27 - } - }, - { - "filename": "755_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 113, - "y": 76, - "w": 13, - "h": 24 - } - }, - { - "filename": "791_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 142, - "w": 29, - "h": 28 - } - }, - { - "filename": "773-fighting_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 170, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fire_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 200, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fire_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 230, - "w": 26, - "h": 30 - } - }, - { - "filename": "792_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 61, - "y": 143, - "w": 28, - "h": 28 - } - }, - { - "filename": "792_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 89, - "y": 143, - "w": 28, - "h": 28 - } - }, - { - "filename": "773-flying_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 171, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-flying_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 201, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ghost_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 171, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ghost_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 201, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-grass_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 231, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-grass_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 231, - "w": 26, - "h": 30 - } - }, - { - "filename": "778_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 109, - "y": 171, - "w": 17, - "h": 22 - } - }, - { - "filename": "728_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 193, - "w": 17, - "h": 20 - } - }, - { - "filename": "728_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 213, - "w": 17, - "h": 20 - } - }, - { - "filename": "808_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 109, - "y": 233, - "w": 17, - "h": 17 - } - }, - { - "filename": "808_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 109, - "y": 250, - "w": 17, - "h": 17 - } - }, - { - "filename": "773-ground_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 264, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ground_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 294, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 354, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 384, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 414, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 444, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 474, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 504, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 534, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 564, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 54, - "y": 261, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 54, - "y": 291, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 80, - "y": 261, - "w": 26, - "h": 30 - } - }, - { - "filename": "735_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 106, - "y": 267, - "w": 20, - "h": 24 - } - }, - { - "filename": "773_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 80, - "y": 291, - "w": 26, - "h": 30 - } - }, - { - "filename": "735_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 106, - "y": 291, - "w": 20, - "h": 24 - } - }, - { - "filename": "789_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 46, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "754_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 106, - "y": 315, - "w": 20, - "h": 22 - } - }, - { - "filename": "773_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 52, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "772_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 52, - "y": 354, - "w": 25, - "h": 28 - } - }, - { - "filename": "748_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 382, - "w": 26, - "h": 25 - } - }, - { - "filename": "748_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 407, - "w": 26, - "h": 25 - } - }, - { - "filename": "776_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 52, - "y": 432, - "w": 23, - "h": 26 - } - }, - { - "filename": "776_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 52, - "y": 458, - "w": 23, - "h": 26 - } - }, - { - "filename": "729_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 52, - "y": 484, - "w": 23, - "h": 24 - } - }, - { - "filename": "729_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 52, - "y": 508, - "w": 23, - "h": 24 - } - }, - { - "filename": "756_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 532, - "w": 22, - "h": 24 - } - }, - { - "filename": "756_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 556, - "w": 22, - "h": 24 - } - }, - { - "filename": "767_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 52, - "y": 580, - "w": 24, - "h": 14 - } - }, - { - "filename": "747_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 69, - "y": 594, - "w": 22, - "h": 20 - } - }, - { - "filename": "768_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 78, - "y": 321, - "w": 24, - "h": 23 - } - }, - { - "filename": "768_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 102, - "y": 337, - "w": 24, - "h": 23 - } - }, - { - "filename": "2053_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 78, - "y": 344, - "w": 24, - "h": 22 - } - }, - { - "filename": "2053_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 102, - "y": 360, - "w": 24, - "h": 22 - } - }, - { - "filename": "734_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 77, - "y": 366, - "w": 25, - "h": 16 - } - }, - { - "filename": "802_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 78, - "y": 382, - "w": 22, - "h": 24 - } - }, - { - "filename": "802_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 78, - "y": 406, - "w": 22, - "h": 24 - } - }, - { - "filename": "802_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 100, - "y": 382, - "w": 22, - "h": 24 - } - }, - { - "filename": "793_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 100, - "y": 406, - "w": 21, - "h": 24 - } - }, - { - "filename": "734_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 78, - "y": 430, - "w": 25, - "h": 16 - } - }, - { - "filename": "752_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 103, - "y": 430, - "w": 23, - "h": 18 - } - }, - { - "filename": "793_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 75, - "y": 446, - "w": 21, - "h": 24 - } - }, - { - "filename": "754_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 75, - "y": 470, - "w": 20, - "h": 22 - } - }, - { - "filename": "762_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 75, - "y": 492, - "w": 18, - "h": 23 - } - }, - { - "filename": "747_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 96, - "y": 448, - "w": 22, - "h": 20 - } - }, - { - "filename": "752_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 75, - "y": 515, - "w": 23, - "h": 18 - } - }, - { - "filename": "2052_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 74, - "y": 533, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 74, - "y": 554, - "w": 21, - "h": 21 - } - }, - { - "filename": "790_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 76, - "y": 575, - "w": 21, - "h": 19 - } - }, - { - "filename": "751_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 91, - "y": 594, - "w": 14, - "h": 20 - } - }, - { - "filename": "790_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 105, - "y": 468, - "w": 21, - "h": 19 - } - }, - { - "filename": "762_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 93, - "y": 492, - "w": 18, - "h": 23 - } - }, - { - "filename": "755_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 111, - "y": 487, - "w": 13, - "h": 24 - } - }, - { - "filename": "751_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 98, - "y": 515, - "w": 14, - "h": 20 - } - }, - { - "filename": "753_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 112, - "y": 511, - "w": 14, - "h": 19 - } - }, - { - "filename": "753_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 112, - "y": 530, - "w": 14, - "h": 19 - } - }, - { - "filename": "761_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 95, - "y": 535, - "w": 16, - "h": 19 - } - }, - { - "filename": "767_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 95, - "y": 554, - "w": 24, - "h": 14 - } - }, - { - "filename": "771_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 97, - "y": 568, - "w": 18, - "h": 13 - } - }, - { - "filename": "771_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 97, - "y": 581, - "w": 18, - "h": 13 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4de745903870d93aebe9c754281ab9a1:4247d298b98d033d5b01c30d46133c87:d5975df27e1e94206a68aa1fd3c2c8d0$" - } -} +{ + "textures": [ + { + "image": "pokemon_icons_7v.png", + "format": "RGBA8888", + "size": { + "w": 126, + "h": 614 + }, + "scale": 1, + "frames": [ + { + "filename": "809_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 28 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 28 + } + }, + { + "filename": "809_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 28 + }, + "frame": { + "x": 0, + "y": 28, + "w": 40, + "h": 28 + } + }, + { + "filename": "800-dusk-mane_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 34, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 34, + "h": 30 + } + }, + { + "filename": "800-dusk-mane_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 34, + "h": 30 + }, + "frame": { + "x": 0, + "y": 56, + "w": 34, + "h": 30 + } + }, + { + "filename": "800-ultra_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 35, + "h": 28 + }, + "frame": { + "x": 74, + "y": 0, + "w": 35, + "h": 28 + } + }, + { + "filename": "797_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 32, + "h": 30 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 30 + } + }, + { + "filename": "797_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 32, + "h": 30 + }, + "frame": { + "x": 0, + "y": 116, + "w": 32, + "h": 30 + } + }, + { + "filename": "778-disguised_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 113, + "y": 72, + "w": 17, + "h": 22 + } + }, + { + "filename": "800-dawn-wings_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 31, + "h": 30 + }, + "frame": { + "x": 0, + "y": 146, + "w": 31, + "h": 30 + } + }, + { + "filename": "800-dawn-wings_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 31, + "h": 30 + }, + "frame": { + "x": 0, + "y": 176, + "w": 31, + "h": 30 + } + }, + { + "filename": "798_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 31, + "h": 29 + }, + "frame": { + "x": 0, + "y": 206, + "w": 31, + "h": 29 + } + }, + { + "filename": "798_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 31, + "h": 29 + }, + "frame": { + "x": 0, + "y": 235, + "w": 31, + "h": 29 + } + }, + { + "filename": "800-ultra_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 35, + "h": 28 + }, + "frame": { + "x": 40, + "y": 30, + "w": 35, + "h": 28 + } + }, + { + "filename": "800_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 264, + "w": 28, + "h": 30 + } + }, + { + "filename": "800_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 294, + "w": 28, + "h": 30 + } + }, + { + "filename": "773-bug_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 324, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-bug_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 354, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dark_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 384, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dark_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 414, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dragon_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 444, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dragon_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 474, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-electric_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 504, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-electric_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 534, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fairy_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 564, + "w": 26, + "h": 30 + } + }, + { + "filename": "789_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 0, + "y": 594, + "w": 23, + "h": 20 + } + }, + { + "filename": "809-gigantamax_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 30, + "h": 28 + }, + "frame": { + "x": 75, + "y": 28, + "w": 30, + "h": 28 + } + }, + { + "filename": "763_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 109, + "y": 0, + "w": 21, + "h": 24 + } + }, + { + "filename": "809-gigantamax_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 30, + "h": 28 + }, + "frame": { + "x": 34, + "y": 58, + "w": 30, + "h": 28 + } + }, + { + "filename": "791_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 32, + "y": 86, + "w": 29, + "h": 28 + } + }, + { + "filename": "791_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 32, + "y": 114, + "w": 29, + "h": 28 + } + }, + { + "filename": "763_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 109, + "y": 24, + "w": 21, + "h": 24 + } + }, + { + "filename": "789_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 23, + "y": 594, + "w": 23, + "h": 20 + } + }, + { + "filename": "772_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 64, + "y": 58, + "w": 25, + "h": 28 + } + }, + { + "filename": "773-fairy_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 61, + "y": 86, + "w": 26, + "h": 30 + } + }, + { + "filename": "730_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 61, + "y": 116, + "w": 28, + "h": 27 + } + }, + { + "filename": "761_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 98, + "y": 516, + "w": 16, + "h": 19 + } + }, + { + "filename": "773-fighting_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 87, + "y": 86, + "w": 26, + "h": 30 + } + }, + { + "filename": "730_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 89, + "y": 116, + "w": 28, + "h": 27 + } + }, + { + "filename": "755_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 4, + "w": 13, + "h": 24 + }, + "frame": { + "x": 117, + "y": 117, + "w": 13, + "h": 24 + } + }, + { + "filename": "791_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 32, + "y": 142, + "w": 29, + "h": 28 + } + }, + { + "filename": "773-fighting_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 170, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fire_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 200, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fire_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 230, + "w": 26, + "h": 30 + } + }, + { + "filename": "792_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 61, + "y": 143, + "w": 28, + "h": 28 + } + }, + { + "filename": "792_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 89, + "y": 143, + "w": 28, + "h": 28 + } + }, + { + "filename": "773-flying_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 171, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-flying_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 201, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ghost_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 171, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ghost_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 201, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-grass_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 231, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-grass_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 231, + "w": 26, + "h": 30 + } + }, + { + "filename": "778-disguised_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 96, + "y": 445, + "w": 17, + "h": 22 + } + }, + { + "filename": "728_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 113, + "y": 448, + "w": 17, + "h": 20 + } + }, + { + "filename": "728_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 113, + "y": 94, + "w": 17, + "h": 20 + } + }, + { + "filename": "808_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 114, + "y": 468, + "w": 17, + "h": 17 + } + }, + { + "filename": "808_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 113, + "y": 235, + "w": 17, + "h": 17 + } + }, + { + "filename": "773-ground_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 264, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ground_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 294, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ice_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 324, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ice_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 354, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-poison_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 384, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-poison_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 414, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-psychic_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 444, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-psychic_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 474, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-rock_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 504, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-rock_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 534, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-steel_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 564, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-steel_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 54, + "y": 261, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-water_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 54, + "y": 291, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-water_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 80, + "y": 261, + "w": 26, + "h": 30 + } + }, + { + "filename": "735_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 109, + "y": 171, + "w": 20, + "h": 24 + } + }, + { + "filename": "773_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 80, + "y": 291, + "w": 26, + "h": 30 + } + }, + { + "filename": "735_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 109, + "y": 195, + "w": 20, + "h": 24 + } + }, + { + "filename": "789_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 46, + "y": 594, + "w": 23, + "h": 20 + } + }, + { + "filename": "754_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 106, + "y": 318, + "w": 20, + "h": 22 + } + }, + { + "filename": "773_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 52, + "y": 324, + "w": 26, + "h": 30 + } + }, + { + "filename": "772_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 52, + "y": 354, + "w": 25, + "h": 28 + } + }, + { + "filename": "748_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 52, + "y": 382, + "w": 26, + "h": 25 + } + }, + { + "filename": "748_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 52, + "y": 407, + "w": 26, + "h": 25 + } + }, + { + "filename": "776_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 52, + "y": 432, + "w": 23, + "h": 26 + } + }, + { + "filename": "776_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 101, + "y": 382, + "w": 23, + "h": 26 + } + }, + { + "filename": "729_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 52, + "y": 484, + "w": 23, + "h": 24 + } + }, + { + "filename": "729_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 52, + "y": 508, + "w": 23, + "h": 24 + } + }, + { + "filename": "756_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 52, + "y": 532, + "w": 22, + "h": 24 + } + }, + { + "filename": "756_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 52, + "y": 556, + "w": 22, + "h": 24 + } + }, + { + "filename": "767_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 52, + "y": 580, + "w": 24, + "h": 14 + } + }, + { + "filename": "747_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 69, + "y": 594, + "w": 22, + "h": 20 + } + }, + { + "filename": "768_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 78, + "y": 321, + "w": 24, + "h": 23 + } + }, + { + "filename": "768_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 106, + "y": 295, + "w": 24, + "h": 23 + } + }, + { + "filename": "2053_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 78, + "y": 344, + "w": 24, + "h": 22 + } + }, + { + "filename": "2053_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 102, + "y": 360, + "w": 24, + "h": 22 + } + }, + { + "filename": "734_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 77, + "y": 366, + "w": 25, + "h": 16 + } + }, + { + "filename": "802_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 78, + "y": 382, + "w": 22, + "h": 24 + } + }, + { + "filename": "802_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 78, + "y": 406, + "w": 22, + "h": 24 + } + }, + { + "filename": "802_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 52, + "y": 458, + "w": 22, + "h": 24 + } + }, + { + "filename": "793_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 109, + "y": 48, + "w": 21, + "h": 24 + } + }, + { + "filename": "734_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 78, + "y": 430, + "w": 25, + "h": 16 + } + }, + { + "filename": "752_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 104, + "y": 408, + "w": 23, + "h": 18 + } + }, + { + "filename": "793_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 75, + "y": 446, + "w": 21, + "h": 24 + } + }, + { + "filename": "754_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 74, + "y": 470, + "w": 20, + "h": 22 + } + }, + { + "filename": "762_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 75, + "y": 492, + "w": 18, + "h": 23 + } + }, + { + "filename": "747_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 109, + "y": 426, + "w": 22, + "h": 20 + } + }, + { + "filename": "752_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 75, + "y": 515, + "w": 23, + "h": 18 + } + }, + { + "filename": "2052_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 74, + "y": 533, + "w": 21, + "h": 21 + } + }, + { + "filename": "2052_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 74, + "y": 554, + "w": 21, + "h": 21 + } + }, + { + "filename": "790_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 76, + "y": 575, + "w": 21, + "h": 19 + } + }, + { + "filename": "751_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 102, + "y": 340, + "w": 14, + "h": 20 + } + }, + { + "filename": "790_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 91, + "y": 594, + "w": 21, + "h": 19 + } + }, + { + "filename": "762_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 93, + "y": 492, + "w": 18, + "h": 23 + } + }, + { + "filename": "755_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 4, + "w": 13, + "h": 24 + }, + "frame": { + "x": 117, + "y": 141, + "w": 13, + "h": 24 + } + }, + { + "filename": "751_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 116, + "y": 340, + "w": 14, + "h": 20 + } + }, + { + "filename": "753_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 116, + "y": 537, + "w": 14, + "h": 19 + } + }, + { + "filename": "753_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 116, + "y": 556, + "w": 14, + "h": 19 + } + }, + { + "filename": "761_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 96, + "y": 575, + "w": 16, + "h": 19 + } + }, + { + "filename": "767_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 106, + "y": 265, + "w": 24, + "h": 14 + } + }, + { + "filename": "742_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 19, + "h": 20 + }, + "frame": { + "x": 112, + "y": 575, + "w": 19, + "h": 20 + } + }, + { + "filename": "742_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 19, + "h": 20 + }, + "frame": { + "x": 112, + "y": 594, + "w": 19, + "h": 20 + } + }, + { + "filename": "743_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 94, + "y": 470, + "w": 20, + "h": 22 + } + }, + { + "filename": "743_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 89, + "y": 56, + "w": 20, + "h": 22 + } + }, + { + "filename": "777_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 114, + "y": 518, + "w": 17, + "h": 19 + } + }, + { + "filename": "777_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 114, + "y": 486, + "w": 17, + "h": 19 + } + }, + { + "filename": "778-busted_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 109, + "y": 219, + "w": 21, + "h": 16 + } + }, + { + "filename": "778-busted_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 106, + "y": 279, + "w": 21, + "h": 16 + } + }, + { + "filename": "779_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 95, + "y": 535, + "w": 21, + "h": 20 + } + }, + { + "filename": "779_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 95, + "y": 555, + "w": 21, + "h": 20 + } + }, + { + "filename": "771_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 112, + "y": 505, + "w": 18, + "h": 13 + } + }, + { + "filename": "771_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 109, + "y": 252, + "w": 18, + "h": 13 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4de745903870d93aebe9c754281ab9a1:4247d298b98d033d5b01c30d46133c87:d5975df27e1e94206a68aa1fd3c2c8d0$" + } +} diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 23b318b788a..822f7950f3e 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/types/bug.png b/public/images/types/bug.png deleted file mode 100644 index 72681086ec6..00000000000 Binary files a/public/images/types/bug.png and /dev/null differ diff --git a/public/images/types/dark.png b/public/images/types/dark.png deleted file mode 100644 index 6605a95bb4c..00000000000 Binary files a/public/images/types/dark.png and /dev/null differ diff --git a/public/images/types/dragon.png b/public/images/types/dragon.png deleted file mode 100644 index 3554bc8bd68..00000000000 Binary files a/public/images/types/dragon.png and /dev/null differ diff --git a/public/images/types/electric.png b/public/images/types/electric.png deleted file mode 100644 index ea5008652c5..00000000000 Binary files a/public/images/types/electric.png and /dev/null differ diff --git a/public/images/types/fairy.png b/public/images/types/fairy.png deleted file mode 100644 index f8ca169d3aa..00000000000 Binary files a/public/images/types/fairy.png and /dev/null differ diff --git a/public/images/types/fighting.png b/public/images/types/fighting.png deleted file mode 100644 index 0fd87f3dbd9..00000000000 Binary files a/public/images/types/fighting.png and /dev/null differ diff --git a/public/images/types/fire.png b/public/images/types/fire.png deleted file mode 100644 index 08a550fcaff..00000000000 Binary files a/public/images/types/fire.png and /dev/null differ diff --git a/public/images/types/flying.png b/public/images/types/flying.png deleted file mode 100644 index 3a13e051222..00000000000 Binary files a/public/images/types/flying.png and /dev/null differ diff --git a/public/images/types/ghost.png b/public/images/types/ghost.png deleted file mode 100644 index f32896bed02..00000000000 Binary files a/public/images/types/ghost.png and /dev/null differ diff --git a/public/images/types/grass.png b/public/images/types/grass.png deleted file mode 100644 index 35dfecfc2d2..00000000000 Binary files a/public/images/types/grass.png and /dev/null differ diff --git a/public/images/types/ground.png b/public/images/types/ground.png deleted file mode 100644 index 0df975559b6..00000000000 Binary files a/public/images/types/ground.png and /dev/null differ diff --git a/public/images/types/ice.png b/public/images/types/ice.png deleted file mode 100644 index 57ea33f9b16..00000000000 Binary files a/public/images/types/ice.png and /dev/null differ diff --git a/public/images/types/normal.png b/public/images/types/normal.png deleted file mode 100644 index 92524168f5c..00000000000 Binary files a/public/images/types/normal.png and /dev/null differ diff --git a/public/images/types/poison.png b/public/images/types/poison.png deleted file mode 100644 index c898b4d14a9..00000000000 Binary files a/public/images/types/poison.png and /dev/null differ diff --git a/public/images/types/psychic.png b/public/images/types/psychic.png deleted file mode 100644 index ff55bc54a60..00000000000 Binary files a/public/images/types/psychic.png and /dev/null differ diff --git a/public/images/types/rock.png b/public/images/types/rock.png deleted file mode 100644 index 0a90b780a24..00000000000 Binary files a/public/images/types/rock.png and /dev/null differ diff --git a/public/images/types/steel.png b/public/images/types/steel.png deleted file mode 100644 index 34e2ad73db8..00000000000 Binary files a/public/images/types/steel.png and /dev/null differ diff --git a/public/images/types/stellar.png b/public/images/types/stellar.png deleted file mode 100644 index 6ca5e5bdbc4..00000000000 Binary files a/public/images/types/stellar.png and /dev/null differ diff --git a/public/images/types/unknown.png b/public/images/types/unknown.png deleted file mode 100644 index 607111adefb..00000000000 Binary files a/public/images/types/unknown.png and /dev/null differ diff --git a/public/images/types/water.png b/public/images/types/water.png deleted file mode 100644 index eb618008d00..00000000000 Binary files a/public/images/types/water.png and /dev/null differ diff --git a/public/images/types_pt_BR.json b/public/images/types_pt-BR.json similarity index 99% rename from public/images/types_pt_BR.json rename to public/images/types_pt-BR.json index 932d316fd30..e89bdcba87f 100644 --- a/public/images/types_pt_BR.json +++ b/public/images/types_pt-BR.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_pt_BR.png", + "image": "types_pt-BR.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_pt_BR.png b/public/images/types_pt-BR.png similarity index 100% rename from public/images/types_pt_BR.png rename to public/images/types_pt-BR.png diff --git a/public/images/types_zh_CN.json b/public/images/types_zh-CN.json similarity index 99% rename from public/images/types_zh_CN.json rename to public/images/types_zh-CN.json index 4cd0135a677..e82d3c56468 100644 --- a/public/images/types_zh_CN.json +++ b/public/images/types_zh-CN.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_zh_CN.png", + "image": "types_zh-CN.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_zh-CN.png b/public/images/types_zh-CN.png new file mode 100644 index 00000000000..a1a41a663fd Binary files /dev/null and b/public/images/types_zh-CN.png differ diff --git a/public/images/types_zh_TW.json b/public/images/types_zh-TW.json similarity index 99% rename from public/images/types_zh_TW.json rename to public/images/types_zh-TW.json index e3923b00f02..18c51ab61f4 100644 --- a/public/images/types_zh_TW.json +++ b/public/images/types_zh-TW.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_zh_TW.png", + "image": "types_zh-TW.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_zh_CN.png b/public/images/types_zh-TW.png similarity index 100% rename from public/images/types_zh_CN.png rename to public/images/types_zh-TW.png diff --git a/public/images/types_zh_TW.png b/public/images/types_zh_TW.png deleted file mode 100644 index 8b644f1041c..00000000000 Binary files a/public/images/types_zh_TW.png and /dev/null differ diff --git a/public/images/ui/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/command_fight_labels.png b/public/images/ui/command_fight_labels.png deleted file mode 100644 index c9d6d60c47f..00000000000 Binary files a/public/images/ui/command_fight_labels.png and /dev/null differ diff --git a/public/images/ui/legacy/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/command_fight_labels.png b/public/images/ui/legacy/command_fight_labels.png deleted file mode 100644 index 257d0e5d93f..00000000000 Binary files a/public/images/ui/legacy/command_fight_labels.png and /dev/null differ diff --git a/public/images/ui/legacy/shiny_icons.json b/public/images/ui/legacy/shiny_icons.json new file mode 100644 index 00000000000..698b5b96e72 --- /dev/null +++ b/public/images/ui/legacy/shiny_icons.json @@ -0,0 +1,78 @@ +{ + "textures": [ + { + "image": "shiny_icons.png", + "format": "RGBA8888", + "size": { + "w": 15, + "h": 14 + }, + "scale": 1, + "frames": [ + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + } + } + ] + } + ] +} diff --git a/public/images/ui/legacy/shiny_icons.png b/public/images/ui/legacy/shiny_icons.png new file mode 100644 index 00000000000..f601d908d32 Binary files /dev/null and b/public/images/ui/legacy/shiny_icons.png differ diff --git a/public/images/ui/legacy/summary_moves_effect_pt_BR.png b/public/images/ui/legacy/summary_moves_effect_pt-BR.png similarity index 100% rename from public/images/ui/legacy/summary_moves_effect_pt_BR.png rename to public/images/ui/legacy/summary_moves_effect_pt-BR.png diff --git a/public/images/ui/legacy/summary_moves_effect_zh_CN.png b/public/images/ui/legacy/summary_moves_effect_zh-CN.png similarity index 100% rename from public/images/ui/legacy/summary_moves_effect_zh_CN.png rename to public/images/ui/legacy/summary_moves_effect_zh-CN.png diff --git a/public/images/ui/shiny_icons.json b/public/images/ui/shiny_icons.json new file mode 100644 index 00000000000..698b5b96e72 --- /dev/null +++ b/public/images/ui/shiny_icons.json @@ -0,0 +1,78 @@ +{ + "textures": [ + { + "image": "shiny_icons.png", + "format": "RGBA8888", + "size": { + "w": 15, + "h": 14 + }, + "scale": 1, + "frames": [ + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + } + } + ] + } + ] +} diff --git a/public/images/ui/shiny_icons.png b/public/images/ui/shiny_icons.png new file mode 100644 index 00000000000..f601d908d32 Binary files /dev/null and b/public/images/ui/shiny_icons.png differ diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts index 0c76c169b51..f3a63d6f4ec 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,54 +1,9 @@ -import { AbilityTranslationEntries, SimpleTranslationEntries, AchievementTranslationEntries, BerryTranslationEntries, DialogueTranslationEntries, ModifierTypeTranslationEntries, MoveTranslationEntries, PokemonInfoTranslationEntries } from "#app/interfaces/locales"; +import { enConfig } from "#app/locales/en/config.js"; // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { interface CustomTypeOptions { defaultNS: "menu", // needed here as well for typedoc - resources: { - ability: AbilityTranslationEntries; - abilityTriggers: SimpleTranslationEntries; - achv: AchievementTranslationEntries; - battle: SimpleTranslationEntries; - battleMessageUiHandler: SimpleTranslationEntries; - berry: BerryTranslationEntries; - biome: SimpleTranslationEntries; - challenges: SimpleTranslationEntries; - commandUiHandler: SimpleTranslationEntries; - PGMachv: AchievementTranslationEntries; - PGFachv: AchievementTranslationEntries; - PGMdialogue: DialogueTranslationEntries; - PGFdialogue: DialogueTranslationEntries; - PGMbattleSpecDialogue: SimpleTranslationEntries; - PGFbattleSpecDialogue: SimpleTranslationEntries; - PGMmiscDialogue: SimpleTranslationEntries; - PGFmiscDialogue: SimpleTranslationEntries; - PGMdoubleBattleDialogue: DialogueTranslationEntries; - PGFdoubleBattleDialogue: DialogueTranslationEntries; - egg: SimpleTranslationEntries; - fightUiHandler: SimpleTranslationEntries; - gameMode: SimpleTranslationEntries; - gameStatsUiHandler: SimpleTranslationEntries; - growth: SimpleTranslationEntries; - menu: SimpleTranslationEntries; - menuUiHandler: SimpleTranslationEntries; - modifierType: ModifierTypeTranslationEntries; - move: MoveTranslationEntries; - nature: SimpleTranslationEntries; - partyUiHandler: SimpleTranslationEntries; - pokeball: SimpleTranslationEntries; - pokemon: SimpleTranslationEntries; - pokemonInfo: PokemonInfoTranslationEntries; - pokemonInfoContainer: SimpleTranslationEntries; - saveSlotSelectUiHandler: SimpleTranslationEntries; - settings: SimpleTranslationEntries; - splashMessages: SimpleTranslationEntries; - starterSelectUiHandler: SimpleTranslationEntries; - titles: SimpleTranslationEntries; - trainerClasses: SimpleTranslationEntries; - trainerNames: SimpleTranslationEntries; - tutorial: SimpleTranslationEntries; - voucher: SimpleTranslationEntries; - weather: SimpleTranslationEntries; - }; + resources: typeof enConfig } } diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 43224ab074b..f20c6503229 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -37,7 +37,7 @@ import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "./ui/ui-theme"; import PokemonData from "./system/pokemon-data"; import { Nature } from "./data/nature"; -import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; +import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase"; import { getTypeRgb } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; @@ -66,6 +66,7 @@ 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"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -157,6 +158,8 @@ export default class BattleScene extends SceneBase { public fusionPaletteSwaps: boolean = true; public enableTouchControls: boolean = false; public enableVibration: boolean = false; + public showBgmBar: boolean = true; + /** * Determines the selected battle style. * - 0 = 'Switch' @@ -219,6 +222,7 @@ export default class BattleScene extends SceneBase { public arenaFlyout: ArenaFlyout; private fieldOverlay: Phaser.GameObjects.Rectangle; + private shopOverlay: Phaser.GameObjects.Rectangle; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; public uiContainer: Phaser.GameObjects.Container; @@ -332,7 +336,9 @@ export default class BattleScene extends SceneBase { launchBattle() { this.arenaBg = this.add.sprite(0, 0, "plains_bg"); + this.arenaBg.setName("sprite-arena-bg"); this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); + this.arenaBgTransition.setName("sprite-arena-bg-transition"); [ this.arenaBgTransition, this.arenaBg ].forEach(a => { a.setPipeline(this.fieldSpritePipeline); @@ -342,13 +348,13 @@ export default class BattleScene extends SceneBase { }); const field = this.add.container(0, 0); + field.setName("field"); field.setScale(6); - field.setName("container-field"); this.field = field; const fieldUI = this.add.container(0, this.game.canvas.height); - fieldUI.setName("container-field-ui"); + fieldUI.setName("field-ui"); fieldUI.setDepth(1); fieldUI.setScale(6); @@ -372,7 +378,7 @@ export default class BattleScene extends SceneBase { this.add.existing(transition); const uiContainer = this.add.container(0, 0); - uiContainer.setName("container-ui"); + uiContainer.setName("ui"); uiContainer.setDepth(2); uiContainer.setScale(6); @@ -386,16 +392,22 @@ export default class BattleScene extends SceneBase { this.fieldOverlay.setAlpha(0); this.fieldUI.add(this.fieldOverlay); + this.shopOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x070707); + this.shopOverlay.setName("rect-shop-overlay"); + this.shopOverlay.setOrigin(0, 0); + this.shopOverlay.setAlpha(0); + this.fieldUI.add(this.shopOverlay); + this.modifiers = []; this.enemyModifiers = []; this.modifierBar = new ModifierBar(this); - this.modifierBar.setName("container-modifier-bar"); + this.modifierBar.setName("modifier-bar"); this.add.existing(this.modifierBar); uiContainer.add(this.modifierBar); this.enemyModifierBar = new ModifierBar(this, true); - this.enemyModifierBar.setName("container-enemy-modifier-bar"); + this.enemyModifierBar.setName("enemy-modifier-bar"); this.add.existing(this.enemyModifierBar); uiContainer.add(this.enemyModifierBar); @@ -406,28 +418,28 @@ export default class BattleScene extends SceneBase { this.fieldUI.add(this.charSprite); this.pbTray = new PokeballTray(this, true); - this.pbTray.setName("container-pb-tray"); + this.pbTray.setName("pb-tray"); this.pbTray.setup(); this.pbTrayEnemy = new PokeballTray(this, false); - this.pbTrayEnemy.setName("container-enemy-pb-tray"); + this.pbTrayEnemy.setName("enemy-pb-tray"); this.pbTrayEnemy.setup(); this.fieldUI.add(this.pbTray); this.fieldUI.add(this.pbTrayEnemy); this.abilityBar = new AbilityBar(this); - this.abilityBar.setName("container-ability-bar"); + this.abilityBar.setName("ability-bar"); this.abilityBar.setup(); this.fieldUI.add(this.abilityBar); this.partyExpBar = new PartyExpBar(this); - this.partyExpBar.setName("container-party-exp-bar"); + this.partyExpBar.setName("party-exp-bar"); this.partyExpBar.setup(); this.fieldUI.add(this.partyExpBar); this.candyBar = new CandyBar(this); - this.candyBar.setName("container-candy-bar"); + this.candyBar.setName("candy-bar"); this.candyBar.setup(); this.fieldUI.add(this.candyBar); @@ -452,7 +464,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); @@ -479,13 +491,13 @@ export default class BattleScene extends SceneBase { const loadPokemonAssets = []; this.arenaPlayer = new ArenaBase(this, true); - this.arenaPlayer.setName("container-arena-player"); + this.arenaPlayer.setName("arena-player"); this.arenaPlayerTransition = new ArenaBase(this, true); - this.arenaPlayerTransition.setName("container-arena-player-transition"); + this.arenaPlayerTransition.setName("arena-player-transition"); this.arenaEnemy = new ArenaBase(this, false); - this.arenaEnemy.setName("container-arena-enemy"); + this.arenaEnemy.setName("arena-enemy"); this.arenaNextEnemy = new ArenaBase(this, false); - this.arenaNextEnemy.setName("container-arena-next-enemy"); + this.arenaNextEnemy.setName("arena-next-enemy"); this.arenaBgTransition.setVisible(false); this.arenaPlayerTransition.setVisible(false); @@ -737,6 +749,14 @@ export default class BattleScene extends SceneBase { : ret; } + /** + * Returns the ModifierBar of this scene, which is declared private and therefore not accessible elsewhere + * @returns {ModifierBar} + */ + getModifierBar(): ModifierBar { + return this.modifierBar; + } + // store info toggles to be accessible by the ui addInfoToggle(infoToggle: InfoToggle): void { this.infoToggles.push(infoToggle); @@ -798,8 +818,10 @@ export default class BattleScene extends SceneBase { addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { const container = this.add.container(x, y); + container.setName(`${pokemon.name}-icon`); const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); + icon.setName(`sprite-${pokemon.name}-icon`); icon.setFrame(pokemon.getIconId(true)); // Temporary fix to show pokemon's default icon if variant icon doesn't exist if (icon.frame.name !== pokemon.getIconId(true)) { @@ -816,6 +838,7 @@ export default class BattleScene extends SceneBase { if (pokemon.isFusion()) { const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); + fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pokemon.getFusionIconId(true)); @@ -1100,8 +1123,10 @@ export default class BattleScene extends SceneBase { playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); for (const pokemon of this.getParty()) { - if (pokemon.hasAbility(Abilities.ICE_FACE)) { - pokemon.formIndex = 0; + // Only trigger form change when Eiscue is in Noice form + // Hardcoded Eiscue for now in case it is fused with another pokemon + if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); } pokemon.resetBattleData(); @@ -1202,6 +1227,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: @@ -1397,6 +1423,30 @@ export default class BattleScene extends SceneBase { }); } + showShopOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.shopOverlay, + alpha: 0.8, + ease: "Sine.easeOut", + duration: duration, + onComplete: () => resolve() + }); + }); + } + + hideShopOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.shopOverlay, + alpha: 0, + duration: duration, + ease: "Cubic.easeIn", + onComplete: () => resolve() + }); + }); + } + showEnemyModifierBar(): void { this.enemyModifierBar.setVisible(true); } @@ -1408,6 +1458,7 @@ export default class BattleScene extends SceneBase { updateBiomeWaveText(): void { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); + this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); @@ -1592,6 +1643,7 @@ export default class BattleScene extends SceneBase { : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { + this.ui.bgmBar.setBgmToBgmBar(bgmName); if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { this.bgm.play({ volume: this.masterVolume * this.bgmVolume @@ -1825,6 +1877,8 @@ export default class BattleScene extends SceneBase { return 0.175; case "battle_legendary_ruinous": //SV Treasures of Ruin Battle return 6.333; + case "battle_legendary_kor_mir": //SV Depths of Area Zero Battle + return 6.442; case "battle_legendary_loyal_three": //SV Loyal Three Battle return 6.500; case "battle_legendary_ogerpon": //SV Ogerpon Battle @@ -1847,8 +1901,26 @@ export default class BattleScene extends SceneBase { return 13.940; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; + case "battle_rocket_grunt": //HGSS Team Rocket Battle + return 12.707; + case "battle_aqua_magma_grunt": //ORAS Team Aqua & Magma Battle + return 12.062; + case "battle_galactic_grunt": //BDSP Team Galactic Battle + return 13.043; case "battle_plasma_grunt": //BW Team Plasma Battle return 12.974; + case "battle_flare_grunt": //XY Team Flare Battle + return 4.228; + case "battle_rocket_boss": //USUM Giovanni Battle + return 9.115; + case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle + return 14.847; + case "battle_galactic_boss": //BDSP Cyrus Battle + return 106.962; + case "battle_plasma_boss": //B2W2 Ghetsis Battle + return 25.624; + case "battle_flare_boss": //XY Lysandre Battle + return 8.085; } return 0; diff --git a/src/battle.ts b/src/battle.ts index 97fd8dd064c..3f2519df3e8 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -7,11 +7,13 @@ import { GameMode } from "./game-mode"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; import {trainerConfigs} from "#app/data/trainer-config"; +import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleSpec } from "#enums/battle-spec"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import i18next from "#app/plugins/i18n"; export enum BattleType { WILD, @@ -166,9 +168,16 @@ export default class Battle { const moneyAmount = new Utils.IntegerHolder(scene.currentBattle.moneyScattered); scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + if (scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + scene.addMoney(moneyAmount.value); - scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString("en-US")}!`, null, true); + 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; } @@ -306,6 +315,9 @@ export default class Battle { if (pokemon.species.speciesId === Species.WO_CHIEN || pokemon.species.speciesId === Species.CHIEN_PAO || pokemon.species.speciesId === Species.TING_LU || pokemon.species.speciesId === Species.CHI_YU) { return "battle_legendary_ruinous"; } + if (pokemon.species.speciesId === Species.KORAIDON || pokemon.species.speciesId === Species.MIRAIDON) { + return "battle_legendary_kor_mir"; + } if (pokemon.species.speciesId === Species.OKIDOGI || pokemon.species.speciesId === Species.MUNKIDORI || pokemon.species.speciesId === Species.FEZANDIPITI) { return "battle_legendary_loyal_three"; } @@ -426,8 +438,8 @@ export interface FixedBattleConfigs { /** * Youngster/Lass on 5 * Rival on 8, 55, 95, 145, 195 - * Evil team grunts on 35, 62, 64, 65, 112, 114 (Not currently spawning) - * Evil leader on 115, 165 (Not currently spawning) + * Evil team grunts on 35, 62, 64, 66, 112, 114 + * Evil leader on 115, 165 * E4 on 182, 184, 186, 188 * Champion on 190 */ @@ -438,28 +450,28 @@ export const classicFixedBattles: FixedBattleConfigs = { .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [65]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), + [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), + [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) diff --git a/src/data/ability.ts b/src/data/ability.ts index 5a3f1d7b2cd..2eb9f8caaa7 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6,10 +6,10 @@ import { BattleStat, getBattleStatName } from "./battle-stat"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import { Weather, WeatherType } from "./weather"; -import { BattlerTag } from "./battler-tags"; +import { BattlerTag, GroundedTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr } from "./move"; +import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit } from "./move"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { Stat, getStatName } from "./pokemon-stat"; import { BerryModifier, PokemonHeldItemModifier } from "../modifier/modifier"; @@ -301,18 +301,19 @@ export class StabBoostAbAttr extends AbAttr { export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { protected condition: PokemonDefendCondition; - private powerMultiplier: number; + private damageMultiplier: number; - constructor(condition: PokemonDefendCondition, powerMultiplier: number) { + constructor(condition: PokemonDefendCondition, damageMultiplier: number) { super(); this.condition = condition; - this.powerMultiplier = powerMultiplier; + this.damageMultiplier = damageMultiplier; } applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; + (args[0] as Utils.NumberHolder).value = Math.floor((args[0] as Utils.NumberHolder).value * this.damageMultiplier); + return true; } @@ -321,19 +322,19 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { } export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { - constructor(moveType: Type, powerMultiplier: number) { - super((user, target, move) => move.type === moveType, powerMultiplier); + constructor(moveType: Type, damageMultiplier: number) { + super((user, target, move) => move.type === moveType, damageMultiplier); } } -export class PreDefendMovePowerToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr { +export class PreDefendMoveDamageToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr { constructor(condition: PokemonDefendCondition) { super(condition, 1); } applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = 1; + (args[0] as Utils.NumberHolder).value = Math.floor(pokemon.getMaxHp() / 8); return true; } @@ -360,13 +361,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 @@ -878,7 +879,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; @@ -1230,6 +1231,85 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { } } +/** + * Class for abilities that convert single-strike moves to two-strike moves (i.e. Parental Bond). + * @param damageMultiplier the damage multiplier for the second strike, relative to the first. + */ +export class AddSecondStrikeAbAttr extends PreAttackAbAttr { + private damageMultiplier: number; + + constructor(damageMultiplier: number) { + super(false); + + this.damageMultiplier = damageMultiplier; + } + + /** + * Determines whether this attribute can apply to a given move. + * @param {Move} move the move to which this attribute may apply + * @param numTargets the number of {@linkcode Pokemon} targeted by this move + * @returns true if the attribute can apply to the move, false otherwise + */ + canApplyPreAttack(move: Move, numTargets: integer): boolean { + /** + * Parental Bond cannot apply to multi-hit moves, charging moves, or + * moves that cause the user to faint. + */ + const exceptAttrs: Constructor[] = [ + MultiHitAttr, + ChargeAttr, + SacrificialAttr, + SacrificialAttrOnHit + ]; + + /** Parental Bond cannot apply to these specific moves */ + const exceptMoves: Moves[] = [ + Moves.FLING, + Moves.UPROAR, + Moves.ROLLOUT, + Moves.ICE_BALL, + Moves.ENDEAVOR + ]; + + /** Also check if this move is an Attack move and if it's only targeting one Pokemon */ + return numTargets === 1 + && !exceptAttrs.some(attr => move.hasAttr(attr)) + && !exceptMoves.some(id => move.id === id) + && move.category !== MoveCategory.STATUS; + } + + /** + * If conditions are met, this doubles the move's hit count (via args[1]) + * or multiplies the damage of secondary strikes (via args[2]) + * @param {Pokemon} pokemon the Pokemon using the move + * @param passive n/a + * @param defender n/a + * @param {Move} move the move used by the ability source + * @param args\[0\] the number of Pokemon this move is targeting + * @param {Utils.IntegerHolder} args\[1\] the number of strikes with this move + * @param {Utils.NumberHolder} args\[2\] the damage multiplier for the current strike + * @returns + */ + applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + const numTargets = args[0] as integer; + const hitCount = args[1] as Utils.IntegerHolder; + const multiplier = args[2] as Utils.NumberHolder; + + if (this.canApplyPreAttack(move, numTargets)) { + this.showAbility = !!hitCount?.value; + if (!!hitCount?.value) { + hitCount.value *= 2; + } + + if (!!multiplier?.value && pokemon.turnData.hitsLeft % 2 === 1 && pokemon.turnData.hitsLeft !== pokemon.turnData.hitCount) { + multiplier.value *= this.damageMultiplier; + } + return true; + } + return false; + } +} + /** * Class for abilities that boost the damage of moves * For abilities that boost the base power of moves, see VariableMovePowerAbAttr @@ -1367,7 +1447,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. @@ -1377,6 +1457,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 @@ -1702,7 +1794,18 @@ export class PostIntimidateStatChangeAbAttr extends AbAttr { } } +/** + * Base class for defining all {@linkcode Ability} Attributes post summon + * @see {@linkcode applyPostSummon()} + */ export class PostSummonAbAttr extends AbAttr { + /** + * Applies ability post summon (after switching in) + * @param pokemon {@linkcode Pokemon} with this ability + * @param passive Whether this ability is a passive + * @param args Set of unique arguments needed by this attribute + * @returns true if application of the ability succeeds + */ applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { return false; } @@ -1974,7 +2077,11 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { } } -export class TraceAbAttr extends PostSummonAbAttr { +/** Attempts to copy a pokemon's ability */ +export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { + private target: Pokemon; + private targetAbilityName: string; + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (!targets.length) { @@ -1988,18 +2095,57 @@ export class TraceAbAttr extends PostSummonAbAttr { target = targets[0]; } - // Wonder Guard is normally uncopiable so has the attribute, but trace specifically can copy it - if (target.getAbility().hasAttr(UncopiableAbilityAbAttr) && target.getAbility().id !== Abilities.WONDER_GUARD) { + if ( + target.getAbility().hasAttr(UncopiableAbilityAbAttr) && + // Wonder Guard is normally uncopiable so has the attribute, but Trace specifically can copy it + !(pokemon.hasAbility(Abilities.TRACE) && target.getAbility().id === Abilities.WONDER_GUARD) + ) { return false; } + this.target = target; + this.targetAbilityName = allAbilities[target.getAbility().id].name; pokemon.summonData.ability = target.getAbility().id; - - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` traced ${target.name}'s\n${allAbilities[target.getAbility().id].name}!`)); setAbilityRevealed(target); + pokemon.updateInfo(); return true; } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:trace", { + pokemonName: getPokemonNameWithAffix(pokemon), + targetName: getPokemonNameWithAffix(this.target), + abilityName: this.targetAbilityName, + }); + } +} + + +/** Attempt to copy the stat changes on an ally pokemon */ +export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + if (!pokemon.scene.currentBattle.double) { + return false; + } + + const ally = pokemon.getAlly(); + if (!ally || ally.summonData.battleStats.every((change) => change === 0)) { + return false; + } + + pokemon.summonData.battleStats = ally.summonData.battleStats; + pokemon.updateInfo(); + + return true; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:costar", { + pokemonName: getPokemonNameWithAffix(pokemon), + allyName: getPokemonNameWithAffix(pokemon.getAlly()), + }); + } } export class PostSummonTransformAbAttr extends PostSummonAbAttr { @@ -2350,7 +2496,7 @@ export class BlockNonDirectDamageAbAttr extends AbAttr { /** * This attribute will block any status damage that you put in the parameter. */ -export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { +export class BlockStatusDamageAbAttr extends AbAttr { private effects: StatusEffect[]; /** @@ -2370,7 +2516,7 @@ export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { * @returns Returns true if status damage is blocked */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.effects.includes(pokemon.status.effect)) { + if (this.effects.includes(pokemon.status?.effect)) { cancelled.value = true; return true; } @@ -2484,6 +2630,9 @@ function getSheerForceHitDisableAbCondition(): AbAttrCondition { function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { return (pokemon: Pokemon) => { + if (!pokemon.scene?.arena) { + return false; + } if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) { return false; } @@ -2669,15 +2818,11 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { } applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); - pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); - return true; - } - - return false; + const scene = pokemon.scene; + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); + pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); + return true; } } @@ -2778,7 +2923,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; @@ -3729,6 +3874,54 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt } } +/** + * If a Pokémon with this Ability selects a damaging move, it has a 30% chance of going first in its priority bracket. If the Ability activates, this is announced at the start of the turn (after move selection). + * + * @extends AbAttr + */ +export class BypassSpeedChanceAbAttr extends AbAttr { + public chance: integer; + + /** + * @param {integer} chance probability of ability being active. + */ + constructor(chance: integer) { + super(true); + this.chance = chance; + } + + /** + * bypass move order in their priority bracket when pokemon choose damaging move + * @param {Pokemon} pokemon {@linkcode Pokemon} the Pokemon applying this ability + * @param {boolean} passive N/A + * @param {Utils.BooleanHolder} cancelled N/A + * @param {any[]} args [0] {@linkcode Utils.BooleanHolder} set to true when the ability activated + * @returns {boolean} - whether the ability was activated. + */ + apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + const bypassSpeed = args[0] as Utils.BooleanHolder; + + if (!bypassSpeed.value && pokemon.randSeedInt(100) < this.chance) { + const turnCommand = + pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = allMoves[turnCommand.move?.move]; + const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; + + if (isCommandFight && isDamageMove) { + bypassSpeed.value = true; + return true; + } + } + + return false; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:quickDraw", {pokemonName: getPokemonNameWithAffix(pokemon)}); + } +} + function applyAbAttrsInternal(attrType: Constructor, pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { return new Promise(resolve => { @@ -4053,7 +4246,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED)) + .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), @@ -4083,7 +4276,7 @@ export function initAbilities() { .attr(DoubleBattleChanceAbAttr) .ignorable(), new Ability(Abilities.TRACE, 3) - .attr(TraceAbAttr) + .attr(PostSummonCopyAbilityAbAttr) .attr(UncopiableAbilityAbAttr), new Ability(Abilities.HUGE_POWER, 3) .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 2), @@ -4486,8 +4679,8 @@ export function initAbilities() { .attr(HealFromBerryUseAbAttr, 1/3) .partial(), // Healing not blocked by Heal Block new Ability(Abilities.PROTEAN, 6) - .attr(PokemonTypeChangeAbAttr) - .condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), + .attr(PokemonTypeChangeAbAttr), + //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation new Ability(Abilities.FUR_COAT, 6) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, 0.5) .ignorable(), @@ -4530,7 +4723,7 @@ export function initAbilities() { new Ability(Abilities.AERILATE, 6) .attr(MoveTypeChangeAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL), new Ability(Abilities.PARENTAL_BOND, 6) - .unimplemented(), + .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Dark Aura!")) .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), @@ -4539,7 +4732,8 @@ export function initAbilities() { .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .unimplemented(), + .conditionalAttr(target => target.hasAbility(Abilities.DARK_AURA), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) + .conditionalAttr(target => target.hasAbility(Abilities.FAIRY_AURA), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16), new Ability(Abilities.PRIMORDIAL_SEA, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) @@ -4615,7 +4809,7 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .bypassFaint(), new Ability(Abilities.DISGUISE, 7) - .attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) + .attr(PreDefendMoveDamageToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) .attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) .attr(PostBattleInitFormChangeAbAttr, () => 0) .attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) @@ -4729,8 +4923,8 @@ export function initAbilities() { .attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true) .condition(getOncePerBattleCondition(Abilities.DAUNTLESS_SHIELD)), new Ability(Abilities.LIBERO, 8) - .attr(PokemonTypeChangeAbAttr) - .condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), + .attr(PokemonTypeChangeAbAttr), + //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), //Gen 9 Implementation new Ability(Abilities.BALL_FETCH, 8) .attr(FetchBallAbAttr) .condition(getOncePerBattleCondition(Abilities.BALL_FETCH)), @@ -4783,8 +4977,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) @@ -4812,7 +5005,7 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .condition((pokemon) => !pokemon.isTerastallized()), new Ability(Abilities.QUICK_DRAW, 8) - .unimplemented(), + .attr(BypassSpeedChanceAbAttr, 30), new Ability(Abilities.UNSEEN_FIST, 8) .attr(IgnoreProtectOnContactAbAttr), new Ability(Abilities.CURIOUS_MEDICINE, 8) @@ -4938,7 +5131,7 @@ export function initAbilities() { .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5)) .partial(), new Ability(Abilities.COSTAR, 9) - .unimplemented(), + .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) .attr(PostDefendApplyArenaTrapTagAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, ArenaTagType.TOXIC_SPIKES) .bypassFaint(), diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 81ba4b17005..28d38daffb4 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -4,7 +4,7 @@ import * as Utils from "../utils"; import { MoveCategory, allMoves, MoveTarget } from "./move"; import { getPokemonMessage } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; -import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase} from "../phases"; +import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; import { BattlerIndex } from "../battle"; import { BlockNonDirectDamageAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; @@ -63,6 +63,10 @@ export abstract class ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mist_(move) Mist}. + * Prevents Pokémon on the opposing side from lowering the stats of the Pokémon in the Mist. + */ export class MistTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side); @@ -86,37 +90,57 @@ export class MistTag extends ArenaTag { } } +/** + * Reduces the damage of specific move categories in the arena. + * @extends ArenaTag + */ export class WeakenMoveScreenTag extends ArenaTag { - constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide) { + protected weakenedCategories: MoveCategory[]; + + /** + * Creates a new instance of the WeakenMoveScreenTag class. + * + * @param tagType - The type of the arena tag. + * @param turnCount - The number of turns the tag is active. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + * @param side - The side (player or enemy) the tag affects. + * @param weakenedCategories - The categories of moves that are weakened by this tag. + */ + constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, weakenedCategories: MoveCategory[]) { super(tagType, turnCount, sourceMove, sourceId, side); + + this.weakenedCategories = weakenedCategories; } + /** + * Applies the weakening effect to the move. + * + * @param arena - The arena where the move is applied. + * @param args - The arguments for the move application. + * @param args[0] - The category of the move. + * @param args[1] - A boolean indicating whether it is a double battle. + * @param args[2] - An object of type `Utils.NumberHolder` that holds the damage multiplier + * + * @returns True if the move was weakened, otherwise false. + */ apply(arena: Arena, args: any[]): boolean { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } - return true; - } -} - -class ReflectTag extends WeakenMoveScreenTag { - constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side); - } - - apply(arena: Arena, args: any[]): boolean { - if ((args[0] as MoveCategory) === MoveCategory.PHYSICAL) { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } + if (this.weakenedCategories.includes((args[0] as MoveCategory))) { + (args[2] as Utils.NumberHolder).value = (args[1] as boolean) ? 2732/4096 : 0.5; return true; } return false; } +} + +/** + * Reduces the damage of physical moves. + * Used by {@linkcode Moves.REFLECT} + */ +class ReflectTag extends WeakenMoveScreenTag { + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]); + } onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { @@ -125,21 +149,13 @@ class ReflectTag extends WeakenMoveScreenTag { } } +/** + * Reduces the damage of special moves. + * Used by {@linkcode Moves.LIGHT_SCREEN} + */ class LightScreenTag extends WeakenMoveScreenTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side); - } - - apply(arena: Arena, args: any[]): boolean { - if ((args[0] as MoveCategory) === MoveCategory.SPECIAL) { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } - return true; - } - return false; + super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]); } onAdd(arena: Arena, quiet: boolean = false): void { @@ -149,9 +165,13 @@ class LightScreenTag extends WeakenMoveScreenTag { } } +/** + * Reduces the damage of physical and special moves. + * Used by {@linkcode Moves.AURORA_VEIL} + */ class AuroraVeilTag extends WeakenMoveScreenTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side); + super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL]); } onAdd(arena: Arena, quiet: boolean = false): void { @@ -283,6 +303,10 @@ class CraftyShieldTag extends ConditionalProtectTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wish_(move) Wish}. + * Heals the Pokémon in the user's position the turn after Wish is used. + */ class WishTag extends ArenaTag { private battlerIndex: BattlerIndex; private triggerMessage: string; @@ -308,9 +332,21 @@ class WishTag extends ArenaTag { } } +/** + * Abstract class to implement weakened moves of a specific type. + */ export class WeakenMoveTypeTag extends ArenaTag { private weakenedType: Type; + /** + * Creates a new instance of the WeakenMoveTypeTag class. + * + * @param tagType - The type of the arena tag. + * @param turnCount - The number of turns the tag is active. + * @param type - The type being weakened from this tag. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + */ constructor(tagType: ArenaTagType, turnCount: integer, type: Type, sourceMove: Moves, sourceId: integer) { super(tagType, turnCount, sourceMove, sourceId); @@ -327,6 +363,10 @@ export class WeakenMoveTypeTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mud_Sport_(move) Mud Sport}. + * Weakens Electric type moves for a set amount of turns, usually 5. + */ class MudSportTag extends WeakenMoveTypeTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId); @@ -341,6 +381,10 @@ class MudSportTag extends WeakenMoveTypeTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Water_Sport_(move) Water Sport}. + * Weakens Fire type moves for a set amount of turns, usually 5. + */ class WaterSportTag extends WeakenMoveTypeTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId); @@ -355,10 +399,22 @@ class WaterSportTag extends WeakenMoveTypeTag { } } +/** + * Abstract class to implement arena traps. + */ export class ArenaTrapTag extends ArenaTag { public layers: integer; public maxLayers: integer; + /** + * Creates a new instance of the ArenaTrapTag class. + * + * @param tagType - The type of the arena tag. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + * @param side - The side (player or enemy) the tag affects. + * @param maxLayers - The maximum amount of layers this tag can have. + */ constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, maxLayers: integer) { super(tagType, 0, sourceMove, sourceId, side); @@ -392,6 +448,11 @@ export class ArenaTrapTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Spikes_(move) Spikes}. + * Applies up to 3 layers of Spikes, dealing 1/8th, 1/6th, or 1/4th of the the Pokémon's HP + * in damage for 1, 2, or 3 layers of Spikes respectively if they are summoned into this trap. + */ class SpikesTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3); @@ -428,6 +489,12 @@ class SpikesTag extends ArenaTrapTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Spikes_(move) Toxic Spikes}. + * Applies up to 2 layers of Toxic Spikes, poisoning or badly poisoning any Pokémon who is + * summoned into this trap if 1 or 2 layers of Toxic Spikes respectively are up. Poison-type + * Pokémon summoned into this trap remove it entirely. + */ class ToxicSpikesTag extends ArenaTrapTag { private neutralized: boolean; @@ -481,6 +548,11 @@ class ToxicSpikesTag extends ArenaTrapTag { } } +/** + * Arena Tag class for delayed attacks, such as {@linkcode Moves.FUTURE_SIGHT} or {@linkcode Moves.DOOM_DESIRE}. + * Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used), + * and deals damage after the turn count is reached. + */ class DelayedAttackTag extends ArenaTag { public targetIndex: BattlerIndex; @@ -503,6 +575,11 @@ class DelayedAttackTag extends ArenaTag { onRemove(arena: Arena): void { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Stealth_Rock_(move) Stealth Rock}. + * Applies up to 1 layer of Stealth Rocks, dealing percentage-based damage to any Pokémon + * who is summoned into the trap, based on the Rock type's type effectiveness. + */ class StealthRockTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1); @@ -574,6 +651,11 @@ class StealthRockTag extends ArenaTrapTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Web_(move) Sticky Web}. + * Applies up to 1 layer of Sticky Web, which lowers the Speed by one stage + * to any Pokémon who is summoned into this trap. + */ class StickyWebTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1); @@ -606,6 +688,11 @@ class StickyWebTag extends ArenaTrapTag { } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Trick_Room_(move) Trick Room}. + * Reverses the Speed stats for all Pokémon on the field as long as this arena tag is up, + * also reversing the turn order for all Pokémon on the field as well. + */ export class TrickRoomTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.TRICK_ROOM, turnCount, Moves.TRICK_ROOM, sourceId); @@ -626,6 +713,11 @@ export class TrickRoomTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) Gravity}. + * Grounds all Pokémon on the field, including Flying-types and those with + * {@linkcode Abilities.LEVITATE} for the duration of the arena tag, usually 5 turns. + */ export class GravityTag extends ArenaTag { constructor(turnCount: integer) { super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY); @@ -645,6 +737,11 @@ export class GravityTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Tailwind_(move) Tailwind}. + * Doubles the Speed of the Pokémon who created this arena tag, as well as all allied Pokémon. + * Applies this arena tag for 4 turns (including the turn the move was used). + */ class TailwindTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side); @@ -679,6 +776,24 @@ class TailwindTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Happy_Hour_(move) Happy Hour}. + * Doubles the prize money from trainers and money moves like {@linkcode Moves.PAY_DAY} and {@linkcode Moves.MAKE_IT_RAIN}. + */ +class HappyHourTag extends ArenaTag { + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side); + } + + onAdd(arena: Arena): void { + arena.scene.queueMessage("Everyone is caught up in the happy atmosphere!"); + } + + onRemove(arena: Arena): void { + arena.scene.queueMessage("The atmosphere returned to normal."); + } +} + export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag { switch (tagType) { case ArenaTagType.MIST: @@ -720,5 +835,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new AuroraVeilTag(turnCount, sourceId, side); case ArenaTagType.TAILWIND: return new TailwindTag(turnCount, sourceId, side); + case ArenaTagType.HAPPY_HOUR: + return new HappyHourTag(turnCount, sourceId, side); } } diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 86764f9973a..7dccd4f8a7c 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -32,34 +32,38 @@ export function getBattleStatName(stat: BattleStat) { } } -export function getBattleStatLevelChangeDescription(levels: integer, up: boolean) { - if (up) { - switch (levels) { - case 1: - return i18next.t("battle:statRose"); - case 2: - return i18next.t("battle:statSharplyRose"); - case 3: - case 4: - case 5: - case 6: - return i18next.t("battle:statRoseDrastically"); - default: - return i18next.t("battle:statWontGoAnyHigher"); +export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean) { + const stringKey = (() => { + if (up) { + switch (levels) { + case 1: + return "battle:statRose"; + case 2: + return "battle:statSharplyRose"; + case 3: + case 4: + case 5: + case 6: + return "battle:statRoseDrastically"; + default: + return "battle:statWontGoAnyHigher"; + } + } else { + switch (levels) { + case 1: + return "battle:statFell"; + case 2: + return "battle:statHarshlyFell"; + case 3: + case 4: + case 5: + case 6: + return "battle:statSeverelyFell"; + default: + return "battle:statWontGoAnyLower"; + } } - } else { - switch (levels) { - case 1: - return i18next.t("battle:statFell"); - case 2: - return i18next.t("battle:statHarshlyFell"); - case 3: - case 4: - case 5: - case 6: - return i18next.t("battle:statSeverelyFell"); - default: - return i18next.t("battle:statWontGoAnyLower"); - } - } + })(); + + return i18next.t(stringKey, { pokemonNameWithAffix, stats }); } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 4e2a4e06d3c..41b6f73ec28 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -896,6 +896,12 @@ export class ProtectedTag extends BattlerTag { if (lapseType === BattlerTagLapseType.CUSTOM) { new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(pokemon.scene); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + + // Stop multi-hit moves early + const effectPhase = pokemon.scene.getCurrentPhase(); + if (effectPhase instanceof MoveEffectPhase) { + effectPhase.stopMultiHit(pokemon); + } return true; } @@ -928,7 +934,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); + } } } @@ -1258,7 +1266,7 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } } -export class HideSpriteTag extends BattlerTag { +export class SemiInvulnerableTag extends BattlerTag { constructor(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves) { super(tagType, BattlerTagLapseType.MOVE_EFFECT, turnCount, sourceMove); } @@ -1467,6 +1475,17 @@ export class CursedTag extends BattlerTag { } } +/** + * Battler tag for effects that ground the source, allowing Ground-type moves to hit them. Encompasses two tag types: + * @item IGNORE_FLYING: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) + * @item ROOSTED: One-turn grounding effects (i.e. from Roost) + */ +export class GroundedTag extends BattlerTag { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: Moves) { + super(tagType, lapseType, 1, sourceMove); + } +} + /** * Provides the Ice Face ability's effects. */ @@ -1604,7 +1623,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.UNDERGROUND: case BattlerTagType.UNDERWATER: case BattlerTagType.HIDDEN: - return new HideSpriteTag(tagType, turnCount, sourceMove); + return new SemiInvulnerableTag(tagType, turnCount, sourceMove); case BattlerTagType.FIRE_BOOST: return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); case BattlerTagType.CRIT_BOOST: @@ -1618,9 +1637,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.BYPASS_SLEEP: return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); - case BattlerTagType.GROUNDED: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount - 1, sourceMove); + return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); + case BattlerTagType.ROOSTED: + return new GroundedTag(tagType, BattlerTagLapseType.TURN_END, sourceMove); case BattlerTagType.SALT_CURED: return new SaltCuredTag(sourceId); case BattlerTagType.CURSED: diff --git a/src/data/berry.ts b/src/data/berry.ts index 4e0d1dbd85f..2f0f466d8a9 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 { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult } from "../field/pokemon"; import { BattleStat } from "./battle-stat"; import { getStatusEffectHealText } from "./status-effect"; @@ -80,7 +80,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { pokemon.battleData.berriesEaten.push(berryType); } if (pokemon.status) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); } pokemon.resetStatus(true, true); pokemon.updateInfo(); diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 5c689ef7345..75b200b24ee 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -12,6 +12,7 @@ import { pokemonFormChanges } from "./pokemon-forms"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { TypeColor, TypeShadow } from "#app/enums/color.js"; /** * An enum for all the challenge types. The parameter entries on these describe the @@ -160,7 +161,7 @@ export abstract class Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`); + return `${i18next.t("challenges:usePokemon")}${i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`)}`; } /** @@ -347,6 +348,37 @@ export class SingleGenerationChallenge extends Challenge { return this.value > 0 ? 1 : 0; } + /** + * Returns the textual representation of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised name for the current value. + */ + getValue(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + if (this.value === 0) { + return i18next.t("settings:off"); + } + return i18next.t(`starterSelectUiHandler:gen${this.value}`); + } + + /** + * Returns the description of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised description for the current value. + */ + getDescription(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + if (this.value === 0) { + return i18next.t("challenges:singleGeneration.desc_default"); + } + return i18next.t("challenges:singleGeneration.desc", { gen: i18next.t(`challenges:singleGeneration.gen_${this.value}`) }); + } + + static loadChallenge(source: SingleGenerationChallenge | any): SingleGenerationChallenge { const newChallenge = new SingleGenerationChallenge(); newChallenge.value = source.value; @@ -438,6 +470,34 @@ export class SingleTypeChallenge extends Challenge { return this.value > 0 ? 1 : 0; } + /** + * Returns the textual representation of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised name for the current value. + */ + getValue(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + return Type[this.value - 1].toLowerCase(); + } + + /** + * Returns the description of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised description for the current value. + */ + getDescription(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`); + const typeColor = `[color=${TypeColor[Type[this.value-1]]}][shadow=${TypeShadow[Type[this.value-1]]}]${type}[/shadow][/color]`; + const defaultDesc = i18next.t("challenges:singleType.desc_default"); + const typeDesc = i18next.t("challenges:singleType.desc", {type: typeColor}); + return this.value === 0 ? defaultDesc : typeDesc; + } + static loadChallenge(source: SingleTypeChallenge | any): SingleTypeChallenge { const newChallenge = new SingleTypeChallenge(); newChallenge.value = source.value; diff --git a/src/data/egg.ts b/src/data/egg.ts index ec82143e727..bb952d71fb0 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,97 +1,526 @@ import BattleScene from "../battle-scene"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; +import { VariantTier } from "../enums/variant-tiers"; +import * as Utils from "../utils"; +import * as Overrides from "../overrides"; +import { pokemonPrevolutions } from "./pokemon-evolutions"; +import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export const EGG_SEED = 1073741824; -export enum GachaType { - MOVE, - LEGENDARY, - SHINY +// Rates for specific random properties in 1/x +const DEFAULT_SHINY_RATE = 128; +const GACHA_SHINY_UP_SHINY_RATE = 64; +const SAME_SPECIES_EGG_SHINY_RATE = 32; +const SAME_SPECIES_EGG_HA_RATE = 16; +const MANAPHY_EGG_MANAPHY_RATE = 8; + +// 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs +const DEFAULT_RARE_EGGMOVE_RATE = 6; +const SAME_SPECIES_EGG_RARE_EGGMOVE_RATE = 3; +const GACHA_MOVE_UP_RARE_EGGMOVE_RATE = 3; + +/** Egg options to override egg properties */ +export interface IEggOptions { + /** Id. Used to check if egg type will be manaphy (id % 204 === 0) */ + id?: number; + /** Timestamp when this egg got created */ + timestamp?: number; + /** Defines if the egg got pulled from a gacha or not. If true, egg pity and pull statistics will be applyed. + * Egg will be automaticly added to the game data. + * NEEDS scene eggOption to work. + */ + pulled?: boolean; + /** Defines where the egg comes from. Applies specific modifiers. + * Will also define the text displayed in the egg list. + */ + sourceType?: EggSourceType; + /** Needs to be defined if eggOption pulled is defined or if no species or isShiny is degined since this will be needed to generate them. */ + scene?: BattleScene; + /** Sets the tier of the egg. Only species of this tier can be hatched from this egg. + * Tier will be overriden if species eggOption is set. + */ + tier?: EggTier; + /** Sets how many waves it will take till this egg hatches. */ + hatchWaves?: number; + /** Sets the exact species that will hatch from this egg. + * Needs scene eggOption if not provided. + */ + species?: Species; + /** Defines if the hatched pokemon will be a shiny. */ + isShiny?: boolean; + /** Defines the variant of the pokemon that will hatch from this egg. If no variantTier is given the normal variant rates will apply. */ + variantTier?: VariantTier; + /** Defines which egg move will be unlocked. 3 = rare egg move. */ + eggMoveIndex?: number; + /** Defines if the egg will hatch with the hidden ability of this species. + * If no hidden ability exist, a random one will get choosen. + */ + overrideHiddenAbility?: boolean } export class Egg { - public id: integer; - public tier: EggTier; - public gachaType: GachaType; - public hatchWaves: integer; - public timestamp: integer; - constructor(id: integer, gachaType: GachaType, hatchWaves: integer, timestamp: integer) { - this.id = id; - this.tier = Math.floor(id / EGG_SEED); - this.gachaType = gachaType; - this.hatchWaves = hatchWaves; - this.timestamp = timestamp; + //// + // #region Privat properties + //// + + private _id: number; + private _tier: EggTier; + private _sourceType: EggSourceType | undefined; + private _hatchWaves: number; + private _timestamp: number; + + private _species: Species; + private _isShiny: boolean; + private _variantTier: VariantTier; + private _eggMoveIndex: number; + + private _overrideHiddenAbility: boolean; + + //// + // #endregion + //// + + //// + // #region Public facing properties + //// + get id(): number { + return this._id; } - isManaphyEgg(): boolean { - return this.tier === EggTier.COMMON && !(this.id % 204); + get tier(): EggTier { + return this._tier; } - getKey(): string { + get sourceType(): EggSourceType | undefined { + return this._sourceType; + } + + get hatchWaves(): number { + return this._hatchWaves; + } + + set hatchWaves(value: number) { + this._hatchWaves = value; + } + + get timestamp(): number { + return this._timestamp; + } + + get species(): Species { + return this._species; + } + + get isShiny(): boolean { + return this._isShiny; + } + + get variantTier(): VariantTier { + return this._variantTier; + } + + get eggMoveIndex(): number { + return this._eggMoveIndex; + } + + get overrideHiddenAbility(): boolean { + return this._overrideHiddenAbility; + } + + //// + // #endregion + //// + + constructor(eggOptions?: IEggOptions) { + //if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.") + + this._sourceType = eggOptions.sourceType ?? undefined; + // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced + this._tier = eggOptions.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); + // If egg was pulled, check if egg pity needs to override the egg tier + if (eggOptions.pulled) { + // Needs this._tier and this._sourceType to work + this.checkForPityTierOverrides(eggOptions.scene); + } + + this._id = eggOptions.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier); + + this._sourceType = eggOptions.sourceType ?? undefined; + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + this._timestamp = eggOptions.timestamp ?? new Date().getTime(); + + // First roll shiny and variant so we can filter if species with an variant exist + this._isShiny = eggOptions.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); + this._variantTier = eggOptions.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant()); + this._species = eggOptions.species ?? this.rollSpecies(eggOptions.scene); + + this._overrideHiddenAbility = eggOptions.overrideHiddenAbility ?? false; + + // Override egg tier and hatchwaves if species was given + if (eggOptions.species) { + this._tier = this.getEggTierFromSpeciesStarterValue(); + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + // If species has no variant, set variantTier to common. This needs to + // be done because species with no variants get filtered at rollSpecies but since the + // species is set the check never happens + if (!getPokemonSpecies(this.species).hasVariants()) { + this._variantTier = VariantTier.COMMON; + } + } + // Needs this._tier so it needs to be generated afer the tier override if bought from same species + this._eggMoveIndex = eggOptions.eggMoveIndex ?? this.rollEggMoveIndex(); + if (eggOptions.pulled) { + this.increasePullStatistic(eggOptions.scene); + this.addEggToGameData(eggOptions.scene); + } + } + + //// + // #region Public methodes + //// + + public isManaphyEgg(): boolean { + return (this._species === Species.PHIONE || this._species === Species.MANAPHY) || + this._tier === EggTier.COMMON && !(this._id % 204) && !this._species; + } + + public getKey(): string { if (this.isManaphyEgg()) { return "manaphy"; } - return this.tier.toString(); + return this._tier.toString(); } + + // Generates a PlayerPokemon from an egg + public generatePlayerPokemon(scene: BattleScene): PlayerPokemon { + // Legacy egg wants to hatch. Generate missing properties + if (!this._species) { + this._isShiny = this.rollShiny(); + this._species = this.rollSpecies(scene); + } + + const pokemonSpecies = getPokemonSpecies(this._species); + + // Sets the hidden ability if a hidden ability exists and the override is set + // or if the same species egg hits the chance + let abilityIndex = undefined; + if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility + || (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)))) { + abilityIndex = pokemonSpecies.ability2 ? 2 : 1; + } + + // This function has way to many optional parameters + const ret: PlayerPokemon = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false); + ret.shiny = this._isShiny; + ret.variant = this._variantTier; + + const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); + + for (let s = 0; s < ret.ivs.length; s++) { + ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); + } + + return ret; + } + + // Doesn't need to be called if the egg got pulled by a gacha machiene + public addEggToGameData(scene: BattleScene): void { + scene.gameData.eggs.push(this); + } + + public getEggDescriptor(): string { + if (this.isManaphyEgg()) { + return "Manaphy"; + } + switch (this.tier) { + case EggTier.GREAT: + return i18next.t("egg:greatTier"); + case EggTier.ULTRA: + return i18next.t("egg:ultraTier"); + case EggTier.MASTER: + return i18next.t("egg:masterTier"); + default: + return i18next.t("egg:defaultTier"); + } + } + + public getEggHatchWavesMessage(): string { + if (this.hatchWaves <= 5) { + return i18next.t("egg:hatchWavesMessageSoon"); + } + if (this.hatchWaves <= 15) { + return i18next.t("egg:hatchWavesMessageClose"); + } + if (this.hatchWaves <= 50) { + return i18next.t("egg:hatchWavesMessageNotClose"); + } + return i18next.t("egg:hatchWavesMessageLongTime"); + } + + public getEggTypeDescriptor(scene: BattleScene): string { + switch (this.sourceType) { + case EggSourceType.SAME_SPECIES_EGG: + return i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName()}); + case EggSourceType.GACHA_LEGENDARY: + return `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp)).getName()})`; + case EggSourceType.GACHA_SHINY: + return i18next.t("egg:gachaTypeShiny"); + case EggSourceType.GACHA_MOVE: + return i18next.t("egg:gachaTypeMove"); + } + } + + //// + // #endregion + //// + + //// + // #region Private methodes + //// + + private rollEggMoveIndex() { + let baseChance = DEFAULT_RARE_EGGMOVE_RATE; + switch (this._sourceType) { + case EggSourceType.SAME_SPECIES_EGG: + baseChance = SAME_SPECIES_EGG_RARE_EGGMOVE_RATE; + break; + case EggSourceType.GACHA_MOVE: + baseChance = GACHA_MOVE_UP_RARE_EGGMOVE_RATE; + break; + default: + break; + } + + return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier)) ? Utils.randSeedInt(3) : 3; + } + + private getEggTierDefaultHatchWaves(eggTier?: EggTier): number { + if (this._species === Species.PHIONE || this._species === Species.MANAPHY) { + return 50; + } + + switch (eggTier ?? this._tier) { + case EggTier.COMMON: + return 10; + case EggTier.GREAT: + return 25; + case EggTier.ULTRA: + return 50; + } + return 100; + } + + private rollEggTier(): EggTier { + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + const tierValue = Utils.randInt(256); + return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; + } + + private rollSpecies(scene: BattleScene): Species { + if (!scene) { + return undefined; + } + /** + * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione + * Legendary eggs pulled from the legendary gacha have a 50% of being converted into + * the species that was the legendary focus at the time + */ + if (this.isManaphyEgg()) { + const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE); + return rand ? Species.PHIONE : Species.MANAPHY; + } else if (this.tier === EggTier.MASTER + && this._sourceType === EggSourceType.GACHA_LEGENDARY) { + if (!Utils.randSeedInt(2)) { + return getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp); + } + } + + let minStarterValue: integer; + let maxStarterValue: integer; + + switch (this.tier) { + case EggTier.GREAT: + minStarterValue = 4; + maxStarterValue = 5; + break; + case EggTier.ULTRA: + minStarterValue = 6; + maxStarterValue = 7; + break; + case EggTier.MASTER: + minStarterValue = 8; + maxStarterValue = 9; + break; + default: + minStarterValue = 1; + maxStarterValue = 3; + break; + } + + const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS]; + + let speciesPool = Object.keys(speciesStarters) + .filter(s => speciesStarters[s] >= minStarterValue && speciesStarters[s] <= maxStarterValue) + .map(s => parseInt(s) as Species) + .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); + + // If this is the 10th egg without unlocking something new, attempt to force it. + if (scene.gameData.unlockPity[this.tier] >= 9) { + const lockedPool = speciesPool.filter(s => !scene.gameData.dexData[s].caughtAttr && !scene.gameData.eggs.some(e => e.species === s)); + if (lockedPool.length) { // Skip this if everything is unlocked + speciesPool = lockedPool; + } + } + + // If egg variant is set to RARE or EPIC, filter species pool to only include ones with variants. + if (this.variantTier && (this.variantTier === VariantTier.RARE || this.variantTier === VariantTier.EPIC)) { + speciesPool = speciesPool.filter(s => getPokemonSpecies(s).hasVariants()); + } + + /** + * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty + * 1 cost mons get 2x + * 2 cost mons get 1.5x + * 4, 6, 8 cost mons get 1.75x + * 3, 5, 7, 9 cost mons get 1x + * Alolan, Galarian, and Paldean mons get 0.5x + * Hisui mons get 0.125x + * + * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once + * and being the same each time + */ + let totalWeight = 0; + const speciesWeights = []; + for (const speciesId of speciesPool) { + let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); + const species = getPokemonSpecies(speciesId); + if (species.isRegional()) { + weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); + } + speciesWeights.push(totalWeight + weight); + totalWeight += weight; + } + + let species: Species; + + const rand = Utils.randSeedInt(totalWeight); + for (let s = 0; s < speciesWeights.length; s++) { + if (rand < speciesWeights[s]) { + species = speciesPool[s]; + break; + } + } + + if (!!scene.gameData.dexData[species].caughtAttr || scene.gameData.eggs.some(e => e.species === species)) { + scene.gameData.unlockPity[this.tier] = Math.min(scene.gameData.unlockPity[this.tier] + 1, 10); + } else { + scene.gameData.unlockPity[this.tier] = 0; + } + + return species; + } + + /** + * Rolls whether the egg is shiny or not. + * @returns True if the egg is shiny + **/ + private rollShiny(): boolean { + let shinyChance = DEFAULT_SHINY_RATE; + switch (this._sourceType) { + case EggSourceType.GACHA_SHINY: + shinyChance = GACHA_SHINY_UP_SHINY_RATE; + break; + case EggSourceType.SAME_SPECIES_EGG: + shinyChance = SAME_SPECIES_EGG_SHINY_RATE; + break; + default: + break; + } + + return !Utils.randSeedInt(shinyChance); + } + + // Uses the same logic as pokemon.generateVariant(). I would like to only have this logic in one + // place but I don't want to touch the pokemon class. + private rollVariant(): VariantTier { + if (!this.isShiny) { + return VariantTier.COMMON; + } + + const rand = Utils.randSeedInt(10); + if (rand >= 4) { + return VariantTier.COMMON; // 6/10 + } else if (rand >= 1) { + return VariantTier.RARE; // 3/10 + } else { + return VariantTier.EPIC; // 1/10 + } + } + + private checkForPityTierOverrides(scene: BattleScene): void { + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + scene.gameData.eggPity[EggTier.GREAT] += 1; + scene.gameData.eggPity[EggTier.ULTRA] += 1; + scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; + // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. + if (scene.gameData.eggPity[EggTier.MASTER] >= 412 && this._tier === EggTier.COMMON) { + this._tier = EggTier.MASTER; + } else if (scene.gameData.eggPity[EggTier.ULTRA] >= 59 && this._tier === EggTier.COMMON) { + this._tier = EggTier.ULTRA; + } else if (scene.gameData.eggPity[EggTier.GREAT] >= 9 && this._tier === EggTier.COMMON) { + this._tier = EggTier.GREAT; + } + scene.gameData.eggPity[this._tier] = 0; + } + + private increasePullStatistic(scene: BattleScene): void { + scene.gameData.gameStats.eggsPulled++; + if (this.isManaphyEgg()) { + scene.gameData.gameStats.manaphyEggsPulled++; + this._hatchWaves = this.getEggTierDefaultHatchWaves(EggTier.ULTRA); + return; + } + switch (this.tier) { + case EggTier.GREAT: + scene.gameData.gameStats.rareEggsPulled++; + break; + case EggTier.ULTRA: + scene.gameData.gameStats.epicEggsPulled++; + break; + case EggTier.MASTER: + scene.gameData.gameStats.legendaryEggsPulled++; + break; + } + } + + private getEggTierFromSpeciesStarterValue(): EggTier { + const speciesStartValue = speciesStarters[this.species]; + if (speciesStartValue >= 1 && speciesStartValue <= 3) { + return EggTier.COMMON; + } + if (speciesStartValue >= 4 && speciesStartValue <= 5) { + return EggTier.GREAT; + } + if (speciesStartValue >= 6 && speciesStartValue <= 7) { + return EggTier.ULTRA; + } + if (speciesStartValue >= 8) { + return EggTier.MASTER; + } + } + + //// + // #endregion + //// } -export function getEggTierDefaultHatchWaves(tier: EggTier): integer { - switch (tier) { - case EggTier.COMMON: - return 10; - case EggTier.GREAT: - return 25; - case EggTier.ULTRA: - return 50; - } - return 100; -} - -export function getEggDescriptor(egg: Egg): string { - if (egg.isManaphyEgg()) { - return "Manaphy"; - } - switch (egg.tier) { - case EggTier.GREAT: - return i18next.t("egg:greatTier"); - case EggTier.ULTRA: - return i18next.t("egg:ultraTier"); - case EggTier.MASTER: - return i18next.t("egg:masterTier"); - default: - return i18next.t("egg:defaultTier"); - } -} - -export function getEggHatchWavesMessage(hatchWaves: integer): string { - if (hatchWaves <= 5) { - return i18next.t("egg:hatchWavesMessageSoon"); - } - if (hatchWaves <= 15) { - return i18next.t("egg:hatchWavesMessageClose"); - } - if (hatchWaves <= 50) { - return i18next.t("egg:hatchWavesMessageNotClose"); - } - return i18next.t("egg:hatchWavesMessageLongTime"); -} - -export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string { - switch (egg.gachaType) { - case GachaType.LEGENDARY: - return `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`; - case GachaType.MOVE: - return i18next.t("egg:gachaTypeMove"); - case GachaType.SHINY: - return i18next.t("egg:gachaTypeShiny"); - } -} - -export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: integer): Species { +export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { const legendarySpecies = Object.entries(speciesStarters) .filter(s => s[1] >= 8 && s[1] <= 9) .map(s => parseInt(s[0])) diff --git a/src/data/move.ts b/src/data/move.ts index dec52b04c57..321fbc6d097 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,7 +1,7 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; -import { EncoreTag } from "./battler-tags"; +import { EncoreTag, SemiInvulnerableTag } from "./battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; @@ -811,11 +811,17 @@ export class MoveEffectAttr extends MoveAttr { public trigger: MoveEffectTrigger; /** Should this effect only apply on the first hit? */ public firstHitOnly: boolean; + /** Should this effect only apply on the last hit? */ + public lastHitOnly: boolean; + /** Should this effect only apply on the first target hit? */ + public firstTargetOnly: boolean; - constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false) { + constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false, lastHitOnly: boolean = false, firstTargetOnly: boolean = false) { super(selfTarget); this.trigger = trigger !== undefined ? trigger : MoveEffectTrigger.POST_APPLY; this.firstHitOnly = firstHitOnly; + this.lastHitOnly = lastHitOnly; + this.firstTargetOnly = firstTargetOnly; } /** @@ -1064,7 +1070,7 @@ export class RecoilAttr extends MoveEffectAttr { private unblockable: boolean; constructor(useHp: boolean = false, damageRatio: number = 0.25, unblockable: boolean = false) { - super(true); + super(true, MoveEffectTrigger.POST_APPLY, false, true); this.useHp = useHp; this.damageRatio = damageRatio; @@ -1085,8 +1091,8 @@ export class RecoilAttr extends MoveEffectAttr { return false; } - const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.currDamageDealt : user.getMaxHp()) * this.damageRatio), - user.turnData.currDamageDealt ? 1 : 0); + const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio), + user.turnData.damageDealt ? 1 : 0); if (!recoilDamage) { return false; } @@ -1149,7 +1155,7 @@ export class SacrificialAttr extends MoveEffectAttr { **/ export class SacrificialAttrOnHit extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, MoveEffectTrigger.HIT); } /** @@ -1757,7 +1763,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { const statusAfflictResult = target.trySetStatus(statusToApply, true, user); if (statusAfflictResult) { - user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect))); + user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); user.resetStatus(); user.updateInfo(); } @@ -1903,7 +1909,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { } /** - * Attribute that causes targets of the move to eat a berry. If chosenBerry is not overridden, a random berry will be picked from the target's inventory. + * Attribute that causes targets of the move to eat a berry. Used for Teatime, Stuff Cheeks */ export class EatBerryAttr extends MoveEffectAttr { protected chosenBerry: BerryModifier; @@ -1912,42 +1918,29 @@ export class EatBerryAttr extends MoveEffectAttr { this.chosenBerry = undefined; } /** - * Causes the target to eat a berry. - * @param user {@linkcode Pokemon} Pokemon that used the move - * @param target {@linkcode Pokemon} Pokemon that will eat a berry - * @param move {@linkcode Move} The move being used - * @param args Unused - * @returns {boolean} true if the function succeeds - */ + * Causes the target to eat a berry. + * @param user {@linkcode Pokemon} Pokemon that used the move + * @param target {@linkcode Pokemon} Pokemon that will eat a berry + * @param move {@linkcode Move} The move being used + * @param args Unused + * @returns {boolean} true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - if (this.chosenBerry === undefined) { // if no berry has been provided, pick a random berry from their inventory - const heldBerries = this.getTargetHeldBerries(target); - if (heldBerries.length <= 0) { - return false; - } - this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + const heldBerries = this.getTargetHeldBerries(target); + if (heldBerries.length <= 0) { + return false; } - - getBerryEffectFunc(this.chosenBerry.berryType)(target); // target eats the berry - + this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; const preserve = new Utils.BooleanHolder(false); - target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); - - if (!preserve.value) { // remove the eaten berry if not preserved - if (!--this.chosenBerry.stackCount) { - target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } - target.scene.updateModifiers(target.isPlayer()); + target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); // check for berry pouch preservation + if (!preserve.value) { + this.reduceBerryModifier(target); } - - this.chosenBerry = undefined; - - applyAbAttrs(HealFromBerryUseAbAttr, target, new Utils.BooleanHolder(false)); - + this.eatBerry(target); return true; } @@ -1956,7 +1949,21 @@ export class EatBerryAttr extends MoveEffectAttr { && (m as BerryModifier).pokemonId === target.id, target.isPlayer()) as BerryModifier[]; } + reduceBerryModifier(target: Pokemon) { + if (this.chosenBerry.stackCount === 1) { + target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); + } else { + this.chosenBerry.stackCount--; + } + target.scene.updateModifiers(target.isPlayer()); + } + + eatBerry(consumer: Pokemon) { + getBerryEffectFunc(this.chosenBerry.berryType)(consumer); // consumer eats the berry + applyAbAttrs(HealFromBerryUseAbAttr, consumer, new Utils.BooleanHolder(false)); + } } + /** * Attribute used for moves that steal a random berry from the target. The user then eats the stolen berry. * Used for Pluck & Bug Bite. @@ -1966,36 +1973,30 @@ export class StealEatBerryAttr extends EatBerryAttr { super(); } /** - * User steals a random berry from the target and then eats it. - * @param {Pokemon} user Pokemon that used the move and will eat the stolen berry - * @param {Pokemon} target Pokemon that will have its berry stolen - * @param {Move} move Move being used - * @param {any[]} args Unused - * @returns {boolean} true if the function succeeds - */ + * User steals a random berry from the target and then eats it. + * @param {Pokemon} user Pokemon that used the move and will eat the stolen berry + * @param {Pokemon} target Pokemon that will have its berry stolen + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockItemTheftAbAttr, target, cancelled); // check for abilities that block item theft if (cancelled.value === true) { return false; } - const heldBerries = this.getTargetHeldBerries(target).filter(i => i.getTransferrable(false)); - - if (heldBerries.length) { // if the target has berries, pick a random berry and steal it - this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; - - if (this.chosenBerry.stackCount === 1) { // remove modifier if its the last berry - target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } - target.scene.updateModifiers(target.isPlayer()); - - user.scene.queueMessage(getPokemonMessage(user, ` stole and ate\n${target.name}'s ${this.chosenBerry.type.name}!`)); - return super.apply(user, user, move, args); + if (heldBerries.length <= 0) { + return false; } - - return false; + // if the target has berries, pick a random berry and steal it + this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + const message = i18next.t("battle:stealEatBerry", {pokemonName: user.name, targetName: target.name, berryName: this.chosenBerry.type.name}); + user.scene.queueMessage(message); + this.reduceBerryModifier(target); + this.eatBerry(user); + return true; } } @@ -2013,7 +2014,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { * @param ...effects - List of status effects to cure */ constructor(selfTarget: boolean, ...effects: StatusEffect[]) { - super(selfTarget); + super(selfTarget, MoveEffectTrigger.POST_APPLY, false, true); this.effects = effects; } @@ -2031,7 +2032,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { const pokemon = this.selfTarget ? user : target; if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); pokemon.resetStatus(); pokemon.updateInfo(); @@ -2327,8 +2328,8 @@ export class StatChangeAttr extends MoveEffectAttr { private condition: MoveConditionFunc; private showMessage: boolean; - constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT) { - super(selfTarget, moveEffectTrigger, firstHitOnly); + constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT, firstTargetOnly: boolean = false) { + super(selfTarget, moveEffectTrigger, firstHitOnly, false, firstTargetOnly); this.stats = typeof(stats) === "number" ? [ stats as BattleStat ] : stats as BattleStat[]; @@ -2770,7 +2771,7 @@ export class DoublePowerChanceAttr extends VariablePowerAttr { export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultiplierAttr { constructor(limit: integer, resetOnFail: boolean, resetOnLimit?: boolean, ...comboMoves: Moves[]) { super((user: Pokemon, target: Pokemon, move: Move): number => { - const moveHistory = user.getMoveHistory().reverse().slice(1); + const moveHistory = user.getLastXMoves(limit + 1).slice(1); let count = 0; let turnMove: TurnMove; @@ -2960,9 +2961,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; } @@ -3139,8 +3160,13 @@ export class PunishmentPowerAttr extends VariablePowerAttr { export class PresentPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * If this move is multi-hit, and this attribute is applied to any hit + * other than the first, this move cannot result in a heal. + */ + const firstHit = (user.turnData.hitCount === user.turnData.hitsLeft); - const powerSeed = Utils.randSeedInt(100); + const powerSeed = Utils.randSeedInt(firstHit ? 100 : 80); if (powerSeed <= 40) { (args[0] as Utils.NumberHolder).value = 40; } else if (40 < powerSeed && powerSeed <= 70) { @@ -3148,6 +3174,8 @@ export class PresentPowerAttr extends VariablePowerAttr { } else if (70 < powerSeed && powerSeed <= 80) { (args[0] as Utils.NumberHolder).value = 120; } else if (80 < powerSeed && powerSeed <= 100) { + // If this move is multi-hit, disable all other hits + user.stopMultiHit(); target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), Math.max(Math.floor(target.getMaxHp() / 4), 1), getPokemonMessage(target, " regained\nhealth!"), true)); } @@ -3662,10 +3690,9 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; //When a flying type is hit, the first hit is always 1x multiplier. Levitating pokemon are instantly affected by typing - if (target.isOfType(Type.FLYING)) { + if (target.isOfType(Type.FLYING) || target.hasAbility(Abilities.LEVITATE)) { multiplier.value = 1; } - target.addTag(BattlerTagType.IGNORE_FLYING, 20, move.id, user.id); //TODO: Grounded effect should not have turn limit return true; } @@ -3863,7 +3890,7 @@ export class DisableMoveAttr extends MoveEffectAttr { export class FrenzyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, MoveEffectTrigger.HIT, false, true); } canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { @@ -3906,8 +3933,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr { public turnCountMax: integer; private failOnOverlap: boolean; - constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer) { - super(selfTarget); + constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer, lastHitOnly: boolean = false) { + super(selfTarget, MoveEffectTrigger.POST_APPLY, false, lastHitOnly); this.tagType = tagType; this.turnCountMin = turnCountMin; @@ -3964,6 +3991,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return -3; case BattlerTagType.ENCORE: return -2; + case BattlerTagType.MINIMIZED: + return 0; case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: @@ -3990,7 +4019,7 @@ export class CurseAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { if (user.getTypes(true).includes(Type.GHOST)) { if (target.getTag(BattlerTagType.CURSED)) { - user.scene.queueMessage("But it failed!"); + user.scene.queueMessage(i18next.t("battle:attackFailed")); return false; } const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); @@ -4070,7 +4099,7 @@ export class ConfuseAttr extends AddBattlerTagAttr { export class RechargeAttr extends AddBattlerTagAttr { constructor() { - super(BattlerTagType.RECHARGING, true); + super(BattlerTagType.RECHARGING, true, false, 1, 1, true); } } @@ -4189,7 +4218,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; @@ -4447,7 +4476,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } resolve(true); } else { - user.scene.queueMessage("But it failed!"); + user.scene.queueMessage(i18next.t("battle:attackFailed")); resolve(false); } }); @@ -4467,7 +4496,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { private batonPass: boolean; constructor(user?: boolean, batonPass?: boolean) { - super(false, MoveEffectTrigger.POST_APPLY, true); + super(false, MoveEffectTrigger.POST_APPLY, false, true); this.user = !!user; this.batonPass = !!batonPass; } @@ -4582,7 +4611,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { private messageCallback: ((user: Pokemon) => void) | undefined; constructor(removedType: Type, messageCallback?: (user: Pokemon) => void) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true, MoveEffectTrigger.POST_TARGET); this.removedType = removedType; this.messageCallback = messageCallback; @@ -5290,7 +5319,16 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { } } +/** + * Attribute used for moves that suppress abilities like {@linkcode Moves.GASTRO_ACID}. + * A suppressed ability cannot be activated. + * + * @extends MoveEffectAttr + * @see {@linkcode apply} + * @see {@linkcode getCondition} + */ export class SuppressAbilitiesAttr extends MoveEffectAttr { + /** Sets ability suppression for the target pokemon and displays a message. */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; @@ -5303,8 +5341,9 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { return true; } + /** Causes the effect to fail when the target's ability is unsupressable or already suppressed. */ getCondition(): MoveConditionFunc { - return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr); + return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !target.summonData.abilitySuppressed; } } @@ -5319,7 +5358,7 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { * abillity cannot be suppressed. This is a secondary effect and has no bearing on the success or failure of the move. * * @returns True if the move occurred, otherwise false. Note that true will be returned even if the target has not - * yet moved or if the target's abiilty is un-suppressable. + * yet moved or if the suppression failed to apply. */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { @@ -5380,7 +5419,7 @@ export class DiscourageFrequentUseAttr extends MoveAttr { export class MoneyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, MoveEffectTrigger.HIT, true); } apply(user: Pokemon, target: Pokemon, move: Move): boolean { @@ -6595,7 +6634,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) - .attr(AddBattlerTagAttr, BattlerTagType.GROUNDED, true, false, 1) + .attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false) .triageMove(), new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) @@ -6666,7 +6705,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(), @@ -6890,7 +6929,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) @@ -6936,7 +6975,7 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES) .unimplemented(), new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) - .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 5) + .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .attr(HitsTagAttr, BattlerTagType.FLYING, false) @@ -7227,7 +7266,7 @@ export function initMoves() { .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true), new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .unimplemented(), + .attr(StatChangeAttr, BattleStat.DEF, 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)), new StatusMove(Moves.GRASSY_TERRAIN, Type.GRASS, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.GRASSY) .target(MoveTarget.BOTH_SIDES), @@ -7293,8 +7332,8 @@ export function initMoves() { .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))), new StatusMove(Moves.HAPPY_HOUR, Type.NORMAL, -1, 30, -1, 0, 6) // No animation - .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.HAPPY_HOUR, null, true) + .target(MoveTarget.USER_SIDE), new StatusMove(Moves.ELECTRIC_TERRAIN, Type.ELECTRIC, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.ELECTRIC) .target(MoveTarget.BOTH_SIDES), @@ -7320,13 +7359,14 @@ export function initMoves() { .triageMove(), new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) + .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(HitsTagAttr, BattlerTagType.FLYING, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.THOUSAND_WAVES, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.LANDS_WRATH, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) @@ -7468,7 +7508,7 @@ export function initMoves() { new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7) .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER), new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false), new AttackMove(Moves.DARKEST_LARIAT, Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .attr(IgnoreOpponentStatChangesAttr), @@ -7512,7 +7552,7 @@ export function initMoves() { .attr(HealOnAllyAttr, 0.5, true, false) .ballBombMove(), new AttackMove(Moves.ANCHOR_SHOT, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, 100, 0, 7) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true), new StatusMove(Moves.PSYCHIC_TERRAIN, Type.PSYCHIC, -1, 10, -1, 0, 7) .attr(TerrainChangeAttr, TerrainType.PSYCHIC) .target(MoveTarget.BOTH_SIDES), @@ -7536,9 +7576,9 @@ export function initMoves() { new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7) .condition( - (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(user.status?.effect)) + (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect)) .attr(HealAttr, 0.5) - .attr(HealStatusEffectAttr, true, ...getNonVolatileStatusEffects()) + .attr(HealStatusEffectAttr, false, ...getNonVolatileStatusEffects()) .triageMove(), new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() @@ -7994,6 +8034,7 @@ export function initMoves() { new AttackMove(Moves.MYSTICAL_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.SPATK, 1, true), new AttackMove(Moves.RAGING_FURY, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) + .makesContact(false) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), @@ -8003,6 +8044,7 @@ export function initMoves() { new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) .attr(RecoilAttr, true, 0.5), new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) + .makesContact(false) .attr(FlinchAttr), new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPD ], 1, true) @@ -8011,6 +8053,7 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true) .punchingMove(), new AttackMove(Moves.BARB_BARRAGE, Type.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8) + .makesContact(false) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1) .attr(StatusEffectAttr, StatusEffect.POISON), new AttackMove(Moves.ESPER_WING, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) @@ -8021,6 +8064,7 @@ export function initMoves() { new SelfStatusMove(Moves.SHELTER, Type.STEEL, -1, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.DEF, 2, true), new AttackMove(Moves.TRIPLE_ARROWS, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) + .makesContact(false) .attr(HighCritAttr) .attr(StatChangeAttr, BattleStat.DEF, -1) .attr(FlinchAttr) @@ -8234,7 +8278,7 @@ export function initMoves() { .attr(RemoveScreensAttr), new AttackMove(Moves.MAKE_IT_RAIN, Type.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(MoneyAttr) - .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, true) + .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, false, MoveEffectTrigger.HIT, true) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.PSYBLADE, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) @@ -8257,8 +8301,7 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPD ], 1, true, null, true, true) - .attr(RemoveArenaTrapAttr) - .target(MoveTarget.BOTH_SIDES), + .attr(RemoveArenaTrapAttr, true), new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9) .attr(WeatherChangeAttr, WeatherType.SNOW) .target(MoveTarget.BOTH_SIDES), @@ -8356,8 +8399,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) diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index 0399e383820..5964884d967 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -10,6 +10,8 @@ export enum PokeballType { LUXURY_BALL } +export const MAX_PER_TYPE_POKEBALLS: integer = 99; + export function getPokeballAtlasKey(type: PokeballType): string { switch (type) { case PokeballType.POKEBALL: diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 1fb1f7db5fd..696cf006ad0 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1618,7 +1618,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.GIMMIGHOUL]: [ - new SpeciesEvolution(Species.GHOLDENGO, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) ] }; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index ad93bec44e4..ae1532f0be0 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -639,6 +639,10 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.AEGISLASH, "shield", "blade", new SpeciesFormChangePreMoveTrigger(m => allMoves[m].category !== MoveCategory.STATUS), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))), new SpeciesFormChange(Species.AEGISLASH, "blade", "shield", new SpeciesFormChangeActiveTrigger(false), true) ], + [Species.XERNEAS]: [ + new SpeciesFormChange(Species.XERNEAS, "neutral", "active", new SpeciesFormChangeActiveTrigger(true), true), + new SpeciesFormChange(Species.XERNEAS, "active", "neutral", new SpeciesFormChangeActiveTrigger(false), true) + ], [Species.ZYGARDE]: [ new SpeciesFormChange(Species.ZYGARDE, "50-pc", "complete", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.ZYGARDE, "complete", "50-pc", new SpeciesFormChangeManualTrigger(), true), diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index 5f01b4db02f..53272ed5beb 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 ], @@ -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,7 +1043,7 @@ 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 ], @@ -1058,7 +1063,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 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,7 +1180,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 58, Moves.POWER_WHIP ], ], [Species.VICTREEBEL]: [ - [ 0, Moves.LEAF_STORM ], + [ EVOLVE_MOVE, Moves.LEAF_STORM ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.SLEEP_POWDER ], [ 1, Moves.SWEET_SCENT ], @@ -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 ], @@ -1360,7 +1365,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 +1416,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 +1452,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 +1525,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 +1562,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.DREAM_EATER ], ], [Species.HAUNTER]: [ - [ 0, Moves.SHADOW_PUNCH ], + [ EVOLVE_MOVE, Moves.SHADOW_PUNCH ], [ 1, Moves.HYPNOSIS ], [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.LICK ], @@ -1739,7 +1744,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.SOLAR_BEAM ], ], [Species.EXEGGUTOR]: [ - [ 0, Moves.STOMP ], + [ EVOLVE_MOVE, Moves.STOMP ], [ 1, Moves.BARRAGE ], [ 1, Moves.SEED_BOMB ], [ 1, Moves.PSYSHOCK ], @@ -1794,7 +1799,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.DOUBLE_EDGE ], ], [Species.HITMONLEE]: [ - [ 0, Moves.BRICK_BREAK ], + [ EVOLVE_MOVE, Moves.BRICK_BREAK ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.FAKE_OUT ], @@ -1817,7 +1822,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.AXE_KICK ], ], [Species.HITMONCHAN]: [ - [ 0, Moves.DRAIN_PUNCH ], + [ EVOLVE_MOVE, Moves.DRAIN_PUNCH ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.FAKE_OUT ], @@ -1873,7 +1878,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.DESTINY_BOND ], ], [Species.WEEZING]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ 1, Moves.TACKLE ], [ 1, Moves.SMOKESCREEN ], [ 1, Moves.SMOG ], @@ -1908,7 +1913,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HORN_DRILL ], ], [Species.RHYDON]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.SMACK_DOWN ], @@ -2211,7 +2216,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 25, Moves.FLAIL ], ], [Species.GYARADOS]: [ - [ 0, Moves.BITE ], + [ EVOLVE_MOVE, Moves.BITE ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.SPLASH ], @@ -2271,7 +2276,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.VEEVEE_VOLLEY ], ], [Species.VAPOREON]: [ - [ 0, Moves.BOUNCY_BUBBLE ], + [ EVOLVE_MOVE, Moves.BOUNCY_BUBBLE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2298,7 +2303,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.JOLTEON]: [ - [ 0, Moves.BUZZY_BUZZ ], + [ EVOLVE_MOVE, Moves.BUZZY_BUZZ ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2325,7 +2330,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.FLAREON]: [ - [ 0, Moves.SIZZLY_SLIDE ], + [ EVOLVE_MOVE, Moves.SIZZLY_SLIDE ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2384,7 +2389,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.HYDRO_PUMP ], ], [Species.OMASTAR]: [ - [ 0, Moves.CRUNCH ], + [ EVOLVE_MOVE, Moves.CRUNCH ], [ 1, Moves.BIND ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.CONSTRICT ], @@ -2419,7 +2424,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.STONE_EDGE ], ], [Species.KABUTOPS]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.SCRATCH ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.ABSORB ], @@ -2569,7 +2574,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 ], @@ -2655,7 +2660,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 ], @@ -2792,7 +2797,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.HYPER_VOICE ], ], [Species.FURRET]: [ - [ 0, Moves.AGILITY ], + [ EVOLVE_MOVE, Moves.AGILITY ], [ 1, Moves.SCRATCH ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.DEFENSE_CURL ], @@ -2896,7 +2901,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 51, Moves.TOXIC_THREAD ], ], [Species.ARIADOS]: [ - [ 0, Moves.SWORDS_DANCE ], + [ EVOLVE_MOVE, Moves.SWORDS_DANCE ], [ 1, Moves.POISON_STING ], [ 1, Moves.ABSORB ], [ 1, Moves.STRING_SHOT ], @@ -2919,7 +2924,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 59, Moves.TOXIC_THREAD ], ], [Species.CROBAT]: [ - [ 0, Moves.CROSS_POISON ], + [ EVOLVE_MOVE, Moves.CROSS_POISON ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.ABSORB ], [ 1, Moves.TOXIC ], @@ -2953,9 +2958,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 44, Moves.HYDRO_PUMP ], ], [Species.LANTURN]: [ - [ 0, Moves.STOCKPILE ], - [ 0, Moves.SPIT_UP ], - [ 0, Moves.SWALLOW ], + [ EVOLVE_MOVE, Moves.STOCKPILE ], + [ EVOLVE_MOVE, Moves.SPIT_UP ], + [ EVOLVE_MOVE, Moves.SWALLOW ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.WATER_GUN ], [ 1, Moves.SPOTLIGHT ], @@ -3019,7 +3024,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.WISH ], ], [Species.TOGETIC]: [ - [ 0, Moves.FAIRY_WIND ], + [ EVOLVE_MOVE, Moves.FAIRY_WIND ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.SWEET_KISS ], @@ -3051,7 +3056,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.FUTURE_SIGHT ], ], [Species.XATU]: [ - [ 0, Moves.AIR_SLASH ], + [ EVOLVE_MOVE, Moves.AIR_SLASH ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], [ 1, Moves.TELEPORT ], @@ -3101,7 +3106,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.THUNDER ], ], [Species.AMPHAROS]: [ - [ 0, Moves.THUNDER_PUNCH ], + [ EVOLVE_MOVE, Moves.THUNDER_PUNCH ], [ 1, Moves.FIRE_PUNCH ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], @@ -3124,7 +3129,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.THUNDER ], ], [Species.BELLOSSOM]: [ - [ 0, Moves.PETAL_BLIZZARD ], + [ EVOLVE_MOVE, Moves.PETAL_BLIZZARD ], [ 1, Moves.ACID ], [ 1, Moves.ABSORB ], [ 1, Moves.MEGA_DRAIN ], @@ -3180,7 +3185,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SUPERPOWER ], ], [Species.SUDOWOODO]: [ - [ 0, Moves.SLAM ], + [ EVOLVE_MOVE, Moves.SLAM ], [ 1, Moves.ROCK_THROW ], [ 1, Moves.FLAIL ], [ 1, Moves.FAKE_TEARS ], @@ -3200,7 +3205,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.HEAD_SMASH ], ], [Species.POLITOED]: [ - [ 0, Moves.BOUNCE ], + [ EVOLVE_MOVE, Moves.BOUNCE ], [ 1, Moves.RAIN_DANCE ], [ 1, Moves.HYDRO_PUMP ], [ 1, Moves.BELLY_DRUM ], @@ -3374,7 +3379,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.EARTHQUAKE ], ], [Species.ESPEON]: [ - [ 0, Moves.GLITZY_GLOW ], + [ EVOLVE_MOVE, Moves.GLITZY_GLOW ], [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -3400,7 +3405,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 ], @@ -3484,10 +3489,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 ], @@ -3528,7 +3537,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 ], @@ -3664,7 +3673,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 ], @@ -3787,7 +3796,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 ], @@ -3820,7 +3829,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 ], @@ -3868,7 +3877,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 ], @@ -4013,7 +4022,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 ], @@ -4077,7 +4086,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 ], @@ -4265,7 +4274,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 ], @@ -4395,7 +4404,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.LEAF_STORM ], ], [Species.SCEPTILE]: [ - [ 0, Moves.LEAF_BLADE ], + [ EVOLVE_MOVE, Moves.LEAF_BLADE ], [ 1, Moves.POUND ], [ 1, Moves.LEER ], [ 1, Moves.LEAFAGE ], @@ -4435,7 +4444,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.FLARE_BLITZ ], ], [Species.COMBUSKEN]: [ - [ 0, Moves.DOUBLE_KICK ], + [ EVOLVE_MOVE, Moves.DOUBLE_KICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], @@ -4455,7 +4464,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.FLARE_BLITZ ], ], [Species.BLAZIKEN]: [ - [ 0, Moves.BLAZE_KICK ], + [ EVOLVE_MOVE, Moves.BLAZE_KICK ], [ 1, Moves.DOUBLE_KICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], @@ -4494,7 +4503,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.HYDRO_PUMP ], ], [Species.MARSHTOMP]: [ - [ 0, Moves.MUD_SHOT ], + [ EVOLVE_MOVE, Moves.MUD_SHOT ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -4550,7 +4559,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 ], @@ -4588,7 +4597,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 ], @@ -4615,11 +4624,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 ], @@ -4639,11 +4648,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 ], @@ -4731,7 +4740,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 ], @@ -4752,7 +4761,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 57, Moves.LEAF_BLADE ], ], [Species.SHIFTRY]: [ - [ 0, Moves.LEAF_BLADE ], + [ EVOLVE_MOVE, Moves.LEAF_BLADE ], [ 1, Moves.AIR_CUTTER ], [ 1, Moves.HURRICANE ], [ 1, Moves.PAYBACK ], @@ -4877,7 +4886,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 ], @@ -4942,7 +4951,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.SPORE ], ], [Species.BRELOOM]: [ - [ 0, Moves.MACH_PUNCH ], + [ EVOLVE_MOVE, Moves.MACH_PUNCH ], [ 1, Moves.POISON_POWDER ], [ 1, Moves.GROWTH ], [ 1, Moves.TOXIC ], @@ -4988,7 +4997,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 ], @@ -5016,9 +5025,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 ], @@ -5071,7 +5080,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 ], @@ -5086,7 +5095,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 ], @@ -5457,7 +5466,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 ], @@ -5494,7 +5503,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 ], @@ -5528,7 +5537,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 ], @@ -5600,7 +5609,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 ], @@ -5653,7 +5662,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 ], @@ -5702,7 +5711,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FISSURE ], ], [Species.VIBRAVA]: [ - [ 0, Moves.DRAGON_BREATH ], + [ EVOLVE_MOVE, Moves.DRAGON_BREATH ], [ 1, Moves.DIG ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.BITE ], @@ -5727,7 +5736,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.BOOMBURST ], ], [Species.FLYGON]: [ - [ 0, Moves.DRAGON_CLAW ], + [ EVOLVE_MOVE, Moves.DRAGON_CLAW ], [ 1, Moves.DRAGON_BREATH ], [ 1, Moves.BULLDOZE ], [ 1, Moves.SAND_ATTACK ], @@ -5774,7 +5783,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 ], @@ -5809,7 +5818,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 ], @@ -5827,20 +5836,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 ], @@ -5925,7 +5934,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 ], @@ -5959,7 +5968,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 ], @@ -5996,7 +6005,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 ], @@ -6089,7 +6098,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 ], @@ -6163,7 +6172,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 ], @@ -6194,7 +6203,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 ], @@ -6291,7 +6300,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 ], @@ -6328,7 +6337,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 ], @@ -6461,7 +6470,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 ], @@ -6477,7 +6486,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 ], @@ -6499,8 +6508,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 ], @@ -6516,7 +6525,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 74, Moves.HYPER_BEAM ], ], [Species.METAGROSS]: [ - [ 0, Moves.HAMMER_ARM ], + [ EVOLVE_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.CONFUSION ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.BULLET_PUNCH ], @@ -6738,7 +6747,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 ], @@ -6770,7 +6779,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 ], @@ -6786,7 +6795,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.FLARE_BLITZ ], ], [Species.INFERNAPE]: [ - [ 0, Moves.CLOSE_COMBAT ], + [ EVOLVE_MOVE, Moves.CLOSE_COMBAT ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -6817,7 +6826,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 ], @@ -6832,7 +6841,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 ], @@ -6878,7 +6887,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 ], @@ -6909,7 +6918,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 ], @@ -6935,7 +6944,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 ], @@ -7043,7 +7052,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 ], @@ -7072,7 +7081,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.HEAVY_SLAM ], ], [Species.BASTIODON]: [ - [ 0, Moves.BLOCK ], + [ EVOLVE_MOVE, Moves.BLOCK ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.TAUNT ], @@ -7094,7 +7103,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 ], @@ -7114,7 +7123,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 ], @@ -7139,7 +7148,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 ], @@ -7227,7 +7236,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 ], @@ -7304,7 +7313,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 ], @@ -7342,7 +7351,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 ], @@ -7405,7 +7414,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 ], @@ -7452,7 +7461,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 ], @@ -7486,7 +7495,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 ], @@ -7615,7 +7624,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 ], @@ -7668,7 +7677,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 ], @@ -7885,7 +7894,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 ], @@ -8034,7 +8043,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 ], @@ -8074,7 +8083,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 ], @@ -8101,7 +8110,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 ], @@ -8145,7 +8154,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 ], @@ -8184,7 +8193,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 ], @@ -8219,7 +8228,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 ], @@ -8263,7 +8272,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 ], @@ -8606,7 +8615,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 ], @@ -8677,7 +8686,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 ], @@ -8715,7 +8724,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 ], @@ -9015,7 +9024,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 ], @@ -9094,7 +9103,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 ], @@ -9214,7 +9223,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 ], @@ -9277,7 +9286,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 ], @@ -9290,7 +9299,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.FLAIL ], ], [Species.LEAVANNY]: [ - [ 0, Moves.SLASH ], + [ EVOLVE_MOVE, Moves.SLASH ], [ 1, Moves.TACKLE ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.STRING_SHOT ], @@ -9320,7 +9329,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 ], @@ -9415,7 +9424,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 ], @@ -9523,7 +9532,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 ], @@ -9665,7 +9674,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 ], @@ -9820,7 +9829,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 ], @@ -9854,7 +9863,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.LAST_RESORT ], ], [Species.CINCCINO]: [ - [ 0, Moves.TAIL_SLAP ], + [ EVOLVE_MOVE, Moves.TAIL_SLAP ], [ 1, Moves.BULLET_SEED ], [ 1, Moves.SING ], [ 1, Moves.CHARM ], @@ -9961,7 +9970,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 ], @@ -10082,7 +10091,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 ], @@ -10258,7 +10267,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 ], @@ -10290,7 +10299,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 ], @@ -10363,7 +10372,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 ], @@ -10561,7 +10570,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 ], @@ -10816,7 +10825,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 ], @@ -10849,7 +10858,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 ], @@ -10980,7 +10989,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 ], @@ -11227,7 +11236,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 ], @@ -11244,7 +11253,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 ], @@ -11298,7 +11307,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 ], @@ -11352,7 +11361,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 ], @@ -11423,7 +11432,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 ], @@ -11463,11 +11472,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 ], @@ -11582,7 +11591,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 ], @@ -11617,7 +11626,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 ], @@ -11715,7 +11724,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 ], @@ -12040,7 +12049,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 ], @@ -12131,7 +12140,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 ], @@ -12147,7 +12156,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 ], @@ -12200,7 +12209,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 ], @@ -12270,7 +12279,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 ], @@ -12308,7 +12317,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 ], @@ -12480,7 +12489,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 ], @@ -12533,7 +12542,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.FLARE_BLITZ ], ], [Species.INCINEROAR]: [ - [ 0, Moves.DARKEST_LARIAT ], + [ EVOLVE_MOVE, Moves.DARKEST_LARIAT ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], @@ -12585,7 +12594,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 ], @@ -12633,7 +12642,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 ], @@ -12695,7 +12704,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 ], @@ -12710,7 +12719,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.DISCHARGE ], ], [Species.VIKAVOLT]: [ - [ 0, Moves.THUNDERBOLT ], + [ EVOLVE_MOVE, Moves.THUNDERBOLT ], [ 1, Moves.CHARGE ], [ 1, Moves.CRUNCH ], [ 1, Moves.DISCHARGE ], @@ -12747,7 +12756,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 ], @@ -12794,7 +12803,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 ], @@ -12824,7 +12833,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 ], @@ -12874,7 +12883,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 ], @@ -12968,7 +12977,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 ], @@ -13032,7 +13041,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 ], @@ -13071,7 +13080,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 ], @@ -13113,7 +13122,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 ], @@ -13188,7 +13197,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 ], @@ -13274,7 +13283,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 ], @@ -13445,7 +13454,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 ], @@ -13463,7 +13472,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.CLOSE_COMBAT ], ], [Species.KOMMO_O]: [ - [ 0, Moves.CLANGING_SCALES ], + [ EVOLVE_MOVE, Moves.CLANGING_SCALES ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.PROTECT ], @@ -13566,11 +13575,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 ], @@ -13590,7 +13599,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 ], @@ -13815,7 +13824,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 ], @@ -13899,7 +13908,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 ], @@ -13929,7 +13938,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 ], @@ -13943,7 +13952,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 ], @@ -13987,7 +13996,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 ], @@ -14029,7 +14038,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 ], @@ -14060,7 +14069,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 ], @@ -14102,7 +14111,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 ], @@ -14122,9 +14131,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]: [ @@ -14159,7 +14171,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 ], @@ -14187,7 +14199,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 ], @@ -14242,7 +14254,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 ], @@ -14298,7 +14310,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 ], @@ -14312,7 +14324,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 ], @@ -14332,7 +14344,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 ], @@ -14351,7 +14363,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 ], @@ -14446,7 +14458,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 ], @@ -14515,7 +14527,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 ], @@ -14545,7 +14557,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 ], @@ -14575,7 +14587,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 ], @@ -14589,7 +14601,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 ], @@ -14620,7 +14632,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 ], @@ -14636,7 +14648,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 ], @@ -14655,7 +14667,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 ], @@ -14678,7 +14690,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 ], @@ -14712,7 +14724,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 ], @@ -14764,7 +14776,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 ], @@ -14798,7 +14810,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 ], @@ -14849,7 +14861,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 ], @@ -14944,7 +14956,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 ], @@ -15041,7 +15053,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 ], @@ -15060,7 +15072,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 ], @@ -15145,7 +15157,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 ], @@ -15265,7 +15277,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 ], @@ -15282,7 +15294,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 ], @@ -15298,7 +15310,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 ], @@ -15338,7 +15350,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 ], @@ -15424,7 +15436,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 46, Moves.LEAF_STORM ], ], [Species.MEOWSCARADA]: [ - [ 0, Moves.FLOWER_TRICK ], + [ EVOLVE_MOVE, Moves.FLOWER_TRICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.LEAFAGE ], @@ -15474,7 +15486,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 47, Moves.FIRE_BLAST ], ], [Species.SKELEDIRGE]: [ - [ 0, Moves.TORCH_SONG ], + [ EVOLVE_MOVE, Moves.TORCH_SONG ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -15525,7 +15537,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.FEATHER_DANCE ], ], [Species.QUAQUAVAL]: [ - [ 0, Moves.AQUA_STEP ], + [ EVOLVE_MOVE, Moves.AQUA_STEP ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -15594,7 +15606,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 ], @@ -15626,7 +15638,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 ], @@ -15664,7 +15676,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 ], @@ -15682,7 +15694,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 ], @@ -15854,7 +15866,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 ], @@ -15871,7 +15883,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 ], @@ -15904,7 +15916,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 ], @@ -15924,7 +15936,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.ARMOR_CANNON ], ], [Species.CERULEDGE]: [ - [ 0, Moves.SHADOW_CLAW ], + [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], [ 1, Moves.EMBER ], [ 1, Moves.LEER ], [ 1, Moves.ASTONISH ], @@ -15991,7 +16003,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 ], @@ -16024,7 +16036,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 ], @@ -16060,7 +16072,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 ], @@ -16180,8 +16192,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 ], @@ -16211,7 +16223,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 35, Moves.LUNGE ], ], [Species.RABSCA]: [ - [ 0, Moves.REVIVAL_BLESSING ], + [ EVOLVE_MOVE, Moves.REVIVAL_BLESSING ], [ 1, Moves.TACKLE ], [ 1, Moves.CONFUSION ], [ 1, Moves.DEFENSE_CURL ], @@ -16242,7 +16254,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 ], @@ -16296,7 +16308,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 ], @@ -16377,7 +16389,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 ], @@ -16413,7 +16425,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 ], @@ -16480,7 +16492,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 ], @@ -16516,7 +16528,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 ], @@ -16633,7 +16645,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 ], @@ -16654,7 +16666,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 ], @@ -16706,7 +16718,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 ], @@ -16975,7 +16987,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 ], @@ -17169,10 +17181,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 ], @@ -17186,10 +17200,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 ], @@ -17205,7 +17221,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.SOLAR_BLADE ], ], [Species.DIPPLIN]: [ - [ 0, Moves.DOUBLE_HIT ], + [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], @@ -17238,7 +17254,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 ], @@ -17316,7 +17332,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 ], @@ -17332,7 +17348,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 66, Moves.HYPER_BEAM ], ], [Species.HYDRAPPLE]: [ - [ 0, Moves.FICKLE_BEAM ], + [ EVOLVE_MOVE, Moves.FICKLE_BEAM ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], @@ -17353,6 +17369,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 ], @@ -17372,6 +17391,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 ], @@ -17473,7 +17493,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 ], @@ -17490,8 +17510,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 ], @@ -17534,7 +17554,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.BLIZZARD ], ], [Species.ALOLA_SANDSLASH]: [ - [ 0, Moves.ICICLE_SPEAR ], + [ EVOLVE_MOVE, Moves.ICICLE_SPEAR ], [ 1, Moves.ICICLE_CRASH ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.SLASH ], @@ -17574,7 +17594,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.BLIZZARD ], ], [Species.ALOLA_NINETALES]: [ - [ 0, Moves.DAZZLING_GLEAM ], + [ EVOLVE_MOVE, Moves.DAZZLING_GLEAM ], [ 1, Moves.ICY_WIND ], [ 1, Moves.IMPRISON ], [ 1, Moves.BLIZZARD ], @@ -17608,7 +17628,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 ], @@ -17642,7 +17662,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 ], @@ -17750,7 +17770,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 57, Moves.MEMENTO ], ], [Species.ALOLA_EXEGGUTOR]: [ - [ 0, Moves.DRAGON_HAMMER ], + [ EVOLVE_MOVE, Moves.DRAGON_HAMMER ], [ 1, Moves.BARRAGE ], [ 1, Moves.SEED_BOMB ], [ 1, Moves.PSYSHOCK ], @@ -17772,7 +17792,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 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 ], @@ -17842,7 +17862,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 ], @@ -17879,7 +17899,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 ], @@ -17917,7 +17937,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 ], @@ -18022,7 +18042,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 70, Moves.SKY_ATTACK ], ], [Species.GALAR_SLOWKING]: [ - [ 0, Moves.EERIE_SPELL ], + [ EVOLVE_MOVE, Moves.EERIE_SPELL ], [ 1, Moves.POWER_GEM ], [ 1, Moves.NASTY_PLOT ], [ 1, Moves.SWAGGER ], @@ -18079,7 +18099,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 ], @@ -18115,7 +18135,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 ], @@ -18184,7 +18204,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 ], @@ -18224,7 +18244,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 ], @@ -18244,7 +18264,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 ], @@ -18298,7 +18318,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 ], @@ -18318,7 +18338,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 ], @@ -18359,7 +18379,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 ], @@ -18377,7 +18397,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 ], @@ -18396,7 +18416,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 ], @@ -18412,7 +18432,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 ], @@ -18433,7 +18453,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 ], @@ -18455,7 +18475,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 ], @@ -18574,7 +18594,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 ], @@ -18598,7 +18618,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 ], @@ -18622,7 +18642,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 ], @@ -18646,7 +18666,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 ], @@ -18670,7 +18690,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 ], @@ -18751,7 +18771,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 ], @@ -18771,7 +18791,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 ], @@ -18794,7 +18814,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 ], @@ -18810,7 +18830,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 ], @@ -18826,7 +18846,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 ], @@ -18842,7 +18862,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 ], @@ -18858,7 +18878,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 ], @@ -18972,8 +18992,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 ], @@ -18995,7 +19015,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 ], @@ -19015,7 +19035,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 ], @@ -19042,7 +19062,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 ], @@ -19062,7 +19082,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 ], @@ -19082,8 +19102,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 ], @@ -19105,7 +19125,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.TOXTRICITY]: { 1: [ - [ 0, Moves.SPARK ], + [ EVOLVE_MOVE, Moves.SPARK ], [ 1, Moves.LEER ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], @@ -19148,7 +19168,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 ], @@ -19167,7 +19187,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 ], @@ -19204,7 +19224,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 eddcf3c97b7..2b488f330c4 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -319,6 +319,7 @@ export abstract class PokemonSpeciesForm { case Species.UNFEZANT: case Species.FRILLISH: case Species.JELLICENT: + case Species.PYROAR: ret += female ? "-f" : ""; break; } @@ -778,7 +779,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(); @@ -819,6 +820,10 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return super.isObtainable(); } + hasVariants() { + return variantData.hasOwnProperty(this.speciesId); + } + getFormSpriteKey(formIndex?: integer) { if (this.forms.length && formIndex >= this.forms.length) { console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); @@ -2153,7 +2158,7 @@ export function initSpecies() { new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", Type.FIRE, Type.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, "", true), + new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), new PokemonForm("Busted Form", "busted", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), ), new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", Type.WATER, Type.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), @@ -3323,7 +3328,7 @@ export const starterPassiveAbilities = { [Species.KRABBY]: Abilities.UNBURDEN, [Species.VOLTORB]: Abilities.ELECTRIC_SURGE, [Species.EXEGGCUTE]: Abilities.RIPEN, - [Species.CUBONE]: Abilities.HUGE_POWER, + [Species.CUBONE]: Abilities.PARENTAL_BOND, [Species.LICKITUNG]: Abilities.THICK_FAT, [Species.KOFFING]: Abilities.PARENTAL_BOND, [Species.RHYHORN]: Abilities.FILTER, diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 810bd4d9482..5949fb2f130 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,4 +1,5 @@ import * as Utils from "../utils"; +import i18next, { ParseKeys } from "i18next"; export enum StatusEffect { NONE, @@ -31,94 +32,52 @@ export class Status { } } -export function getStatusEffectObtainText(statusEffect: StatusEffect, sourceText?: string): string { - const sourceClause = sourceText ? ` ${statusEffect !== StatusEffect.SLEEP ? "by" : "from"} ${sourceText}` : ""; +function getStatusEffectMessageKey(statusEffect: StatusEffect): string { switch (statusEffect) { case StatusEffect.POISON: - return `\nwas poisoned${sourceClause}!`; + return "statusEffect:poison"; case StatusEffect.TOXIC: - return `\nwas badly poisoned${sourceClause}!`; + return "statusEffect:toxic"; case StatusEffect.PARALYSIS: - return ` was paralyzed${sourceClause}!\nIt may be unable to move!`; + return "statusEffect:paralysis"; case StatusEffect.SLEEP: - return `\nfell asleep${sourceClause}!`; + return "statusEffect:sleep"; case StatusEffect.FREEZE: - return `\nwas frozen solid${sourceClause}!`; + return "statusEffect:freeze"; case StatusEffect.BURN: - return `\nwas burned${sourceClause}!`; + return "statusEffect:burn"; + default: + return "statusEffect:none"; } - - return ""; } -export function getStatusEffectActivationText(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return " is hurt\nby poison!"; - case StatusEffect.PARALYSIS: - return " is paralyzed!\nIt can't move!"; - case StatusEffect.SLEEP: - return " is fast asleep."; - case StatusEffect.FREEZE: - return " is\nfrozen solid!"; - case StatusEffect.BURN: - return " is hurt\nby its burn!"; +export function getStatusEffectObtainText(statusEffect: StatusEffect, pokemonNameWithAffix: string, sourceText?: string): string { + if (!sourceText) { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } - - return ""; + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource`as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix, sourceText: sourceText }); } -export function getStatusEffectOverlapText(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return " is\nalready poisoned!"; - case StatusEffect.PARALYSIS: - return " is\nalready paralyzed!"; - case StatusEffect.SLEEP: - return " is\nalready asleep!"; - case StatusEffect.FREEZE: - return " is\nalready frozen!"; - case StatusEffect.BURN: - return " is\nalready burned!"; - } - - return ""; +export function getStatusEffectActivationText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.activation` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } -export function getStatusEffectHealText(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return " was\ncured of its poison!"; - case StatusEffect.PARALYSIS: - return " was\nhealed of paralysis!"; - case StatusEffect.SLEEP: - return " woke up!"; - case StatusEffect.FREEZE: - return " was\ndefrosted!"; - case StatusEffect.BURN: - return " was\nhealed of its burn!"; - } +export function getStatusEffectOverlapText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.overlap` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); +} - return ""; +export function getStatusEffectHealText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.heal` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } export function getStatusEffectDescriptor(statusEffect: StatusEffect): string { - switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return "poisoning"; - case StatusEffect.PARALYSIS: - return "paralysis"; - case StatusEffect.SLEEP: - return "sleep"; - case StatusEffect.FREEZE: - return "freezing"; - case StatusEffect.BURN: - return "burn"; - } + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.description` as ParseKeys; + return i18next.t(i18nKey); } export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): number { diff --git a/src/data/terrain.ts b/src/data/terrain.ts index e396c693c4e..f7324c28b93 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, @@ -67,6 +68,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 b98c11da223..0a13cef4ee8 100644 --- a/src/data/tms.ts +++ b/src/data/tms.ts @@ -4258,6 +4258,8 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PANPOUR, + Species.DRILBUR, + Species.EXCADRILL, Species.TYMPOLE, Species.PALPITOAD, Species.SEISMITOAD, @@ -11023,12 +11025,222 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -11048,7 +11260,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.CONFUSE_RAY]: [ Species.VULPIX, @@ -27226,6 +27475,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -27245,6 +27710,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.FRUSTRATION]: [ Species.BULBASAUR, @@ -28038,6 +28541,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -28057,6 +28776,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.SAFEGUARD]: [ Species.BULBASAUR, @@ -30147,6 +30904,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -30166,6 +31139,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.RAIN_DANCE]: [ Species.SQUIRTLE, @@ -37674,6 +38685,8 @@ export const tmSpecies: TmSpecies = { Species.GOLDEEN, Species.SEAKING, Species.SCYTHER, + Species.ELECTABUZZ, + Species.MAGMAR, Species.PINSIR, Species.OMANYTE, Species.OMASTAR, @@ -37681,6 +38694,8 @@ export const tmSpecies: TmSpecies = { Species.KABUTOPS, Species.MEWTWO, Species.MEW, + Species.BAYLEEF, + Species.MEGANIUM, Species.SENTRET, Species.FURRET, Species.LEDYBA, @@ -37697,8 +38712,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, @@ -37729,12 +38746,7 @@ export const tmSpecies: TmSpecies = { Species.CHIMECHO, Species.ABSOL, Species.METAGROSS, - [ - Species.DEOXYS, - "", - "defense", - "speed", - ], + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -37756,6 +38768,8 @@ export const tmSpecies: TmSpecies = { Species.WEAVILE, Species.LICKILICKY, Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, Species.LEAFEON, Species.GLISCOR, Species.MAMOSWINE, @@ -37770,6 +38784,8 @@ export const tmSpecies: TmSpecies = { Species.SNIVY, Species.SERVINE, Species.SERPERIOR, + Species.PIGNITE, + Species.EMBOAR, Species.OSHAWOTT, Species.DEWOTT, Species.SAMUROTT, @@ -37826,6 +38842,8 @@ export const tmSpecies: TmSpecies = { Species.ACCELGOR, Species.MIENFOO, Species.MIENSHAO, + Species.GOLETT, + Species.GOLURK, Species.PAWNIARD, Species.BISHARP, Species.VULLABY, @@ -37862,6 +38880,7 @@ export const tmSpecies: TmSpecies = { Species.SALAZZLE, Species.STEENEE, Species.TSAREENA, + Species.COMFEY, Species.ORANGURU, Species.PASSIMIAN, Species.GOLISOPOD, @@ -37934,6 +38953,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, @@ -58835,16 +59855,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, @@ -58876,8 +59891,6 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.PINCURCHIN, Species.ETERNATUS, - Species.PIKACHU, - Species.ALOLA_MUK, Species.GALAR_WEEZING, Species.GALAR_SLOWKING, [ @@ -60842,6 +61855,7 @@ export const tmSpecies: TmSpecies = { Species.METANG, Species.METAGROSS, Species.JIRACHI, + Species.DEOXYS, Species.BRONZOR, Species.BRONZONG, Species.GALLADE, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 2479f1a189f..8a25406fc5a 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -531,13 +531,18 @@ export class TrainerConfig { * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader. * @param {Type[]} specialtyTypes - The specialty types for the evil team Leader. + * @param boolean whether or not this is the rematch fight * @returns {TrainerConfig} - The updated TrainerConfig instance. * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig { if (!getIsInitialized()) { initI18n(); } - this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + if (rematch) { + this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); + } else { + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + } signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { speciesPool = [speciesPool]; @@ -551,11 +556,11 @@ export class TrainerConfig { const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setTitle(title); - this.setMoneyMultiplier(2.5); + this.setMoneyMultiplier(2.25); this.setBoss(); this.setStaticParty(); - this.setBattleBgm("battle_unova_gym"); // TODO: change - this.setVictoryBgm("victory_gym"); // TODO: change + this.setBattleBgm("battle_plasma_boss"); + this.setVictoryBgm("victory_team_plasma"); return this; } @@ -814,7 +819,7 @@ interface TrainerConfigs { } /** - * The function to get variable strength grutns + * The function to get variable strength grunts * @param scene the singleton scene being passed in * @returns the correct TrainerPartyTemplate */ @@ -822,22 +827,14 @@ function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate { const waveIndex = scene.currentBattle?.waveIndex; if (waveIndex < 40) { return trainerPartyTemplates.TWO_AVG; - } else if (waveIndex < 80) { - switch (waveIndex) { - case 62: - return trainerPartyTemplates.THREE_AVG; - case 64: - return trainerPartyTemplates.TWO_AVG_ONE_STRONG; - case 65: - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - } + } else if (waveIndex < 63) { + return trainerPartyTemplates.THREE_AVG; + } else if (waveIndex < 65) { + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + } else if (waveIndex < 112) { + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger } else { - switch (waveIndex) { - case 112: - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - case 114: - return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger - } + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } } @@ -1183,53 +1180,47 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesPools( [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP] ), - [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING], - [TrainerPoolTier.UNCOMMON]: [Species.GRIMER, Species.CUBONE, Species.ODDISH, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], - [TrainerPoolTier.RARE]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER], - [TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], - [TrainerPoolTier.ULTRA_RARE]: [Species.DRATINI, Species.LARVITAR] + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH], + [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], + [TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], + [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR] }), - [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY], - [TrainerPoolTier.UNCOMMON]: [Species.PHANPY, Species.SWINUB, Species.GLIGAR, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], - [TrainerPoolTier.RARE]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA], - [TrainerPoolTier.SUPER_RARE]: [Species.TRAPINCH, Species.HEATMOR], - [TrainerPoolTier.ULTRA_RARE]: [Species.TURTONATOR, Species.CHARCADET] + [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], + [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], + [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] }), - [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH], - [TrainerPoolTier.UNCOMMON]: [Species.SPHEAL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL ], - [TrainerPoolTier.RARE]: [Species.CLAMPERL, Species.REMORAID, Species.ARROKUDA], - [TrainerPoolTier.SUPER_RARE]: [Species.MANTINE, Species.BASCULEGION], - [TrainerPoolTier.ULTRA_RARE]: [Species.DONDOZO] + [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL ], + [TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH ], + [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA], + [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO] }), - [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE], - [TrainerPoolTier.UNCOMMON]: [Species.BRONZOR, Species.DRIFLOON, Species.BURMY], - [TrainerPoolTier.RARE]: [Species.CARNIVINE], - [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], - [TrainerPoolTier.ULTRA_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] + [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY], + [TrainerPoolTier.UNCOMMON]: [ Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL ], + [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], + [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] }), - [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.SANDILE, Species.TRUBBISH, Species.GOLETT], - [TrainerPoolTier.RARE]: [Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS, Species.DRILBUR, Species.KLINK, Species.VULLABY], - [TrainerPoolTier.SUPER_RARE]: [Species.PAWNIARD, Species.VULLABY, Species.DRUDDIGON, Species.BOUFFALANT, Species.ZORUA], - [TrainerPoolTier.ULTRA_RARE]: [Species.AXEW, Species.DEINO, Species.DURANT] + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH], + [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS], + [TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK], + [TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT] }), - [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI], - [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN], - [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL], - [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN], - [TrainerPoolTier.ULTRA_RARE]: [] + [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK], + [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG], + [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], + [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON] }), [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"],true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"],false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1509,7 +1500,7 @@ export const trainerConfigs: TrainerConfigs = { return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), - [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]) + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN , Species.ALOLA_PERSIAN])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NIDOKING , Species.NIDOQUEEN ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) @@ -1521,14 +1512,14 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []) + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR , Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.EXCADRILL ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.EXCADRILL ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1541,7 +1532,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) + [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIGHTYENA ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ])) @@ -1553,33 +1544,33 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { + [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.TYPHLOSION ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // DROUGHT + })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SHIFTRY, Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 0; // Chlorophyll })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // DROUGHT - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LINOONE ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.PELIPPER ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ])) @@ -1591,36 +1582,36 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Swift Swim - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Swift Swim - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Drizzle })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.abilityIndex = 2; // Swift Swim })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Swift Swim + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.BASCULEGION ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.OVERQWIL ])) @@ -1635,25 +1626,29 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })), - [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ELECTRODE, Species.HISUI_ELECTRODE ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.ROARING_MOON ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HISUI_ZOROARK ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS, Species.RUNERIGUS ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BOUFFALANT ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SEISMITOAD, Species.CARRACOSTA ])) @@ -1664,7 +1659,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })), - [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SLITHER_WING, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1673,17 +1668,17 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DURANT ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DARMANITAN, Species.GALAR_DARMANITAN ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) @@ -1695,7 +1690,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SCREAM_TAIL, Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1704,15 +1699,15 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GHOLDENGO, Species.AEGISLASH ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), }; diff --git a/src/data/variant.ts b/src/data/variant.ts index b16586108fd..48369d112db 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -1,3 +1,5 @@ +import { VariantTier } from "#app/enums/variant-tier.js"; + export type Variant = 0 | 1 | 2; export type VariantSet = [Variant, Variant, Variant]; @@ -16,3 +18,14 @@ export function getVariantTint(variant: Variant): integer { return 0xe81048; } } + +export function getVariantIcon(variant: Variant): integer { + switch (variant) { + case 0: + return VariantTier.STANDARD; + case 1: + return VariantTier.RARE; + case 2: + return VariantTier.EPIC; + } +} diff --git a/src/data/weather.ts b/src/data/weather.ts index 425dd3724f6..f671c754873 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -1,12 +1,12 @@ import { Biome } from "#enums/biome"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +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 { @@ -216,34 +216,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 6e44b832181..44b72fb3d05 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -1,19 +1,16 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import i18next from "i18next"; import { Phase } from "./phase"; import BattleScene, { AnySound } from "./battle-scene"; import * as Utils from "./utils"; import { Mode } from "./ui/ui"; -import { EGG_SEED, Egg, GachaType, getLegendaryGachaSpeciesForTimestamp } from "./data/egg"; +import { EGG_SEED, Egg } from "./data/egg"; import EggHatchSceneHandler from "./ui/egg-hatch-scene-handler"; import { PlayerPokemon } from "./field/pokemon"; -import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import { achvs } from "./system/achv"; -import { pokemonPrevolutions } from "./data/pokemon-evolutions"; import PokemonInfoContainer from "./ui/pokemon-info-container"; import EggCounterContainer from "./ui/egg-counter-container"; import { EggCountChangedEvent } from "./events/egg"; -import { EggTier } from "#enums/egg-type"; -import { Species } from "#enums/species"; /** * Class that represents egg hatching @@ -345,7 +342,7 @@ export class EggHatchPhase extends Phase { this.scene.playSoundWithoutBgm("evolution_fanfare"); - this.scene.ui.showText(`${this.pokemon.name} hatched from the egg!`, null, () => { + this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.name }), null, () => { this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); this.scene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then(() => { @@ -442,135 +439,10 @@ export class EggHatchPhase extends Phase { */ generatePokemon(): PlayerPokemon { let ret: PlayerPokemon; - let speciesOverride: Species; // SpeciesOverride should probably be a passed in parameter for future species-eggs this.scene.executeWithSeedOffset(() => { - - /** - * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione - * Legendary eggs pulled from the legendary gacha have a 50% of being converted into - * the species that was the legendary focus at the time - */ - if (this.egg.isManaphyEgg()) { - const rand = Utils.randSeedInt(8); - - speciesOverride = rand ? Species.PHIONE : Species.MANAPHY; - } else if (this.egg.tier === EggTier.MASTER - && this.egg.gachaType === GachaType.LEGENDARY) { - if (!Utils.randSeedInt(2)) { - speciesOverride = getLegendaryGachaSpeciesForTimestamp(this.scene, this.egg.timestamp); - } - } - - if (speciesOverride) { - const pokemonSpecies = getPokemonSpecies(speciesOverride); - ret = this.scene.addPlayerPokemon(pokemonSpecies, 1, undefined, undefined, undefined, false); - } else { - let minStarterValue: integer; - let maxStarterValue: integer; - - switch (this.egg.tier) { - case EggTier.GREAT: - minStarterValue = 4; - maxStarterValue = 5; - break; - case EggTier.ULTRA: - minStarterValue = 6; - maxStarterValue = 7; - break; - case EggTier.MASTER: - minStarterValue = 8; - maxStarterValue = 9; - break; - default: - minStarterValue = 1; - maxStarterValue = 3; - break; - } - - const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; - - let speciesPool = Object.keys(speciesStarters) - .filter(s => speciesStarters[s] >= minStarterValue && speciesStarters[s] <= maxStarterValue) - .map(s => parseInt(s) as Species) - .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); - - // If this is the 10th egg without unlocking something new, attempt to force it. - if (this.scene.gameData.unlockPity[this.egg.tier] >= 9) { - const lockedPool = speciesPool.filter(s => !this.scene.gameData.dexData[s].caughtAttr); - if (lockedPool.length) { // Skip this if everything is unlocked - speciesPool = lockedPool; - } - } - - /** - * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty - * 1 cost mons get 2x - * 2 cost mons get 1.5x - * 4, 6, 8 cost mons get 1.75x - * 3, 5, 7, 9 cost mons get 1x - * Alolan, Galarian, and Paldean mons get 0.5x - * Hisui mons get 0.125x - * - * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once - * and being the same each time - */ - let totalWeight = 0; - const speciesWeights = []; - for (const speciesId of speciesPool) { - let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); - const species = getPokemonSpecies(speciesId); - if (species.isRegional()) { - weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); - } - speciesWeights.push(totalWeight + weight); - totalWeight += weight; - } - - let species: Species; - - const rand = Utils.randSeedInt(totalWeight); - for (let s = 0; s < speciesWeights.length; s++) { - if (rand < speciesWeights[s]) { - species = speciesPool[s]; - break; - } - } - - if (!!this.scene.gameData.dexData[species].caughtAttr) { - this.scene.gameData.unlockPity[this.egg.tier] = Math.min(this.scene.gameData.unlockPity[this.egg.tier] + 1, 10); - } else { - this.scene.gameData.unlockPity[this.egg.tier] = 0; - } - - const pokemonSpecies = getPokemonSpecies(species); - - ret = this.scene.addPlayerPokemon(pokemonSpecies, 1, undefined, undefined, undefined, false); - } - - /** - * Non Shiny gacha Pokemon have a 1/128 chance of being shiny - * Shiny gacha Pokemon have a 1/64 chance of being shiny - * IVs are rolled twice and the higher of each stat's IV is taken - * The egg move gacha doubles the rate of rare egg moves but the base rates are - * Common: 1/48 - * Rare: 1/24 - * Epic: 1/12 - * Legendary: 1/6 - */ - ret.trySetShiny(this.egg.gachaType === GachaType.SHINY ? 1024 : 512); - ret.variant = ret.shiny ? ret.generateVariant() : 0; - - const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); - - for (let s = 0; s < ret.ivs.length; s++) { - ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); - } - - const baseChance = this.egg.gachaType === GachaType.MOVE ? 3 : 6; - this.eggMoveIndex = Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.egg.tier)) - ? Utils.randSeedInt(3) - : 3; + ret = this.egg.generatePlayerPokemon(this.scene); + this.eggMoveIndex = this.egg.eggMoveIndex; }, this.egg.id, EGG_SEED.toString()); diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 90f45f481ba..722096c42cd 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -20,5 +20,6 @@ export enum ArenaTagType { WIDE_GUARD = "WIDE_GUARD", MAT_BLOCK = "MAT_BLOCK", CRAFTY_SHIELD = "CRAFTY_SHIELD", - TAILWIND = "TAILWIND" + TAILWIND = "TAILWIND", + HAPPY_HOUR = "HAPPY_HOUR" } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 4d212a2da12..5cdabfe78c2 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -54,7 +54,7 @@ export enum BattlerTagType { SALT_CURED = "SALT_CURED", CURSED = "CURSED", CHARGED = "CHARGED", - GROUNDED = "GROUNDED", + ROOSTED = "ROOSTED", MAGNET_RISEN = "MAGNET_RISEN", MINIMIZED = "MINIMIZED", DESTINY_BOND = "DESTINY_BOND", diff --git a/src/enums/color.ts b/src/enums/color.ts new file mode 100644 index 00000000000..99c2d14cb63 --- /dev/null +++ b/src/enums/color.ts @@ -0,0 +1,83 @@ +export enum Color { + WHITE = "#ffffff", + OFF_WHITE = "#f8f8f8", + LIGHT_GREY = "#a0a0a0", + GREY = "#484848", + DARK_GREY = "#404040", + PINK = "#f89890", + RED = "#e13d3d", + RED2 = "#e70808", + REDORANGE = "#d64b00", + ORANGE = "#f8b050", + LIGHT_YELLOW = "#e8e8a8", + YELLOW = "#ccbe00", + DARK_YELLOW = "#a68e17", + GREEN = "#78c850", + BLUE = "#40c8f8", + COMMON = "#ffffff", + GREAT = "#3890f8", + ULTRA = "#f8d038", + ROGUE = "#d52929", + MASTER = "#e020c0", + LUXURY = "#e64a18" +} + +export enum TypeColor { + NORMAL = "#ADA594", + FIGHTING = "#A55239", + FLYING = "#9CADF7", + POISON = "#9141CB", + GROUND = "#AE7A3B", + ROCK = "#BDA55A", + BUG = "#ADBD21", + GHOST = "#6363B5", + STEEL = "#81A6BE", + FIRE = "#F75231", + WATER = "#399CFF", + GRASS = "#7BCE52", + ELECTRIC = "#FFC631", + PSYCHIC = "#EF4179", + ICE = "#5ACEE7", + DRAGON = "#7B63E7", + DARK = "#735A4A", + FAIRY = "#EF70EF", +} + +export enum TypeShadow { + NORMAL = "#574F4A", + FIGHTING = "#4E637C", + FLYING = "#4E637C", + POISON = "#352166", + GROUND = "#572D1E", + ROCK = "#5F442D", + BUG = "#5F5010", + GHOST = "#323D5B", + STEEL = "#415C5F", + FIRE = "#7C1818", + WATER = "#1C4E80", + GRASS = "#4F6729", + ELECTRIC = "#804618", + PSYCHIC = "#782155", + ICE = "#2D5C74", + DRAGON = "#313874", + DARK = "#392725", + FAIRY = "#663878", +} + +export enum ShadowColor { + GREY = "#636363", + PURPLE = "#6b5a73", + LIGHT_GREY = "#d0d0c8", + BROWN = "#69402a", + PINK = "#fca2a2", + BRIGHT_RED = "#f83018", + RED = "#984038", + MAROON = "#632929", + GREEN = "#306850", + BLUE = "#006090", + LIGHT_YELLOW = "#ded6b5", + YELLOW = "#ebd773", + DARK_YELLOW = "#a0a060", + ORANGE = "#c07800", + LIGHT_ORANGE = "#ffbd73", +} diff --git a/src/enums/egg-source-types.ts b/src/enums/egg-source-types.ts new file mode 100644 index 00000000000..a670d86704b --- /dev/null +++ b/src/enums/egg-source-types.ts @@ -0,0 +1,7 @@ +export enum EggSourceType { + GACHA_MOVE, + GACHA_LEGENDARY, + GACHA_SHINY, + SAME_SPECIES_EGG, + EVENT +} diff --git a/src/enums/gacha-types.ts b/src/enums/gacha-types.ts new file mode 100644 index 00000000000..c8beff5cad2 --- /dev/null +++ b/src/enums/gacha-types.ts @@ -0,0 +1,5 @@ +export enum GachaType { + MOVE, + LEGENDARY, + SHINY +} diff --git a/src/enums/variant-tier.ts b/src/enums/variant-tier.ts new file mode 100644 index 00000000000..279846d5f60 --- /dev/null +++ b/src/enums/variant-tier.ts @@ -0,0 +1,5 @@ +export enum VariantTier { + STANDARD, + RARE, + EPIC +} diff --git a/src/enums/variant-tiers.ts b/src/enums/variant-tiers.ts new file mode 100644 index 00000000000..20a0e8ec4e4 --- /dev/null +++ b/src/enums/variant-tiers.ts @@ -0,0 +1,5 @@ +export enum VariantTier { + COMMON, + RARE, + EPIC +} diff --git a/src/field/arena.ts b/src/field/arena.ts index a5e62872152..ddb3499b3ae 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -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: @@ -661,7 +665,7 @@ export class Arena { case Biome.LAKE: return 5.350; case Biome.SEABED: - return 2.629; + return 2.600; case Biome.MOUNTAIN: return 4.018; case Biome.BADLANDS: @@ -691,7 +695,7 @@ export class Arena { case Biome.ABYSS: return 5.130; case Biome.SPACE: - return 21.347; + return 20.036; case Biome.CONSTRUCTION_SITE: return 1.222; case Biome.JUNGLE: diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index cebde7c3ae9..4af219a60b9 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -20,6 +20,7 @@ export default class DamageNumberHandler { const battlerIndex = target.getBattlerIndex(); const baseScale = target.getSpriteScale() / 6; const damageNumber = addTextObject(scene, target.x, -(scene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, Utils.formatStat(amount, true), TextStyle.SUMMARY); + damageNumber.setName("text-damage-number"); damageNumber.setOrigin(0.5, 1); damageNumber.setScale(baseScale); diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 9b55133bb50..5312dd18727 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -39,6 +39,7 @@ export default class PokemonSpriteSparkleHandler { const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height]; const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), "tera_sparkle"); sparkle.pipelineData["ignoreTimeTint"] = s.pipelineData["ignoreTimeTint"]; + sparkle.setName("sprite-tera-sparkle"); sparkle.play("tera_sparkle"); parent.add(sparkle); s.scene.time.delayedCall(Utils.fixedInt(Math.floor((1000 / 12) * 13)), () => sparkle.destroy()); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 5b37365bec1..0fb74d51304 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 } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat } from "../data/pokemon-stat"; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; +import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; import { Status, StatusEffect, getRandomStatus } from "../data/status-effect"; import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions"; import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; -import { DamagePhase, FaintPhase, LearnMovePhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; import { BattleStat } from "../data/battle-stat"; -import { BattlerTag, BattlerTagLapseType, EncoreTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; +import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, 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 } from "../data/ability"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AllyMoveCategoryPowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AddSecondStrikeAbAttr, UserFieldMoveTypePowerBoostAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -657,6 +657,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel); } const statValue = new Utils.NumberHolder(this.getStat(stat)); + this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + const fieldApplied = new Utils.BooleanHolder(false); for (const pokemon of this.scene.getField(true)) { applyFieldBattleStatMultiplierAbAttrs(FieldMultiplyBattleStatAbAttr, pokemon, stat, statValue, this, fieldApplied); @@ -847,10 +849,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return ret; } + /** + * All moves that could be relearned by this pokemon at this point. Used for memory mushrooms. + * @returns {Moves[]} The valid moves + */ 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); + return this.getLevelMoves(1, true, false, true).map(lm => lm[1]).filter(lm => !this.moveset.filter(m => m.moveId === lm).length).filter((move: Moves, i: integer, array: Moves[]) => array.indexOf(move) === i); } + /** + * Gets the types of a pokemon + * @param includeTeraType boolean to include tera-formed type, default false + * @param forDefend boolean if the pokemon is defending from an attack + * @param ignoreOverride boolean if true, ignore ability changing effects + * @returns array of {@linkcode Type} + */ getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride?: boolean): Type[] { const types = []; @@ -884,7 +897,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (forDefend && (this.getTag(BattlerTagType.IGNORE_FLYING) || this.scene.arena.getTag(ArenaTagType.GRAVITY) || this.getTag(BattlerTagType.GROUNDED))) { + // this.scene potentially can be undefined for a fainted pokemon in doubles + // use optional chaining to avoid runtime errors + if (forDefend && (this.getTag(GroundedTag) || this.scene?.arena.getTag(ArenaTagType.GRAVITY))) { const flyingIndex = types.indexOf(Type.FLYING); if (flyingIndex > -1) { types.splice(flyingIndex, 1); @@ -1061,7 +1076,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * in effect, and both passive and non-passive. This is one of the two primary ways to check * whether a pokemon has a particular ability. * @param {AbAttr} attrType The ability attribute to check for - * @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active + * @param {boolean} canApply If false, it doesn't check whether the ability is currently active * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether an ability with that attribute is present and active */ @@ -1082,13 +1097,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return weight.value; } + /** + * Gets the tera-formed type of the pokemon, or UNKNOWN if not present + * @returns the {@linkcode Type} + */ getTeraType(): Type { - const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier - && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; - if (teraModifier) { - return teraModifier.teraType; + // this.scene can be undefined for a fainted mon in doubles + if (this.scene !== undefined) { + const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier + && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; + // return teraType + if (teraModifier) { + return teraModifier.teraType; + } } - + // if scene is undefined, or if teraModifier is considered false, then return unknown type return Type.UNKNOWN; } @@ -1097,7 +1120,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isGrounded(): boolean { - return !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)); } /** @@ -1136,10 +1159,18 @@ 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 moveType Type of the move + * @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(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { if (moveType === Type.STELLAR) { return this.isTerastallized() ? 2 : 1; } @@ -1160,8 +1191,11 @@ 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)) { @@ -1216,7 +1250,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) { @@ -1227,62 +1269,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; @@ -1725,7 +1750,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const cancelled = new Utils.BooleanHolder(false); const typeless = move.hasAttr(TypelessAttr); const typeMultiplier = new Utils.NumberHolder(!typeless && (moveCategory !== MoveCategory.STATUS || move.getAttrs(StatusMoveTypeImmunityAttr).find(attr => types.includes(attr.immuneType))) - ? this.getAttackTypeEffectiveness(move.type, source) + ? this.getAttackTypeEffectiveness(move.type, source, false, false) : 1); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); if (typeless) { @@ -1769,12 +1794,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { aura.applyPreAttack(null, null, null, move, [power]); } - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, power); + const alliedField: Pokemon[] = source instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField(); + alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, this, move, power)); power.value *= typeChangeMovePowerMultiplier.value; if (!typeless) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); + applyMoveAttrs(NeutralDamageAgainstFlyingTypeMultiplierAttr, source, this, move, typeMultiplier); } if (!cancelled.value) { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier); @@ -1782,6 +1809,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (cancelled.value) { + source.stopMultiHit(this); result = HitResult.NO_EFFECT; } else { const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === move.type) as TypeBoostTag; @@ -1796,7 +1824,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && move.type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { power.value /= 2; } + applyMoveAttrs(VariablePowerAttr, source, this, move, power); + this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); if (!typeless) { this.scene.arena.applyTags(WeakenMoveTypeTag, move.type, power); @@ -1865,8 +1895,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); + const effectPhase = this.scene.getCurrentPhase(); + let numTargets = 1; + if (effectPhase instanceof MoveEffectPhase) { + numTargets = effectPhase.getTargets().length; + } + const twoStrikeMultiplier = new Utils.NumberHolder(1); + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); + if (!isTypeImmune) { - damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); + damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * twoStrikeMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { if (!move.hasAttr(BypassBurnDamageReductionAttr)) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); @@ -1934,10 +1972,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); - - if (power.value === 0) { - damage.value = 0; - } + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, damage); console.log("damage", damage.value, move.name, power.value, sourceAtk, targetDef); @@ -2234,6 +2269,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.moveQueue; } + /** + * If this Pokemon is using a multi-hit move, cancels all subsequent strikes + * @param {Pokemon} target If specified, this only cancels subsequent strikes against the given target + */ + stopMultiHit(target?: Pokemon): void { + const effectPhase = this.scene.getCurrentPhase(); + if (effectPhase instanceof MoveEffectPhase && effectPhase.getUserPokemon() === this) { + effectPhase.stopMultiHit(target); + } + } + changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); @@ -2508,6 +2554,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } + /** + * If this Pokemon falls asleep or freezes in the middle of a multi-hit attack, + * cancel the attack's subsequent hits. + */ + if (effect === StatusEffect.SLEEP || effect === StatusEffect.FREEZE) { + this.stopMultiHit(); + } + if (asPhase) { this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon)); return true; @@ -3069,7 +3123,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); @@ -3361,14 +3415,17 @@ export class EnemyPokemon extends Pokemon { public aiType: AiType; public bossSegments: integer; public bossSegmentIndex: integer; + /** To indicate of the instance was populated with a dataSource -> e.g. loaded & populated from session data */ + public readonly isPopulatedFromDataSource: boolean; constructor(scene: BattleScene, species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean, dataSource: PokemonData) { super(scene, 236, 84, species, level, dataSource?.abilityIndex, dataSource?.formIndex, dataSource?.gender, dataSource ? dataSource.shiny : false, dataSource ? dataSource.variant : undefined, null, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; + this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource if (boss) { - this.setBoss(); + this.setBoss(boss, dataSource?.bossSegments); } if (Overrides.OPP_STATUS_OVERRIDE) { @@ -3416,6 +3473,13 @@ export class EnemyPokemon extends Pokemon { } } + /** + * Sets the pokemons boss status. If true initializes the boss segments either from the arguments + * or through the the Scene.getEncounterBossSegments function + * + * @param boss if the pokemon is a boss + * @param bossSegments amount of boss segments (health-bar segments) + */ setBoss(boss: boolean = true, bossSegments: integer = 0): void { if (boss) { this.bossSegments = bossSegments || this.scene.getEncounterBossSegments(this.scene.currentBattle.waveIndex, this.level, this.species, true); @@ -3505,6 +3569,10 @@ export class EnemyPokemon extends Pokemon { const target = this.scene.getField()[mt]; let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); + if (Number.isNaN(targetScore)) { + console.error(`Move ${move.name} returned score of NaN`); + targetScore = 0; + } if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)) { targetScore = -20; } else if (move instanceof AttackMove) { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index a582ab4b096..3e78afeae83 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -432,20 +432,24 @@ export default class Trainer extends Phaser.GameObjects.Container { } const party = this.scene.getEnemyParty(); - const nonFaintedPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => !p.isFainted()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); - const partyMemberScores = nonFaintedPartyMembers.map(p => { - const playerField = this.scene.getPlayerField(); + const nonFaintedLegalPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => p.isAllowedInBattle()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); + const partyMemberScores = nonFaintedLegalPartyMembers.map(p => { + const playerField = this.scene.getPlayerField().filter(p => p.isAllowedInBattle()); let score = 0; - for (const playerPokemon of playerField) { - score += p.getMatchupScore(playerPokemon); - if (playerPokemon.species.legendary) { - score /= 2; + + if (playerField.length > 0) { + for (const playerPokemon of playerField) { + score += p.getMatchupScore(playerPokemon); + if (playerPokemon.species.legendary) { + score /= 2; + } + } + score /= playerField.length; + if (forSwitch && !p.isOnField()) { + this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); } } - score /= playerField.length; - if (forSwitch && !p.isOnField()) { - this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); - } + return [party.indexOf(p), score]; }) as [integer, integer][]; diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index 7d4e8349775..ebf91c635fd 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -280,7 +280,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..dd22e69d719 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -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 21fbda7c468..5f7c52100c1 100644 --- a/src/interfaces/locales.ts +++ b/src/interfaces/locales.ts @@ -2,6 +2,9 @@ export interface Localizable { localize(): void; } +export interface TranslationEntries { + [key: string]: string | { [key: string]: string } +} export interface SimpleTranslationEntries { [key: string]: string } @@ -32,6 +35,7 @@ export interface ModifierTypeTranslationEntry { export interface ModifierTypeTranslationEntries { ModifierType: { [key: string]: ModifierTypeTranslationEntry }, + SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }, AttackTypeBoosterItem: SimpleTranslationEntries, TempBattleStatBoosterItem: SimpleTranslationEntries, TempBattleStatBoosterStatName: SimpleTranslationEntries, @@ -54,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 e623c00aad0..aca2d5e6c41 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -1,4 +1,4 @@ -import { GachaType } from "./data/egg"; +import { GachaType } from "./enums/gacha-types"; import { trainerConfigs } from "./data/trainer-config"; import { getBiomeHasProps } from "./field/arena"; import CacheBustedLoaderPlugin from "./plugins/cache-busted-loader-plugin"; @@ -43,7 +43,6 @@ export class LoadingScene extends SceneBase { // Load menu images this.loadAtlas("bg", "ui"); - this.loadImage("command_fight_labels", "ui"); this.loadAtlas("prompt", "ui"); this.loadImage("candy", "ui"); this.loadImage("candy_overlay", "ui"); @@ -79,6 +78,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"); @@ -91,6 +91,7 @@ export class LoadingScene extends SceneBase { this.loadImage("shiny_star_small", "ui", "shiny_small.png"); this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); + this.loadAtlas("shiny_icons", "ui"); this.loadImage("ha_capsule", "ui", "ha_capsule.png"); this.loadImage("champion_ribbon", "ui", "champion_ribbon.png"); this.loadImage("icon_spliced", "ui"); @@ -323,6 +324,7 @@ export class LoadingScene extends SceneBase { this.loadBgm("minor_fanfare", "bw/minor_fanfare.mp3"); this.loadBgm("heal", "bw/heal.mp3"); this.loadBgm("victory_trainer", "bw/victory_trainer.mp3"); + this.loadBgm("victory_team_plasma", "bw/victory_team_plasma.mp3"); this.loadBgm("victory_gym", "bw/victory_gym.mp3"); this.loadBgm("victory_champion", "bw/victory_champion.mp3"); this.loadBgm("evolution", "bw/evolution.mp3"); diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 895f2f55c64..4e69db20231 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -1,8 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!", + "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", + "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", + "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", - "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden\nmit {{abilityName}} ab!", + "quickDraw": "Durch Schnellschuss kann {{pokemonName}} schneller handeln als sonst!", } as const; diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 760f17c0c9a..06b9ec719ba 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -14,7 +14,9 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?", "trainerDefeated": "{{trainerName}}\nwurde besiegt!", "moneyWon": "Du gewinnst\n{{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?", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", @@ -24,7 +26,9 @@ 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}}!", @@ -37,7 +41,7 @@ export const battle: SimpleTranslationEntries = { "learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.", "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!", "learnMoveAnd": "Und…", - "levelCapUp": "Das Levelbeschränkung\nwurde auf {{levelCap}} erhöht!", + "levelCapUp": "Die Levelbeschränkung\nwurde auf {{levelCap}} erhöht!", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!", "moveDisabled": "{{moveName}} ist deaktiviert!", @@ -54,6 +58,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", + "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", + "hpIsFull": "Die KP von {{pokemonName}} sind voll!", "eggHatching": "Oh?", "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?", "wildPokemonWithAffix": "{{pokemonName}} (wild)", @@ -61,16 +67,17 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} setzt {{moveName}} ein!", "drainMessage": "{{pokemonName}} wurde Energie abgesaugt", "regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", "fainted": "{{pokemonNameWithAffix}} wurde besiegt!", - "statRose": "steigt", - "statSharplyRose": "steigt stark", - "statRoseDrastically": "steigt drastisch", - "statWontGoAnyHigher": "kann nicht weiter erhöht werden", - "statFell": "sinkt", - "statHarshlyFell": "sinkt stark", - "statSeverelyFell": "sinkt drastisch", - "statWontGoAnyLower": "kann nicht weiter sinken", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", + "statRose": "{{stats}} von {{pokemonNameWithAffix}} steigt!", + "statSharplyRose": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", + "statRoseDrastically": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", + "statWontGoAnyHigher": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", + "statFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", + "statHarshlyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", + "statSeverelyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", + "statWontGoAnyLower": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", + "ppReduced": "{{moveName}} von {{targetName}} wird um {{reduction}} AP reduziert!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.", @@ -93,7 +100,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsNightmareOnAdd": "Nachtmahr sucht {{pokemonNameWithAffix}} heim!", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} wird bereits von Nachtmahr heimgesucht!", "battlerTagsNightmareLapse": "Nachtmahr schadet {{pokemonNameWithAffix}}!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} gibt eine Zugabe", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} gibt eine Zugabe", "battlerTagsEncoreOnRemove": "Die Zugabe von {{pokemonNameWithAffix}} ist beendet!", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} will {{pokemonName}} helfen!", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} nimmt über seine Wurzeln Nährstoffe auf!", diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts new file mode 100644 index 00000000000..1a6712b8608 --- /dev/null +++ b/src/locales/de/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Musik: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "S2W2 Vs. Kanto Champion", + "battle_johto_champion": "S2W2 Vs. Johto Champion", + "battle_hoenn_champion": "S2W2 Vs. Hoenn Champion", + "battle_sinnoh_champion": "S2W2 Vs. Champion Cynthia", + "battle_champion_alder": "SW Vs. Champion Lauro", + "battle_champion_iris": "S2W2 Vs. Champion Lilia", + "battle_kalos_champion": "XY Vs. Champion Diantha", + "battle_alola_champion": "USUM Vs. Alola Champion", + "battle_galar_champion": "SWSH Vs. Champion Delion", + "battle_champion_geeta": "KAPU Vs. Champion Sagaria", + "battle_champion_nemona": "KAPU Vs. Champion Nemila", + "battle_champion_kieran": "KAPU Vs. Jo", + "battle_hoenn_elite": "ORAS Vs. Hoenn Top Vier", + "battle_unova_elite": "SW Vs. Einall Top Vier", + "battle_kalos_elite": "XY Vs. Kalos Top Vier", + "battle_alola_elite": "SM Vs. Alola Top Vier", + "battle_galar_elite": "SWSH Galar Champ-Cup", + "battle_paldea_elite": "KAPU Vs. Paldea Top Vier", + "battle_bb_elite": "KAPU Vs. Blaubeer-Top-Vier", + "battle_final_encounter": "PMDDX Rayquazas Domäne", + "battle_final": "SW Vs. G-Cis", + "battle_kanto_gym": "S2W2 Vs. Kanto Arenaleiter", + "battle_johto_gym": "S2W2 Vs. Johto Arenaleiter", + "battle_hoenn_gym": "S2W2 Vs. Hoenn Arenaleiter", + "battle_sinnoh_gym": "S2W2 Vs. Sinnoh Arenaleiter", + "battle_unova_gym": "SW Vs. Einall Arenaleiter", + "battle_kalos_gym": "XY Vs. Kalos Arenaleiter", + "battle_galar_gym": "SWSH Vs. Galar Arenaleiter", + "battle_paldea_gym": "KAPU Vs. Paldea Arenaleiter", + "battle_legendary_kanto": "XY Vs. Legendäres Kanto Pokémon", + "battle_legendary_raikou": "HGSS Vs. Raikou", + "battle_legendary_entei": "HGSS Vs. Entei", + "battle_legendary_suicune": "HGSS Vs. Suicune", + "battle_legendary_lugia": "HGSS Vs. Lugia", + "battle_legendary_ho_oh": "HGSS Vs. Ho-oh", + "battle_legendary_regis_g5": "S2W2 Vs. Legendäre Giganten", + "battle_legendary_regis_g6": "ORAS Vs. Legendäre Giganten", + "battle_legendary_gro_kyo": "ORAS Vs. Groudon & Kyogre", + "battle_legendary_rayquaza": "ORAS Vs. Rayquaza", + "battle_legendary_deoxys": "ORAS Vs. Deoxys", + "battle_legendary_lake_trio": "ORAS Vs. Seen-Trio", + "battle_legendary_sinnoh": "ORAS Vs. Legendäres Sinnoh Pokémon", + "battle_legendary_dia_pal": "ORAS Vs. Dialga & Palkia", + "battle_legendary_giratina": "ORAS Vs. Giratina", + "battle_legendary_arceus": "HGSS Vs. Arceus", + "battle_legendary_unova": "SW Vs. Legendäres Einall Pokémon", + "battle_legendary_kyurem": "SW Vs. Kyurem", + "battle_legendary_res_zek": "SW Vs. Reshiram & Zekrom", + "battle_legendary_xern_yvel": "XY Vs. Xerneas & Yveltal", + "battle_legendary_tapu": "SM Vs. Kapu", + "battle_legendary_sol_lun": "SM Vs. Solgaleo & Lunala", + "battle_legendary_ub": "SM Vs. Ultrabestie", + "battle_legendary_dusk_dawn": "USUM Vs. Abendmähne- & Morgenschwingen-Necrozma", + "battle_legendary_ultra_nec": "USUM Vs. Ultra-Necrozma", + "battle_legendary_zac_zam": "SWSH Vs. Zacian & Zamazenta", + "battle_legendary_glas_spec": "SWSH Vs. Polaross & Phantoross", + "battle_legendary_calyrex": "SWSH Vs. Coronospa", + "battle_legendary_birds_galar": "SWSH Vs. Legendäre Galar-Vögel", + "battle_legendary_ruinous": "KAPU Vs. Schätze des Unheils", + "battle_legendary_kor_mir": "KAPU Die Tiefen von Zone Null", + "battle_legendary_loyal_three": "KAPU Drei Gefährten", + "battle_legendary_ogerpon": "KAPU Vs. Ogerpon", + "battle_legendary_terapagos": "KAPU Vs. Terapagos", + "battle_legendary_pecharunt": "KAPU Vs. Infamomo", + "battle_rival": "SW Vs. Rivale", + "battle_rival_2": "SW Vs. N", + "battle_rival_3": "SW Vs. N (Finale)", + "battle_trainer": "SW Vs. Trainer", + "battle_wild": "SW Vs. Wilde Pokémon", + "battle_wild_strong": "SW Vs. Starke Wilde Pokémon", + "end_summit": "PMDDX Gipfel des Himmelturms", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", + "badlands": "PMD Erkundungsteam Himmel Kargtal", + "beach": "PMD Erkundungsteam Himmel Feuchtklippe", + "cave": "PMD Erkundungsteam Himmel Himmelsgipfel-Höhle", + "construction_site": "PMD Erkundungsteam Himmel Geröllbruch", + "desert": "PMD Erkundungsteam Himmel Nordwüste", + "dojo": "PMD Erkundungsteam Himmel Knogga-Dojo", + "end": "PMD Retterteam DX Himmelsturm", + "factory": "PMD Erkundungsteam Himmel Verborgene Ruinen", + "fairy_cave": "PMD Erkundungsteam Himmel Sternenhöhle", + "forest": "PMD Erkundungsteam Himmel Düsterwald", + "grass": "PMD Erkundungsteam Himmel Apfelwald", + "graveyard": "PMD Erkundungsteam Himmel Verwirrwald", + "ice_cave": "PMD Erkundungsteam Himmel Rieseneisberg", + "island": "PMD Erkundungsteam Himmel Schroffküste", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD Erkundungsteam Himmel Kristallhöhle", + "meadow": "PMD Erkundungsteam Himmel Himmelsgipfel-Wald", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD Erkundungsteam Himmel Hornberg", + "plains": "PMD Erkundungsteam Himmel Himmelsgipfel-Prärie", + "power_plant": "PMD Erkundungsteam Himmel Weite Ampere-Ebene", + "ruins": "PMD Erkundungsteam Himmel Tiefes Ruinenverlies", + "sea": "PMD Erkundungsteam Himmel Salzwasserhöhle", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD Erkundungsteam Himmel Himmelsgipfel-Küste", + "snowy_forest": "PMD Erkundungsteam Himmel Himmelsgipfel-Schneefeld", + "space": "Firel - Aether", + "swamp": "PMD Erkundungsteam Himmel Ringmeer", + "tall_grass": "PMD Erkundungsteam Himmel Nebelwald", + "temple": "PMD Erkundungsteam Himmel Ägishöhle", + "town": "PMD Erkundungsteam Himmel Zufälliges Dungeon-Theme 3", + "volcano": "PMD Erkundungsteam Himmel Dunsthöhle", + "wasteland": "PMD Erkundungsteam Himmel Verborgenes Hochland", + + // Encounter + "encounter_ace_trainer": "SW Trainerblicke treffen sich (Ass-Trainer)", + "encounter_backpacker": "SW Trainerblicke treffen sich (Backpacker)", + "encounter_clerk": "SW Trainerblicke treffen sich (Angestellter)", + "encounter_cyclist": "SW Trainerblicke treffen sich (Biker)", + "encounter_lass": "SW Trainerblicke treffen sich (Göre)", + "encounter_parasol_lady": "SW Trainerblicke treffen sich (Schirmdame)", + "encounter_pokefan": "SW Trainerblicke treffen sich (Pokéfan)", + "encounter_psychic": "SW Trainerblicke treffen sich (Seher)", + "encounter_rich": "SW Trainerblicke treffen sich (Gentleman)", + "encounter_rival": "SW Vs. Cheren", + "encounter_roughneck": "SW Trainerblicke treffen sich (Raufbold)", + "encounter_scientist": "SW Trainerblicke treffen sich (Forscher)", + "encounter_twins": "SW Trainerblicke treffen sich (Zwillinge)", + "encounter_youngster": "SW Trainerblicke treffen sich (Knirps)", + + // Other + "heal": "SW Pokémon-Heilung", + "menu": "PMD Erkundungsteam Himmel Willkommen in der Welt der Pokémon!", + "title": "PMD Erkundungsteam Himmel Top-Menü-Thema", +} as const; diff --git a/src/locales/de/challenges.ts b/src/locales/de/challenges.ts index b3e878f4649..176de9879b6 100644 --- a/src/locales/de/challenges.ts +++ b/src/locales/de/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Herausforderungsmodifikatoren", - "confirm_start": "Mit diesen Modifikatoren fortfahren?", - "singleGeneration.name": "Mono-Generation", - "singleGeneration.value.0": "Aus", - "singleGeneration.desc.0": "Du kannst nur Pokémon aus der gewählten Generation verwenden.", - "singleGeneration.value.1": "Generation 1", - "singleGeneration.desc.1": "Du kannst nur Pokémon aus der ersten Generation verwenden.", - "singleGeneration.value.2": "Generation 2", - "singleGeneration.desc.2": "Du kannst nur Pokémon aus der zweiten Generation verwenden.", - "singleGeneration.value.3": "Generation 3", - "singleGeneration.desc.3": "Du kannst nur Pokémon aus der dritten Generation verwenden.", - "singleGeneration.value.4": "Generation 4", - "singleGeneration.desc.4": "Du kannst nur Pokémon aus der vierten Generation verwenden.", - "singleGeneration.value.5": "Generation 5", - "singleGeneration.desc.5": "Du kannst nur Pokémon aus der fünften Generation verwenden.", - "singleGeneration.value.6": "Generation 6", - "singleGeneration.desc.6": "Du kannst nur Pokémon aus der sechsten Generation verwenden.", - "singleGeneration.value.7": "Generation 7", - "singleGeneration.desc.7": "Du kannst nur Pokémon aus der siebten Generation verwenden.", - "singleGeneration.value.8": "Generation 8", - "singleGeneration.desc.8": "Du kannst nur Pokémon aus der achten Generation verwenden.", - "singleGeneration.value.9": "Generation 9", - "singleGeneration.desc.9": "Du kannst nur Pokémon aus der neunten Generation verwenden.", - "singleType.name": "Mono-Typ", - "singleType.value.0": "Aus", - "singleType.desc.0": "Du kannst nur Pokémon des gewählten Typs verwenden.", - "singleType.value.1": "Normal", - "singleType.desc.1": "Du kannst nur Pokémon des Typs Normal verwenden.", - "singleType.value.2": "Kampf", - "singleType.desc.2": "Du kannst nur Pokémon des Typs Kampf verwenden.", - "singleType.value.3": "Flug", - "singleType.desc.3": "Du kannst nur Pokémon des Typs Flug verwenden.", - "singleType.value.4": "Gift", - "singleType.desc.4": "Du kannst nur Pokémon des Typs Gift verwenden.", - "singleType.value.5": "Boden", - "singleType.desc.5": "Du kannst nur Pokémon des Typs Boden verwenden.", - "singleType.value.6": "Gestein", - "singleType.desc.6": "Du kannst nur Pokémon des Typs Gestein verwenden.", - "singleType.value.7": "Käfer", - "singleType.desc.7": "Du kannst nur Pokémon des Typs Käfer verwenden.", - "singleType.value.8": "Geist", - "singleType.desc.8": "Du kannst nur Pokémon des Typs Geist verwenden.", - "singleType.value.9": "Stahl", - "singleType.desc.9": "Du kannst nur Pokémon des Typs Stahl verwenden.", - "singleType.value.10": "Feuer", - "singleType.desc.10": "Du kannst nur Pokémon des Typs Feuer verwenden.", - "singleType.value.11": "Wasser", - "singleType.desc.11": "Du kannst nur Pokémon des Typs Wasser verwenden.", - "singleType.value.12": "Pflanze", - "singleType.desc.12": "Du kannst nur Pokémon des Typs Pflanze verwenden.", - "singleType.value.13": "Elektro", - "singleType.desc.13": "Du kannst nur Pokémon des Typs Elektro verwenden.", - "singleType.value.14": "Psycho", - "singleType.desc.14": "Du kannst nur Pokémon des Typs Psycho verwenden.", - "singleType.value.15": "Eis", - "singleType.desc.15": "Du kannst nur Pokémon des Typs Eis verwenden.", - "singleType.value.16": "Drache", - "singleType.desc.16": "Du kannst nur Pokémon des Typs Drache verwenden.", - "singleType.value.17": "Unlicht", - "singleType.desc.17": "Du kannst nur Pokémon des Typs Unlicht verwenden.", - "singleType.value.18": "Fee", - "singleType.desc.18": "Du kannst nur Pokémon des Typs Fee verwenden." - + "illegalEvolution": "{{pokemon}} hat sich in ein Pokémon verwandelt, dass für diese Herausforderung nicht zulässig ist!", + "singleGeneration": { + "name": "Mono-Generation", + "desc": "Du kannst nur Pokémon aus der {{gen}} Generation verwenden.", + "desc_default": "Du kannst nur Pokémon gewählten Generation verwenden.", + "gen_1": "ersten", + "gen_2": "zweiten", + "gen_3": "dritten", + "gen_4": "vierten", + "gen_5": "fünften", + "gen_6": "sechsten", + "gen_7": "siebten", + "gen_8": "achten", + "gen_9": "neunten", + }, + "singleType": { + "name": "Mono-Typ", + "desc": "Du kannst nur Pokémon des Typs {{type}} verwenden.", + "desc_default": "Du kannst nur Pokémon des gewählten Typs verwenden." + // types in pokemon-info + }, } as const; diff --git a/src/locales/de/common.ts b/src/locales/de/common.ts new file mode 100644 index 00000000000..07f920aaf30 --- /dev/null +++ b/src/locales/de/common.ts @@ -0,0 +1,10 @@ +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 16c25d6ca78..ffbb2733205 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/de/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const deConfig = { ability: ability, @@ -47,9 +52,11 @@ export const deConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const deConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const deConfig = { 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 }; diff --git a/src/locales/de/egg.ts b/src/locales/de/egg.ts index e4a66f9ba87..9dc7b10f174 100644 --- a/src/locales/de/egg.ts +++ b/src/locales/de/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Du hast nicht genug Ei-Gutscheine!", "tooManyEggs": "Du hast schon zu viele Eier!", "pull": "Pull", - "pulls": "Pulls" + "pulls": "Pulls", + "sameSpeciesEgg": "{{species}} wird aus dem Ei schlüpfen!", + "hatchFromTheEgg": "Ein {{pokemonName}} ist aus dem Ei geschlüpft!", + "eggMoveUnlock": "Ei-Attacke freigeschaltet: {{moveName}}", + "rareEggMoveUnlock": "Seltene Ei-Attacke freigeschaltet: {{moveName}}", + "moveUPGacha": "Mehr\nEi-Attacken!", + "shinyUPGacha": "Mehr\nSchillernde!", + "legendaryUPGacha": "erscheint\nöfter!", } as const; diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index 7c5858540ca..6d461d286af 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Google verbinden", "unlinkGoogle": "Google trennen", "cancel": "Abbrechen", - "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?" + "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", + "noEggs": "Du brütest aktuell keine Eier aus!" } as const; diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index e31f352030c..bd0173a3383 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -48,10 +48,11 @@ export const menu: SimpleTranslationEntries = { "score": "Punkte", "wave": "Welle", "loading": "Lade…", - "loadingAsset": "Loading asset: {{assetName}}", + "loadingAsset": "Lade Asset: {{assetName}}", "playersOnline": "Spieler Online", "yes":"Ja", "no":"Nein", - "disclaimer": "DISCLAIMER", + "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.", + "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 f5536e2c6d7..d1019ec4270 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -151,7 +151,7 @@ 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." }, "ETHER": { name: "Äther" }, "MAX_ETHER": { name: "Top-Äther" }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Sanftglocke" }, + "EVIOLITE": { name: "Evolith", description: "Ein mysteriöser Klumpen, der die Vert. u. Spez.-Vert. von Pokémon erhöht, die sich noch entwickeln können." }, + "SOUL_DEW": { name: "Seelentau", description: "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)." }, "NUGGET": { name: "Nugget" }, @@ -240,6 +242,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Kugelblitz", description: "Ein Item, das von Pikachu getragen werden kann. Es erhöht den Angriff und den Spezial-Angriff." }, + "THICK_CLUB": { name: "Kampfknochen", description: "Ein Item, das von Tragosso oder Knogga getragen werden kann. Dieser harte Knochen erhöht den Angriff." }, + "METAL_POWDER": { name: "Metallstaub", description: "Ein Item, das von Ditto getragen werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Verteidigung." }, + "QUICK_POWDER": { name: "Flottstaub", description: "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative." } + }, TempBattleStatBoosterItem: { "x_attack": "X-Angriff", "x_defense": "X-Verteidigung", diff --git a/src/locales/de/modifier.ts b/src/locales/de/modifier.ts new file mode 100644 index 00000000000..c1a282ee5f1 --- /dev/null +++ b/src/locales/de/modifier.ts @@ -0,0 +1,12 @@ +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!", + "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!", +} as const; diff --git a/src/locales/de/party-ui-handler.ts b/src/locales/de/party-ui-handler.ts index da83d2370c3..604efb83628 100644 --- a/src/locales/de/party-ui-handler.ts +++ b/src/locales/de/party-ui-handler.ts @@ -6,5 +6,48 @@ 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", + + "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-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/settings.ts b/src/locales/de/settings.ts index f7b8a1b0877..0254611b5d5 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", @@ -95,4 +95,5 @@ export const settings: SimpleTranslationEntries = { "mute": "Stumm", "controller": "Controller", "gamepadSupport": "Controllerunterstützung", + "showBgmBar": "Musiknamen anzeigen", } as const; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index c82f579c341..92ead61ebe7 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passiv:", "nature": "Wesen:", "eggMoves": "Ei-Attacken", - "start": "Start", "addToParty": "Zum Team hinzufügen", "toggleIVs": "DVs anzeigen/verbergen", "manageMoves": "Attacken ändern", @@ -32,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Wähle die gewünschte Attacke.", "unlockPassive": "Passiv-Skill freischalten", "reduceCost": "Preis reduzieren", + "sameSpeciesEgg": "Ein Ei kaufen", "cycleShiny": ": Schillernd", "cycleForm": ": Form", "cycleGender": ": Geschlecht", diff --git a/src/locales/de/status-effect.ts b/src/locales/de/status-effect.ts new file mode 100644 index 00000000000..997d005987e --- /dev/null +++ b/src/locales/de/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Gift", + description: "Vergiftungen", + obtain: "{{pokemonNameWithAffix}} wurde vergiftet!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} vergiftet!", + activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", + heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + toxic: { + name: "Gift", + description: "Vergiftungen", + obtain: "{{pokemonNameWithAffix}} wurde schwer vergiftet!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} schwer vergiftet!", + activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", + heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + paralysis: { + name: "Paralyse", + description: "Paralyse", + obtain: "{{pokemonNameWithAffix}} wurde paralysiert!\nEs kann eventuell nicht handeln!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} paralysiert,\nEs kann eventuell nicht handeln!", + activation: "{{pokemonNameWithAffix}}ist paralysiert!\nEs kann nicht angreifen!", + overlap: "{{pokemonNameWithAffix}} ist bereits paralysiert!", + heal: "Die Paralyse von {{pokemonNameWithAffix}} wurde aufgehoben!" + }, + sleep: { + name: "Schlaf", + description: "Einschlafen", + obtain: "{{pokemonNameWithAffix}} ist eingeschlafen!", + obtainSource: "{{pokemonNameWithAffix}}ist durch {{sourceText}} eingeschlafen!", + activation: "{{pokemonNameWithAffix}} schläft tief und fest!", + overlap: "{{pokemonNameWithAffix}} schläft bereits!", + heal: "{{pokemonNameWithAffix}} ist aufgewacht!" + }, + freeze: { + name: "Gefroren", + description: "Einfrieren", + obtain: "{{pokemonNameWithAffix}} erstarrt zu Eis!", + obtainSource: "{{pokemonNameWithAffix}} erstarrt durch {{sourceText}} zu Eis!", + activation: "{{pokemonNameWithAffix}} ist eingefroren und kann nicht handeln!", + overlap: "{{pokemonNameWithAffix}} ist bereits eingefroren!", + heal: "{{pokemonNameWithAffix}} wurde aufgetaut!" + }, + burn: { + name: "Verbrennung ", + description: "Verbrennungen", + obtain: "{{pokemonNameWithAffix}} erleidet Verbrennungen!", + obtainSource: "{{pokemonNameWithAffix}} erleidet durch {{sourceText}} Verbrennungen!", + activation: "Die Verbrennungen schaden {{pokemonNameWithAffix}}!", + overlap: "{{pokemonNameWithAffix}} leidet bereits unter Verbrennungen!", + heal: "Die Verbrennungen von {{pokemonNameWithAffix}} wurden geheilt!" + }, +} as const; diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 7be3c019903..1390bf410ae 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -93,12 +93,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon-Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Angestellte", - "rich": "Rich", - "rich_female": "Rich", + "rich": "Gentleman", + "rich_female": "Reiche Dame", "rich_boy": "Schnösel", "rich_couple": "Reiches Paar", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", + "rich_kid": "Schnösel", + "rich_kid_female": "Schnöselin", "rich_kids": "Schnösel", "roughneck": "Raufbold", "sailor": "Matrose", diff --git a/src/locales/de/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 00370d82874..b516bc8dde0 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -1,10 +1,13 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", + "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", "badDreams": "{{pokemonName}} is tormented!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 304766a228f..c7e2ef96be4 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -14,7 +14,9 @@ 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}}?", "pokemon": "Pokémon", "sendOutPokemon": "Go! {{pokemonName}}!", @@ -24,7 +26,9 @@ 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!", "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", "learnMove": "{{pokemonName}} learned\n{{moveName}}!", @@ -53,6 +57,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "switching", "escapeVerbFlee": "fleeing", "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Are you sure you want to skip taking an item?", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", @@ -61,19 +67,20 @@ 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}}!", "fainted": "{{pokemonNameWithAffix}} fainted!", - "statRose": "rose", - "statSharplyRose": "sharply rose", - "statRoseDrastically": "rose drastically", - "statWontGoAnyHigher": "won't go any higher", - "statFell": "fell", - "statHarshlyFell": "harshly fell", - "statSeverelyFell": "severely fell", - "statWontGoAnyLower": "won't go any lower", + "statRose": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", @@ -93,7 +100,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts new file mode 100644 index 00000000000..87d90dabc9d --- /dev/null +++ b/src/locales/en/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/en/challenges.ts b/src/locales/en/challenges.ts index 746a7e962d2..a40f05a0843 100644 --- a/src/locales/en/challenges.ts +++ b/src/locales/en/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales.js"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Challenge Modifiers", - "start": "Start", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokemon\nfor this challenge!", - "singleGeneration.name": "Mono Gen", - "singleGeneration.value.0": "Off", - "singleGeneration.desc.0": "You can only use pokemon from the chosen generation.", - "singleGeneration.value.1": "Gen 1", - "singleGeneration.desc.1": "You can only use pokemon from generation one.", - "singleGeneration.value.2": "Gen 2", - "singleGeneration.desc.2": "You can only use pokemon from generation two.", - "singleGeneration.value.3": "Gen 3", - "singleGeneration.desc.3": "You can only use pokemon from generation three.", - "singleGeneration.value.4": "Gen 4", - "singleGeneration.desc.4": "You can only use pokemon from generation four.", - "singleGeneration.value.5": "Gen 5", - "singleGeneration.desc.5": "You can only use pokemon from generation five.", - "singleGeneration.value.6": "Gen 6", - "singleGeneration.desc.6": "You can only use pokemon from generation six.", - "singleGeneration.value.7": "Gen 7", - "singleGeneration.desc.7": "You can only use pokemon from generation seven.", - "singleGeneration.value.8": "Gen 8", - "singleGeneration.desc.8": "You can only use pokemon from generation eight.", - "singleGeneration.value.9": "Gen 9", - "singleGeneration.desc.9": "You can only use pokemon from generation nine.", - "singleType.name": "Mono Type", - "singleType.value.0": "Off", - "singleType.desc.0": "You can only use pokemon of the chosen type.", - "singleType.value.1": "Normal", - "singleType.desc.1": "You can only use pokemon with the Normal type.", - "singleType.value.2": "Fighting", - "singleType.desc.2": "You can only use pokemon with the Fighting type.", - "singleType.value.3": "Flying", - "singleType.desc.3": "You can only use pokemon with the Flying type.", - "singleType.value.4": "Poison", - "singleType.desc.4": "You can only use pokemon with the Poison type.", - "singleType.value.5": "Ground", - "singleType.desc.5": "You can only use pokemon with the Ground type.", - "singleType.value.6": "Rock", - "singleType.desc.6": "You can only use pokemon with the Rock type.", - "singleType.value.7": "Bug", - "singleType.desc.7": "You can only use pokemon with the Bug type.", - "singleType.value.8": "Ghost", - "singleType.desc.8": "You can only use pokemon with the Ghost type.", - "singleType.value.9": "Steel", - "singleType.desc.9": "You can only use pokemon with the Steel type.", - "singleType.value.10": "Fire", - "singleType.desc.10": "You can only use pokemon with the Fire type.", - "singleType.value.11": "Water", - "singleType.desc.11": "You can only use pokemon with the Water type.", - "singleType.value.12": "Grass", - "singleType.desc.12": "You can only use pokemon with the Grass type.", - "singleType.value.13": "Electric", - "singleType.desc.13": "You can only use pokemon with the Electric type.", - "singleType.value.14": "Psychic", - "singleType.desc.14": "You can only use pokemon with the Psychic type.", - "singleType.value.15": "Ice", - "singleType.desc.15": "You can only use pokemon with the Ice type.", - "singleType.value.16": "Dragon", - "singleType.desc.16": "You can only use pokemon with the Dragon type.", - "singleType.value.17": "Dark", - "singleType.desc.17": "You can only use pokemon with the Dark type.", - "singleType.value.18": "Fairy", - "singleType.desc.18": "You can only use pokemon with the Fairy type.", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "Mono Gen", + "desc": "You can only use Pokémon from Generation {{gen}}.", + "desc_default": "You can only use Pokémon from the chosen generation.", + "gen_1": "one", + "gen_2": "two", + "gen_3": "three", + "gen_4": "four", + "gen_5": "five", + "gen_6": "six", + "gen_7": "seven", + "gen_8": "eight", + "gen_9": "nine", + }, + "singleType": { + "name": "Mono Type", + "desc": "You can only use Pokémon with the {{type}} type.", + "desc_default": "You can only use Pokémon of the chosen type." + //types in pokemon-info + }, } as const; diff --git a/src/locales/en/common.ts b/src/locales/en/common.ts new file mode 100644 index 00000000000..750322e1f09 --- /dev/null +++ b/src/locales/en/common.ts @@ -0,0 +1,10 @@ +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 98b36ea61ab..1c5449a2e88 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -1,10 +1,12 @@ -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 { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -25,6 +27,7 @@ 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"; @@ -36,10 +39,12 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const enConfig = { ability: ability, @@ -47,9 +52,11 @@ export const enConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,10 +74,10 @@ export const enConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, - partyUiHandler: partyUiHandler, pokeball: pokeball, pokemon: pokemon, pokemonInfo: pokemonInfo, @@ -79,10 +86,14 @@ export const enConfig = { 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 }; diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index fb45d82765b..dda8891b788 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -447,7 +447,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "My old associates need me... Are you going to get in my way?" }, "victory": { - 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + 1: "How is this possible...? The precious dream of Team Rocket has become little more than an illusion..." }, "defeat": { 1: "Team Rocket will be reborn again, and I will rule the world!" @@ -466,7 +466,8 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "magma_boss_maxie_2": { "encounter": { - 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + 1: `You are the final obstacle remaining between me and my goals. + $Brace yourself for my ultimate attack! Fuhahaha!` }, "victory": { 1: "This... This is not.. Ngh..." @@ -477,7 +478,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "aqua_boss_archie_1": { "encounter": { - 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + 1: "I'm the leader of Team Aqua, so I'm afraid it's the rope's end for you." }, "victory": { 1: "Let's meet again somewhere. I'll be sure to remember that face." @@ -499,7 +500,8 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_1": { "encounter": { - 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + 1: `You were compelled to come here by such vacuous sentimentality. + $I will make you regret paying heed to your heart!` }, "victory": { 1: "Interesting. And quite curious." @@ -510,7 +512,8 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_2": { "encounter": { - 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + 1: `So we meet again. It seems our fates have become intertwined. + $But here and now, I will finally break that bond!` }, "victory": { 1: "How? How? HOW?!" @@ -1641,7 +1644,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: `Just a moment, please. The book I'm reading has nearly reached its thrilling climax… $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` + $Let me see if you'll achieve as much glory as the hero of my book!` }, "victory": { 1: "I see… It appears you've put me in checkmate." diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.ts index 7009dc91b59..9f699ce0fdc 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "You don't have enough vouchers!", "tooManyEggs": "You have too many eggs!", "pull": "Pull", - "pulls": "Pulls" + "pulls": "Pulls", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "{{pokemonName}} hatched from the egg!", + "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", + "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", + "moveUPGacha": "Move UP!", + "shinyUPGacha": "Shiny UP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.ts index 1a46812293c..6eb680544ed 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Link Google", "unlinkGoogle": "Unlink Google", "cancel": "Cancel", - "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?" + "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 1a6ddf0aca0..c6a767def50 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "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 f8073400358..7bbf89388c4 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -151,7 +151,7 @@ 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." }, "ETHER": { name: "Ether" }, "MAX_ETHER": { name: "Max Ether" }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Soothe Bell" }, + "EVIOLITE": { name: "Eviolite", description: "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." }, + "SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." }, "NUGGET": { name: "Nugget" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Endure Token" }, "ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Adds a 1% chance that a wild Pokémon will be a fusion." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Light Ball", description: "It's a mysterious orb that boosts Pikachu's Attack and Sp. Atk stats." }, + "THICK_CLUB": { name: "Thick Club", description: "This hard bone of unknown origin boosts Cubone or Marowak's Attack stat." }, + "METAL_POWDER": { name: "Metal Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." }, + "QUICK_POWDER": { name: "Quick Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." } + }, TempBattleStatBoosterItem: { "x_attack": "X Attack", "x_defense": "X Defense", diff --git a/src/locales/en/modifier.ts b/src/locales/en/modifier.ts new file mode 100644 index 00000000000..d3da4c2150b --- /dev/null +++ b/src/locales/en/modifier.ts @@ -0,0 +1,12 @@ +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}}!", + "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!", +} as const; diff --git a/src/locales/en/party-ui-handler.ts b/src/locales/en/party-ui-handler.ts index b7eac04b4c8..78fdcc14dbe 100644 --- a/src/locales/en/party-ui-handler.ts +++ b/src/locales/en/party-ui-handler.ts @@ -1,11 +1,53 @@ 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", + + "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-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/settings.ts b/src/locales/en/settings.ts index 20624defd92..f68a649269f 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index 4b7c3194396..ac59785bab7 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passive:", "nature": "Nature:", "eggMoves": "Egg Moves", - "start": "Start", "addToParty": "Add to Party", "toggleIVs": "Toggle IVs", "manageMoves": "Manage Moves", @@ -32,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Select a move to swap with", "unlockPassive": "Unlock Passive", "reduceCost": "Reduce Cost", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Form", "cycleGender": ": Gender", diff --git a/src/locales/en/status-effect.ts b/src/locales/en/status-effect.ts new file mode 100644 index 00000000000..162b2ada281 --- /dev/null +++ b/src/locales/en/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + toxic: { + name: "Toxic", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + paralysis: { + name: "Paralysis", + description: "paralysis", + obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}}!\nIt may be unable to move!", + activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", + heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + sleep: { + name: "Sleep", + description: "sleep", + obtain: "{{pokemonNameWithAffix}}\nfell asleep!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is fast asleep.", + overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", + heal: "{{pokemonNameWithAffix}} woke up!" + }, + freeze: { + name: "Freeze", + description: "freezing", + obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", + overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", + heal: "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + burn: { + name: "Burn", + description: "burn", + obtain: "{{pokemonNameWithAffix}}\nwas burned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", + overlap: "{{pokemonNameWithAffix}} is\nalready burned!", + heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" + }, +} as const; diff --git a/src/locales/en/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 0b0dcbd067b..5c09c3832c0 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -3,6 +3,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", "badDreams": "¡{{pokemonName}} está atormentado!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", - "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!" + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index 7ba401b524d..bc0dd1e4b78 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -14,7 +14,9 @@ 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}}?", "pokemon": "Pokémon", "sendOutPokemon": "¡Adelante, {{pokemonName}}!", @@ -24,7 +26,9 @@ 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.", "levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!", "learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!", @@ -53,6 +57,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiar", "escapeVerbFlee": "huir", "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "eggHatching": "¿Y esto?", "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", @@ -61,19 +67,20 @@ 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ó!", "fainted": "¡{{pokemonNameWithAffix}} se debilitó!", - "statRose": "rose", - "statSharplyRose": "sharply rose", - "statRoseDrastically": "rose drastically", - "statWontGoAnyHigher": "won't go any higher", - "statFell": "fell", - "statHarshlyFell": "harshly fell", - "statSeverelyFell": "severely fell", - "statWontGoAnyLower": "won't go any lower", + "statRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", + "statSharplyRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", + "statRoseDrastically": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", + "statWontGoAnyHigher": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", + "statFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", + "statHarshlyFell": "¡El {{stats}} de {{pokemonNameWithAffix}}} ha bajado mucho!", + "statSeverelyFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", + "statWontGoAnyLower": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", @@ -93,7 +100,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", diff --git a/src/locales/es/bgm-name.ts b/src/locales/es/bgm-name.ts new file mode 100644 index 00000000000..a0f7544d608 --- /dev/null +++ b/src/locales/es/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Música: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", + "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", + "battle_hoenn_champion": "B2W2 - ¡Vs Campeón de Hoenn!", + "battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!", + "battle_champion_alder": "BW - ¡Vs Campeón de Teselia!", + "battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!", + "battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!", + "battle_alola_champion": "USUM - ¡Vs Campeón de Alola!", + "battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!", + "battle_champion_geeta": "SV - ¡Vs Campeona Ságita!", + "battle_champion_nemona": "SV - ¡Vs Campeona Mencía!", + "battle_champion_kieran": "SV - ¡Vs Campeón Cass!", + "battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!", + "battle_unova_elite": "BW - ¡Vs Alto Mando!", + "battle_kalos_elite": "XY - ¡Vs Alto Mando!", + "battle_alola_elite": "SM - ¡Vs Alto Mando!", + "battle_galar_elite": "SWSH - Torneo de Finalistas", + "battle_paldea_elite": "SV - ¡Vs Alto Mando!", + "battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!", + "battle_final_encounter": "PMD RTDX - Dominio de Rayquaza", + "battle_final": "BW - ¡Vs Ghechis!", + "battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!", + "battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!", + "battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!", + "battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!", + "battle_unova_gym": "BW - ¡Vs Líder de Teselia!", + "battle_kalos_gym": "XY - ¡Vs Líder de Kalos!", + "battle_galar_gym": "SWSH - ¡Vs Líder de Galar!", + "battle_paldea_gym": "SV - ¡Vs Líder de Paldea!", + "battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!", + "battle_legendary_raikou": "HGSS - ¡Vs Raikou!", + "battle_legendary_entei": "HGSS - ¡Vs Entei!", + "battle_legendary_suicune": "HGSS - ¡Vs Suicune!", + "battle_legendary_lugia": "HGSS - ¡Vs Lugia!", + "battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!", + "battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!", + "battle_legendary_regis_g6": "ORAS - ¡Vs Regis!", + "battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!", + "battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!", + "battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!", + "battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!", + "battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!", + "battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!", + "battle_legendary_giratina": "ORAS - ¡Vs Giratina!", + "battle_legendary_arceus": "HGSS - ¡Vs Arceus!", + "battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!", + "battle_legendary_kyurem": "BW - ¡Vs Kyurem!", + "battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!", + "battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!", + "battle_legendary_tapu": "SM - ¡Vs Tapus!", + "battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!", + "battle_legendary_ub": "SM - ¡Vs Ultraentes!", + "battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!", + "battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!", + "battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!", + "battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!", + "battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!", + "battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!", + "battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV - ¡Vs Compatrones!", + "battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!", + "battle_legendary_terapagos": "SV - ¡Vs Terapagos!", + "battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!", + "battle_rival": "BW - ¡Vs Rival!", + "battle_rival_2": "BW - ¡Vs N!", + "battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!", + "battle_trainer": "BW - ¡Vs Entrenador!", + "battle_wild": "BW - ¡Vs Pokémon Salvaje!", + "battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!", + "end_summit": "PMD RTDX - Techo del Cielo", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS - Cráter Oscuro", + "badlands": "PMD EoS - Valle Desolado", + "beach": "PMD EoS - Risco Calado", + "cave": "PMD EoS - Cueva de la Cumbre del Cielo", + "construction_site": "PMD EoS - Roquedal", + "desert": "PMD EoS - Desierto Norte", + "dojo": "PMD EoS - Dojo Marowak", + "end": "PMD RTDX - Torre del Cielo", + "factory": "PMD EoS - Ruinas Camufladas", + "fairy_cave": "PMD EoS - Cueva Estrella", + "forest": "PMD EoS - Bosque Sombrío", + "grass": "PMD EoS - Manzanar", + "graveyard": "PMD EoS - Bosque Misterio", + "ice_cave": "PMD EoS - Gran Iceberg", + "island": "PMD EoS - Costa Escarpada", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS - Cueva Cristal", + "meadow": "PMD EoS - Bosque de la Cumbre del Cielo", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS - Monte Cuerno", + "plains": "PMD EoS - Pradera de la Cumbre del Cielo", + "power_plant": "PMD EoS - Pradera Destello", + "ruins": "PMD EoS - Sima Hermética", + "sea": "PMD EoS - Cueva Aguamar", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS - Costa de la Cumbre del Cielo", + "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", + "space": "Firel - Aether", + "swamp": "PMD EoS - Mar Circundante", + "tall_grass": "PMD EoS - Bosque Niebla", + "temple": "PMD EoS - Cueva Regia", + "town": "PMD EoS - Tema del territorio aleatorio 3", + "volcano": "PMD EoS - Cueva Vapor", + "wasteland": "PMD EoS - Corazón Tierra Oculta", + + // Encounter + "encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)", + "encounter_backpacker": "BW - Desafío Combate (Mochilero)", + "encounter_clerk": "BW - Desafío Combate (Empresario)", + "encounter_cyclist": "BW - Desafío Combate (Ciclista)", + "encounter_lass": "BW - Desafío Combate (Chica)", + "encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)", + "encounter_pokefan": "BW - Desafío Combate (Pokéfan)", + "encounter_psychic": "BW - Desafío Combate (Médium)", + "encounter_rich": "BW - Desafío Combate (Aristócrata)", + "encounter_rival": "BW - Desafío Combate (Cheren)", + "encounter_roughneck": "BW - Desafío Combate (Calvo)", + "encounter_scientist": "BW - Desafío Combate (Científico)", + "encounter_twins": "BW - Desafío Combate (Gemelas)", + "encounter_youngster": "BW - Desafío Combate (Joven)", + + // Other + "heal": "BW - Cura Pokémon", + "menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!", + "title": "PMD EoS - Tema del menú principal", +} as const; diff --git a/src/locales/es/challenges.ts b/src/locales/es/challenges.ts index 9bc5b0923fd..711be39b116 100644 --- a/src/locales/es/challenges.ts +++ b/src/locales/es/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Parámetros de Desafíos", - "points": "Malas Ideas", - "confirm_start": "¿Continuar con estos desafíos?", - "singleGeneration.name": "Monogeneración", - "singleGeneration.value.0": "No", - "singleGeneration.desc.0": "Solo puedes usar Pokémon de la generación elegida.", - "singleGeneration.value.1": "Gen 1", - "singleGeneration.desc.1": "Solo puedes usar Pokémon de primera generación.", - "singleGeneration.value.2": "Gen 2", - "singleGeneration.desc.2": "Solo puedes usar Pokémon de segunda generación.", - "singleGeneration.value.3": "Gen 3", - "singleGeneration.desc.3": "Solo puedes usar Pokémon de tercera generación.", - "singleGeneration.value.4": "Gen 4", - "singleGeneration.desc.4": "Solo puedes usar Pokémon de cuarta generación.", - "singleGeneration.value.5": "Gen 5", - "singleGeneration.desc.5": "Solo puedes usar Pokémon de quinta generación.", - "singleGeneration.value.6": "Gen 6", - "singleGeneration.desc.6": "Solo puedes usar Pokémon de sexta generación.", - "singleGeneration.value.7": "Gen 7", - "singleGeneration.desc.7": "Solo puedes usar Pokémon de séptima generación.", - "singleGeneration.value.8": "Gen 8", - "singleGeneration.desc.8": "Solo puedes usar Pokémon de octava generación.", - "singleGeneration.value.9": "Gen 9", - "singleGeneration.desc.9": "Solo puedes usar Pokémon de novena generación.", - "singleType.name": "Monotipo", - "singleType.value.0": "No", - "singleType.desc.0": "Solo puedes usar Pokémon del tipo elegido", - "singleType.value.1": "Normal", - "singleType.desc.1": "Solo puedes usar Pokémon de tipo Normal.", - "singleType.value.2": "Lucha", - "singleType.desc.2": "Solo puedes usar Pokémon de tipo Lucha.", - "singleType.value.3": "Volador", - "singleType.desc.3": "Solo puedes usar Pokémon de tipo Volador.", - "singleType.value.4": "Veneno", - "singleType.desc.4": "Solo puedes usar Pokémon de tipo Veneno.", - "singleType.value.5": "Tierra", - "singleType.desc.5": "Solo puedes usar Pokémon de tipo Tierra.", - "singleType.value.6": "Roca", - "singleType.desc.6": "Solo puedes usar Pokémon de tipo Roca.", - "singleType.value.7": "Bicho", - "singleType.desc.7": "Solo puedes usar Pokémon de tipo Bicho.", - "singleType.value.8": "Fantasma", - "singleType.desc.8": "Solo puedes usar Pokémon de tipo Fantasma.", - "singleType.value.9": "Acero", - "singleType.desc.9": "Solo puedes usar Pokémon de tipo Acero.", - "singleType.value.10": "Fuego", - "singleType.desc.10": "Solo puedes usar Pokémon de tipo Fuego.", - "singleType.value.11": "Agua", - "singleType.desc.11": "Solo puedes usar Pokémon de tipo Agua.", - "singleType.value.12": "Planta", - "singleType.desc.12": "Solo puedes usar Pokémon de tipo Planta.", - "singleType.value.13": "Eléctrico", - "singleType.desc.13": "Solo puedes usar Pokémon de tipo Eléctrico.", - "singleType.value.14": "Psíquico", - "singleType.desc.14": "Solo puedes usar Pokémon de tipo Psíquico.", - "singleType.value.15": "Hielo", - "singleType.desc.15": "Solo puedes usar Pokémon de tipo Hielo.", - "singleType.value.16": "Dragón", - "singleType.desc.16": "Solo puedes usar Pokémon de tipo Dragón.", - "singleType.value.17": "Siniestro", - "singleType.desc.17": "Solo puedes usar Pokémon de tipo Siniestro.", - "singleType.value.18": "Hada", - "singleType.desc.18": "Solo puedes usar Pokémon de tipo Hada.", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "Monogeneración", + "desc": "Solo puedes usar Pokémon de {{gen}} generación.", + "desc_default": "Solo puedes usar Pokémon de la generación elegida.", + "gen_1": "primera", + "gen_2": "segunda", + "gen_3": "tercera", + "gen_4": "cuarta", + "gen_5": "quinta", + "gen_6": "sexta", + "gen_7": "séptima", + "gen_8": "octava", + "gen_9": "novena", + }, + "singleType": { + "name": "Monotipo", + "desc": "Solo puedes usar Pokémon with the {{type}} type.", + "desc_default": "Solo puedes usar Pokémon del tipo elegido.", + }, } as const; diff --git a/src/locales/es/common.ts b/src/locales/es/common.ts new file mode 100644 index 00000000000..347b39c973c --- /dev/null +++ b/src/locales/es/common.ts @@ -0,0 +1,10 @@ +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 e85ba976be4..341fafa4ca9 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/es/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const esConfig = { ability: ability, @@ -47,9 +52,11 @@ export const esConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const esConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const esConfig = { 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 }; diff --git a/src/locales/es/dialogue.ts b/src/locales/es/dialogue.ts index 5fed9019b29..c1b23b57fe0 100644 --- a/src/locales/es/dialogue.ts +++ b/src/locales/es/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Creo que soy yo quien está mareado..." }, }, + "rocket_grunt": { + "encounter": { + 1: "¡Ríndete ahora, o prepárate para luchar!" + }, + "victory": { + 1: "¡El Team Rocket despega de nuevo!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "¡No esperes piedad si te interpones al Team Magma!" + }, + "victory": { + 1: "¿Eh? ¿He perdido?" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "El Team Aqua no muestra piedad, ¡ni siquiera a los niños!" + }, + "victory": { + 1: "¡Bromeas! ¡No me lo creo!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "¡No desafíes al Equipo Galaxia, te arrepentirás!" + }, + "victory": { + 1: "Me callaste la boca..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "¡El Equipo Plasma no tolerará otros ideales!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "¡La moda es lo más importante para nosotros!" + }, + "victory": { + 1: "Me temo que se me avecina un futuro oscuro..." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "He de decir... estoy impresionado de que hayas llegado tan lejos." + }, + "victory": { + 1: "¿¡QUÉ?! ¡No puede ser!" + }, + "defeat": { + 1: "Recuerda mis palabras: Que no seas capaz de medir\n tu propia fuerza demuestra que todavía eres un niño" + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mis antiguos socios me necesitan... ¿te atreves a imponerte en mi camino?" + }, + "victory": { + 1: "¿Cómo es esto posible?\nEl sueño del Team Rocket, ahora tan solo una mera ilusión..." + }, + "defeat": { + 1: "El Team Rocket renacerá... ¡y gobernaré el mundo!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Está bien, tendré que cavar yo mismo tu propia tumba. Siéntete orgulloso." + }, + "victory": { + 1: "Ugh! Eres... muy capaz...\nFue por poco, estuve a esto de ganarte..." + }, + "defeat": { + 1: "¡El Equipo Magma prevalecerá!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "Eres el obstáculo final entre mi y mis propósitos.\n¡Aquí va mi mejor golpe! ¡MUAJAJAJA!" + }, + "victory": { + 1: "No... no es posib... nnngh..." + }, + "defeat": { + 1: "Y ahora... transformaré este planeta en una tierra ideal para la humanidad." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Soy el líder del Equipo Aqua, así que me temo que aquí se acaba tu bromita." + }, + "victory": { + 1: "Volvamos a vernos más tarde. Recordaré tu cara." + }, + "defeat": { + 1: "¡Excelente! ¡Nadie se puede oponer a mi equipo!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Llevo esperando mucho que llegara este día.\n¡Contempla el poder de mi equipo!" + }, + "victory": { + 1: "Quién me lo iba a decir..." + }, + "defeat": { + 1: "Devolveré todo en este planeta a su estado original.\nSe avecina un nuevo mundo, ¡más puro!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu fútil sentimentalidad te hizo interferir.\n¡Haré que te arrepientas de escuchar a tu corazón!" + }, + "victory": { + 1: "Interesante. Muy... curioso." + }, + "defeat": { + 1: "Crearé un nuevo mundo..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nos vemos de nuevo... se ve que nuestros destinos están entrelazados.\nPero, aquí y ahora, ¡sesgaré ese vínculo!" + }, + "victory": { + 1: "¿Cómo? ¿¡Cómo!? ¿¡¡CÓMO!!?" + }, + "defeat": { + 1: "Hasta nunca." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "¡No permitiré que nadie me detenga!" + }, + "victory": { + 1: "¿Cómo puede ser esto? ¡yo creé al Equipo Plasma!\n¡Soy PERFECTO!" + }, + "defeat": { + 1: "Soy el perfecto gobernante para un perfecto nuevo mundo. ¡Muajajajaja!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "¡Adelante! ¡Quiero ver tu cara cuando la desesperación se apoderede de ti!" + }, + "victory": { + 1: "Mis planes... ¡no! ¡El mundo debería pertenecerme!" + }, + "defeat": { + 1: "¡Kyurem, Absorfusión... ahora!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "¿Acaso quieres detenerme? Demuéstramelo." + }, + "victory": { + 1: "Estás aquí para detenerme. Pero tendrás que esperar. " + }, + "defeat": { + 1: "Los Pokémon... su fin ha llegado." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "El futuro que quieres tú, o el futuro que quiero yo.\nVeamos cuál de los dos se merece existir..." + }, + "victory": { + 1: "¡AARGH!" + }, + "defeat": { + 1: "Los idiotas sin ningún tipo de visión continuarán asediando este mundo." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/es/egg.ts b/src/locales/es/egg.ts index d04f74ed8ef..ab2c3aab903 100644 --- a/src/locales/es/egg.ts +++ b/src/locales/es/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "¡No tienes suficientes vales!", "tooManyEggs": "¡No tienes suficiente espacio!", "pull": "Tirada", - "pulls": "Tiradas" + "pulls": "Tiradas", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "¡Ha salido un {{pokemonName}} del Huevo!", + "eggMoveUnlock": "Mov. Huevo desbloqueado:\n{{moveName}}", + "rareEggMoveUnlock": "Mov. Huevo Raro desbloqueado:\n{{moveName}}", + "moveUPGacha": "¡Más Mov.\nHuevo Raro!", + "shinyUPGacha": "¡Más Shiny!", + "legendaryUPGacha": ", ¡mayor\nprob.!", } as const; diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.ts index 8982c8e147c..e38ac4eab3d 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Conectar Google", "unlinkGoogle": "Desconectar Google", "cancel": "Cancelar", - "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?" + "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index 37c45203410..524464f32f7 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "AVISO", "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado),cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", + "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 8bdb6f13f41..5d5ed5ddc5c 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -151,7 +151,7 @@ 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." }, "ETHER": { name: "Éter" }, "MAX_ETHER": { name: "Éter Máx." }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Camp. Alivio" }, + "EVIOLITE": { name: "Mineral Evolutivo", description: "Roca misteriosa. El Pokémon portador aumentará su Defensa y su Defensa Especial si aún puede evolucionar." }, + "SOUL_DEW": { name: "Rocío bondad", description: "Aumenta la influencia de la naturaleza de un Pokémon en sus estadísticas en un 10% (aditivo)." }, "NUGGET": { name: "Pepita" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Ficha Aguante" }, "ENEMY_FUSED_CHANCE": { name: "Ficha Fusión", description: "Agrega un 1% de probabilidad de que un Pokémon salvaje sea una fusión." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Bola Luminosa", description: "Asombrosa esfera que aumenta el Ataque y el Ataque Especial. Debe llevarla Pikachu." }, + "THICK_CLUB": { name: "Hueso Grueso", description: "Extraño tipo de hueso que potencia los ataques físicos. Debe llevarlo Cubone o Marowak." }, + "METAL_POWDER": { name: "Polvo Metálico", description: "Polvo muy fino, pero a la vez poderoso, que aumenta la Defensa. Debe llevarlo Ditto." }, + "QUICK_POWDER": { name: "Polvo Veloz", description: "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto." } + }, TempBattleStatBoosterItem: { "x_attack": "Ataque X", "x_defense": "Defensa X", diff --git a/src/locales/es/modifier.ts b/src/locales/es/modifier.ts new file mode 100644 index 00000000000..d3da4c2150b --- /dev/null +++ b/src/locales/es/modifier.ts @@ -0,0 +1,12 @@ +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}}!", + "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!", +} as const; diff --git a/src/locales/es/party-ui-handler.ts b/src/locales/es/party-ui-handler.ts index 894ea14bb12..b310a98840d 100644 --- a/src/locales/es/party-ui-handler.ts +++ b/src/locales/es/party-ui-handler.ts @@ -6,5 +6,48 @@ 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", + + "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-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/settings.ts b/src/locales/es/settings.ts index bf4c22707a9..dfd6f097242 100644 --- a/src/locales/es/settings.ts +++ b/src/locales/es/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 642d55ab5d8..14c22e22097 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Pasiva:", "nature": "Natur:", "eggMoves": "Mov. Huevo", - "start": "Iniciar", "addToParty": "Añadir a Equipo", "toggleIVs": "Mostrar IVs", "manageMoves": "Gestionar Movs.", @@ -32,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Elige el movimiento que sustituirá a", "unlockPassive": "Añadir Pasiva", "reduceCost": "Reducir Coste", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Forma", "cycleGender": ": Género", diff --git a/src/locales/es/status-effect.ts b/src/locales/es/status-effect.ts new file mode 100644 index 00000000000..975288fc451 --- /dev/null +++ b/src/locales/es/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Ninguno", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Envenenamiento", + description: "envenenamiento", + obtain: "¡{{pokemonNameWithAffix}}\nha sido envenenado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido envenenado por {{sourceText}}!", + activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + toxic: { + name: "Envenenamiento grave", + description: "envenenamiento grave", + obtain: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado por {{sourceText}}!", + activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + paralysis: { + name: "Parálisis", + description: "parálisis", + obtain: "¡{{pokemonNameWithAffix}} sufre parálisis!\nQuizás no se pueda mover.", + obtainSource: "¡{{pokemonNameWithAffix}} sufre parálisis por {{sourceText}}!\nQuizás no se pueda mover.", + activation: "¡{{pokemonNameWithAffix}} está paralizado!\n¡No se puede mover!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá paralizado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá paralizado!" + }, + sleep: { + name: "Dormir", + description: "dormir", + obtain: "¡{{pokemonNameWithAffix}}\nse ha dormido!", + obtainSource: "¡{{pokemonNameWithAffix}}\nse ha dormido\npor culpa de {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} está/ndormido como un tronco.", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá dormido!", + heal: "¡{{pokemonNameWithAffix}} se despertó!" + }, + freeze: { + name: "Congelamiento", + description: "congelamiento", + obtain: "¡{{pokemonNameWithAffix}}\nha sido congelado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido congelado por {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} está\ncongelado!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá congelado!", + heal: "¡{{pokemonNameWithAffix}} se\nha descongelado!" + }, + burn: { + name: "Quemadura", + description: "quemadura", + obtain: "¡{{pokemonNameWithAffix}}\nse ha quemado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nse ha quemado por {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} se resiente\nde las quemaduras!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá quemado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá quemado!" + }, +} as const; diff --git a/src/locales/es/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 90a2a9ac109..f99ff15c26f 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -3,8 +3,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", "badDreams": "{{pokemonName}} a le sommeil agité !", - "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", + "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", + "iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !", "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", - "iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !" + "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", + "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index e86e00029c6..fc155664aaa 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -14,7 +14,9 @@ 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}} ?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}} ! Go !", @@ -24,7 +26,9 @@ 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 !", "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", @@ -53,24 +57,27 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "le changement", "escapeVerbFlee": "la fuite", "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", + "turnEndHpRestore": "{{pokemonName}} récupère des PV !", + "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", "eggHatching": "Hein ?", "ivScannerUseQuestion": "Utiliser le Scanner d’IV sur {{pokemonName}} ?", "wildPokemonWithAffix": "{{pokemonName}} sauvage", "foePokemonWithAffix": "{{pokemonName}} ennemi", "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", + "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", "drainMessage": "L’énergie de {{pokemonName}}\nest drainée !", "regainHealth": "{{pokemonName}} récupère\ndes PV !", "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", - "statRose": "augmente", - "statSharplyRose": "augmente beaucoup", - "statRoseDrastically": "augmente énormément", - "statWontGoAnyHigher": "ne peut plus augmenter", - "statFell": "baisse", - "statHarshlyFell": "baisse beaucoup", - "statSeverelyFell": "baisse énormément", - "statWontGoAnyLower": "ne peut plus baisser", - "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} sont réduits de {{reduction}} !", + "statRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", "battlerTagsRechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus s’échapper !", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !", @@ -84,7 +91,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} entraine\n{{pokemonNameWithAffix2}} dans sa chute !", "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà amoureux !", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}] est amoureux\nde {{sourcePokemonName}} !", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", "battlerTagsInfatuatedLapseImmobilize": "L’amour empêche {{pokemonNameWithAffix}}\nd’agir !", "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus amoureux !", "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} est infecté !", @@ -93,7 +100,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !", "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} !\nEncore une fois !", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !", 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 new file mode 100644 index 00000000000..15ec145a6ff --- /dev/null +++ b/src/locales/fr/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Musique : ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "N2B2 - Vs. Maitre de Kanto", + "battle_johto_champion": "N2B2 - Vs. Maitre de Johto", + "battle_hoenn_champion": "N2B2 - Vs. Maitre de Hoenn", + "battle_sinnoh_champion": "N2B2 - Vs. Maitresse de Sinnoh", + "battle_champion_alder": "NB - Vs. Maitre d’Unys", + "battle_champion_iris": "N2B2 - Vs. Maitresse d’Unys", + "battle_kalos_champion": "XY - Maitresse de Kalos", + "battle_alola_champion": "USUL - Maitre d’Alola", + "battle_galar_champion": "ÉB - Maitre de Galar", + "battle_champion_geeta": "ÉV - Vs. Alisma la Maitresse", + "battle_champion_nemona": "ÉV - Vs. Menzi la Maitresse", + "battle_champion_kieran": "ÉV - Vs. Kassis le Maitre", + "battle_hoenn_elite": "ROSA - Vs. Conseil 4", + "battle_unova_elite": "NB - Vs. Conseil 4", + "battle_kalos_elite": "XY - Vs. Conseil 4", + "battle_alola_elite": "SL - Vs. Conseil 4", + "battle_galar_elite": "ÉB - Vs. Tournoi des Champions", + "battle_paldea_elite": "ÉV - Vs. Conseil 4", + "battle_bb_elite": "ÉV - Vs. Conseil 4 de l’Institut Myrtille", + "battle_final_encounter": "PDM ÉSDX - Vs. Rayquaza", + "battle_final": "NB - Vs. Ghetis", + "battle_kanto_gym": "N2B2 - Vs. Champion·ne d’Arène de Kanto", + "battle_johto_gym": "N2B2 - Vs. Champion·ne d’Arène de Johto", + "battle_hoenn_gym": "N2B2 - Vs. Champion·ne d’Arène de Hoenn", + "battle_sinnoh_gym": "N2B2 - Vs. Champion·ne d’Arène de Sinnoh", + "battle_unova_gym": "NB - Vs. Champion·ne d’Arène d’Unys", + "battle_kalos_gym": "XY - Vs. Champion·ne d’Arène de Kalos", + "battle_galar_gym": "ÉB - Vs. Champion·ne d’Arène de Galar", + "battle_paldea_gym": "ÉV - Vs. Champion·ne d’Arène de Paldea", + "battle_legendary_kanto": "XY - Vs. Légendaire de Kanto", + "battle_legendary_raikou": "HGSS - Vs. Raikou", + "battle_legendary_entei": "HGSS - Vs. Entei", + "battle_legendary_suicune": "HGSS - Vs. Suicune", + "battle_legendary_lugia": "HGSS - Vs. Lugia", + "battle_legendary_ho_oh": "HGSS - Vs. Ho-oh", + "battle_legendary_regis_g5": "N2B2 - Vs. Colosses Légendaires", + "battle_legendary_regis_g6": "ROSA - Vs. Colosses Légendaires", + "battle_legendary_gro_kyo": "ROSA - Vs. Groudon/Kyogre", + "battle_legendary_rayquaza": "ROSA - Vs. Rayquaza", + "battle_legendary_deoxys": "ROSA - Vs. Deoxys", + "battle_legendary_lake_trio": "ROSA - Vs. Gardiens des Lacs", + "battle_legendary_sinnoh": "ROSA - Vs. Légendaire de Sinnoh", + "battle_legendary_dia_pal": "ROSA - Vs. Dialga/Palkia", + "battle_legendary_giratina": "ROSA - Vs. Giratina", + "battle_legendary_arceus": "HGSS - Vs. Arceus", + "battle_legendary_unova": "NB - Vs. Légendaire d’Unys", + "battle_legendary_kyurem": "NB - Vs. Kyurem", + "battle_legendary_res_zek": "NB - Vs. Reshiram/Zekrom", + "battle_legendary_xern_yvel": "XY - Vs. Xerneas/Yveltal", + "battle_legendary_tapu": "SL - Vs. Divinités gardiennes d’Alola", + "battle_legendary_sol_lun": "SL - Vs. Solgaleo/Lunala", + "battle_legendary_ub": "SL - Vs. Ultra-Chimère", + "battle_legendary_dusk_dawn": "USUL - Vs. Necrozma Crinière du Couchant/Ailes de l’Aurore", + "battle_legendary_ultra_nec": "USUL - Vs. Ultra-Necrozma", + "battle_legendary_zac_zam": "ÉB - Vs. Zacian/Zamazenta", + "battle_legendary_glas_spec": "ÉB - Vs. Blizzeval/Spectreval", + "battle_legendary_calyrex": "ÉB - Vs. Sylveroy", + "battle_legendary_birds_galar": "ÉB - Vs. Oiseaux Légendaires de Galar", + "battle_legendary_ruinous": "ÉV - Vs. Trésors du fléau", + "battle_legendary_kor_mir": "ÉV - Profondeurs de la Zone Zéro (Combat)", + "battle_legendary_loyal_three": "ÉV - Vs. Adoramis", + "battle_legendary_ogerpon": "ÉV - Vs. Ogerpon", + "battle_legendary_terapagos": "ÉV - Vs. Terapagos", + "battle_legendary_pecharunt": "ÉV - Vs. Pêchaminus", + "battle_rival": "NB - Vs. Rival", + "battle_rival_2": "NB - Vs. N", + "battle_rival_3": "NB - Combat final Vs. N", + "battle_trainer": "NB - Vs. Dresseur·euse", + "battle_wild": "NB - Vs. Pokémon sauvage", + "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", + "end_summit": "PDM ÉSDX - Tour Céleste", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "NB - Vs. Team Plasma", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PDM EdS - Cratère Obscur", + "badlands": "PDM EdS - Vallée Stérile", + "beach": "PDM EdS - Falaise Trempée", + "cave": "PDM EdS - Pic Céleste (grotte)", + "construction_site": "PDM EdS - Carrière Rocher", + "desert": "PDM EdS - Désert du Nord", + "dojo": "PDM EdS - Dojo Ossatueur", + "end": "PDM EdS - Tour Céleste", + "factory": "PDM EdS - Ruines Cachées", + "fairy_cave": "PDM EdS - Caverne Étoile", + "forest": "PDM EdS - Forêt Crépuscule", + "grass": "PDM EdS - Bois aux Pommes", + "graveyard": "PDM EdS - Forêt Trompeuse", + "ice_cave": "PDM EdS - Montagne Glacier", + "island": "PDM EdS - Côte Escarpée", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PDM EdS - Caverne Cristal", + "meadow": "PDM EdS - Pic Céleste (forêt)", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PDM EdS - Mt Corne", + "plains": "PDM EdS - Pic Céleste (prairie)", + "power_plant": "PDM EdS - Plaines Élek", + "ruins": "PDM EdS - Ruine Scellée", + "sea": "PDM EdS - Caverne Saline", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PDM EdS - Pic Céleste (côte)", + "snowy_forest": "PDM EdS - Pic Céleste (plaine enneigée)", + "space": "Firel - Aether", + "swamp": "PDM EdS - Mer Fermée", + "tall_grass": "PDM EdS - Forêt Brumeuse", + "temple": "PDM EdS - Grotte Égide", + "town": "PDM EdS - Donjon aléatoire - Thème 3", + "volcano": "PDM EdS - Grotte Étuve", + "wasteland": "PDM EdS - Terres Illusoires", + + // Encounter + "encounter_ace_trainer": "NB - Regards croisés (Topdresseur·euse)", + "encounter_backpacker": "NB - Regards croisés (Randonneur·euse)", + "encounter_clerk": "NB - Regards croisés (Employé·e)", + "encounter_cyclist": "NB - Regards croisés (Cycliste)", + "encounter_lass": "NB - Regards croisés (Fillette)", + "encounter_parasol_lady": "NB - Regards croisés (Sœur Parasol)", + "encounter_pokefan": "NB - Regards croisés (Pokéfan)", + "encounter_psychic": "NB - Regards croisés (Kinésiste)", + "encounter_rich": "NB - Regards croisés (Gentleman)", + "encounter_rival": "NB - Tcheren", + "encounter_roughneck": "NB - Regards croisés (Loubard)", + "encounter_scientist": "NB - Regards croisés (Scientifique)", + "encounter_twins": "NB - Regards croisés (Jumelles)", + "encounter_youngster": "NB - Regards croisés (Gamin)", + + // Other + "heal": "NB - Soin de Pokémon", + "menu": "PDM EdS - Bienvenue dans le monde de Pokémon !", + "title": "PDM EdS - Menu Principal", +} as const; diff --git a/src/locales/fr/challenges.ts b/src/locales/fr/challenges.ts index 6029cdc302a..d88960dbe3b 100644 --- a/src/locales/fr/challenges.ts +++ b/src/locales/fr/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Paramètres du Challenge", - "start": "Démarrer", "illegalEvolution": "{{pokemon}} s’est transformé en Pokémon\ninéligible pour ce challenge !", - "singleGeneration.name": "Mono-génération", - "singleGeneration.value.0": "Désactivé", - "singleGeneration.desc.0": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", - "singleGeneration.value.1": "1G", - "singleGeneration.desc.1": "Vous ne pouvez choisir que des Pokémon de 1re génération.", - "singleGeneration.value.2": "2G", - "singleGeneration.desc.2": "Vous ne pouvez choisir que des Pokémon de 2e génération.", - "singleGeneration.value.3": "3G", - "singleGeneration.desc.3": "Vous ne pouvez choisir que des Pokémon de 3e génération.", - "singleGeneration.value.4": "4G", - "singleGeneration.desc.4": "Vous ne pouvez choisir que des Pokémon de 4e génération.", - "singleGeneration.value.5": "5G", - "singleGeneration.desc.5": "Vous ne pouvez choisir que des Pokémon de 5e génération.", - "singleGeneration.value.6": "6G", - "singleGeneration.desc.6": "Vous ne pouvez choisir que des Pokémon de 6e génération.", - "singleGeneration.value.7": "7G", - "singleGeneration.desc.7": "Vous ne pouvez choisir que des Pokémon de 7e génération.", - "singleGeneration.value.8": "8G", - "singleGeneration.desc.8": "Vous ne pouvez choisir que des Pokémon de 8e génération.", - "singleGeneration.value.9": "9G", - "singleGeneration.desc.9": "Vous ne pouvez choisir que des Pokémon de 9e génération.", - "singleType.name": "Mono-type", - "singleType.value.0": "Désactivé", - "singleType.desc.0": "Vous ne pouvez choisir que des Pokémon du type sélectionné.", - "singleType.value.1": "Normal", - "singleType.desc.1": "Vous ne pouvez choisir que des Pokémon de type Normal.", - "singleType.value.2": "Combat", - "singleType.desc.2": "Vous ne pouvez choisir que des Pokémon de type Combat.", - "singleType.value.3": "Vol", - "singleType.desc.3": "Vous ne pouvez choisir que des Pokémon de type Vol.", - "singleType.value.4": "Poison", - "singleType.desc.4": "Vous ne pouvez choisir que des Pokémon de type Poison.", - "singleType.value.5": "Sol", - "singleType.desc.5": "Vous ne pouvez choisir que des Pokémon de type Sol.", - "singleType.value.6": "Roche", - "singleType.desc.6": "Vous ne pouvez choisir que des Pokémon de type Roche.", - "singleType.value.7": "Insecte", - "singleType.desc.7": "Vous ne pouvez choisir que des Pokémon de type Insecte.", - "singleType.value.8": "Spectre", - "singleType.desc.8": "Vous ne pouvez choisir que des Pokémon de type Spectre.", - "singleType.value.9": "Acier", - "singleType.desc.9": "Vous ne pouvez choisir que des Pokémon de type Acier.", - "singleType.value.10": "Feu", - "singleType.desc.10": "Vous ne pouvez choisir que des Pokémon de type Feu.", - "singleType.value.11": "Eau", - "singleType.desc.11": "Vous ne pouvez choisir que des Pokémon de type Eau.", - "singleType.value.12": "Plante", - "singleType.desc.12": "Vous ne pouvez choisir que des Pokémon de type Plante.", - "singleType.value.13": "Électrik", - "singleType.desc.13": "Vous ne pouvez choisir que des Pokémon de type Électrik.", - "singleType.value.14": "Psy", - "singleType.desc.14": "Vous ne pouvez choisir que des Pokémon de type Psy.", - "singleType.value.15": "Glace", - "singleType.desc.15": "Vous ne pouvez choisir que des Pokémon de type Glace.", - "singleType.value.16": "Dragon", - "singleType.desc.16": "Vous ne pouvez choisir que des Pokémon de type Dragon.", - "singleType.value.17": "Ténèbres", - "singleType.desc.17": "Vous ne pouvez choisir que des Pokémon de type Ténèbres.", - "singleType.value.18": "Fée", - "singleType.desc.18": "Vous ne pouvez choisir que des Pokémon de type Fée.", + "singleGeneration": { + "name": "Mono-génération", + "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.", + "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", + "gen_1": "1re", + "gen_2": "2e", + "gen_3": "3e", + "gen_4": "4e", + "gen_5": "5e", + "gen_6": "6e", + "gen_7": "7e", + "gen_8": "8e", + "gen_9": "9e", + }, + "singleType": { + "name": "Mono-type", + "desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.", + "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." + //type in pokemon-info + }, } as const; diff --git a/src/locales/fr/common.ts b/src/locales/fr/common.ts new file mode 100644 index 00000000000..c8e3d58dd3e --- /dev/null +++ b/src/locales/fr/common.ts @@ -0,0 +1,10 @@ +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 b5e7a4e383a..d8f9a6601c1 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/fr/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const frConfig = { ability: ability, @@ -47,9 +52,11 @@ export const frConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const frConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const frConfig = { 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 }; diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts index 382e9a179fe..d3ec5f85d5d 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": { @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Nous sommes de retour !" + }, + "victory": { + 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" + }, + }, + "magma_grunt": { + "encounter": { + 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" + }, + "victory": { + 1: "Je…?\nJ’ai perdu ?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour un gamin !" + }, + "victory": { + 1: "Comment ça ?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Ne te mets pas en travers de la Team Galaxie !" + }, + "victory": { + 1: "Désactivation…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" + }, + "victory": { + 1: "Plasmaaaaaaaaa !" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Le style et le bon gout, il n’y a que ça qui compte !" + }, + "victory": { + 1: "Mon futur me semble guère radieux." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" + }, + "victory": { + 1: "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’un gamin." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" + }, + "victory": { + 1: "Comment c’est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" + }, + "defeat": { + 1: "La Team Rocket renaitra, et je dominerai le monde !" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" + }, + "victory": { + 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" + }, + "defeat": { + 1: "La Team Magma vaincra !" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "T’es le dernier rempart entravant mes objectifs. Prépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + 1: "Ce… Ce n’est pas… Gnn…" + }, + "defeat": { + 1: "L’heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + 1: "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + 1: "Comme si j’y avait cru…" + }, + "defeat": { + 1: "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter." + }, + "victory": { + 1: "Intéressant. Et plutôt curieux." + }, + "defeat": { + 1: "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." + }, + "victory": { + 1: "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + 1: "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + 1: "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + 1: "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + 1: "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "Ton futur ou le mien…\nVoyons lequel mérite plus d’aboutir." + }, + "victory": { + 1: "Ohhhh… !" + }, + "defeat": { + 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -2109,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 !`, } }, @@ -2125,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 !` }, }, @@ -2151,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 !` @@ -2180,14 +2360,14 @@ 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… - $@c{smile}Bon. Ça veut juste dire que je vois devoir encore plus m’entrainer ! + $@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer ! $@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~. $@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là ! $@c{smile_wave}Allez, tiens le coup !` @@ -2198,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": { @@ -2231,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 ?" @@ -2243,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. @@ -2287,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. - $Comme si c’était tout ce que ce monde avait toujours connu. + $@c{serious}… et c’est comme si quelque chose ici me parlait. + $Comme si c’était tout ce que ce monde avait toujours connu. $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? - $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. + $@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.` }, }, @@ -2313,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.` @@ -2334,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 !" }, @@ -2355,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": { @@ -2686,6 +2866,210 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "I'll tune up for the next race." }, }, + "firebreather": { + "encounter": { + 1: "My flames shall devour you!", + 2: "My soul is on fire. I'll show you how hot it burns!", + 3: "Step right up and take a look!" + }, + "victory": { + 1: "I burned down to ashes...", + 2: "Yow! That's hot!", + 3: "Ow! I scorched the tip of my nose!" + }, + }, + "sailor": { + "encounter": { + 1: "Matey, you're walking the plank if you lose!", + 2: "Come on then! My sailor's pride is at stake!", + 3: "Ahoy there! Are you seasick?" + }, + "victory": { + 1: "Argh! Beaten by a kid!", + 2: "Your spirit sank me!", + 3: "I think it's me that's seasick..." + }, + }, + "rocket_grunt": { + "encounter": { + 1: "Nous sommes de retour !" + }, + "victory": { + 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" + }, + }, + "magma_grunt": { + "encounter": { + 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" + }, + "victory": { + 1: "Je…?\nJ’ai perdu ?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !" + }, + "victory": { + 1: "Comment ça ?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Ne te mets pas en travers de la Team Galaxie !" + }, + "victory": { + 1: "Désactivation…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" + }, + "victory": { + 1: "Plasmaaaaaaaaa !" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Le style et le bon gout, il n’y a que ça qui compte !" + }, + "victory": { + 1: "Mon futur me semble guère radieux." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" + }, + "victory": { + 1: "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’une gamine." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" + }, + "victory": { + 1: "Comment c’est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" + }, + "defeat": { + 1: "La Team Rocket renaitra, et je dominerai le monde !" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" + }, + "victory": { + 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" + }, + "defeat": { + 1: "La Team Magma vaincra !" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + 1: "Ce… Ce n’est pas… Gnn…" + }, + "defeat": { + 1: "L’heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + 1: "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + 1: "Comme si j’y avait cru…" + }, + "defeat": { + 1: "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu t’es sentie obligée de venir ici dans un acte vide de sens. Je vais te le faire regretter." + }, + "victory": { + 1: "Intéressant. Et plutôt curieux." + }, + "defeat": { + 1: "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." + }, + "victory": { + 1: "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + 1: "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + 1: "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + 1: "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + 1: "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "Ton futur ou le mien…\nVoyons lequel mérite plus d’aboutir." + }, + "victory": { + 1: "Ohhhh… !" + }, + "defeat": { + 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -4415,26 +4799,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 !` }, @@ -4442,14 +4826,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 !` @@ -4457,15 +4841,15 @@ 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… - $@c{smile}Bon. Ça veut juste dire que je vois devoir encore plus m’entrainer ! + $@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer ! $@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~. $@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là ! $@c{smile_wave}Allez, tiens le coup !` @@ -4492,7 +4876,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…" @@ -4509,8 +4893,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": { @@ -4520,20 +4904,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": { @@ -4565,7 +4949,8 @@ export const PGFdialogue: DialogueTranslationEntries = { $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait.\nComme si c’était tout ce que ce monde avait toujours connu. + $@c{serious}… et c’est comme si quelque chose ici me parlait. + $Comme si c’était tout ce que ce monde avait toujours connu. $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. @@ -4573,7 +4958,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.` }, }, @@ -4590,13 +4975,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.` + $@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.` }, @@ -4636,7 +5021,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 ? @@ -4644,7 +5029,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 ! @@ -4682,76 +5067,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": { @@ -4762,10 +5147,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…`, }, }, @@ -4797,76 +5182,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": { @@ -4877,10 +5262,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 b7df2d51cc7..f63ac3abb0d 100644 --- a/src/locales/fr/egg.ts +++ b/src/locales/fr/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Vous n’avez pas assez de coupons !", "tooManyEggs": "Vous avez trop d’Œufs !", "pull": "Tirage", - "pulls": "Tirages" + "pulls": "Tirages", + "sameSpeciesEgg": "{{species}} sortira de cet Œuf !", + "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", + "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", + "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", + "moveUPGacha": "Bonus Capacité\nŒuf Rare !", + "shinyUPGacha": "Bonus\nChromatique !", + "legendaryUPGacha": "Bonus !", } as const; diff --git a/src/locales/fr/fight-ui-handler.ts b/src/locales/fr/fight-ui-handler.ts index 5472838d780..8bcf7732626 100644 --- a/src/locales/fr/fight-ui-handler.ts +++ b/src/locales/fr/fight-ui-handler.ts @@ -4,6 +4,6 @@ export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "Puissance", "accuracy": "Précision", - "abilityFlyInText": " {{passive}}{{abilityName}} de {{pokemonName}}", + "abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}", "passive": "Passif ", // The space at the end is important } as const; diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index 9cf14cc61dc..70cf05fe984 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Link Google", "unlinkGoogle": "Unlink Google", "cancel": "Retour", - "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?" + "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", + "noEggs": "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 2416b60b9aa..aeb6ad9ed7e 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -39,14 +39,15 @@ export const menu: SimpleTranslationEntries = { "weeklyRankings": "Classement de la Semaine", "noRankings": "Pas de Classement", "positionIcon": "#", - "usernameScoreboard": "Username", + "usernameScoreboard": "Utilisateur", "score": "Score", - "wave": "Wave", + "wave": "Vague", "loading": "Chargement…", - "loadingAsset": "Chargement de la ressource: {{assetName}}", + "loadingAsset": "Chargement de la ressource : {{assetName}}", "playersOnline": "Joueurs Connectés", "yes":"Oui", "no":"Non", "disclaimer": "AVERTISSEMENT", "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", + "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 97a31161dc4..498b064de75 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}}", @@ -17,7 +17,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonHpRestoreModifierType": { - description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé", + description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé.", extra: { "fully": "Restaure tous les PV d’un Pokémon.", "fullyWithStatus": "Restaure tous les PV d’un Pokémon et soigne tous ses problèmes de statut.", @@ -73,7 +73,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Réanime et restaure tous les PV de tous les Pokémon K.O.", }, "MoneyRewardModifierType": { - description: "Octroie une {{moneyMultiplier}} somme d’argent ({{moneyAmount}}₽).", + description: "Octroie une {{moneyMultiplier}} somme d’argent.\n({{moneyAmount}} ₽)", extra: { "small": "petite", "moderate": "moyenne", @@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TmModifierTypeWithInfo": { name: "CT{{moveId}} - {{moveName}}", - description: "Apprend la capacité {{moveName}} à un Pokémon\n(Hold C or Shift for more info).", + description: "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)", }, "EvolutionItemModifierType": { description: "Permet à certains Pokémon d’évoluer.", @@ -110,7 +110,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Permet à certains Pokémon de changer de forme.", }, "FusePokemonModifierType": { - description: "Fusionne deux Pokémon (transfère le Talent, sépare les stats de base et les types, partage le movepool).", + description: "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage le movepool).", }, "TerastallizeModifierType": { name: "Téra-Éclat {{teraType}}", @@ -151,7 +151,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Cendre Sacrée" }, - "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O." }, + "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il est mis K.O. par une capacité directe." }, "ETHER": { name: "Huile" }, "MAX_ETHER": { name: "Huile Max" }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Grelot Zen" }, + "EVIOLITE": { name: "Évoluroc", description: "Un étrange concentré d’évolution qui augmente la Défense et la Défense Spéciale d’un Pokémon pouvant évoluer." }, + "SOUL_DEW": { name: "Rosée Âme", description: "Augmente de 10% l’influence de la nature d’un Pokémon sur ses statistiques (cumulatif)." }, "NUGGET": { name: "Pépite" }, @@ -211,10 +213,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "KINGS_ROCK": { name: "Roche Royale", description: "Ajoute 10% de chances qu’une capacité offensive apeure l’adversaire." }, "LEFTOVERS": { name: "Restes", description: "Soigne à chaque tour 1/16 des PV max d’un Pokémon." }, - "SHELL_BELL": { name: "Grelot Coque", description: "Soigne 1/8 des dégâts infligés par un Pokémon." }, + "SHELL_BELL": { name: "Grelot Coque", description: "Soigne son porteur avec 1/8 des dégâts qu’il inflige à un Pokémon." }, "TOXIC_ORB": { name: "Orbe Toxique", description: "Un orbe bizarre qui empoisonne gravement son porteur durant le combat." }, - "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brûle son porteur durant le combat." }, + "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brule son porteur durant le combat." }, "BATON": { name: "Bâton", description: "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Jeton Ténacité" }, "ENEMY_FUSED_CHANCE": { name: "Jeton Fusion", description: "Ajoute 1% de chances qu’un Pokémon sauvage soit une fusion." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Balle Lumière", description: "Objet à faire tenir à Pikachu. Un orbe énigmatique qui augmente son Attaque et son Attaque Spéciale." }, + "THICK_CLUB": { name: "Masse Os", description: "Objet à faire tenir à Osselait ou Ossatueur. Un os dur qui augmente leur Attaque." }, + "METAL_POWDER": { name: "Poudre Métal", description: "Objet à faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, augmente sa Défense." }, + "QUICK_POWDER": { name: "Poudre Vite", description: "Objet à faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, augmente sa Vitesse." } + }, TempBattleStatBoosterItem: { "x_attack": "Attaque +", "x_defense": "Défense +", diff --git a/src/locales/fr/modifier.ts b/src/locales/fr/modifier.ts new file mode 100644 index 00000000000..f215e258a76 --- /dev/null +++ b/src/locales/fr/modifier.ts @@ -0,0 +1,12 @@ +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 !", + "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 !", +} as const; diff --git a/src/locales/fr/party-ui-handler.ts b/src/locales/fr/party-ui-handler.ts index 369f7b65bb9..b1324f52398 100644 --- a/src/locales/fr/party-ui-handler.ts +++ b/src/locales/fr/party-ui-handler.ts @@ -1,11 +1,53 @@ 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", + + "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-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/settings.ts b/src/locales/fr/settings.ts index 59de6c82d32..cd85b0f8cb9 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -10,7 +10,7 @@ export const settings: SimpleTranslationEntries = { "keyboard": "Clavier", "gameSpeed": "Vitesse du jeu", "hpBarSpeed": "Vit. barre de PV", - "expGainsSpeed": "Vit.barre d’Exp", + "expGainsSpeed": "Vit. barre d’Exp", "expPartyDisplay": "Afficher Exp équipe", "skipSeenDialogues": "Passer dialogues connus", "battleStyle": "Style de combat", @@ -41,13 +41,13 @@ export const settings: SimpleTranslationEntries = { "fancy": "Amélioré", "abbreviated": "Abrégé", "moveAnimations": "Animations de combat", - "showStatsOnLevelUp": "Afficher stats à la montée de niveau", + "showStatsOnLevelUp": "Afficher stats à la montée de N.", "candyUpgradeNotification": "Notif amélioration de bonbon", "passivesOnly": "Passifs", "candyUpgradeDisplay": "Amélioration bonbon", "icon": "Icône", "animation": "Animation", - "moveInfo": "Info de capacité", + "moveInfo": "Infos de capacité", "showMovesetFlyout": "Afficher le volet de capacités", "showArenaFlyout": "Afficher le volet d’arène", "showTimeOfDayWidget": "Widget de l’heure", @@ -58,16 +58,16 @@ export const settings: SimpleTranslationEntries = { "consistent": "Consistant", "mixedAnimated": "Mixte", "fusionPaletteSwaps": "Palettes de fusion", - "playerGender": "Genre du joueur", + "playerGender": "Genre de l’avatar", "typeHints": "Indications de type", "masterVolume": "Vol. principal", "bgmVolume": "Vol. musique", "seVolume": "Vol. effets", - "musicPreference": "Préférence musicale", + "musicPreference": "Préf. musicale", "mixed": "Mixte", - "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton", + "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton.", "delete": "Supprimer", - "keyboardPleasePress": "Veuillez appuyer sur une touche de votre clavier", + "keyboardPleasePress": "Veuillez appuyer sur une touche de votre clavier.", "reset": "Réinitialiser", "requireReload": "Redémarrage requis", "action": "Action", @@ -92,7 +92,8 @@ export const settings: SimpleTranslationEntries = { "buttonSpeedUp": "Accélérer", "buttonSlowDown": "Ralentir", "alt": " (Alt)", - "mute": "Mute", + "mute": "Muet", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Montrer titre de la musique", } as const; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index 0874c18d84c..bddc740681e 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passif :", "nature": "Nature :", "eggMoves": "Capacités Œuf", - "start": "Lancer", "addToParty": "Ajouter à l’équipe", "toggleIVs": "Voir les IV", "manageMoves": "Modifier les Capacités", @@ -32,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Sélectionnez laquelle échanger avec", "unlockPassive": "Débloquer Passif", "reduceCost": "Diminuer le cout", + "sameSpeciesEgg": "Acheter un Œuf", "cycleShiny": ": » Chromatiques", "cycleForm": ": » Formes", "cycleGender": ": » Sexes", diff --git a/src/locales/fr/status-effect.ts b/src/locales/fr/status-effect.ts new file mode 100644 index 00000000000..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/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 17dbfd89fb1..fd18147ac5a 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -3,6 +3,9 @@ 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}} ha copiato le modifiche alle statistiche\ndel suo alleato {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", + "trace": "L'abilità {{abilityName}} di {{targetName}}\nviene copiata da {{pokemonName}} con Traccia!", "windPowerCharged": "Venire colpito da {{moveName}} ha caricato {{pokemonName}}!", - "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!" + "quickDraw":"{{pokemonName}} agisce più rapidamente del normale grazie a Colpolesto!", } as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index a4b3c32db07..787888e333b 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,7 +14,9 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "Vuoi cambiare\n{{pokemonName}}?", "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", "moneyWon": "Hai vinto {{moneyAmount}}₽", + "moneyPickedUp": "You picked up ₽{{moneyAmount}}!", "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Vai! {{pokemonName}}!", @@ -24,7 +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}}!", "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", "learnMove": "{{pokemonName}} impara\n{{moveName}}!", @@ -41,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}}!", @@ -52,24 +56,27 @@ export const battle: SimpleTranslationEntries = { "runAwayCannotEscape": "Non puoi fuggire!", "escapeVerbSwitch": "cambiando", "escapeVerbFlee": "fuggendo", - "notDisabled": "{{pokemonName}}'s {{moveName}} non è più\ndisabilitata!", + "notDisabled": "{{moveName}} di {{pokemonName}} non è più\ndisabilitata!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", - "eggHatching": "Oh!", + "eggHatching": "Oh?", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", "wildPokemonWithAffix": "{{pokemonName}} selvatico", "foePokemonWithAffix": "{{pokemonName}} avversario", "useMove": "{{pokemonNameWithAffix}} usa {{moveName}}!", "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", - "statRose": "è aumentato/a", - "statSharplyRose": "è aumentato/a molto", - "statRoseDrastically": "è aumentato/a drasticamente", - "statWontGoAnyHigher": "non può aumentare più di così", - "statFell": "è diminuito/a", - "statHarshlyFell": "è diminuito/a molto", - "statSeverelyFell": "è diminuito/a drasticamente", - "statWontGoAnyLower": "non può diminuire più di così", + "statRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", + "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", + "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", + "statFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", + "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", + "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", @@ -93,7 +100,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} sta\navendo un Incubo!", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} sta\ngià avendo un Incubo!", "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} è bloccato\nin un Incubo!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} ha\nsubito Ripeti!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} ha\nsubito Ripeti!", "battlerTagsEncoreOnRemove": "L'effetto di Ripeti su {{pokemonNameWithAffix}}\n è terminato!", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} è pronto ad\naiutare {{pokemonName}}!", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} assorbe\nnutrienti dalle sue radici!", diff --git a/src/locales/it/bgm-name.ts b/src/locales/it/bgm-name.ts new file mode 100644 index 00000000000..87d90dabc9d --- /dev/null +++ b/src/locales/it/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/it/challenges.ts b/src/locales/it/challenges.ts index 0a15b22f83e..2643b16d0f7 100644 --- a/src/locales/it/challenges.ts +++ b/src/locales/it/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Modificatori delle sfide", - "points": "Pessime idee", - "confirm_start": "Procedere con le sfide selezionate?", - "singleGeneration.name": "Mono gen", - "singleGeneration.value.0": "Off", - "singleGeneration.desc.0": "Puoi usare solo Pokémon della generazione selezionata.", - "singleGeneration.value.1": "1ª gen", - "singleGeneration.desc.1": "Puoi usare solo Pokémon di 1ª generazione.", - "singleGeneration.value.2": "2ª gen", - "singleGeneration.desc.2": "Puoi usare solo Pokémon di 2ª generazione.", - "singleGeneration.value.3": "3ª gen", - "singleGeneration.desc.3": "Puoi usare solo Pokémon di 3ª generazione.", - "singleGeneration.value.4": "4ª gen", - "singleGeneration.desc.4": "Puoi usare solo Pokémon di 4ª generazione.", - "singleGeneration.value.5": "5ª gen", - "singleGeneration.desc.5": "Puoi usare solo Pokémon di 5ª generazione.", - "singleGeneration.value.6": "6ª gen", - "singleGeneration.desc.6": "Puoi usare solo Pokémon di 6ª generazione.", - "singleGeneration.value.7": "7ª gen", - "singleGeneration.desc.7": "Puoi usare solo Pokémon di 7ª generazione.", - "singleGeneration.value.8": "8ª gen", - "singleGeneration.desc.8": "Puoi usare solo Pokémon di 8ª generazione.", - "singleGeneration.value.9": "9ª gen", - "singleGeneration.desc.9": "Puoi usare solo Pokémon di 9ª generazione.", - "singleType.name": "Mono tipo", - "singleType.value.0": "Off", - "singleType.desc.0": "Puoi usare solo Pokémon del tipo selezionato.", - "singleType.value.1": "Normale", - "singleType.desc.1": "Puoi usare solo Pokémon di tipo normale.", - "singleType.value.2": "Lotta", - "singleType.desc.2": "Puoi usare solo Pokémon di tipo lotta.", - "singleType.value.3": "Volante", - "singleType.desc.3": "Puoi usare solo Pokémon di tipo volante.", - "singleType.value.4": "Veleno", - "singleType.desc.4": "Puoi usare solo Pokémon di tipo veleno.", - "singleType.value.5": "Terra", - "singleType.desc.5": "Puoi usare solo Pokémon di tipo terra.", - "singleType.value.6": "Roccia", - "singleType.desc.6": "Puoi usare solo Pokémon di tipo roccia.", - "singleType.value.7": "Coleottero", - "singleType.desc.7": "Puoi usare solo Pokémon di tipo coleottero.", - "singleType.value.8": "Spettro", - "singleType.desc.8": "Puoi usare solo Pokémon di tipo spettro.", - "singleType.value.9": "Acciaio", - "singleType.desc.9": "Puoi usare solo Pokémon di tipo acciaio.", - "singleType.value.10": "Fuoco", - "singleType.desc.10": "Puoi usare solo Pokémon di tipo fuoco.", - "singleType.value.11": "Acqua", - "singleType.desc.11": "Puoi usare solo Pokémon di tipo acqua.", - "singleType.value.12": "Erba", - "singleType.desc.12": "Puoi usare solo Pokémon di tipo erba.", - "singleType.value.13": "Elettro", - "singleType.desc.13": "Puoi usare solo Pokémon di tipo elettro.", - "singleType.value.14": "Psico", - "singleType.desc.14": "Puoi usare solo Pokémon di tipo psico.", - "singleType.value.15": "Ghiaccio", - "singleType.desc.15": "Puoi usare solo Pokémon di tipo ghiaccio.", - "singleType.value.16": "Drago", - "singleType.desc.16": "Puoi usare solo Pokémon di tipo drago.", - "singleType.value.17": "Buio", - "singleType.desc.17": "Puoi usare solo Pokémon di tipo buio.", - "singleType.value.18": "Folletto", - "singleType.desc.18": "Puoi usare solo Pokémon di tipo folletto.", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "Mono gen", + "desc": "Puoi usare solo Pokémon di {{gen}} generazione.", + "desc_default": "Puoi usare solo Pokémon della generazione selezionata.", + "gen_1": "1ª", + "gen_2": "2ª", + "gen_3": "3ª", + "gen_4": "4ª", + "gen_5": "5ª", + "gen_6": "6ª", + "gen_7": "7ª", + "gen_8": "8ª", + "gen_9": "9ª", + }, + "singleType": { + "name": "Mono tipo", + "desc": "Puoi usare solo Pokémon di tipo {{type}}.", + "desc_default": "Puoi usare solo Pokémon del tipo selezionato." + }, } as const; diff --git a/src/locales/it/common.ts b/src/locales/it/common.ts new file mode 100644 index 00000000000..2a84e982350 --- /dev/null +++ b/src/locales/it/common.ts @@ -0,0 +1,10 @@ +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 6f14aabda50..5b370b00e4b 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/it/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const itConfig = { ability: ability, @@ -47,9 +52,11 @@ export const itConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const itConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const itConfig = { 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 }; diff --git a/src/locales/it/dialogue.ts b/src/locales/it/dialogue.ts index 0fbd8cabf67..702b550c45a 100644 --- a/src/locales/it/dialogue.ts +++ b/src/locales/it/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts index 63c8290edee..c51f12065a1 100644 --- a/src/locales/it/egg.ts +++ b/src/locales/it/egg.ts @@ -6,16 +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" + "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": "Estrazione", + "pulls": "Estrazioni", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "Dall’Uovo è nato {{pokemonName}}!", + "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/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts index 320a4844372..58e48574476 100644 --- a/src/locales/it/menu-ui-handler.ts +++ b/src/locales/it/menu-ui-handler.ts @@ -2,26 +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 ad47faa8980..8df8c2db9b3 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -54,4 +54,5 @@ 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.", + "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/it/modifier-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 07e7e6909f4..1d8b0232e70 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.", @@ -67,7 +67,7 @@ export const modifierType: ModifierTypeTranslationEntries = { 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,70 +129,71 @@ 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." }, "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" }, + "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" }, @@ -200,18 +201,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." }, @@ -221,24 +222,30 @@ 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: { + "LIGHT_BALL": { name: "Elettropalla", description: "Strumento da dare a Pikachu. Sfera insolita che aumenta l’Attacco e l’Attacco Speciale." }, + "THICK_CLUB": { name: "Osso spesso", description: "Strumento da dare a Cubone o Marowak. Osso duro che aumenta l’Attacco." }, + "METAL_POWDER": { name: "Metalpolvere", description: "Strumento da dare a Ditto. Strana polvere finissima e al tempo stesso dura che migliora la Difesa." }, + "QUICK_POWDER": { name: "Velopolvere", description: "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità." } + }, TempBattleStatBoosterItem: { "x_attack": "Attacco X", "x_defense": "Difesa X", @@ -250,14 +257,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..d3da4c2150b --- /dev/null +++ b/src/locales/it/modifier.ts @@ -0,0 +1,12 @@ +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}}!", + "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!", +} as const; diff --git a/src/locales/it/party-ui-handler.ts b/src/locales/it/party-ui-handler.ts index c174df03d1f..86966a6e7f9 100644 --- a/src/locales/it/party-ui-handler.ts +++ b/src/locales/it/party-ui-handler.ts @@ -6,5 +6,48 @@ 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", + + "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-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/settings.ts b/src/locales/it/settings.ts index ea70c2ec94b..af48368aeeb 100644 --- a/src/locales/it/settings.ts +++ b/src/locales/it/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index 8f68e5ff10d..c84334fcd6a 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passiva:", "nature": "Natura:", "eggMoves": "Mosse da uova", - "start": "Inizia", "addToParty": "Aggiungi al gruppo", "toggleIVs": "Vedi/Nascondi IV", "manageMoves": "Gestisci mosse", @@ -30,6 +29,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "Seleziona natura.", "selectMoveSwapOut": "Seleziona una mossa da scambiare.", "selectMoveSwapWith": "Seleziona una mossa da scambiare con", + "sameSpeciesEgg": "Buy an Egg", "unlockPassive": "Sblocca passiva", "reduceCost": "Riduci costo", "cycleShiny": ": Shiny", diff --git a/src/locales/it/status-effect.ts b/src/locales/it/status-effect.ts new file mode 100644 index 00000000000..1a402ac30fd --- /dev/null +++ b/src/locales/it/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + toxic: { + name: "Toxic", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + paralysis: { + name: "Paralysis", + description: "paralysis", + obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", + activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", + heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + sleep: { + name: "Sleep", + description: "sleep", + obtain: "{{pokemonNameWithAffix}}\nfell asleep!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is fast asleep.", + overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", + heal: "{{pokemonNameWithAffix}} woke up!" + }, + freeze: { + name: "Freeze", + description: "freezing", + obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", + overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", + heal: "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + burn: { + name: "Burn", + description: "burn", + obtain: "{{pokemonNameWithAffix}}\nwas burned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", + overlap: "{{pokemonNameWithAffix}} is\nalready burned!", + heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" + }, +} as const; diff --git a/src/locales/it/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 c6c29b5f200..58ba7bf9aa6 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -3,8 +3,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", - "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", - "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", } as const; diff --git a/src/locales/ko/ability.ts b/src/locales/ko/ability.ts index f11c1363924..18b102800cf 100644 --- a/src/locales/ko/ability.ts +++ b/src/locales/ko/ability.ts @@ -1154,7 +1154,7 @@ export const ability: AbilityTranslationEntries = { }, beadsOfRuin: { name: "재앙의구슬", - description: "재앙을 부르는 곡옥의 힘으 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." + description: "재앙을 부르는 곡옥의 힘으로 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." }, orichalcumPulse: { name: "진홍빛고동", diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts index a4141da13d8..d8b8cc54f66 100644 --- a/src/locales/ko/achv.ts +++ b/src/locales/ko/achv.ts @@ -26,7 +26,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "DamageAchv": { - description: "한 번의 공격만으로 {{damageAmount}} 대미지", + description: "한 번의 공격만으로 {{damageAmount}} 데미지", }, "250_DMG": { name: "강타자", diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index 545d70217a1..dbb425da63f 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -14,7 +14,9 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "{{pokemonName}}[[를]]\n교체하시겠습니까?", "trainerDefeated": "{{trainerName}}[[와]]의\n승부에서 이겼다!", "moneyWon": "상금으로\n₽{{moneyAmount}}을 손에 넣었다!", + "moneyPickedUp": "₽{{moneyAmount}}을 주웠다!", "pokemonCaught": "신난다-!\n{{pokemonName}}[[를]] 잡았다!", + "addedAsAStarter": "{{pokemonName}}[[가]]\n스타팅 포켓몬에 추가되었다!", "partyFull": "지닌 포켓몬이 가득 찼습니다. {{pokemonName}}[[를]]\n대신해 포켓몬을 놓아주시겠습니까?", "pokemon": "포켓몬", "sendOutPokemon": "가랏! {{pokemonName}}!", @@ -23,8 +25,10 @@ export const battle: SimpleTranslationEntries = { "hitResultNotVeryEffective": "효과가 별로인 듯하다…", "hitResultNoEffect": "{{pokemonName}}에게는\n효과가 없는 것 같다…", "hitResultOneHitKO": "일격필살!", - "attackFailed": "하지만 실패했다!", + "attackFailed": "그러나 실패하고 말았다!!", + "attackMissed": "{{pokemonNameWithAffix}}에게는\n맞지 않았다!", "attackHitsCount": "{{count}}번 맞았다!", + "rewardGain": "{{modifierName}}[[를]] 받았다!", "expGain": "{{pokemonName}}[[는]]\n{{exp}} 경험치를 얻었다!", "levelUp": "{{pokemonName}}[[는]]\n레벨 {{level}}[[로]] 올랐다!", "learnMove": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배웠다!", @@ -53,6 +57,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "교체할", "escapeVerbFlee": "도망칠", "notDisabled": "{{pokemonName}}의\n{{moveName}} 사슬묶기가 풀렸다!", + "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", + "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", "eggHatching": "어라…?", "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", @@ -60,16 +66,17 @@ export const battle: SimpleTranslationEntries = { "foePokemonWithAffix": "상대 {{pokemonName}}", "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", - "regainHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!", + "stealEatBerry": "{{pokemonName}}[[가]]\n{{targetName}}의 {{berryName}}[[를]] 빼앗아 먹었다!", + "regainHealth": "{{pokemonName}}[[는]]\n체력을 회복했다!", "fainted": "{{pokemonNameWithAffix}}[[는]] 쓰러졌다!", - "statRose": "[[가]] 올라갔다!", - "statSharplyRose": "[[가]] 크게 올라갔다!", - "statRoseDrastically": "[[가]] 매우 크게 올라갔다!", - "statWontGoAnyHigher": "[[는]] 더 올라가지 않는다!", - "statFell": "[[가]] 떨어졌다!", - "statHarshlyFell": "[[가]] 크게 떨어졌다!", - "statSeverelyFell": "[[가]] 매우 크게 떨어졌다!", - "statWontGoAnyLower": "[[는]] 더 떨어지지 않는다!", + "statRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statSharplyRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statRoseDrastically": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statHarshlyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statSeverelyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!", "battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", @@ -93,7 +100,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}[[는]]\n악몽을 꾸기 시작했다!", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 악몽을 꾸고 있다!", "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}[[는]]\n악몽에 시달리고 있다!", - "battlerTagsEncoreOnAdd": "{{sourcePokemonNameWithAffix}}[[는]]\n앙코르를 받았다!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}[[는]]\n앙코르를 받았다!", "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}의\n앙코르 상태가 풀렸다!", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}[[는]] {{pokemonName}}에게\n도우미가 되어주려 한다!", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!", @@ -127,5 +134,5 @@ export const battle: SimpleTranslationEntries = { "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", } as const; diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts new file mode 100644 index 00000000000..235d6a3320e --- /dev/null +++ b/src/locales/ko/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "BW2 관동 챔피언 배틀", + "battle_johto_champion": "BW2 성도 챔피언 배틀", + "battle_hoenn_champion": "BW2 호연 챔피언 배틀", + "battle_sinnoh_champion": "BW2 신오 챔피언 배틀", + "battle_champion_alder": "BW 하나 챔피언 배틀", + "battle_champion_iris": "BW2 하나 챔피언 배틀", + "battle_kalos_champion": "XY 칼로스 챔피언 배틀", + "battle_alola_champion": "USUM 알로라 챔피언 배틀", + "battle_galar_champion": "SWSH 가라르 챔피언 배틀", + "battle_champion_geeta": "SV 챔피언 테사 배틀", + "battle_champion_nemona": "SV 챔피언 네모 배틀", + "battle_champion_kieran": "SV 챔피언 카지 배틀", + "battle_hoenn_elite": "ORAS 사천왕 배틀", + "battle_unova_elite": "BW 사천왕 배틀", + "battle_kalos_elite": "XY 사천왕 배틀", + "battle_alola_elite": "SM 사천왕 배틀", + "battle_galar_elite": "SWSH 리그 토너먼트 배틀", + "battle_paldea_elite": "SV 사천왕 배틀", + "battle_bb_elite": "SV 블루베리 리그 사천왕 배틀", + "battle_final_encounter": "불가사의 던전 구조대 DX 레쿠쟈의 영역", + "battle_final": "BW 게치스 배틀", + "battle_kanto_gym": "BW2 관동 체육관 배틀", + "battle_johto_gym": "BW2 성도 체육관 배틀", + "battle_hoenn_gym": "BW2 호연 체육관 배틀", + "battle_sinnoh_gym": "BW2 신오 체육관 배틀", + "battle_unova_gym": "BW 하나 체육관 배틀", + "battle_kalos_gym": "XY 칼로스 체육관 배틀", + "battle_galar_gym": "SWSH 가라르 체육관 배틀", + "battle_paldea_gym": "SV 팔데아 체육관 배틀", + "battle_legendary_kanto": "XY 관동 전설 조우 배틀", + "battle_legendary_raikou": "HGSS 라이코 배틀", + "battle_legendary_entei": "HGSS 엔테이 배틀", + "battle_legendary_suicune": "HGSS 스이쿤 배틀", + "battle_legendary_lugia": "HGSS 루기아 배틀", + "battle_legendary_ho_oh": "HGSS 칠색조 배틀", + "battle_legendary_regis_g5": "BW2 레지시리즈 배틀", + "battle_legendary_regis_g6": "ORAS 레지시리즈 배틀", + "battle_legendary_gro_kyo": "ORAS 그란돈 & 가이오가 배틀", + "battle_legendary_rayquaza": "ORAS 레쿠쟈 배틀", + "battle_legendary_deoxys": "ORAS 데오키시스 배틀", + "battle_legendary_lake_trio": "ORAS 호수의 수호신 배틀", + "battle_legendary_sinnoh": "ORAS 신오 전설 조우 배틀", + "battle_legendary_dia_pal": "ORAS 디아루가 & 펄기아 배틀", + "battle_legendary_giratina": "ORAS 기라티나 배틀", + "battle_legendary_arceus": "HGSS 아르세우스 배틀", + "battle_legendary_unova": "BW 하나 전설 조우 배틀", + "battle_legendary_kyurem": "BW 큐레무 배틀", + "battle_legendary_res_zek": "BW 레시라무 & 제크로무 배틀", + "battle_legendary_xern_yvel": "XY 제르네아스 & 이벨타르 배틀", + "battle_legendary_tapu": "SM 섬 수호신 배틀", + "battle_legendary_sol_lun": "SM 솔가레오 & 루나아라 배틀", + "battle_legendary_ub": "SM 울트라비스트 배틀", + "battle_legendary_dusk_dawn": "USUM 황혼의 갈기 & 새벽의 날개 네크로즈마 배틀", + "battle_legendary_ultra_nec": "USUM 울트라 네크로즈마 배틀", + "battle_legendary_zac_zam": "SWSH 자시안 & 자마젠타 배틀", + "battle_legendary_glas_spec": "SWSH 블리자포스 & 레이스포스 배틀", + "battle_legendary_calyrex": "SWSH 버드렉스 배틀", + "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", + "battle_legendary_ruinous": "SV 재앙의 보물 배틀", + "battle_legendary_kor_mir": "SV 에리어 제로 배틀", + "battle_legendary_loyal_three": "SV 세벗들 배틀", + "battle_legendary_ogerpon": "SV 오거폰 배틀", + "battle_legendary_terapagos": "SV 테라파고스 배틀", + "battle_legendary_pecharunt": "SV 복숭악동 배틀", + "battle_rival": "BW 라이벌 배틀", + "battle_rival_2": "BW N 배틀", + "battle_rival_3": "BW 최종전 N 배틀", + "battle_trainer": "BW 트레이너 배틀", + "battle_wild": "BW 야생 포켓몬 배틀", + "battle_wild_strong": "BW 강한 야생 포켓몬 조우 배틀", + "end_summit": "불가사의 던전 구조대 DX 천공의 탑 꼭대기", + "battle_rocket_grunt": "HGSS 로켓단 배틀", + "battle_aqua_magma_grunt": "ORAS 아쿠아단 & 마그마단 배틀", + "battle_galactic_grunt": "BDSP 갤럭시단 배틀", + "battle_plasma_grunt": "BW 플라스마단 배틀", + "battle_flare_grunt": "XY 플레어단 배틀", + "battle_rocket_boss": "USUM 비주기 배틀", + "battle_aqua_magma_boss": "ORAS 아강 & 마적 배틀", + "battle_galactic_boss": "BDSP 태홍 배틀", + "battle_plasma_boss": "B2W2 게치스 배틀", + "battle_flare_boss": "XY 플라드리 배틀", + + // Biome Music + "abyss": "불가사의 던전 하늘의 탐험대 어둠의 화구", + "badlands": "불가사의 던전 하늘의 탐험대 불모의 계곡", + "beach": "불가사의 던전 하늘의 탐험대 축축한 암반", + "cave": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 동굴", + "construction_site": "불가사의 던전 하늘의 탐험대 바위 채석장", + "desert": "불가사의 던전 하늘의 탐험대 북쪽 사막", + "dojo": "불가사의 던전 하늘의 탐험대 텅구리 도장", + "end": "불가사의 던전 구조대DX 천공의 탑", + "factory": "불가사의 던전 하늘의 탐험대 숨겨진 유적", + "fairy_cave": "불가사의 던전 하늘의 탐험대 별의 동굴", + "forest": "불가사의 던전 하늘의 탐험대 검은 숲", + "grass": "불가사의 던전 하늘의 탐험대 사과의 숲", + "graveyard": "불가사의 던전 하늘의 탐험대 신비의 숲", + "ice_cave": "불가사의 던전 하늘의 탐험대 광대한 얼음산", + "island": "불가사의 던전 하늘의 탐험대 연안의 암반", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "불가사의 던전 하늘의 탐험대 수정 동굴", + "meadow": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 숲", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "불가사의 던전 하늘의 탐험대 뿔산", + "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", + "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", + "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", + "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", + "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", + "space": "Firel - Aether", + "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", + "tall_grass": "불가사의 던전 하늘의 탐험대 짙은 안개의 숲", + "temple": "불가사의 던전 하늘의 탐험대 파수꾼의 동굴", + "town": "불가사의 던전 하늘의 탐험대 랜덤 던전 테마 3", + "volcano": "불가사의 던전 하늘의 탐험대 열수의 동굴", + "wasteland": "불가사의 던전 하늘의 탐험대 환상의 대지", + + // Encounter + "encounter_ace_trainer": "BW 눈이 마주치면 승부! (엘리트 트레이너)", + "encounter_backpacker": "BW 눈이 마주치면 승부! (등산가)", + "encounter_clerk": "BW 눈이 마주치면 승부! (회사원)", + "encounter_cyclist": "BW 눈이 마주치면 승부! (사이클링)", + "encounter_lass": "BW 눈이 마주치면 승부! (짧은 치마)", + "encounter_parasol_lady": "BW 눈이 마주치면 승부! (파라솔 아가씨)", + "encounter_pokefan": "BW 눈이 마주치면 승부! (애호가클럽)", + "encounter_psychic": "BW 눈이 마주치면 승부! (초능력자)", + "encounter_rich": "BW 눈이 마주치면 승부! (신사)", + "encounter_rival": "BW 체렌", + "encounter_roughneck": "BW 눈이 마주치면 승부! (빡빡이)", + "encounter_scientist": "BW 눈이 마주치면 승부! (연구원)", + "encounter_twins": "BW 눈이 마주치면 승부! (쌍둥이)", + "encounter_youngster": "BW 눈이 마주치면 승부! (반바지 꼬마)", + + // Other + "heal": "BW 포켓몬 센터", + "menu": "불가사의 던전 하늘의 탐험대 포켓몬 세계에 온 것을 환영한다!", + "title": "불가사의 던전 하늘의 탐험대 메뉴 테마", +} as const; diff --git a/src/locales/ko/challenges.ts b/src/locales/ko/challenges.ts index 64fa316b3bb..136417f597b 100644 --- a/src/locales/ko/challenges.ts +++ b/src/locales/ko/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "챌린지 조건 설정", - "points": "Bad Ideas", - "confirm_start": "이 조건으로 챌린지를 진행하시겠습니까?", - "singleGeneration.name": "단일 세대", - "singleGeneration.value.0": "설정 안함", - "singleGeneration.desc.0": "선택한 세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.1": "1세대", - "singleGeneration.desc.1": "1세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.2": "2세대", - "singleGeneration.desc.2": "2세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.3": "3세대", - "singleGeneration.desc.3": "3세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.4": "4세대", - "singleGeneration.desc.4": "4세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.5": "5세대", - "singleGeneration.desc.5": "5세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.6": "6세대", - "singleGeneration.desc.6": "6세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.7": "7세대", - "singleGeneration.desc.7": "7세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.8": "8세대", - "singleGeneration.desc.8": "8세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.9": "9세대", - "singleGeneration.desc.9": "9세대의 포켓몬만 사용할 수 있습니다.", - "singleType.name": "단일 타입", - "singleType.value.0": "설정 안함", - "singleType.desc.0": "선택한 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.1": "노말", - "singleType.desc.1": "노말 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.2": "격투", - "singleType.desc.2": "격투 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.3": "비행", - "singleType.desc.3": "비행 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.4": "독", - "singleType.desc.4": "독 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.5": "땅", - "singleType.desc.5": "땅 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.6": "바위 ", - "singleType.desc.6": "바위 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.7": "벌레", - "singleType.desc.7": "벌레 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.8": "고스트", - "singleType.desc.8": "고스트 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.9": "강철", - "singleType.desc.9": "강철 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.10": "불꽃", - "singleType.desc.10": "불꽃 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.11": "물", - "singleType.desc.11": "물 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.12": "풀", - "singleType.desc.12": "풀 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.13": "전기", - "singleType.desc.13": "전기 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.14": "에스퍼", - "singleType.desc.14": "에스퍼 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.15": "얼음", - "singleType.desc.15": "얼음 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.16": "드래곤", - "singleType.desc.16": "드래곤 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.17": "악", - "singleType.desc.17": "악 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.18": "페어리", - "singleType.desc.18": "페어리 타입의 포켓몬만 사용할 수 있습니다.", + "illegalEvolution": "{{pokemon}}[[는]] 현재의 챌린지에\n부적합한 포켓몬이 되었습니다!", + "singleGeneration": { + "name": "단일 세대", + "desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.", + "desc_default": "선택한 세대의 포켓몬만 사용할 수 있습니다.", + "gen_1": "1세대", + "gen_2": "2세대", + "gen_3": "3세대", + "gen_4": "4세대", + "gen_5": "5세대", + "gen_6": "6세대", + "gen_7": "7세대", + "gen_8": "8세대", + "gen_9": "9세대", + }, + "singleType": { + "name": "단일 타입", + "desc": "{{type}} 타입의 포켓몬만 사용할 수 있습니다.", + "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다." + //type in pokemon-info + }, } as const; diff --git a/src/locales/ko/common.ts b/src/locales/ko/common.ts new file mode 100644 index 00000000000..30df85cb3a6 --- /dev/null +++ b/src/locales/ko/common.ts @@ -0,0 +1,10 @@ +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 99cf5ddd8ea..5b29a46c044 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/ko/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const koConfig = { ability: ability, @@ -47,9 +52,11 @@ export const koConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const koConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const koConfig = { 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 }; diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index 9dcd6294e7c..a98b31a7c61 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -928,71 +928,71 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "marlon": { "encounter": { - 1: "You look strong! Shoots! Let's start!", - 2: "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.", - 3: "Oh ho, so I'm facing you! That's off the wall." + 1: "너 강해보이네! 받아라! 승부 시작이야!", + 2: "난 넓은 대양처럼 강인하다고. 너 분명히 휩쓸려 갈거야.", + 3: "오, 내가 너를 마주 보고 있군! 둘다 파도에서 떨어지겠어." }, "victory": { - 1: "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!", - 2: "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!", - 3: "You're strong as a gnarly wave!" + 1: "너… 좋은 포켓몬을 키우고 있구나! 꽤 하는군! 끝내주는 트레이너야!", + 2: "강해 보이는 게 아니고 진짜 강하구나! 에-, 나도 휩쓸려버렸어!", + 3: "넌 거친 파도처럼 강인하구나!" }, "defeat": { - 1: "You're tough, but it's not enough to sway the sea, 'K!", - 2: "Hee! Looks like I went and won again!", - 3: "Sweet, sweet victory!" + 1: "넌 강하지만, 바다를 흔들기에는 역부족이네, 그치!", + 2: "아하핫! 내가 또 이긴 것 같네!", + 3: "달콤하네, 승리 역시 달콤하고!" } }, "shauntal": { "encounter": { - 1: "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.", - 2: "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?", - 3: "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?" + 1: "미안합니다. 도전자이시죠?\n고스트포켓몬 조련사인 사천왕 망초가 상대하겠습니다.", + 2: "겨루었던 트레이너와 포켓몬의 마음이 통하는 모습을 이야기로 만드는 것을 좋아해서요!\n그러니까 당신들에 대한 취재를 허락해 주세요?", + 3: "포켓몬과 함께 일하는 모든 사람들은 각자 이야기를 갖고 있죠.\n어떤 이야기를 들려드릴까요?" }, "victory": { - 1: "Wow. I'm dumbstruck!", - 2: "S-sorry! First, I must apologize to my Pokémon…\n\nI'm really sorry you had a bad experience because of me!", - 3: "Even in light of that, I'm still one of the Elite Four!" + 1: "…우와. 저 아연실색 망연자실이에요!", + 2: "미-미 미안합니다! 먼저 포켓몬에게 사과해야지…\n\n나 때문에 괴로운 기억을 만들게 돼서 정말 미안해!", + 3: "그치만, 전 여전히 사천왕인걸요!" }, "defeat": { - 1: "Eheh.", - 2: "That gave me excellent material for my next novel!", - 3: "And so, another tale ends…" + 1: "에헤헤.", + 2: "다음 소설의 완벽한 소재를 얻었다!", + 3: "그리고 이렇게, 또 다른 이야기가 끝났습니다…" } }, "marshal": { "encounter": { - 1: "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!", - 2: "Victory, decisive victory, is my intention! Challenger, here I come!", - 3: "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!" + 1: "노간주 스승님이, 잠재력을 보고 네게 관심을 갖고 계시더군.\n그 힘의 한계까지 데려가는 것이 이번 의도다! 그럼 간다!", + 2: "승리, 압도적인 승리, 내가 바라는 것이다! 강인한 도전자여, 간다!", + 3: "깨뜨리는 것은 약한 자신, 관철하는 것은 강한 신념!\n 그리고 바라는 것은 압도적인 승리!" }, "victory": { - 1: "Whew! Well done!", - 2: "As your battles continue, aim for even greater heights!", - 3: "The strength shown by you and your Pokémon has deeply impressed me…" + 1: "후우! 잘 싸웠다!", + 2: "역시 대단하구나! 싸워서 더욱더 높은 곳을 노려라…!", + 3: "너와 네 포켓몬이 보여준 그 힘, 감명 깊군…" }, "defeat": { - 1: "Hmm.", - 2: "That was good battle.", - 3: "Haaah! Haaah! Haiyaaaah!" + 1: "흐음.", + 2: "좋은 승부였다.", + 3: "하압! 하압! 히야아아압!!!!" } }, "cheren": { "encounter": { - 1: "You remind me of an old friend. That makes me excited about this Pokémon battle!", - 2: `Pokémon battles have no meaning if you don't think why you battle. - $Or better said, it makes battling together with Pokémon meaningless.`, - 3: "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you." + 1: "넌 내 오랜 친구가 생각나게 하는군. 그 덕분에 이 배틀이 기대돼!", + 2: `왜 하고 있는지 생각하지 않으면, 포켓몬 배틀은 의미가 없어 . + $좋게 말하면, 함께 포켓몬과 승부하는 것이 무의미해 지는 것이지.`, + 3: "내 이름은 체렌! 체육관 관장이자 선생님을 하고 있지! 널 만나게 되서 기쁘군." }, "victory": { - 1: "Thank you! I saw what was missing in me.", - 2: "Thank you! I feel like I saw a little of the way toward my ideals.", - 3: "Hmm… This is problematic." + 1: "고마워! 내 안에 무엇이 부족했는지 알게 됐네.", + 2: "고마워! 내가 추구하는 이상에 조금 다가간 것 같아.", + 3: "으음… 이건 문제가 있군." }, "defeat": { - 1: "As a Gym Leader, I aim to be a wall for you to overcome.", - 2: "All right!", - 3: "I made it where I am because Pokémon were by my side.\nPerhaps we need to think about why Pokémon help us not in terms of Pokémon and Trainers but as a relationship between living beings." + 1: "체육관 관장으로서, 나는 넘어야할 벽이 되고자 하고 있거든.", + 2: "좋았어!", + 3: "포켓몬이 곁에 있었기 때문에 여기까지 올 수 있었어.\n생명체와 생명체라는 동등한 관계에서 포켓몬이 우리에게 도움을 주는 이유를 생각해 볼 필요는 있지." } }, "chili": { @@ -1226,14 +1226,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "clay": { "encounter": { - 1: "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!" + 1: "실망스럽군! 나를 기다리게 하다니, 이 꼬마가. 아무튼 실력을 확인해 볼까!" }, "victory": { - 1: "Man oh man… It feels good to go all out and still be defeated!" + 1: "이런 이런… 진심으로 싸워서 진 거라 오히려 시원한 기분이군!" }, "defeat": { - 1: `What's important is how ya react to losin'. - $That's why folks who use losin' as fuel to get better are tough.`, + 1: `중요한 것은 패배에 어떻게 반응하는 거다. + $그렇기 때문에 패배를 연료로 삼아 나아가는 사람들은 강인하지.`, } }, "kofu": { @@ -1260,68 +1260,68 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "sidney": { "encounter": { - 1: `I like that look you're giving me. I guess you'll give me a good match. - $That's good! Looking real good! All right! - $You and me, let's enjoy a battle that can only be staged here!`, + 1: `음, 좋은 표정이야. 꽤나 즐길 수 있겠는데. + $좋아! 아주 좋아! 좋았어! + $우리 함께, 포켓몬리그에서만 맛볼 수 있는 배틀을 즐겨보도록 하자!`, }, "victory": { - 1: "Well, how do you like that? I lost! Eh, it was fun, so it doesn't matter." + 1: "이런, 이런 져버렸군? 뭐, 꽤 즐겼으니 상관없지만." }, "defeat": { - 1: "No hard feelings, alright?" + 1: "기분 나빠하지 마, 알겠지?" } }, "phoebe": { "encounter": { - 1: `While I trained, I gained the ability to commune with Ghost-type Pokémon. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, + 1: `송화산에서 수행하면서, 고스트 타입 포켓몬과 마음이 통하게 됐어. + $응, 나와 내 포켓몬의 유대감은 정말 강해! + $이런 내 포켓몬들에게 과연 데미지를 줄 수 있을지 한번 시험해봐!`, }, "victory": { - 1: "Oh, darn. I've gone and lost." + 1: "아- 아, 내가 져버렸다." }, "defeat": { - 1: "I look forward to battling you again sometime!" + 1: "언젠가 다시 승부할 수 있기를 기대할게!" } }, "glacia": { "encounter": { - 1: `All I have seen are challenges by weak Trainers and their Pokémon. - $What about you? It would please me to no end if I could go all out against you!`, + 1: `이곳에 도전하러 오는 건 모두 어설픈 트레이너와 포켓몬뿐…. + $당신은 어떤가요? 제 진짜 실력을 발휘해도 괜찮을 정도라면 정말 기쁠텐데 말이죠…!`, }, "victory": { - 1: `You and your Pokémon… How hot your spirits burn! - $The all-consuming heat overwhelms. - $It's no surprise that my icy skills failed to harm you.`, + 1: `당신과… 당신 포켓몬들의 뜨거운 혼! + $정말로 압도적인 뜨거움이네요. + $내 얼음 기술로 피해를 주지 못한 것도 놀랍지 않을정도로요!`, }, "defeat": { - 1: "A fiercely passionate battle, indeed." + 1: "저런, 정말로 치열한 승부였네요." } }, "drake": { "encounter": { - 1: `For us to battle with Pokémon as partners, do you know what it takes? Do you know what is needed? - $If you don't, then you will never prevail over me!`, + 1: `파트너로 포켓몬과 함께하는 승부에 무엇이 필요한지 넌 알고 있는가? + $그걸 모른다면 넌 이 몸을 이길 수 없다!`, }, "victory": { - 1: "Superb, it should be said." + 1: "훌륭하다, 라고 할 만 하군!" }, "defeat": { - 1: "I gave my all for that battle!" + 1: "난 승부에서 최선을 다했으니까!" } }, "wallace": { "encounter": { - 1: `There's something about you… A difference in your demeanor. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, + 1: `뭐랄까, 너의 분위기가 조금 변한 것 같은… + $그런 느낌이 드는군. 자, 그럼 한번 확인해볼까? 너와 포켓몬의 힘을. + $그리고 확실하게 보여주도록 하지. 나와 포켓몬에 의한 물의 일루전을!`, }, "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, + 1: `훌륭하군. 넌 정말 굉장한 포켓몬 트레이너다. + $그런 너와 너의 포켓몬을 만나게 된 걸 기쁘게 생각해. 스스로 그 가치를 증명하다니!`, }, "defeat": { - 1: "A grand illusion!" + 1: "거대한 일루전이로군!" } }, "lorelei": { @@ -1350,37 +1350,37 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "malva": { "encounter": { - 1: `I feel like my heart might just burst into flames. - $I'm burning up with my hatred for you, runt!`, + 1: `심장이 불에 타버릴 것만 같아요. + $당신에 대한 증오로 불타고 있거든요, 얄미운 트레이너!`, }, "victory": { - 1: "What news… So a new challenger has defeated Malva!" + 1: "도전자가… 사천왕 파키라에게서 멋지게 승리를 쟁취했습니다!" }, "defeat": { - 1: "I am delighted! Yes, delighted that I could squash you beneath my heel." + 1: "기쁘네요! 당신을 짓밟을 수 있어서 말이죠!" } }, "hala": { "encounter": { - 1: "Old Hala is here to make you holler!" + 1: "그럼…진심을 담아서 진지한 할라로 임하겠다!" }, "victory": { - 1: "I could feel the power you gained on your journey." + 1: "네가 순례하면서 갖추게 된 강함을 느낄 수 있었다." }, "defeat": { - 1: "Haha! What a delightful battle!" + 1: "하하! 경쾌한 승부였구나!" } }, "molayne": { "encounter": { - 1: `I gave the captain position to my cousin Sophocles, but I'm confident in my ability. - $My strength is like that of a supernova!`, + 1: `사촌인 마마네에게 캡틴 자리는 줬지만, 아직 실력에는 자신 있어요. + $제 실력은 초신성처럼 빛나니까요!`, }, "victory": { - 1: "I certainly found an interesting Trainer to face!" + 1: "확실히 겨룰 흥미로운 트레이너를 찾았네요!" }, "defeat": { - 1: "Ahaha. What an interesting battle." + 1: "아하하. 흥미로운 배틀이었네요." } }, "rika": { @@ -1442,47 +1442,47 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "lenora": { "encounter": { - 1: "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!" + 1: "자 그럼 도전자여, 애정을 담아 키운 포켓몬으로 어떤 방식으로 싸우는지 연구해 보겠다!" }, "victory": { - 1: "My theory about you was correct. You're more than just talented… You're motivated! I salute you!" + 1: "너에 대한 내 가설이 맞았네. 재능만 있는 게 아니라… 대단한 녀석이구나! 너 반할것 같잖아!" }, "defeat": { - 1: "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!" + 1: "아 하 하! 패배했다면, 그 이유를 분석하고, 다음 승부에서 그 지식을 활용하도록!" } }, "siebold": { "encounter": { - 1: "As long as I am alive, I shall strive onward to seek the ultimate cuisine... and the strongest opponents in battle!" + 1: "살아가는 동안, 궁극적인 요리와 강력한 상대를 찾기 위해… 열과 성을 다할 것입니다!" }, "victory": { - 1: "I shall store my memory of you and your Pokémon forever away within my heart." + 1: "당신에 대한 기억을 제 가슴 속에 담아두겠습니다." }, "defeat": { - 1: `Our Pokémon battle was like food for my soul. It shall keep me going. - $That is how I will pay my respects to you for giving your all in battle!`, + 1: `우리의 포켓몬 배틀은 영혼의 양식과 같습니다. 그건 저를 계속 지탱할 거예요. + $이것이 제가 전투에서 모든 것을 바친 당신에게, 경의를 표하는 방법입니다!`, } }, "roxie": { "encounter": { - 1: "Get ready! I'm gonna knock some sense outta ya!" + 1: "간다! 너의 이성을 싹 날려줄 거야!!" }, "victory": { - 1: "Wild! Your reason's already more toxic than mine!" + 1: "굉-장해! 네 이성, 이미 나보다 TOXIC해버렸잖아!" }, "defeat": { - 1: "Hey, c'mon! Get serious! You gotta put more out there!" + 1: "헤이, 잠깐-! 좀 더 진지해져! 넌 더 날아가야한다구!" } }, "olivia": { "encounter": { - 1: "No introduction needed here. Time to battle me, Olivia!" + 1: "여기에 소개는 필요 없지. 자, 라이치님과 승부할 시간이다!" }, "victory": { - 1: "Really lovely… Both you and your Pokémon…" + 1: "정말 훌륭하군… 당신과 포켓몬 둘 다…" }, "defeat": { - 1: "Mmm-hmm." + 1: "흐-음." } }, "poppy": { @@ -1521,63 +1521,63 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "grimsley": { "encounter": { - 1: "The winner takes everything, and there's nothing left for the loser." + 1: "이긴 자가 모든 것을 갖고 패배한 자에겐 아무것도 남지 않는다." }, "victory": { - 1: "When one loses, they lose everything… The next thing I'll look for will be victory, too!" + 1: "누군가가 이기면 상대한 누군가가 진다… 난 다음 승리를 목표로 하겠어!" }, "defeat": { - 1: "If somebody wins, the person who fought against that person will lose." + 1: "누군가가 이기면, 그 사람과 싸운 사람은 지게 되는 것이지." } }, "caitlin": { "encounter": { - 1: `It's me who appeared when the flower opened up. You who have been waiting… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, + 1: `피어난 꽃에서 나타난 것은 나. 거기 있는 당신… + $강함과 상냥함을 함께 갖춘 포켓몬 트레이너인 것 같네. + $이 카틀레야가 대전 상대로 원하는 건 최고의 강함… + $너도 그 실력을 마음껏 펼쳐 봐!`, }, "victory": { - 1: "My Pokémon and I learned so much! I offer you my thanks." + 1: "대전을 통해서 저도 포켓몬도 성장합니다. 감사드립니다." }, "defeat": { - 1: "I aspire to claim victory with elegance and grace." + 1: "더욱 엘레강트하고 엑셀런트하게 승리를 쟁취하고 싶거든." } }, "diantha": { "encounter": { - 1: `Battling against you and your Pokémon, all of you brimming with hope for the future… - $Honestly, it just fills me up with energy I need to keep facing each new day! It does!`, + 1: `미래를 향한 희망으로 빛나는 당신과, 당신의 포켓몬을 상대로 승부하는 것… + $솔직히, 매일매일 새로운 날을 위해 필요한 에너지가 채워지는 것 같아요! 정말로요!`, }, "victory": { - 1: "Witnessing the noble spirits of you and your Pokémon in battle has really touched my heart…" + 1: "고귀한 영혼을 지닌 포켓몬과 트레이너의 모습에 격하게 마음이 흔들려서…" }, "defeat": { - 1: "Oh, fantastic! What did you think? My team was pretty cool, right?" + 1: "정말, 환상적이야! 어떻게 생각하시나요? 저의 포켓몬들, 꽤 멋있었죠?" } }, "wikstrom": { "encounter": { - 1: `Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! - $Let the battle begin! En garde!`, + 1: `잘 왔네, 젊은 도전자여! 이 몸은 사천왕 중 한 명인 강철의 남자 간피다! + $자 그럼 간다, 간다! 간닷!`, }, "victory": { - 1: "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!" + 1: "정말 영광이군! 자네의 포켓몬과 서로 신뢰하는 힘, 날 능가하는군!!" }, "defeat": { - 1: `What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! - $Winning against such a worthy opponent doth give my soul wings--thus do I soar!`, + 1: `이게 무슨 마법이지? 내 마음의 떨림이 멈추질 않는군! + $가치 있는 상대를 이기는 것은 영혼에 날개를 달아주는 것과 같지--그런 내가 비상하는 것일까!`, } }, "acerola": { "encounter": { - 1: "Battling is just plain fun! Come on, I can take you!" + 1: "포켓몬 배틀은 언제나 재미있지! 자, 내가 상대해줄게!" }, "victory": { - 1: "I'm… I'm speechless! How did you do it?!" + 1: "아세로라… 입이 딱 벌어졌어! 어떻게 해낸 거야?!" }, "defeat": { - 1: "Ehaha! What an amazing victory!" + 1: "후아~! 놀라운 승리네!" } }, "larry_elite": { @@ -1652,25 +1652,25 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "drasna": { "encounter": { - 1: `You must be a strong Trainer. Yes, quite strong indeed… - $That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!` + 1: `당신 강하시죠? 그것도 상당히 꽤 말이에요… + $어머 기뻐라! 그런 상대와 놀면 포켓몬들도 쑥쑥 크겠어요!` }, "victory": { - 1: "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!" + 1: "어머머 벌써 끝나버리다니… 미안해요, 괜찮으면 또 오세요!" }, "defeat": { - 1: "How can this be?" + 1: "어머, 웬일이야?" } }, "kahili": { "encounter": { - 1: "So, here you are… Why don't we see who the winds favor today, you… Or me?" + 1: "자, 여기에서… 승리의 바람이 부는 쪽은 당신과 저 중에 어느 쪽일까요?" }, "victory": { - 1: "It's frustrating to me as a member of the Elite Four, but it seems your strength is the real deal." + 1: "사천왕으로서 분하지만 당신들의 강함은 진정한 강함이군요." }, "defeat": { - 1: "That was an ace!" + 1: "이것이 에이스니까요!" } }, "hassel": { @@ -1742,17 +1742,17 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "steven": { "encounter": { - 1: `Tell me… What have you seen on your journey with your Pokémon? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, + 1: `넌… 포켓몬과 함께 모험을 하면서 무엇을 봤지? + $많은 트레이너와 만나면서 무엇을 느꼈지? + $풍요로운 이 지역을 돌아다니면서, 네 안에서 눈뜨기 시작한 무언가… + $그 모든 것을 나에게 쏟아부었으면 좋겠어. + $나와 내 포켓몬들도 전력을 다해 상대해줄 테니까!`, }, "victory": { - 1: "So I, the Champion, fall in defeat…" + 1: "챔피언인 내가 질 줄이야…" }, "defeat": { - 1: "That was time well spent! Thank you!" + 1: "덕분에 즐거웠어! 고마워!" } }, "cynthia": { @@ -1768,53 +1768,53 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "iris": { "encounter": { - 1: `Know what? I really look forward to having serious battles with strong Trainers! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, + 1: `나는 말이지, 강한 트레이너와의 진지한 승부를 즐겨! + $왜냐면 그렇잖아! 이곳에 오는 건 마음 깊이 승리를 추구하는 트레이너. + #함께 싸우는 건 수많은 승부를 헤쳐온 포켓몬. + $그런 상대와 겨룰 수 있다면 나도! 내 포켓몬도! + $더욱더 강해지고 서로 알 수 있으니까! 으응! 그럼 간다! + $포켓몬리그 챔피언 아이리스! 당신을 이기겠습니다!!`, }, "victory": { - 1: "Aghhhh… I did my best, but we lost…" + 1: "후와아아아… 힘을 모두 발휘했는데도 우리가 졌네." }, "defeat": { - 1: "Yay! We won!" + 1: "우와! 이겼다!" } }, "hau": { "encounter": { - 1: `I wonder if a Trainer battles differently depending on whether they're from a warm region or a cold region. - $Let's test it out!`, + 1: `트레이너가 따뜻한 지역 출신인지 추운 지역 출신인지에 따라 배틀 스타일이 달라지는지 궁금해졌어. + $그럼 테스트 해볼게~!`, }, "victory": { - 1: "That was awesome! I think I kinda understand your vibe a little better now!" + 1: "멋진데~! 이제 너의 스타일을 조금 더 잘 알게된 것 같아!" }, "defeat": { - 1: "Ma-an, that was some kinda battle!" + 1: "이런, 그건 그냥 승부였는데~!" } }, "geeta": { "encounter": { - 1: `I decided to throw my hat in the ring once more. - $Come now… Show me the fruits of your training.`, + 1: `그 도전장, 한 번 더 승낙하도록 하죠. + $자… 훈련의 결실을 보여주세요.`, }, "victory": { - 1: "I eagerly await news of all your achievements!" + 1: "당신이 이룰 업적에 대한 소식들, 기다리고 있겠습니다!" }, "defeat": { - 1: "What's the matter? This isn't all, is it?" + 1: "무슨 문제라도 있나요? 이게 전부라니, 그럴리 없잖아요?" } }, "nemona": { "encounter": { - 1: "Yesss! I'm so psyched! Time for us to let loose!" + 1: "만세! 나 너무 기대돼! 이제 전력으로 승부하는거야~!" }, "victory": { - 1: "Well, that stinks, but I still had fun! I'll getcha next time!" + 1: "우와, 조금 문제 있지만, 그래도 너무 재밌었어! 다음에는 지지 않을거야!" }, "defeat": { - 1: "Well, that was a great battle! Fruitful for sure." + 1: "우와, 너무 멋진 승부였어! 정말로 강하네." } }, "leon": { @@ -1924,13 +1924,13 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "olympia": { "encounter": { - 1: "An ancient custom deciding one's destiny. The battle begins!" + 1: "이 의식은 앞으로의 길을 정하는 것입니다. 포켓몬 승부를 시작해볼까요!" }, "victory": { - 1: "Create your own path. Let nothing get in your way. Your fate, your future." + 1: "당신이라면 별이라도 움직여서 가야 할 길을 만들어 낼 것 같습니다." }, "defeat": { - 1: "Our path is clear now." + 1: "우리의 길은 이제 분명해졌습니다." } }, "volkner": { @@ -1950,130 +1950,130 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "burgh": { "encounter": { - 1: `M'hm… If I win this battle, I feel like I can draw a picture unlike any before it. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` + 1: `으-음… 이번 배틀에서 이기면, 예전과는 다른 그림을 그릴 수 있을 것 같아. + $맞아! 난 승리 뮤즈의 목소리를 선명하게 들을 수 있거든. 그럼 승부다!`, + 2: `물론, 난 내 포켓몬을 자랑스럽게 생각하거든! + $자 그럼… 바로 승부할까!` }, "victory": { - 1: "Is it over? Has my muse abandoned me?", - 2: "Hmm… It's over! You're incredible!" + 1: "벌써 끝이라고? 뮤즈가 나를 버리고 떠나버렸나?", + 2: "아우… 져버렸네! 너 굉장히 강하잖아!" }, "defeat": { - 1: "Wow… It's beautiful somehow, isn't it…", - 2: `Sometimes I hear people say something was an ugly win. - $I think if you're trying your best, any win is beautiful.` + 1: "우와… 왠지 뭔가 아름답네, 그치…", + 2: `가끔 사람들이 못난 승리라고 말하는 걸 듣곤 해. + $그치만 난 최선을 다했다면, 어떤 승리든 아름답다고 생각하거든.` } }, "elesa": { "encounter": { - 1: `C'est fini! When I'm certain of that, I feel an electric jolt run through my body! - $I want to feel the sensation, so now my beloved Pokémon are going to make your head spin!`, + 1: `컴플리트…! 확신이 들때면, 내 몸을 통하는 전기가 짜릿짜릿하게 느껴져! + $그 감각을 느끼고 싶으니까…, 다음은 사랑스러운 포켓몬들로 너를 어질어질하게 할게!`, }, "victory": { - 1: "I meant to make your head spin, but you shocked me instead." + 1: "어질어질하게 만들 셈이였는데, 너한테는 짜릿짜릿하게 당해버렸네." }, "defeat": { - 1: "That was unsatisfying somehow… Will you give it your all next time?" + 1: "왠지 부족한 기분이야… 다음에는 최선을 다할 수 있지?" } }, "skyla": { "encounter": { - 1: `It's finally time for a showdown! That means the Pokémon battle that decides who's at the top, right? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, + 1: `드디어 대결의 시간이야! 누가 정상에 오를지 결정짓는 포켓몬 배틀, 그치? + $난 정상에 있는 게 좋아! 높은 곳에서는 항상 멀리 볼 수 있으니까! + $그럼, 다음은 나랑 더욱 즐거운 것을 할까?`, }, "victory": { - 1: "Being your opponent in battle is a new source of strength to me. Thank you!" + 1: "배틀에서 네 상대가 되는 거, 뭔가 새로운 모티브가 되네. 고마워!" }, "defeat": { - 1: "Win or lose, you always gain something from a battle, right?" + 1: "이기든 지든, 항상 무언가를 얻게 돼, 그치?" } }, "brycen": { "encounter": { - 1: `There is also strength in being with other people and Pokémon. - $Receiving their support makes you stronger. I'll show you this power!`, + 1: `다른사람이나 포켓몬과 함께 있을 때도 힘이 생긴다. + $그 도움을 받는 것이 너를 강하게 만들었겠지. 그 힘을 보이거라!`, }, "victory": { - 1: "The wonderful combination of you and your Pokémon! What a beautiful friendship!" + 1: "너와 포켓몬과! 멋진 콤비네이션! 아름다운 우정!" }, "defeat": { - 1: "Extreme conditions really test you and train you!" + 1: "극한에서 시험받고 단련하도록!" } }, "drayden": { "encounter": { - 1: `What I want to find is a young Trainer who can show me a bright future. - $Let's battle with everything we have: your skill, my experience, and the love we've raised our Pokémon with!`, + 1: `지금 찾는 것은 밝은 미래를 보여줄 젋은 트레이너의 존재. + $승부에서 모든 걸 보이도록. 네 기술, 내 경험, 그리고 포켓몬을 키워온 사랑도 함께!`, }, "victory": { - 1: "This intense feeling that floods me after a defeat… I don't know how to describe it." + 1: "패배하여 끓어오르는 이 마음… 뭐라고 표현해야 좋을까." }, "defeat": { - 1: "Harrumph! I know your ability is greater than that!" + 1: "실망스럽군! 난 자네의 능력이 그보다 더 크다는 걸 알고있네!" } }, "grant": { "encounter": { - 1: `There is only one thing I wish for. - $That by surpassing one another, we find a way to even greater heights.`, + 1: `제가 바라는 것은 단 하나뿐입니다. + $서로가 서로를 뛰어넘어, 더 높은 벽에 도달하는 것입니다.`, }, "victory": { - 1: "You are a wall that I am unable to surmount!" + 1: "내 앞에 솟아 있는 높은 벽… 그건 바로 당신입니다." }, "defeat": { - 1: `Do not give up. - $That is all there really is to it. - $The most important lessons in life are simple.`, + 1: `인생에서 중요한 교훈은 간단합니다. + $포기하지 않는 것. + $이것이 전부입니다.`, } }, "korrina": { "encounter": { - 1: "Time for Lady Korrina's big appearance!" + 1: "코르니 납시오!" }, "victory": { - 1: "It's your very being that allows your Pokémon to evolve!" + 1: "네 존재가 너의 포켓몬을 점점 진화시키고 있어!" }, "defeat": { - 1: "What an explosive battle!" + 1: "정말 멋진 배틀이었어!" } }, "clemont": { "encounter": { - 1: "Oh! I'm glad that we got to meet!" + 1: "아앗! 잘 부탁드립니다!" }, "victory": { - 1: "Your passion for battle inspires me!" + 1: "당신들의 승부를 향한 마음에 자극을 받았습니다!" }, "defeat": { - 1: "Looks like my Trainer-Grow-Stronger Machine, Mach 2 is really working!" + 1: "저의 슈퍼트레이닝 발명품이 효과가 있는 것 같군요!" } }, "valerie": { "encounter": { - 1: `Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, + 1: `어라,트레이너님… 슝슝 워프해서… 이렇게 만나서 반갑네. + $그리고 내가 보기엔 당신은 노력했기에, 이 승부에 참가할 수 있게 된 것 같아. + $찾기 힘든 요정 같은 페어리 타입, 우리 포켓몬들 사뿐하고 화사하지만 강하다구.`, }, "victory": { - 1: "I hope that you will find things worth smiling about tomorrow…" + 1: "난 당신이 내일을 생각하며 웃을 수 있는 것들을 찾길 바라고 있을게…" }, "defeat": { - 1: "Oh goodness, what a pity…" + 1: "앗 이런, 가엾어라…" } }, "wulfric": { "encounter": { - 1: `You know what? We all talk big about what you learn from battling and bonds and all that… - $But really, I just do it 'cause it's fun. - $Who cares about the grandstanding? Let's get to battling!`, + 1: `그거 알아? 그거… 전투와 유대감을 통해 배운다거나 하는… 거 뭐더라, 음. + $여튼 말이지, 난 그냥 재밌어서 하는 거야. + $내 자랑은 별로 듣고 싶지 않으려나? 자, 포켓몬을 꺼내자!`, }, "victory": { - 1: "Outstanding! I'm tough as an iceberg, but you smashed me through and through!" + 1: "그거야, 바로 그거! 멋지다고. 단단한 얼음을 깨부쉈구나!" }, "defeat": { - 1: "Tussle with me and this is what happens!" + 1: "나와 싸우면 그런 일이 벌어진다니까!" } }, "kabu": { diff --git a/src/locales/ko/egg.ts b/src/locales/ko/egg.ts index 3c2d1447c44..7b10b548bc4 100644 --- a/src/locales/ko/egg.ts +++ b/src/locales/ko/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "바우처가 충분하지 않습니다!", "tooManyEggs": "알을 너무 많이 갖고 있습니다!", "pull": "뽑기", - "pulls": "뽑기" + "pulls": "뽑기", + "sameSpeciesEgg": "{{species}}[[가]] 이 알에서 부화할 거야!", + "hatchFromTheEgg": "알이 부화해서\n{{pokemonName}}[[가]] 태어났다!", + "eggMoveUnlock": "알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", + "rareEggMoveUnlock": "레어 알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", + "moveUPGacha": "알 기술 UP!", + "shinyUPGacha": "색이 다른 포켓몬\nUP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/ko/game-mode.ts b/src/locales/ko/game-mode.ts index e85a9bb232b..423f2adb26a 100644 --- a/src/locales/ko/game-mode.ts +++ b/src/locales/ko/game-mode.ts @@ -2,8 +2,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "클래식", - "endless": "엔들리스", - "endlessSpliced": "엔들리스(융합체)", + "endless": "엔드리스", + "endlessSpliced": "엔드리스(융합체)", "dailyRun": "데일리 런", "unknown": "언노운", "challenge": "챌린지", diff --git a/src/locales/ko/menu-ui-handler.ts b/src/locales/ko/menu-ui-handler.ts index e7bb1477cdd..b62ff2247e3 100644 --- a/src/locales/ko/menu-ui-handler.ts +++ b/src/locales/ko/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Link Google", "unlinkGoogle": "Unlink Google", "cancel": "취소", - "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?" + "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?", + "noEggs": "부화중인 알이 없습니다!" } as const; diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.ts index bdcf621a5e8..945f4e711f8 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "no":"아니오", "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", + "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 a0bae4ea703..4df6a397fa0 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}}민트", @@ -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,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "성스러운분말" }, - "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 쓰러지려 할 때 HP를 절반 회복한다." }, + "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 공격을 받고 쓰러지려 할 때 HP를 절반 회복한다." }, "ETHER": { name: "PP에이드" }, "MAX_ETHER": { name: "PP회복" }, @@ -182,7 +182,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "평온의방울" }, - "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다 (합연산)." }, + "EVIOLITE": { name: "진화의휘석", description: "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." }, + + "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다. (합연산)" }, "NUGGET": { name: "금구슬" }, "BIG_NUGGET": { name: "큰금구슬" }, @@ -199,14 +201,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% 추가된다." }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "버티기 토큰" }, "ENEMY_FUSED_CHANCE": { name: "합체 토큰", description: "야생 포켓몬이 합체되어 등장할 확률이 1% 추가된다." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "전기구슬", description: "피카츄에게 지니게 하면 공격과 특수공격이 올라가는 이상한 구슬." }, + "THICK_CLUB": { name: "굵은뼈", description: "무언가의 단단한 뼈. 탕구리 혹은 텅구리에게 지니게 하면 공격이 올라간다." }, + "METAL_POWDER": { name: "금속파우더", description: "메타몽에게 지니게 하면 방어가 올라가는 이상한 가루. 매우 잘고 단단하다." }, + "QUICK_POWDER": { name: "스피드파우더", description: "메타몽에게 지니게 하면 스피드가 올라가는 이상한 가루. 매우 잘고 단단하다." } + }, TempBattleStatBoosterItem: { "x_attack": "플러스파워", "x_defense": "디펜드업", diff --git a/src/locales/ko/modifier.ts b/src/locales/ko/modifier.ts new file mode 100644 index 00000000000..c61d2b3def0 --- /dev/null +++ b/src/locales/ko/modifier.ts @@ -0,0 +1,12 @@ +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정신을 차려 싸울 수 있게 되었다!", + "moneyInterestApply": "{{typeName}}[[로]]부터\n₽{{moneyAmount}}[[를]] 받았다!", + "turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!", + "contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}의\n체력이 약간 회복되었다!", +} as const; diff --git a/src/locales/ko/move.ts b/src/locales/ko/move.ts index ae1bbf088e3..3781725bc6f 100644 --- a/src/locales/ko/move.ts +++ b/src/locales/ko/move.ts @@ -2937,7 +2937,7 @@ export const move: MoveTranslationEntries = { }, bouncyBubble: { name: "생생버블", - effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 데미지의 절만큼 HP를 회복한다." + effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 준 데미지만큼 HP를 회복한다." }, buzzyBuzz: { name: "찌릿찌릿일렉", diff --git a/src/locales/ko/party-ui-handler.ts b/src/locales/ko/party-ui-handler.ts index 15a42ae0521..f0075809345 100644 --- a/src/locales/ko/party-ui-handler.ts +++ b/src/locales/ko/party-ui-handler.ts @@ -6,5 +6,48 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "그만둔다", "RELEASE": "놓아준다", "APPLY": "사용한다", - "TEACH": "가르친다" + "TEACH": "가르친다", + "SPLICE": "융합", + "UNSPLICE": "융합 해제", + "ACTIVATE": "발동", + "DEACTIVATE": "해제", + "TRANSFER": "건넨다", + "ALL": "전부", + "PASS_BATON": "배턴터치한다", + "UNPAUSE_EVOLUTION": "진화 재개", + "REVIVE": "되살린다", + + "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-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/settings.ts b/src/locales/ko/settings.ts index 28fe99f265f..6514683cd94 100644 --- a/src/locales/ko/settings.ts +++ b/src/locales/ko/settings.ts @@ -36,7 +36,7 @@ export const settings: SimpleTranslationEntries = { "legacy": "레거시", "windowType": "윈도우 타입", "moneyFormat": "소지금 표시", - "damageNumbers": "대미지 숫자 표시", + "damageNumbers": "데미지 숫자 표시", "simple": "심플", "fancy": "팬시", "abbreviated": "축약", @@ -84,7 +84,7 @@ export const settings: SimpleTranslationEntries = { "buttonCancel": "취소", "buttonStats": "스탯", "buttonCycleForm": "폼 변환", - "buttonCycleShiny": "특별한 색 변환", + "buttonCycleShiny": "색이 다른 변환", "buttonCycleGender": "성별 변환", "buttonCycleAbility": "특성 변환", "buttonCycleNature": "성격 변환", @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (대체)", "mute": "음소거", "controller": "컨트롤러", - "gamepadSupport": "게임패드 지원" + "gamepadSupport": "게임패드 지원", + "showBgmBar": "BGM 제목 보여주기", } as const; diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index ab155a4a048..d7f8ddbe3ed 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -6,7 +6,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"이 포켓몬들로 시작하시겠습니까?", + "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", "gen1": "1세대", "gen2": "2세대", "gen3": "3세대", @@ -21,16 +21,18 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "패시브:", "nature": "성격:", "eggMoves": "알 기술", - "start": "시작", "addToParty": "파티에 추가", "toggleIVs": "개체값 토글", "manageMoves": "기술 관리", + "manageNature": "성격 관리", "useCandies": "사탕 사용", + "selectNature": "교체할 성격을 선택해주세요.", "selectMoveSwapOut": "교체할 기술을 선택해주세요.", "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", - "cycleShiny": ": 특별한 색", + "sameSpeciesEgg": "알 구매하기", + "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/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 766243c7d7e..11cbaed182d 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -1,10 +1,13 @@ 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!", - "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", + "costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!", "perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", - "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!" + "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", + "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", + "quickDraw": "{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", } as const; diff --git a/src/locales/pt_BR/ability.ts b/src/locales/pt_BR/ability.ts index 05592f3fe1e..2dd4550aabd 100644 --- a/src/locales/pt_BR/ability.ts +++ b/src/locales/pt_BR/ability.ts @@ -331,7 +331,7 @@ export const ability: AbilityTranslationEntries = { }, angerPoint: { name: "Anger Point", - description: "Quando recebe um golpe crítico se enraivece, e com isso, aumenta seu Ataque.", + description: "Quando recebe um acerto crítico se enraivece, e com isso, aumenta seu Ataque.", }, unburden: { name: "Unburden", diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index e7a3adf4b31..8c97d2be6de 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -14,17 +14,21 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "Quer trocar\nde {{pokemonName}}?", "trainerDefeated": "Você derrotou\n{{trainerName}}!", "moneyWon": "Você ganhou\n₽{{moneyAmount}} por ganhar!", + "moneyPickedUp": "Você pegou ₽{{moneyAmount}} do chão!", "pokemonCaught": "{{pokemonName}} foi capturado!", + "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", "partyFull": "Sua equipe está cheia.\nSolte um Pokémon para ter espaço para {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}}, eu escolho você!!", - "hitResultCriticalHit": "Um golpe crítico!", + "hitResultCriticalHit": "Foi um acerto crítico!", "hitResultSuperEffective": "É supereficaz!", "hitResultNotVeryEffective": "É pouco eficaz...", "hitResultNoEffect": "Isso não afeta {{pokemonName}}!", "hitResultOneHitKO": "Foi um nocaute de um golpe!", "attackFailed": "Mas falhou!", + "attackMissed": "{{pokemonNameWithAffix}} desviou do ataque!", "attackHitsCount": "Acertou {{count}} vezes.", + "rewardGain": "Você recebeu\n{{modifierName}}!", "expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.", "levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!", "learnMove": "{{pokemonName}} aprendeu {{moveName}}!", @@ -53,6 +57,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "trocar", "escapeVerbFlee": "fugir", "notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!", + "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", + "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", "skipItemQuestion": "Tem certeza de que não quer escolher um item?", "eggHatching": "Opa?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", @@ -61,71 +67,72 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", "fainted": "{{pokemonNameWithAffix}} desmaiou!", - "statRose": "aumentou", - "statSharplyRose": "aumentou bruscamente", - "statRoseDrastically": "aumentou drasticamente", - "statWontGoAnyHigher": "não vai mais aumentar", - "statFell": "diminuiu", - "statHarshlyFell": "diminuiu duramente", - "statSeverelyFell": "diminuiu severamente", - "statWontGoAnyLower": "não vai mais diminuir", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", - "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", - "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" + "statRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", + "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", + "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", + "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", + "statFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", + "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", + "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", + "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", + "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} hesitou!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!", + "battlerTagsConfusedLapseHurtItself": "Se machucou em sua\nconfusão!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} foi semeado!", + "battlerTagsSeededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!", + "battlerTagsSeededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} ganhou\num Encore!", + "battlerTagsEncoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!", + "battlerTagsAquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!", + "battlerTagsHighestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!", + "battlerTagsHighestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!" } as const; diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts new file mode 100644 index 00000000000..87d90dabc9d --- /dev/null +++ b/src/locales/pt_BR/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/pt_BR/biome.ts b/src/locales/pt_BR/biome.ts index 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/challenges.ts b/src/locales/pt_BR/challenges.ts index 98731fe890b..7c991189bc8 100644 --- a/src/locales/pt_BR/challenges.ts +++ b/src/locales/pt_BR/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Desafios", - "start": "Iniciar", "illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!", - "singleGeneration.name": "Geração Única", - "singleGeneration.value.0": "Desligado", - "singleGeneration.desc.0": "Você só pode user Pokémon de uma única geração.", - "singleGeneration.value.1": "Geração 1", - "singleGeneration.desc.1": "Você só pode user Pokémon da primeira geração.", - "singleGeneration.value.2": "Geração 2", - "singleGeneration.desc.2": "Você só pode user Pokémon da segunda geração.", - "singleGeneration.value.3": "Geração 3", - "singleGeneration.desc.3": "Você só pode user Pokémon da terceira geração.", - "singleGeneration.value.4": "Geração 4", - "singleGeneration.desc.4": "Você só pode user Pokémon da quarta geração.", - "singleGeneration.value.5": "Geração 5", - "singleGeneration.desc.5": "Você só pode user Pokémon da quinta geração.", - "singleGeneration.value.6": "Geração 6", - "singleGeneration.desc.6": "Você só pode user Pokémon da sexta geração.", - "singleGeneration.value.7": "Geração 7", - "singleGeneration.desc.7": "Você só pode user Pokémon da sétima geração.", - "singleGeneration.value.8": "Geração 8", - "singleGeneration.desc.8": "Você só pode user Pokémon da oitava geração.", - "singleGeneration.value.9": "Geração 9", - "singleGeneration.desc.9": "Você só pode user Pokémon da nona geração.", - "singleType.name": "Tipo Único", - "singleType.value.0": "Desligado", - "singleType.desc.0": "Você só pode user Pokémon de um único tipo.", - "singleType.value.1": "Normal", - "singleType.desc.1": "Você só pode user Pokémon do tipo Normal.", - "singleType.value.2": "Lutador", - "singleType.desc.2": "Você só pode user Pokémon do tipo Lutador.", - "singleType.value.3": "Voador", - "singleType.desc.3": "Você só pode user Pokémon do tipo Voador.", - "singleType.value.4": "Veneno", - "singleType.desc.4": "Você só pode user Pokémon do tipo Veneno.", - "singleType.value.5": "Terra", - "singleType.desc.5": "Você só pode user Pokémon do tipo Terra.", - "singleType.value.6": "Pedra", - "singleType.desc.6": "Você só pode user Pokémon do tipo Pedra.", - "singleType.value.7": "Inseto", - "singleType.desc.7": "Você só pode user Pokémon do tipo Inseto.", - "singleType.value.8": "Fantasma", - "singleType.desc.8": "Você só pode user Pokémon do tipo Fantasma.", - "singleType.value.9": "Aço", - "singleType.desc.9": "Você só pode user Pokémon do tipo Aço.", - "singleType.value.10": "Fogo", - "singleType.desc.10": "Você só pode user Pokémon do tipo Fogo.", - "singleType.value.11": "Água", - "singleType.desc.11": "Você só pode user Pokémon do tipo Água.", - "singleType.value.12": "Grama", - "singleType.desc.12": "Você só pode user Pokémon do tipo Grama.", - "singleType.value.13": "Elétrico", - "singleType.desc.13": "Você só pode user Pokémon do tipo Elétrico.", - "singleType.value.14": "Psíquico", - "singleType.desc.14": "Você só pode user Pokémon do tipo Psíquico.", - "singleType.value.15": "Gelo", - "singleType.desc.15": "Você só pode user Pokémon do tipo Gelo.", - "singleType.value.16": "Dragão", - "singleType.desc.16": "Você só pode user Pokémon do tipo Dragão.", - "singleType.value.17": "Sombrio", - "singleType.desc.17": "Você só pode user Pokémon do tipo Sombrio.", - "singleType.value.18": "Fada", - "singleType.desc.18": "Você só pode user Pokémon do tipo Fada.", + "singleGeneration": { + "name": "Geração Única", + "desc": "Você só pode user Pokémon da {{gen}} geração.", + "desc_default": "Você só pode user Pokémon de uma única geração.", + "gen_1": "primeira", + "gen_2": "segunda", + "gen_3": "terceira", + "gen_4": "quarta", + "gen_5": "quinta", + "gen_6": "sexta", + "gen_7": "sétima", + "gen_8": "oitava", + "gen_9": "nona", + }, + "singleType": { + "name": "Monotipo", + "desc": "Você só pode user Pokémon do tipo {{type}}.", + "desc_default": "Você só pode user Pokémon de um único tipo." + }, } as const; diff --git a/src/locales/pt_BR/common.ts b/src/locales/pt_BR/common.ts new file mode 100644 index 00000000000..7161f5c9966 --- /dev/null +++ b/src/locales/pt_BR/common.ts @@ -0,0 +1,10 @@ +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 8d34c1539ef..c02da112770 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/pt_BR/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const ptBrConfig = { ability: ability, @@ -47,9 +52,11 @@ export const ptBrConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,15 +74,17 @@ export const ptBrConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, - partyUiHandler: partyUiHandler, pokeball: pokeball, pokemon: pokemon, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + statusEffect: statusEffect, + terrain: terrain, settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, @@ -84,5 +93,7 @@ export const ptBrConfig = { trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, - weather: weather + weather: weather, + partyUiHandler: partyUiHandler, + modifierSelectUiHandler: modifierSelectUiHandler }; diff --git a/src/locales/pt_BR/dialogue.ts b/src/locales/pt_BR/dialogue.ts index a566192fef5..3325cf81cf9 100644 --- a/src/locales/pt_BR/dialogue.ts +++ b/src/locales/pt_BR/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Estou achando que quem tá enjoado sou eu..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Se prepara pra encrenca!" + }, + "victory": { + 1: "Equipe Rocket decolando de novo!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "Se você se meter com a Equipe Magma, não teremos piedade!" + }, + "victory": { + 1: "Ahn? Eu perdi?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Não pegamos leve com quem se mete com a Equipe Aqua, nem mesmo crianças!" + }, + "victory": { + 1: "Tá de brincadeira!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Não mexe com a Equipe Galáctica!" + }, + "victory": { + 1: "Fui amassado..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Não toleramos pessoas que pensam diferente de nós!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "A moda é a coisa mais importante pra gente!" + }, + "victory": { + 1: "O futuro não parece brilhante pra mim." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Tenho que admitir, estou impressionado que tenha chegado até aqui!" + }, + "victory": { + 1: "QUÊ! Isso não é possível!" + }, + "defeat": { + 1: "Guarde minhas palavras.\nNão ser capaz de medir sua própria força mostra que você ainda é uma criança." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Meus antigos associados precisam de mim... Você vai ficar no meu caminho?" + }, + "victory": { + 1: "Como isso é possível...?\nO precioso sonho da Equipe Rocket se tornou pouco mais que uma ilusão..." + }, + "defeat": { + 1: "A Equipe Rocket renascerá, e eu dominarei o mundo!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Eu vou te enterrar com minhas próprias mãos.\nEspero que você aprecie essa honra!" + }, + "victory": { + 1: "Ugh! Você é... bastante capaz...\nEu fiquei para trás, mas apenas por um triz..." + }, + "defeat": { + 1: "A Equipe Magma vai prevalecer!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "Você é o último obstáculo entre mim e meus objetivos.\nPrepare-se para meu ataque final! Fuhahaha!" + }, + "victory": { + 1: "Isso... Isso não é... Ngh..." + }, + "defeat": { + 1: "E agora... Eu transformarei este planeta em uma terra ideal para a humanidade." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Eu sou o líder da Equipe Aqua, então temo que esse seja o fim da linha para você." + }, + "victory": { + 1: "Vamos nos encontrar de novo em algum lugar. Eu vou ter certeza de lembrar desse rosto." + }, + "defeat": { + 1: "Brilhante! Nada vai parar minha equipe agora!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Estive esperando tanto tempo por este dia.\nEste é o verdadeiro poder da minha equipe!" + }, + "victory": { + 1: "Como eu suspeitava..." + }, + "defeat": { + 1: "Eu vou voltar tudo neste mundo ao seu estado puro e original!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Você foi compelido a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!" + }, + "victory": { + 1: "Interessante. E bastante curioso." + }, + "defeat": { + 1: "Eu criarei meu novo mundo..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nos encontramos novamente. Parece que nossos destinos estão entrelaçados.\nMas aqui e agora, eu finalmente quebrarei esse vínculo!" + }, + "victory": { + 1: "Como? Como? COMO?!" + }, + "defeat": { + 1: "Até logo." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Ninguém pode me deter! Não importa quem seja ou o que faça!" + }, + "victory": { + 1: "Como isso é possível? Eu sou o criador da Equipe Plasma! Eu sou perfeito!" + }, + "defeat": { + 1: "Eu sou o governante perfeito de um novo mundo perfeito! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Vamos! Eu quero ver sua cara depois que você perder toda a esperança!" + }, + "victory": { + 1: "Meus cálculos... Não! Meus planos cuidadosos! O mundo deveria ser meu!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Você está aqui para me deter? Mostre-me em batalha." + }, + "victory": { + 1: "Você está aqui para me deter. Mas eu peço que você espere." + }, + "defeat": { + 1: "Pokémon... não devem mais existir." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "O futuro que você quer, ou o futuro que eu quero... Vamos ver qual é o mais merecedor, não é mesmo?" + }, + "victory": { + 1: "Uau!" + }, + "defeat": { + 1: "Tolos sem visão continuarão a poluir este belo mundo." + } + }, "brock": { "encounter": { 1: "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", @@ -4669,6 +4849,8 @@ export const PGMmiscDialogue: SimpleTranslationEntries = { $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, + "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", + "ending_name": "Desenvolvedores" }; // Diálogo que não se enquadra em nenhuma outra categoria (por exemplo, mensagens de tutorial ou o final do jogo). Para quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMmiscDialogue. @@ -4689,6 +4871,8 @@ export const PGFmiscDialogue: SimpleTranslationEntries = { $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, + "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", + "ending_name": "Desenvolvedores" }; diff --git a/src/locales/pt_BR/egg.ts b/src/locales/pt_BR/egg.ts index 112e5c61240..fbd13bed4e3 100644 --- a/src/locales/pt_BR/egg.ts +++ b/src/locales/pt_BR/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Você não tem vouchers suficientes!", "tooManyEggs": "Você já tem muitos ovos!", "pull": "Prêmio", - "pulls": "Prêmios" + "pulls": "Prêmios", + "sameSpeciesEgg": "{{species}} vai rachar desse ovo!", + "hatchFromTheEgg": "{{pokemonName}} nasceu do ovo!", + "eggMoveUnlock": "Movimento de Ovo desbloqueado: {{moveName}}", + "rareEggMoveUnlock": "Movimento Raro de Ovo desbloqueado: {{moveName}}", + "moveUPGacha": "Movimento\nde Ovo Bônus!", + "shinyUPGacha": "Shiny Bônus!", + "legendaryUPGacha": "Bônus!", } as const; diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.ts index e1592a4e332..b874df7e23b 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Conectar Google", "unlinkGoogle": "Desconectar Google", "cancel": "Cancelar", - "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?" + "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?", + "noEggs": "Você não está chocando\nnenhum ovo no momento!" } as const; diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index 39ac38b6ae1..aca16b6b511 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -53,5 +53,6 @@ export const menu: SimpleTranslationEntries = { "yes": "Sim", "no": "Não", "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." + "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.", + "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 b63d237a4ee..408d2757f9b 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -4,11 +4,11 @@ export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { "AddPokeballModifierType": { name: "{{modifierCount}}x {{pokeballName}}", - description: "Ganhe x{{modifierCount}} {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", + description: "Ganhe {{modifierCount}}x {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", }, "AddVoucherModifierType": { name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Ganhe x{{modifierCount}} {{voucherTypeName}}.", + description: "Ganhe {{modifierCount}}x {{voucherTypeName}}.", }, "PokemonHeldItemModifierType": { extra: { @@ -151,7 +151,7 @@ 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." }, "ETHER": { name: "Éter" }, "MAX_ETHER": { name: "Éter Máximo" }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Guizo" }, + "EVIOLITE": { name: "Eviolita", description: "Esse misterioso caroço evolutivo aumenta os atributos de Defesa e Def. Esp. quando segurado por um Pokémon que ainda pode evoluir." }, + "SOUL_DEW": { name: "Joia da Alma", description: "Aumenta a influência da natureza de um Pokémon em seus atributos em 10% (cumulativo)." }, "NUGGET": { name: "Pepita" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Token de Persistência" }, "ENEMY_FUSED_CHANCE": { name: "Token de Fusão", description: "Adiciona uma chance de 1% de que um Pokémon selvagem seja uma fusão." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Bola de Luz", description: "Orbe intrigante que aumenta os atributos de Ataque e Ataque Esp. de Pikachu." }, + "THICK_CLUB": { name: "Osso Grosso", description: "Este duro osso de origem desconhecida aumenta o atributo de Ataque de Cubone ou Marowak." }, + "METAL_POWDER": { name: "Pó Metálico", description: "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Defesa de Ditto." }, + "QUICK_POWDER": { name: "Pó Veloz", description: "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Velocidade de Ditto." } + }, TempBattleStatBoosterItem: { "x_attack": "Ataque X", "x_defense": "Defesa X", @@ -402,7 +410,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "CrioDisco", "DOUSE_DRIVE": "HidroDisco", - "FIST_PLATE": "Placa de Punho", + "FIST_PLATE": "Placa do Punho", "SKY_PLATE": "Placa do Céu", "TOXIC_PLATE": "Placa Tóxica", "EARTH_PLATE": "Placa Terrestre", @@ -412,15 +420,15 @@ export const modifierType: ModifierTypeTranslationEntries = { "IRON_PLATE": "Placa de Ferro", "FLAME_PLATE": "Placa da Chama", "SPLASH_PLATE": "Placa de Respingo", - "MEADOW_PLATE": "Placa de Prado", + "MEADOW_PLATE": "Placa da Planície", "ZAP_PLATE": "Placa Elétrica", "MIND_PLATE": "Placa Mental", "ICICLE_PLATE": "Placa de Gelo", - "DRACO_PLATE": "Placa de Draco", - "DREAD_PLATE": "Placa do Pavor", - "PIXIE_PLATE": "Placa Duende", + "DRACO_PLATE": "Placa do Dragão", + "DREAD_PLATE": "Placa Sombria", + "PIXIE_PLATE": "Placa de Fada", "BLANK_PLATE": "Placa em Branco", - "LEGEND_PLATE": "Placa de Legenda", + "LEGEND_PLATE": "Placa Lendária", "FIGHTING_MEMORY": "Memória de Lutador", "FLYING_MEMORY": "Memória Voadora", "POISON_MEMORY": "Memória Venenosa", @@ -436,7 +444,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "PSYCHIC_MEMORY": "Memória Psíquica", "ICE_MEMORY": "Memória de Gelo", "DRAGON_MEMORY": "Memória do Dragão", - "DARK_MEMORY": "Memória Negra", + "DARK_MEMORY": "Memória Sombria", "FAIRY_MEMORY": "Memória de Fada", "BLANK_MEMORY": "Memória Vazia", }, diff --git a/src/locales/pt_BR/modifier.ts b/src/locales/pt_BR/modifier.ts new file mode 100644 index 00000000000..7cc90df5caa --- /dev/null +++ b/src/locales/pt_BR/modifier.ts @@ -0,0 +1,12 @@ +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}}!", + "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!", +} as const; diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index 233ec62fa06..0008cc55416 100644 --- a/src/locales/pt_BR/move.ts +++ b/src/locales/pt_BR/move.ts @@ -2095,7 +2095,7 @@ export const move: MoveTranslationEntries = { }, "frostBreath": { name: "Frost Breath", - effect: "O usuário sopra sua respiração gelada no alvo. Esse ataque sempre resulta em um golpe crítico." + effect: "O usuário sopra sua respiração gelada no alvo. Esse ataque sempre resulta em um acerto crítico." }, "dragonTail": { name: "Dragon Tail", @@ -2219,7 +2219,7 @@ export const move: MoveTranslationEntries = { }, "snarl": { name: "Snarl", - effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo a Defesa Especial do Pokémon oponente." + effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo o Ataque Especial do Pokémon oponente." }, "icicleCrash": { name: "Icicle Crash", @@ -2691,7 +2691,7 @@ export const move: MoveTranslationEntries = { }, "laserFocus": { name: "Laser Focus", - effect: "O usuário se concentra intensamente. O ataque no próximo turno sempre resultará em um golpe crítico." + effect: "O usuário se concentra intensamente. O ataque no próximo turno sempre resultará em um acerto crítico." }, "gearUp": { name: "Gear Up", @@ -3267,11 +3267,11 @@ export const move: MoveTranslationEntries = { }, wickedBlow: { name: "Wicked Blow", - effect: "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um golpe crítico." + effect: "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um acerto crítico." }, surgingStrikes: { name: "Surging Strikes", - effect: "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Este ataque sempre resulta em um golpe crítico." + effect: "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Estes ataques sempre resultam em acertos críticos." }, thunderCage: { name: "Thunder Cage", @@ -3359,7 +3359,7 @@ export const move: MoveTranslationEntries = { }, esperWing: { name: "Esper Wing", - effect: "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um golpe crítico." + effect: "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um acerto crítico." }, bitterMalice: { name: "Bitter Malice", @@ -3371,7 +3371,7 @@ export const move: MoveTranslationEntries = { }, tripleArrows: { name: "Triple Arrows", - effect: "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um golpe crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." + effect: "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um acerto crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." }, infernalParade: { name: "Infernal Parade", @@ -3611,7 +3611,7 @@ export const move: MoveTranslationEntries = { }, "flowerTrick": { name: "Flower Trick", - effect: "O usuário lança um buquê de flores armado no alvo. Este ataque nunca erra e sempre resulta em um golpe crítico." + effect: "O usuário lança um buquê de flores armado no alvo. Este ataque nunca erra e sempre resulta em um acerto crítico." }, "torchSong": { name: "Torch Song", @@ -3711,7 +3711,7 @@ export const move: MoveTranslationEntries = { }, "aquaCutter": { name: "Aqua Cutter", - effect: "O usuário expele água pressurizada para cortar o alvo como uma lâmina. Este movimento tem uma chance aumentada de resultar em um golpe crítico." + effect: "O usuário expele água pressurizada para cortar o alvo como uma lâmina. Este movimento tem uma chance aumentada de resultar em um acerto crítico." }, "blazingTorque": { name: "Blazing Torque", @@ -3747,7 +3747,7 @@ export const move: MoveTranslationEntries = { }, "ivyCudgel": { name: "Ivy Cudgel", - effect: "O usuário golpeia com um porrete envolto em hera. O tipo deste movimento muda dependendo da máscara usada pelo usuário, e tem uma chance aumentada de resultar em um golpe crítico." + effect: "O usuário golpeia com um porrete envolto em hera. O tipo deste movimento muda dependendo da máscara usada pelo usuário, e tem uma chance aumentada de resultar em um acerto crítico." }, "electroShot": { name: "Electro Shot", diff --git a/src/locales/pt_BR/nature.ts b/src/locales/pt_BR/nature.ts index 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..aac9e56aefa 100644 --- a/src/locales/pt_BR/party-ui-handler.ts +++ b/src/locales/pt_BR/party-ui-handler.ts @@ -7,4 +7,47 @@ 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", + + "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-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/settings.ts b/src/locales/pt_BR/settings.ts index f094e64d495..9d336cf0757 100644 --- a/src/locales/pt_BR/settings.ts +++ b/src/locales/pt_BR/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mudo", "controller": "Controle", - "gamepadSupport": "Suporte para Controle" + "gamepadSupport": "Suporte para Controle", + "showBgmBar": "Show Music Names", } 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 64a2ceff7c3..eb2709a0da8 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passiva:", "nature": "Natureza:", "eggMoves": "Mov. de Ovo", - "start": "Iniciar", "addToParty": "Adicionar à equipe", "toggleIVs": "Mostrar IVs", "manageMoves": "Mudar Movimentos", @@ -32,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Escolha o movimento que substituirá", "unlockPassive": "Aprender Passiva", "reduceCost": "Reduzir Custo", + "sameSpeciesEgg": "Comprar Ovo", "cycleShiny": ": » Shiny", "cycleForm": ": » Forma", "cycleGender": ": » Gênero", diff --git a/src/locales/pt_BR/status-effect.ts b/src/locales/pt_BR/status-effect.ts new file mode 100644 index 00000000000..d99e2bd5ec1 --- /dev/null +++ b/src/locales/pt_BR/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Nenhum", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Envenenamento", + description: "envenenamento", + obtain: "{{pokemonNameWithAffix}}\nfoi envenenado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi envenenado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", + heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + toxic: { + name: "Toxic", + description: "envenenamento", + obtain: "{{pokemonNameWithAffix}}\nfoi seriamente envenenado!", + obtainSource: "{{pokemonNameWithAffix}} foi seriamente\nenvenenado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", + heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + paralysis: { + name: "Paralisia", + description: "paralisia", + obtain: "{{pokemonNameWithAffix}} foi paralisado,\nTalvez ele não consiga se mover!", + obtainSource: "{{pokemonNameWithAffix}} foi paralisado por {{sourceText}},\nTalvez ele não consiga se mover!", + activation: "{{pokemonNameWithAffix}} está paralisado!\nEle não consegue se mover!", + overlap: "{{pokemonNameWithAffix}} já\nestá paralisado!", + heal: "{{pokemonNameWithAffix}} foi\ncurado da paralisia!" + }, + sleep: { + name: "Dormindo", + description: "dormindo", + obtain: "{{pokemonNameWithAffix}}\nadormeceu!", + obtainSource: "{{pokemonNameWithAffix}}\ndormiu devido a {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} está dormindo profundamente.", + overlap: "{{pokemonNameWithAffix}} já\nestá dormindo!", + heal: "{{pokemonNameWithAffix}} acordou!" + }, + freeze: { + name: "Congelamento", + description: "congelando", + obtain: "{{pokemonNameWithAffix}}\nfoi congelado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi congelado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} está\ncongelado!", + overlap: "{{pokemonNameWithAffix}} já\nestá congelado!", + heal: "{{pokemonNameWithAffix}} foi\ndescongelado!" + }, + burn: { + name: "Queimadura", + description: "queimadura", + obtain: "{{pokemonNameWithAffix}}\nfoi queimado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi queimado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\npor sua queimadura!", + overlap: "{{pokemonNameWithAffix}} já\nestá queimado!", + heal: "{{pokemonNameWithAffix}} foi\ncurado de sua queimadura!" + }, +} as const; diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.ts index 6aaab6d3cd9..31e35657c7f 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": "The mysterious air current weakened the attack!", "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 908b3aaf258..a9d7fa5b202 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -1,8 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "windPowerCharged": "受 {{moveName}} 的影响, {{pokemonName}} 提升了能力!", - "iceFaceAvoidedDamage": "{{pokemonName}} 因为 {{abilityName}}\n避免了伤害!" + "blockRecoilDamage" : "{{pokemonName}}的{{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}}被折磨着!", + "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", + "iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害!", + "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", + "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", + "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", } as const; diff --git a/src/locales/zh_CN/ability.ts b/src/locales/zh_CN/ability.ts index 9fe6b41ae31..82bc403ad84 100644 --- a/src/locales/zh_CN/ability.ts +++ b/src/locales/zh_CN/ability.ts @@ -3,11 +3,11 @@ import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { name: "恶臭", - description: "通过释放臭臭的气味,在攻\n击的时候,有时会使对手畏\n缩。", + description: "通过释放臭臭的气味,在攻击的时\n候,有时会使对手畏缩。", }, drizzle: { name: "降雨", - description: "出场时,会将天气变为下雨\n。", + description: "出场时,会将天气变为下雨。", }, speedBoost: { name: "加速", @@ -15,39 +15,39 @@ export const ability: AbilityTranslationEntries = { }, battleArmor: { name: "战斗盔甲", - description: "被坚硬的甲壳守护着,不会\n被对手的攻击击中要害。", + description: "被坚硬的甲壳守护着,不会被对手\n的攻击击中要害。", }, sturdy: { name: "结实", - description: "在HP全满时,即使受到招\n式攻击,也不会被一击打倒\n。一击必杀的招式也没有效\n果。", + description: "在HP全满时,即使受到招式攻击\n,也不会被一击打倒。一击必杀的\n招式也没有效果。", }, damp: { name: "湿气", - description: "通过把周围都弄湿,使谁都\n无法使用自爆等爆炸类的招\n式。", + description: "通过把周围都弄湿,使谁都无法使\n用自爆等爆炸类的招式。", }, limber: { name: "柔软", - description: "因为身体柔软,不会变为麻\n痹状态。", + description: "因为身体柔软,不会变为麻痹状态\n。", }, sandVeil: { name: "沙隐", - description: "在沙暴的时候,闪避率会提\n高。", + description: "在沙暴的时候,闪避率会提高。", }, static: { name: "静电", - description: "身上带有静电,有时会让接\n触到的对手麻痹。", + description: "身上带有静电,有时会让接触到的\n对手麻痹。", }, voltAbsorb: { name: "蓄电", - description: "受到电属性的招式攻击时,\n不会受到伤害,而是会回复。", + description: "受到电属性的招式攻击时,不会受\n到伤害,而是会回复。", }, waterAbsorb: { name: "储水", - description: "受到水属性的招式攻击时,\n不会受到伤害,而是会回复。", + description: "受到水属性的招式攻击时,不会受\n到伤害,而是会回复。", }, oblivious: { name: "迟钝", - description: "因为感觉迟钝,不会变为着\n迷和被挑衅状态。对威吓也\n毫不动摇。", + description: "因为感觉迟钝,不会变为着迷和被\n挑衅状态。对威吓也毫不动摇。", }, cloudNine: { name: "无关天气", @@ -55,79 +55,79 @@ export const ability: AbilityTranslationEntries = { }, compoundEyes: { name: "复眼", - description: "因为拥有复眼,招式的命中\n率会提高。", + description: "因为拥有复眼,招式的命中率会提\n高。", }, insomnia: { name: "不眠", - description: "因为有着睡不着的体质,所\n以不会陷入睡眠状态。", + description: "因为有着睡不着的体质,所以不会\n陷入睡眠状态。", }, colorChange: { name: "变色", - description: "自己的属性会变为从对手处\n所受招式的属性。", + description: "自己的属性会变为从对手处所受招\n式的属性。", }, immunity: { name: "免疫", - description: "因为体内拥有免疫能力,不\n会变为中毒状态。", + description: "因为体内拥有免疫能力,不会变为\n中毒状态。", }, flashFire: { name: "引火", - description: "受到火属性的招式攻击时,\n吸收火焰,自己使出的火属\n性招式会变强。", + description: "受到火属性的招式攻击时,吸收火\n焰,自己使出的火属性招式会变强\n。", }, shieldDust: { name: "鳞粉", - description: "被鳞粉守护着,不会受到招\n式的追加效果影响。", + description: "被鳞粉守护着,不会受到招式的追\n加效果影响。", }, ownTempo: { name: "我行我素", - description: "因为我行我素,不会变为混\n乱状态。对威吓也毫不动摇。", + description: "因为我行我素,不会变为混乱状态\n。对威吓也毫不动摇。", }, suctionCups: { name: "吸盘", - description: "用吸盘牢牢贴在地面上,让\n替换宝可梦的招式和道具无\n效。", + description: "用吸盘牢牢贴在地面上,让替换宝\n可梦的招式和道具无效。", }, intimidate: { name: "威吓", - description: "出场时威吓对手,让其退缩\n,降低对手的攻击。", + description: "出场时威吓对手,让其退缩,降低\n对手的攻击。", }, shadowTag: { name: "踩影", - description: "踩住对手的影子使其无法逃\n走或替换。", + description: "踩住对手的影子使其无法逃走或替\n换。", }, roughSkin: { name: "粗糙皮肤", - description: "受到攻击时,用粗糙的皮肤\n弄伤接触到自己的对手。", + description: "受到攻击时,用粗糙的皮肤弄伤接\n触到自己的对手。", }, wonderGuard: { name: "神奇守护", - description: "不可思议的力量,只有效果\n绝佳的招式才能击中。", + description: "不可思议的力量,只有效果绝佳的\n招式才能击中。", }, levitate: { name: "飘浮", - description: "从地面浮起,从而不会受到\n地面属性招式的攻击。", + description: "从地面浮起,从而不会受到地面属\n性招式的攻击。", }, effectSpore: { name: "孢子", - description: "受到攻击时,有时会把接触\n到自己的对手变为中毒、麻\n痹或睡眠状态。", + description: "受到攻击时,有时会把接触到自己\n的对手变为中毒、麻痹或睡眠状态\n。", }, synchronize: { name: "同步", - description: "将自己的中毒、麻痹或灼伤\n状态传染给对手。", + description: "将自己的中毒、麻痹或灼伤状态传\n染给对手。", }, clearBody: { name: "恒净之躯", - description: "不会因为对手的招式或特性\n而被降低能力。", + description: "不会因为对手的招式或特性而被降\n低能力。", }, naturalCure: { name: "自然回复", - description: "回到同行队伍后,异常状态\n就会被治愈。", + description: "回到同行队伍后,异常状态就会被\n治愈。", }, lightningRod: { name: "避雷针", - description: "将电属性的招式吸引到自己\n身上,不会受到伤害,而是\n会提高特攻。", + description: "将电属性的招式吸引到自己身上,\n不会受到伤害,而是会提高特攻。", }, sereneGrace: { name: "天恩", - description: "托天恩的福,招式的追加效\n果容易出现。", + description: "托天恩的福,招式的追加效果容易\n出现。", }, swiftSwim: { name: "悠游自如", @@ -139,43 +139,43 @@ export const ability: AbilityTranslationEntries = { }, illuminate: { name: "发光", - description: "通过让周围变亮来保持命中\n率不会被降低。", + description: "通过让周围变亮来保持命中率不会\n被降低。", }, trace: { name: "复制", - description: "出场时,复制对手的特性,\n变为与之相同的特性。", + description: "出场时,复制对手的特性,变为与\n之相同的特性。", }, hugePower: { name: "大力士", - description: "物理攻击的威力会变为2倍\n。", + description: "物理攻击的威力会变为2倍。", }, poisonPoint: { name: "毒刺", - description: "有时会让接触到自己的对手\n变为中毒状态。", + description: "有时会让接触到自己的对手变为中\n毒状态。", }, innerFocus: { name: "精神力", - description: "拥有经过锻炼的精神,而不\n会因对手的攻击而畏缩。对\n威吓也毫不动摇。", + description: "拥有经过锻炼的精神,而不会因对\n手的攻击而畏缩。对威吓也毫不动\n摇。", }, magmaArmor: { name: "熔岩铠甲", - description: "将炽热的熔岩覆盖在身上,\n不会变为冰冻状态。", + description: "将炽热的熔岩覆盖在身上,不会变\n为冰冻状态。", }, waterVeil: { name: "水幕", - description: "将水幕裹在身上,不会变为\n灼伤状态。", + description: "将水幕裹在身上,不会变为灼伤状\n态。", }, magnetPull: { name: "磁力", - description: "用磁力吸住钢属性的宝可梦\n,使其无法逃走。", + description: "用磁力吸住钢属性的宝可梦,使其\n无法逃走。", }, soundproof: { name: "隔音", - description: "通过屏蔽声音,不受到声音\n招式的影响。", + description: "通过屏蔽声音,不受到声音招式的\n影响。", }, rainDish: { name: "雨盘", - description: "下雨天气时,会缓缓回复\nHP。", + description: "下雨天气时,会缓缓回复HP。", }, sandStream: { name: "扬沙", @@ -183,99 +183,99 @@ export const ability: AbilityTranslationEntries = { }, pressure: { name: "压迫感", - description: "给予对手压迫感,大量减少\n其使用招式的PP。", + description: "给予对手压迫感,大量减少其使用\n招式的PP。", }, thickFat: { name: "厚脂肪", - description: "因为被厚厚的脂肪保护着,\n会让火属性和冰属性的招式\n伤害减半。", + description: "因为被厚厚的脂肪保护着,会让火\n属性和冰属性的招式伤害减半。", }, earlyBird: { name: "早起", - description: "即使变为睡眠状态,也能以\n2倍的速度提早醒来。", + description: "即使变为睡眠状态,也能以2倍的\n速度提早醒来。", }, flameBody: { name: "火焰之躯", - description: "有时会让接触到自己的对手\n变为灼伤状态。", + description: "有时会让接触到自己的对手变为灼\n伤状态。", }, runAway: { name: "逃跑", - description: "一定能从野生宝可梦那儿逃\n走。", + description: "一定能从野生宝可梦那儿逃走。", }, keenEye: { name: "锐利目光", - description: "多亏了锐利的目光,命中率\n不会被降低。", + description: "多亏了锐利的目光,命中率不会被\n降低。", }, hyperCutter: { name: "怪力钳", - description: "因为拥有以力量自豪的钳子,\n不会被对手降低攻击。", + description: "因为拥有以力量自豪的钳子,不会\n被对手降低攻击。", }, pickup: { name: "捡拾", - description: "有时会捡来对手用过的道具,\n冒险过程中也会捡到。", + description: "有时会捡来对手用过的道具,冒险\n过程中也会捡到。", }, truant: { name: "懒惰", - description: "如果使出招式,下一回合就\n会休息。", + description: "如果使出招式,下一回合就会休息\n。", }, hustle: { name: "活力", - description: "自己的攻击变高,但命中率\n会降低。", + description: "自己的攻击变高,但命中率会降低\n。", }, cuteCharm: { name: "迷人之躯", - description: "有时会让接触到自己的对手\n着迷。", + description: "有时会让接触到自己的对手着迷。", }, plus: { name: "正电", - description: "出场的伙伴之间如果有正电\n或负电特性的宝可梦,自己\n的特攻会提高。", + description: "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。", }, minus: { name: "负电", - description: "出场的伙伴之间如果有正电\n或负电特性的宝可梦,自己\n的特攻会提高。", + description: "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。", }, forecast: { name: "阴晴不定", - description: "受天气的影响,会变为水属\n性、火属性或冰属性中的某\n一个。", + description: "受天气的影响,会变为水属性、火\n属性或冰属性中的某一个。", }, stickyHold: { name: "黏着", - description: "因为道具是粘在黏性身体上\n的,所以不会被对手夺走。", + description: "因为道具是粘在黏性身体上的,所\n以不会被对手夺走。", }, shedSkin: { name: "蜕皮", - description: "通过蜕去身上的皮,有时会\n治愈异常状态。", + description: "通过蜕去身上的皮,有时会治愈异\n常状态。", }, guts: { name: "毅力", - description: "如果变为异常状态,会拿出\n毅力,攻击会提高。", + description: "如果变为异常状态,会拿出毅力,\n攻击会提高。", }, marvelScale: { name: "神奇鳞片", - description: "如果变为异常状态,神奇鳞\n片会发生反应,防御会提高。", + description: "如果变为异常状态,神奇鳞片会发\n生反应,防御会提高。", }, liquidOoze: { name: "污泥浆", - description: "吸收了污泥浆的对手会因强\n烈的恶臭而受到伤害,减少\nHP。", + description: "吸收了污泥浆的对手会因强烈的恶\n臭而受到伤害,减少HP。", }, overgrow: { name: "茂盛", - description: "HP减少的时候,草属性的\n招式威力会提高。", + description: "HP减少的时候,草属性的招式威\n力会提高。", }, blaze: { name: "猛火", - description: "HP减少的时候,火属性的\n招式威力会提高。", + description: "HP减少的时候,火属性的招式威\n力会提高。", }, torrent: { name: "激流", - description: "HP减少的时候,水属性的\n招式威力会提高。", + description: "HP减少的时候,水属性的招式威\n力会提高。", }, swarm: { name: "虫之预感", - description: "HP减少的时候,虫属性的\n招式威力会提高。", + description: "HP减少的时候,虫属性的招式威\n力会提高。", }, rockHead: { name: "坚硬脑袋", - description: "即使使出会受反作用力伤害\n的招式,HP也不会减少。", + description: "即使使出会受反作用力伤害的招式\n,HP也不会减少。", }, drought: { name: "日照", @@ -287,19 +287,19 @@ export const ability: AbilityTranslationEntries = { }, vitalSpirit: { name: "干劲", - description: "通过激发出干劲,不会变为\n睡眠状态。", + description: "通过激发出干劲,不会变为睡眠状\n态。", }, whiteSmoke: { name: "白色烟雾", - description: "被白色烟雾保护着,不会被\n对手降低能力。", + description: "被白色烟雾保护着,不会被对手降\n低能力。", }, purePower: { name: "瑜伽之力", - description: "因瑜伽的力量,物理攻击的\n威力会变为2倍。", + description: "因瑜伽的力量,物理攻击的威力会\n变为2倍。", }, shellArmor: { name: "硬壳盔甲", - description: "被坚硬的壳保护着,对手的\n攻击不会击中要害。", + description: "被坚硬的壳保护着,对手的攻击不\n会击中要害。", }, airLock: { name: "气闸", @@ -307,19 +307,19 @@ export const ability: AbilityTranslationEntries = { }, tangledFeet: { name: "蹒跚", - description: "在混乱状态时,闪避率会提\n高。", + description: "在混乱状态时,闪避率会提高。", }, motorDrive: { name: "电气引擎", - description: "受到电属性的招式攻击时,\n不会受到伤害,而是速度会\n提高。", + description: "受到电属性的招式攻击时,不会受\n到伤害,而是速度会提高。", }, rivalry: { name: "斗争心", - description: "面对性别相同的对手,会燃\n起斗争心,变得更强。而面\n对性别不同的,则会变弱。", + description: "面对性别相同的对手,会燃起斗争\n心,变得更强。而面对性别不同的\n,则会变弱。", }, steadfast: { name: "不屈之心", - description: "每次畏缩时,不屈之心就会\n燃起,速度也会提高。", + description: "每次畏缩时,不屈之心就会燃起,\n速度也会提高。", }, snowCloak: { name: "雪隐", @@ -327,19 +327,19 @@ export const ability: AbilityTranslationEntries = { }, gluttony: { name: "贪吃鬼", - description: "原本HP变得很少时才会吃\n树果,在HP还有一半时就\n会把它吃掉。", + description: "原本HP变得很少时才会吃树果,\n在HP还有一半时就会把它吃掉。", }, angerPoint: { name: "愤怒穴位", - description: "要害被击中时,会大发雷霆\n,攻击力变为最大。", + description: "要害被击中时,会大发雷霆,攻击\n力变为最大。", }, unburden: { name: "轻装", - description: "失去所持有的道具时,速度\n会提高。", + description: "失去所持有的道具时,速度会提高\n。", }, heatproof: { name: "耐热", - description: "耐热的体质会让火属性的招\n式伤害减半。", + description: "耐热的体质会让火属性的招式伤害\n减半。", }, simple: { name: "单纯", @@ -347,11 +347,11 @@ export const ability: AbilityTranslationEntries = { }, drySkin: { name: "干燥皮肤", - description: "下雨天气时和受到水属性的\n招式时,HP会回复。晴朗\n天气时和受到火属性的招式\n时,HP会减少。", + description: "下雨天气时和受到水属性的招式时\n,HP会回复。晴朗天气时和受到\n火属性的招式时,HP会减少。", }, download: { name: "下载", - description: "比较对手的防御和特防,根\n据较低的那项能力相应地提\n高自己的攻击或特攻。", + description: "比较对手的防御和特防,根据较低\n的那项能力相应地提高自己的攻击\n或特攻。", }, ironFist: { name: "铁拳", @@ -359,35 +359,35 @@ export const ability: AbilityTranslationEntries = { }, poisonHeal: { name: "毒疗", - description: "变为中毒状态时,HP不会\n减少,反而会增加起来。", + description: "变为中毒状态时,HP不会减少,\n反而会增加起来。", }, adaptability: { name: "适应力", - description: "与自身同属性的招式威力会\n提高。", + description: "与自身同属性的招式威力会提高。", }, skillLink: { name: "连续攻击", - description: "如果使用连续招式,总是能\n使出最高次数。", + description: "如果使用连续招式,总是能使出最\n高次数。", }, hydration: { name: "湿润之躯", - description: "下雨天气时,异常状态会治\n愈。", + description: "下雨天气时,异常状态会治愈。", }, solarPower: { name: "太阳之力", - description: "晴朗天气时,特攻会提高,\n而每回合HP会减少。", + description: "晴朗天气时,特攻会提高,而每回\n合HP会减少。", }, quickFeet: { name: "飞毛腿", - description: "变为异常状态时,速度会提\n高。", + description: "变为异常状态时,速度会提高。", }, normalize: { name: "一般皮肤", - description: "无论是什么属性的招式,全\n部会变为一般属性。威力会\n少量提高。", + description: "无论是什么属性的招式,全部会变\n为一般属性。威力会少量提高。", }, sniper: { name: "狙击手", - description: "击中要害时,威力会变得更\n强。", + description: "击中要害时,威力会变得更强。", }, magicGuard: { name: "魔法防守", @@ -395,19 +395,19 @@ export const ability: AbilityTranslationEntries = { }, noGuard: { name: "无防守", - description: "由于无防守战术,双方使出\n的招式都必定会击中。", + description: "由于无防守战术,双方使出的招式\n都必定会击中。", }, stall: { name: "慢出", - description: "使出招式的顺序必定会变为\n最后。", + description: "使出招式的顺序必定会变为最后。", }, technician: { name: "技术高手", - description: "攻击时可以将低威力招式的\n威力提高。", + description: "攻击时可以将低威力招式的威力提\n高。", }, leafGuard: { name: "叶子防守", - description: "晴朗天气时,不会变为异常\n状态。", + description: "晴朗天气时,不会变为异常状态。", }, klutz: { name: "笨拙", @@ -415,55 +415,55 @@ export const ability: AbilityTranslationEntries = { }, moldBreaker: { name: "破格", - description: "可以不受对手特性的干扰,\n向对手使出招式。", + description: "可以不受对手特性的干扰,向对手\n使出招式。", }, superLuck: { name: "超幸运", - description: "因为拥有超幸运,攻击容易\n击中对手的要害。", + description: "因为拥有超幸运,攻击容易击中对\n手的要害。", }, aftermath: { name: "引爆", - description: "变为濒死时,会对接触到自\n己的对手造成伤害。", + description: "变为濒死时,会对接触到自己的对\n手造成伤害。", }, anticipation: { name: "危险预知", - description: "可以察觉到对手拥有的危险\n招式。", + description: "可以察觉到对手拥有的危险招式。", }, forewarn: { name: "预知梦", - description: "出场时,只读取1个对手拥\n有的招式。", + description: "出场时,只读取1个对手拥有的招\n式。", }, unaware: { name: "纯朴", - description: "可以无视对手能力的变化,\n进行攻击。", + description: "可以无视对手能力的变化,进行攻\n击。", }, tintedLens: { name: "有色眼镜", - description: "可以将效果不好的招式以通\n常的威力使出。", + description: "可以将效果不好的招式以通常的威\n力使出。", }, filter: { name: "过滤", - description: "受到效果绝佳的攻击时,可\n以减弱其威力。", + description: "受到效果绝佳的攻击时,可以减弱\n其威力。", }, slowStart: { name: "慢启动", - description: "在5回合内,攻击和速度减\n半。", + description: "在5回合内,攻击和速度减半。", }, scrappy: { name: "胆量", - description: "一般属性和格斗属性的招式\n可以击中幽灵属性的宝可梦\n。对威吓也毫不动摇。", + description: "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。对威吓也毫\n不动摇。", }, stormDrain: { name: "引水", - description: "将水属性的招式引到自己身\n上,不会受到伤害,而是会\n提高特攻。", + description: "将水属性的招式引到自己身上,不\n会受到伤害,而是会提高特攻。", }, iceBody: { name: "冰冻之躯", - description: "下雪天气时,会缓缓回复\nHP。", + description: "下雪天气时,会缓缓回复HP。", }, solidRock: { name: "坚硬岩石", - description: "受到效果绝佳的攻击时,可\n以减弱其威力。", + description: "受到效果绝佳的攻击时,可以减弱\n其威力。", }, snowWarning: { name: "降雪", @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "采蜜", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", + description: "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money.", }, frisk: { name: "察觉", @@ -479,15 +479,15 @@ export const ability: AbilityTranslationEntries = { }, reckless: { name: "舍身", - description: "自己会因反作用力受伤的招\n式,其威力会提高。", + description: "自己会因反作用力受伤的招式,其\n威力会提高。", }, multitype: { name: "多属性", - description: "自己的属性会根据持有的石\n板而改变。", + description: "自己的属性会根据持有的石板而改\n变。", }, flowerGift: { name: "花之礼", - description: "晴朗天气时,自己与同伴的\n攻击和特防能力会提高。", + description: "晴朗天气时,自己与同伴的攻击和\n特防能力会提高。", }, badDreams: { name: "梦魇", @@ -495,31 +495,31 @@ export const ability: AbilityTranslationEntries = { }, pickpocket: { name: "顺手牵羊", - description: "盗取接触到自己的对手的道\n具。", + description: "盗取接触到自己的对手的道具。", }, sheerForce: { name: "强行", - description: "招式的追加效果消失,但因\n此能以更高的威力使出招式\n。", + description: "招式的追加效果消失,但因此能以\n更高的威力使出招式。", }, contrary: { name: "唱反调", - description: "能力的变化发生逆转,原本\n提高时会降低,而原本降低\n时会提高。", + description: "能力的变化发生逆转,原本提高时\n会降低,而原本降低时会提高。", }, unnerve: { name: "紧张感", - description: "让对手紧张,使其无法食用\n树果。", + description: "让对手紧张,使其无法食用树果。", }, defiant: { name: "不服输", - description: "被对手降低能力时,攻击会\n大幅提高。", + description: "被对手降低能力时,攻击会大幅提\n高。", }, defeatist: { name: "软弱", - description: "HP减半时,会变得软弱,\n攻击和特攻会减半。", + description: "HP减半时,会变得软弱,攻击和\n特攻会减半。", }, cursedBody: { name: "诅咒之躯", - description: "受到攻击时,有时会把对手\n的招式变为定身法状态。", + description: "受到攻击时,有时会把对手的招式\n变为定身法状态。", }, healer: { name: "治愈之心", @@ -531,7 +531,7 @@ export const ability: AbilityTranslationEntries = { }, weakArmor: { name: "碎裂铠甲", - description: "受到物理招式的伤害时,防\n御会降低,速度会大幅提高。", + description: "受到物理招式的伤害时,防御会降\n低,速度会大幅提高。", }, heavyMetal: { name: "重金属", @@ -543,39 +543,39 @@ export const ability: AbilityTranslationEntries = { }, multiscale: { name: "多重鳞片", - description: "HP全满时,受到的伤害会\n变少。", + description: "HP全满时,受到的伤害会变少。", }, toxicBoost: { name: "中毒激升", - description: "变为中毒状态时,物理招式\n的威力会提高。", + description: "变为中毒状态时,物理招式的威力\n会提高。", }, flareBoost: { name: "受热激升", - description: "变为灼伤状态时,特殊招式\n的威力会提高。", + description: "变为灼伤状态时,特殊招式的威力\n会提高。", }, harvest: { name: "收获", - description: "可以多次制作出已被使用掉\n的树果。", + description: "可以多次制作出已被使用掉的树果\n。", }, telepathy: { name: "心灵感应", - description: "读取我方的攻击,并闪避其\n招式伤害。", + description: "读取我方的攻击,并闪避其招式伤\n害。", }, moody: { name: "心情不定", - description: "每一回合,能力中的某项会\n大幅提高,而某项会降低。", + description: "每一回合,能力中的某项会大幅提\n高,而某项会降低。", }, overcoat: { name: "防尘", - description: "不会受到沙暴的伤害。也不\n会受到粉末类和孢子类招式\n的影响。", + description: "不会受到沙暴的伤害。也不会受到\n粉末类和孢子类招式的影响。", }, poisonTouch: { name: "毒手", - description: "只通过接触就有可能让对手\n变为中毒状态。", + description: "只通过接触就有可能让对手变为中\n毒状态。", }, regenerator: { name: "再生力", - description: "退回同行队伍后,HP会少\n量回复。", + description: "退回同行队伍后,HP会少量回复\n。", }, bigPecks: { name: "健壮胸肌", @@ -587,15 +587,15 @@ export const ability: AbilityTranslationEntries = { }, wonderSkin: { name: "奇迹皮肤", - description: "成为不易受到变化招式攻击\n的身体。", + description: "成为不易受到变化招式攻击的身体\n。", }, analytic: { name: "分析", - description: "如果在最后使出招式,招式\n的威力会提高。", + description: "如果在最后使出招式,招式的威力\n会提高。", }, illusion: { name: "幻觉", - description: "假扮成同行队伍中的最后一\n只宝可梦出场,迷惑对手。", + description: "假扮成同行队伍中的最后一只宝可\n梦出场,迷惑对手。", }, imposter: { name: "变身者", @@ -603,31 +603,31 @@ export const ability: AbilityTranslationEntries = { }, infiltrator: { name: "穿透", - description: "可以穿透对手的壁障或替身\n进行攻击。", + description: "可以穿透对手的壁障或替身进行攻\n击。", }, mummy: { name: "木乃伊", - description: "被对手接触到后,会将对手\n变为木乃伊。", + description: "被对手接触到后,会将对手变为木\n乃伊。", }, moxie: { name: "自信过度", - description: "如果打倒对手,就会充满自\n信,攻击会提高。", + description: "如果打倒对手,就会充满自信,攻\n击会提高。", }, justified: { name: "正义之心", - description: "受到恶属性的招式攻击时,\n因为正义感,攻击会提高。", + description: "受到恶属性的招式攻击时,因为正\n义感,攻击会提高。", }, rattled: { name: "胆怯", - description: "受到恶属性、幽灵属性和虫\n属性的攻击或威吓时,会因\n胆怯而速度提高。", + description: "受到恶属性、幽灵属性和虫属性的\n攻击或威吓时,会因胆怯而速度提\n高。", }, magicBounce: { name: "魔法镜", - description: "可以不受到由对手使出的变\n化招式影响,并将其反弹。", + description: "可以不受到由对手使出的变化招式\n影响,并将其反弹。", }, sapSipper: { name: "食草", - description: "受到草属性的招式攻击时,\n不会受到伤害,而是攻击会\n提高。", + description: "受到草属性的招式攻击时,不会受\n到伤害,而是攻击会提高。", }, prankster: { name: "恶作剧之心", @@ -635,15 +635,15 @@ export const ability: AbilityTranslationEntries = { }, sandForce: { name: "沙之力", - description: "沙暴天气时,岩石属性、地\n面属性和钢属性的招式威力\n会提高。", + description: "沙暴天气时,岩石属性、地面属性\n和钢属性的招式威力会提高。", }, ironBarbs: { name: "铁刺", - description: "用铁刺给予接触到自己的对\n手伤害。", + description: "用铁刺给予接触到自己的对手伤害\n。", }, zenMode: { name: "达摩模式", - description: "HP变为一半以下时,样子\n会改变。", + description: "HP变为一半以下时,样子会改变\n。", }, victoryStar: { name: "胜利之星", @@ -651,67 +651,67 @@ export const ability: AbilityTranslationEntries = { }, turboblaze: { name: "涡轮火焰", - description: "可以不受对手特性的干扰,\n向对手使出招式。", + description: "可以不受对手特性的干扰,向对手\n使出招式。", }, teravolt: { name: "兆级电压", - description: "可以不受对手特性的干扰,\n向对手使出招式。", + description: "可以不受对手特性的干扰,向对手\n使出招式。", }, aromaVeil: { name: "芳香幕", - description: "可以防住向自己和同伴发出\n的心灵攻击。", + description: "可以防住向自己和同伴发出的心灵\n攻击。", }, flowerVeil: { name: "花幕", - description: "我方的草属性宝可梦能力不\n会降低,也不会变为异常状\n态。", + description: "我方的草属性宝可梦能力不会降低\n,也不会变为异常状态。", }, cheekPouch: { name: "颊囊", - description: "无论是哪种树果,食用后,\nHP都会回复。", + description: "无论是哪种树果,食用后,HP都\n会回复。", }, protean: { name: "变幻自如", - description: "变为与自己使出的招式相同\n的属性。每次出场战斗仅生\n效一次。", + description: "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。", }, furCoat: { name: "毛皮大衣", - description: "对手给予的物理招式的伤害\n会减半。", + description: "对手给予的物理招式的伤害会减半\n。", }, magician: { name: "魔术师", - description: "夺走被自己的招式击中的对\n手的道具。", + description: "夺走被自己的招式击中的对手的道\n具。", }, bulletproof: { name: "防弹", - description: "可以防住对手的球和弹类招\n式。", + description: "可以防住对手的球和弹类招式。", }, competitive: { name: "好胜", - description: "如果被对手降低能力,特攻\n会大幅提高。", + description: "如果被对手降低能力,特攻会大幅\n提高。", }, strongJaw: { name: "强壮之颚", - description: "因为颚部强壮,啃咬类招式\n的威力会提高。", + description: "因为颚部强壮,啃咬类招式的威力\n会提高。", }, refrigerate: { name: "冰冻皮肤", - description: "一般属性的招式会变为冰属\n性。威力会少量提高。", + description: "一般属性的招式会变为冰属性。威\n力会少量提高。", }, sweetVeil: { name: "甜幕", - description: "自己和同伴的宝可梦不会变\n为睡眠状态。", + description: "自己和同伴的宝可梦不会变为睡眠\n状态。", }, stanceChange: { name: "战斗切换", - description: "如果使出攻击招式,会变为\n刀剑形态,如果使出招式“\n王者盾牌”,会变为盾牌形\n态。", + description: "如果使出攻击招式,会变为刀剑形\n态,如果使出招式“王者盾牌”,\n会变为盾牌形态。", }, galeWings: { name: "疾风之翼", - description: "HP全满时,飞行属性的招\n式可以率先使出。", + description: "HP全满时,飞行属性的招式可以\n率先使出。", }, megaLauncher: { name: "超级发射器", - description: "波动和波导类招式的威力会\n提高。", + description: "波动和波导类招式的威力会提高。", }, grassPelt: { name: "草之毛皮", @@ -719,23 +719,23 @@ export const ability: AbilityTranslationEntries = { }, symbiosis: { name: "共生", - description: "同伴使用道具时,会把自己\n持有的道具传递给同伴。", + description: "同伴使用道具时,会把自己持有的\n道具传递给同伴。", }, toughClaws: { name: "硬爪", - description: "接触到对手的招式威力会提\n高。", + description: "接触到对手的招式威力会提高。", }, pixilate: { name: "妖精皮肤", - description: "一般属性的招式会变为妖精\n属性。威力会少量提高。", + description: "一般属性的招式会变为妖精属性。\n威力会少量提高。", }, gooey: { name: "黏滑", - description: "对于用攻击接触到自己的对\n手,会降低其速度。", + description: "对于用攻击接触到自己的对手,会\n降低其速度。", }, aerilate: { name: "飞行皮肤", - description: "一般属性的招式会变为飞行\n属性。威力会少量提高。", + description: "一般属性的招式会变为飞行属性。\n威力会少量提高。", }, parentalBond: { name: "亲子爱", @@ -751,19 +751,19 @@ export const ability: AbilityTranslationEntries = { }, auraBreak: { name: "气场破坏", - description: "让气场的效果发生逆转,降\n低威力。", + description: "让气场的效果发生逆转,降低威力\n。", }, primordialSea: { name: "始源之海", - description: "变为不会受到火属性攻击的\n天气。", + description: "变为不会受到火属性攻击的天气。", }, desolateLand: { name: "终结之地", - description: "变为不会受到水属性攻击的\n天气。", + description: "变为不会受到水属性攻击的天气。", }, deltaStream: { name: "德尔塔气流", - description: "变为令飞行属性的弱点消失\n的天气。", + description: "变为令飞行属性的弱点消失的天气\n。", }, stamina: { name: "持久力", @@ -771,31 +771,31 @@ export const ability: AbilityTranslationEntries = { }, wimpOut: { name: "跃跃欲逃", - description: "HP变为一半时,会慌慌张\n张逃走,退回同行队伍中。", + description: "HP变为一半时,会慌慌张张逃走\n,退回同行队伍中。", }, emergencyExit: { name: "危险回避", - description: "HP变为一半时,为了回避\n危险,会退回到同行队伍中。", + description: "HP变为一半时,为了回避危险,\n会退回到同行队伍中。", }, waterCompaction: { name: "遇水凝固", - description: "受到水属性的招式攻击时,\n防御会大幅提高。", + description: "受到水属性的招式攻击时,防御会\n大幅提高。", }, merciless: { name: "不仁不义", - description: "攻击中毒状态的对手时,\n必定会击中要害。", + description: "攻击中毒状态的对手时,必定会击\n中要害。", }, shieldsDown: { name: "界限盾壳", - description: "HP变为一半时,壳会坏掉,\n变得有攻击性。", + description: "HP变为一半时,壳会坏掉,变得\n有攻击性。", }, stakeout: { name: "蹲守", - description: "可以对替换出场的对手以2\n倍的伤害进行攻击。", + description: "可以对替换出场的对手以2倍的伤\n害进行攻击。", }, waterBubble: { name: "水泡", - description: "降低自己受到的火属性招式\n的威力,不会灼伤。", + description: "降低自己受到的火属性招式的威力\n,不会灼伤。", }, steelworker: { name: "钢能力者", @@ -803,7 +803,7 @@ export const ability: AbilityTranslationEntries = { }, berserk: { name: "怒火冲天", - description: "因对手的攻击HP变为一半\n时,特攻会提高。", + description: "因对手的攻击HP变为一半时,特\n攻会提高。", }, slushRush: { name: "拨雪", @@ -811,11 +811,11 @@ export const ability: AbilityTranslationEntries = { }, longReach: { name: "远隔", - description: "可以不接触对手就使出所有\n的招式。", + description: "可以不接触对手就使出所有的招式\n。", }, liquidVoice: { name: "湿润之声", - description: "所有的声音招式都变为水属\n性。", + description: "所有的声音招式都变为水属性。", }, triage: { name: "先行治疗", @@ -823,83 +823,83 @@ export const ability: AbilityTranslationEntries = { }, galvanize: { name: "电气皮肤", - description: "一般属性的招式会变为电属\n性。威力会少量提高。", + description: "一般属性的招式会变为电属性。威\n力会少量提高。", }, surgeSurfer: { name: "冲浪之尾", - description: "电气场地时,速度会变为2\n倍。", + description: "电气场地时,速度会变为2倍。", }, schooling: { name: "鱼群", - description: "HP多的时候会聚起来变强。\nHP剩余量变少时,群体\n会分崩离析。", + description: "HP多的时候会聚起来变强。HP\n剩余量变少时,群体会分崩离析。", }, disguise: { name: "画皮", - description: "通过画皮覆盖住身体,可以\n防住1次攻击。", + description: "通过画皮覆盖住身体,可以防住1\n次攻击。", }, battleBond: { name: "牵绊变身", - description: "打倒对手时,与训练家的牵\n绊会增强,自己的攻击、特\n攻、速度会提高。", + description: "打倒对手时,与训练家的牵绊会增\n强,自己的攻击、特攻、速度会提\n高。", }, powerConstruct: { name: "群聚变形", - description: "HP变为一半时,细胞们会\n赶来支援,变为完全体形态。", + description: "HP变为一半时,细胞们会赶来支\n援,变为完全体形态。", }, corrosion: { name: "腐蚀", - description: "可以使钢属性和毒属性的宝\n可梦也陷入中毒状态。", + description: "可以使钢属性和毒属性的宝可梦也\n陷入中毒状态。", }, comatose: { name: "绝对睡眠", - description: "总是半梦半醒的状态,绝对\n不会醒来。可以就这么睡着\n进行攻击。", + description: "总是半梦半醒的状态,绝对不会醒\n来。可以就这么睡着进行攻击。", }, queenlyMajesty: { name: "女王的威严", - description: "向对手施加威慑力,使其无\n法对我方使出先制招式。", + description: "向对手施加威慑力,使其无法对我\n方使出先制招式。", }, innardsOut: { name: "飞出的内在物", - description: "被对手打倒的时候,会给予\n对手相当于HP剩余量的伤\n害。", + description: "被对手打倒的时候,会给予对手相\n当于HP剩余量的伤害。", }, dancer: { name: "舞者", - description: "有谁使出跳舞招式时,自己\n也能就这么接着使出跳舞招\n式。", + description: "有谁使出跳舞招式时,自己也能就\n这么接着使出跳舞招式。", }, battery: { name: "蓄电池", - description: "会提高我方的特殊招式的威\n力。", + description: "会提高我方的特殊招式的威力。", }, fluffy: { name: "毛茸茸", - description: "会将对手所给予的接触类招\n式的伤害减半,但火属性招\n式的伤害会变为2倍。", + description: "会将对手所给予的接触类招式的伤\n害减半,但火属性招式的伤害会变\n为2倍。", }, dazzling: { name: "鲜艳之躯", - description: "让对手吓一跳,使其无法对\n我方使出先制招式。", + description: "让对手吓一跳,使其无法对我方使\n出先制招式。", }, soulHeart: { name: "魂心", - description: "宝可梦每次变为濒死状态时\n,特攻会提高。", + description: "宝可梦每次变为濒死状态时,特攻\n会提高。", }, tanglingHair: { name: "卷发", - description: "对于用攻击接触到自己的对\n手,会降低其速度。", + description: "对于用攻击接触到自己的对手,会\n降低其速度。", }, receiver: { name: "接球手", - description: "继承被打倒的同伴的特性,\n变为相同的特性。", + description: "继承被打倒的同伴的特性,变为相\n同的特性。", }, powerOfAlchemy: { name: "化学之力", - description: "继承被打倒的同伴的特性,\n变为相同的特性。", + description: "继承被打倒的同伴的特性,变为相\n同的特性。", }, beastBoost: { name: "异兽提升", - description: "打倒对手的时候,自己最高\n的那项能力会提高。", + description: "打倒对手的时候,自己最高的那项\n能力会提高。", }, rksSystem: { name: "AR系统", - description: "根据持有的存储碟,自己的\n属性会改变。", + description: "根据持有的存储碟,自己的属性会\n改变。", }, electricSurge: { name: "电气制造者", @@ -919,19 +919,19 @@ export const ability: AbilityTranslationEntries = { }, fullMetalBody: { name: "金属防护", - description: "不会因为对手的招式或特性\n而被降低能力。", + description: "不会因为对手的招式或特性而被降\n低能力。", }, shadowShield: { name: "幻影防守", - description: "HP全满时,受到的伤害会\n变少。", + description: "HP全满时,受到的伤害会变少。", }, prismArmor: { name: "棱镜装甲", - description: "受到效果绝佳的攻击时,可\n以减弱其威力。", + description: "受到效果绝佳的攻击时,可以减弱\n其威力。", }, neuroforce: { name: "脑核之力", - description: "效果绝佳的攻击,威力会变\n得更强。", + description: "效果绝佳的攻击,威力会变得更强\n。", }, intrepidSword: { name: "不挠之剑", @@ -943,39 +943,39 @@ export const ability: AbilityTranslationEntries = { }, libero: { name: "自由者", - description: "变为与自己使出的招式相同\n的属性。每次出场战斗仅生\n效一次。", + description: "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。", }, ballFetch: { name: "捡球", - description: "没有携带道具时,会拾取第\n1个投出后捕捉失败的精灵\n球。", + description: "没有携带道具时,会拾取第1个投\n出后捕捉失败的精灵球。", }, cottonDown: { name: "棉絮", - description: "受到攻击后撒下棉絮,降低\n除自己以外的所有宝可梦的\n速度。", + description: "受到攻击后撒下棉絮,降低除自己\n以外的所有宝可梦的速度。", }, propellerTail: { name: "螺旋尾鳍", - description: "能无视具有吸引对手招式效\n果的特性或招式的影响。", + description: "能无视具有吸引对手招式效果的特\n性或招式的影响。", }, mirrorArmor: { name: "镜甲", - description: "只反弹自己受到的能力降低\n效果。", + description: "只反弹自己受到的能力降低效果。", }, gulpMissile: { name: "一口导弹", - description: "冲浪或潜水时会叼来猎物。\n受到伤害时,会吐出猎物进\n行攻击。", + description: "冲浪或潜水时会叼来猎物。受到伤\n害时,会吐出猎物进行攻击。", }, stalwart: { name: "坚毅", - description: "能无视具有吸引对手招式效\n果的特性或招式的影响。", + description: "能无视具有吸引对手招式效果的特\n性或招式的影响。", }, steamEngine: { name: "蒸汽机", - description: "受到水属性或火属性的招式\n攻击时,速度会巨幅提高。", + description: "受到水属性或火属性的招式攻击时\n,速度会巨幅提高。", }, punkRock: { name: "庞克摇滚", - description: "声音招式的威力会提高。受\n到的声音招式伤害会减半。", + description: "声音招式的威力会提高。受到的声\n音招式伤害会减半。", }, sandSpit: { name: "吐沙", @@ -983,7 +983,7 @@ export const ability: AbilityTranslationEntries = { }, iceScales: { name: "冰鳞粉", - description: "由于有冰鳞粉的守护,受到\n的特殊攻击伤害会减半。", + description: "由于有冰鳞粉的守护,受到的特殊\n攻击伤害会减半。", }, ripen: { name: "熟成", @@ -991,47 +991,47 @@ export const ability: AbilityTranslationEntries = { }, iceFace: { name: "结冻头", - description: "头部的冰会代替自己承受物\n理攻击,但是样子会改变。\n下雪时,冰会恢复原状。", + description: "头部的冰会代替自己承受物理攻击\n,但是样子会改变。下雪时,冰会\n恢复原状。", }, powerSpot: { name: "能量点", - description: "只要处在相邻位置,招式的\n威力就会提高。", + description: "只要处在相邻位置,招式的威力就\n会提高。", }, mimicry: { name: "拟态", - description: "宝可梦的属性会根据场地的\n状态而变化。", + description: "宝可梦的属性会根据场地的状态而\n变化。", }, screenCleaner: { name: "除障", - description: "出场时,敌方和我方的光墙\n、反射壁和极光幕的效果会\n消失。", + description: "出场时,敌方和我方的光墙、反射\n壁和极光幕的效果会消失。", }, steelySpirit: { name: "钢之意志", - description: "我方的钢属性攻击威力会提\n高。", + description: "我方的钢属性攻击威力会提高。", }, perishBody: { name: "灭亡之躯", - description: "受到接触类招式攻击时,双\n方都会在3回合后变为濒死\n状态。替换后效果消失。", + description: "受到接触类招式攻击时,双方都会\n在3回合后变为濒死状态。替换后\n效果消失。", }, wanderingSpirit: { name: "游魂", - description: "与使用接触类招式攻击自己\n的宝可梦互换特性。", + description: "与使用接触类招式攻击自己的宝可\n梦互换特性。", }, gorillaTactics: { name: "一猩一意", - description: "虽然攻击会提高,但是只能\n使出一开始所选的招式。", + description: "虽然攻击会提高,但是只能使出一\n开始所选的招式。", }, neutralizingGas: { name: "化学变化气体", - description: "特性为化学变化气体的宝可\n梦在场时,场上所有宝可梦\n的特性效果都会消失或者无\n法生效。", + description: "特性为化学变化气体的宝可梦在场\n时,场上所有宝可梦的特性效果都\n会消失或者无法生效。", }, pastelVeil: { name: "粉彩护幕", - description: "自己和同伴都不会陷入中毒\n的异常状态。", + description: "自己和同伴都不会陷入中毒的异常\n状态。", }, hungerSwitch: { name: "饱了又饿", - description: "每回合结束时会在满腹花纹\n与空腹花纹之间交替改变样\n子。", + description: "每回合结束时会在满腹花纹与空腹\n花纹之间交替改变样子。", }, quickDraw: { name: "速击", @@ -1039,11 +1039,11 @@ export const ability: AbilityTranslationEntries = { }, unseenFist: { name: "无形拳", - description: "如果使出的是接触到对手的\n招式,就可以无视守护效果\n进行攻击。", + description: "如果使出的是接触到对手的招式,\n就可以无视守护效果进行攻击。", }, curiousMedicine: { name: "怪药", - description: "出场时会从贝壳撒药,将我\n方的能力变化复原。", + description: "出场时会从贝壳撒药,将我方的能\n力变化复原。", }, transistor: { name: "电晶体", @@ -1055,51 +1055,51 @@ export const ability: AbilityTranslationEntries = { }, chillingNeigh: { name: "苍白嘶鸣", - description: "打倒对手时会用冰冷的声音\n嘶鸣并提高攻击。", + description: "打倒对手时会用冰冷的声音嘶鸣并\n提高攻击。", }, grimNeigh: { name: "漆黑嘶鸣", - description: "打倒对手时会用恐怖的声音\n嘶鸣并提高特攻。", + description: "打倒对手时会用恐怖的声音嘶鸣并\n提高特攻。", }, asOneGlastrier: { name: "人马一体", - description: "兼备蕾冠王的紧张感和雪暴\n马的苍白嘶鸣这两种特性。", + description: "兼备蕾冠王的紧张感和雪暴马的苍\n白嘶鸣这两种特性。", }, asOneSpectrier: { name: "人马一体", - description: "兼备蕾冠王的紧张感和灵幽\n马的漆黑嘶鸣这两种特性。", + description: "兼备蕾冠王的紧张感和灵幽马的漆\n黑嘶鸣这两种特性。", }, lingeringAroma: { name: "甩不掉的气味", - description: "被对手接触到后,甩不掉的\n气味会沾上对手。", + description: "被对手接触到后,甩不掉的气味会\n沾上对手。", }, seedSower: { name: "掉出种子", - description: "受到攻击时,会将脚下变成\n青草场地。", + description: "受到攻击时,会将脚下变成青草场\n地。", }, thermalExchange: { name: "热交换", - description: "受到火属性的招式攻击时,\n攻击会提高,且不会陷入灼\n伤状态。", + description: "受到火属性的招式攻击时,攻击会\n提高,且不会陷入灼伤状态。", }, angerShell: { name: "愤怒甲壳", - description: "因被对手攻击而HP变为一\n半时,会因愤怒降低防御和\n特防。但攻击、特攻、速度\n会提高。", + description: "因被对手攻击而HP变为一半时,\n会因愤怒降低防御和特防。但攻击\n、特攻、速度会提高。", }, purifyingSalt: { name: "洁净之盐", - description: "因洁净的盐而不会陷入异常\n状态。会让幽灵属性的招式\n伤害减半。", + description: "因洁净的盐而不会陷入异常状态。\n会让幽灵属性的招式伤害减半。", }, wellBakedBody: { name: "焦香之躯", - description: "受到火属性的招式攻击时,\n不会受到伤害,而是会大幅\n提高防御。", + description: "受到火属性的招式攻击时,不会受\n到伤害,而是会大幅提高防御。", }, windRider: { name: "乘风", - description: "吹起了顺风或受到风的招式\n攻击时,不会受到伤害,而\n是会提高攻击。", + description: "吹起了顺风或受到风的招式攻击时\n,不会受到伤害,而是会提高攻击\n。", }, guardDog: { name: "看门犬", - description: "受到威吓时,攻击会提高。\n让替换宝可梦的招式和道具\n无效。", + description: "受到威吓时,攻击会提高。让替换\n宝可梦的招式和道具无效。", }, rockyPayload: { name: "搬岩", @@ -1107,63 +1107,63 @@ export const ability: AbilityTranslationEntries = { }, windPower: { name: "风力发电", - description: "受到风的招式攻击时,会变\n为充电状态。", + description: "受到风的招式攻击时,会变为充电\n状态。", }, zeroToHero: { name: "全能变身", - description: "回到同行队伍后,会变为全\n能形态。", + description: "回到同行队伍后,会变为全能形态\n。", }, commander: { name: "发号施令", - description: "出场时,若我方当中有吃吼\n霸,就会进入其口中,并从\n其口中发出指令。", + description: "出场时,若我方当中有吃吼霸,就\n会进入其口中,并从其口中发出指\n令。", }, electromorphosis: { name: "电力转换", - description: "受到伤害时,会变为充电状\n态。", + description: "受到伤害时,会变为充电状态。", }, protosynthesis: { name: "古代活性", - description: "携带着驱劲能量或天气为晴\n朗时,数值最高的能力会提\n高。", + description: "携带着驱劲能量或天气为晴朗时,\n数值最高的能力会提高。", }, quarkDrive: { name: "夸克充能", - description: "携带着驱劲能量或在电气场\n地上时,数值最高的能力会\n提高。", + description: "携带着驱劲能量或在电气场地上时\n,数值最高的能力会提高。", }, goodAsGold: { name: "黄金之躯", - description: "不会氧化的坚固黄金身躯不\n会受到对手的变化招式的影\n响。", + description: "不会氧化的坚固黄金身躯不会受到\n对手的变化招式的影响。", }, vesselOfRuin: { name: "灾祸之鼎", - description: "以能呼唤灾厄的鼎的力量降\n低除自己以外的宝可梦的特\n攻。", + description: "以能呼唤灾厄的鼎的力量降低除自\n己以外的宝可梦的特攻。", }, swordOfRuin: { name: "灾祸之剑", - description: "以能呼唤灾厄的剑的力量降\n低除自己以外的宝可梦的防\n御。", + description: "以能呼唤灾厄的剑的力量降低除自\n己以外的宝可梦的防御。", }, tabletsOfRuin: { name: "灾祸之简", - description: "以能呼唤灾厄的简的力量降\n低除自己以外的宝可梦的攻\n击。", + description: "以能呼唤灾厄的简的力量降低除自\n己以外的宝可梦的攻击。", }, beadsOfRuin: { name: "灾祸之玉", - description: "以能呼唤灾厄的勾玉的力量\n降低除自己以外的宝可梦的\n特防。", + description: "以能呼唤灾厄的勾玉的力量降低除\n自己以外的宝可梦的特防。", }, orichalcumPulse: { name: "绯红脉动", - description: "出场时,会将天气变为晴朗\n。日照强烈时,会通过古代\n的脉动升高攻击。", + description: "出场时,会将天气变为晴朗。日照\n强烈时,会通过古代的脉动升高攻\n击。", }, hadronEngine: { name: "强子引擎", - description: "出场时,会布下电气场地。\n处于电气场地时,会通过未\n来的机关升高特攻。", + description: "出场时,会布下电气场地。处于电\n气场地时,会通过未来的机关升高\n特攻。", }, opportunist: { name: "跟风", - description: "对手的能力提高时,自己也\n会趁机同样地提高能力。", + description: "对手的能力提高时,自己也会趁机\n同样地提高能力。", }, cudChew: { name: "反刍", - description: "吃了树果后,会在下一回合\n结束时从胃反刍出来再吃1\n次。", + description: "吃了树果后,会在下一回合结束时\n从胃反刍出来再吃1次。", }, sharpness: { name: "锋锐", @@ -1171,74 +1171,74 @@ export const ability: AbilityTranslationEntries = { }, supremeOverlord: { name: "大将", - description: "出场时,攻击和特攻会按照\n目前被打倒的同伴数量逐渐\n提升,被打倒越多,提升越\n多。", + description: "出场时,攻击和特攻会按照目前被\n打倒的同伴数量逐渐提升,被打倒\n越多,提升越多。", }, costar: { name: "同台共演", - description: "出场时,复制同伴的能力变\n化。", + description: "出场时,复制同伴的能力变化。", }, toxicDebris: { name: "毒满地", - description: "受到物理招式的伤害时,会\n在对手脚下散布毒菱。", + description: "受到物理招式的伤害时,会在对手\n脚下散布毒菱。", }, armorTail: { name: "尾甲", - description: "包裹头部的神秘尾巴使对手\n无法对我方使出先制招式。", + description: "包裹头部的神秘尾巴使对手无法对\n我方使出先制招式。", }, earthEater: { name: "食土", - description: "受到地面属性的招式攻击时\n,不会受到伤害,而是会得\n到回复。", + description: "受到地面属性的招式攻击时,不会\n受到伤害,而是会得到回复。", }, myceliumMight: { name: "菌丝之力", - description: "使出变化招式时,虽然行动\n必定会变慢,但能不受对手\n的特性妨碍。", + description: "使出变化招式时,虽然行动必定会\n变慢,但能不受对手的特性妨碍。", }, mindsEye: { name: "心眼", - description: "一般属性和格斗属性的招式\n可以击中幽灵属性的宝可梦。\n无视对手的闪避率的变化,\n且命中率不会被降低。", + description: "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。无视对手的\n闪避率的变化,且命中率不会被降\n低。", }, supersweetSyrup: { name: "甘露之蜜", - description: "首次出场时,会散发出甜腻\n的蜜的香味来降低对手的闪\n避率。", + description: "首次出场时,会散发出甜腻的蜜的\n香味来降低对手的闪避率。", }, hospitality: { name: "款待", - description: "出场时款待同伴,回复其少\n量HP。", + description: "出场时款待同伴,回复其少量HP\n。", }, toxicChain: { name: "毒锁链", - description: "凭借含有毒素的锁链的力量,\n有时能让被招式击中的对\n手陷入剧毒状态。", + description: "凭借含有毒素的锁链的力量,有时\n能让被招式击中的对手陷入剧毒状\n态。", }, embodyAspectTeal: { name: "面影辉映", - description: "将回忆映于心中,让碧草面\n具发出光辉,提高自己的速\n度。", + description: "将回忆映于心中,让碧草面具发出\n光辉,提高自己的速度。", }, embodyAspectWellspring: { name: "面影辉映", - description: "将回忆映于心中,让水井面\n具发出光辉,提高自己的特\n防。", + description: "将回忆映于心中,让水井面具发出\n光辉,提高自己的特防。", }, embodyAspectHearthflame: { name: "面影辉映", - description: "将回忆映于心中,让火灶面\n具发出光辉,提高自己的攻\n击。", + description: "将回忆映于心中,让火灶面具发出\n光辉,提高自己的攻击。", }, embodyAspectCornerstone: { name: "面影辉映", - description: "将回忆映于心中,让础石面\n具发出光辉,提高自己的防\n御。", + description: "将回忆映于心中,让础石面具发出\n光辉,提高自己的防御。", }, teraShift: { name: "太晶变形", - description: "出场时,会吸收周围的能量\n,变为太晶形态。", + description: "出场时,会吸收周围的能量,变为\n太晶形态。", }, teraShell: { name: "太晶甲壳", - description: "甲壳蕴藏着全部属性的力量\n,会将自己HP全满时受到\n的伤害全都变为效果不好。", + description: "甲壳蕴藏着全部属性的力量,会将\n自己HP全满时受到的伤害全都变\n为效果不好。", }, teraformZero: { name: "归零化境", - description: "太乐巴戈斯变为星晶形态时\n,蕴藏在它身上的力量会将\n天气和场地的影响全部归零。", + description: "太乐巴戈斯变为星晶形态时,蕴藏\n在它身上的力量会将天气和场地的\n影响全部归零。", }, poisonPuppeteer: { name: "毒傀儡", - description: "因桃歹郎的招式而陷入中毒\n状态的对手同时也会陷入混\n乱状态。", + description: "因桃歹郎的招式而陷入中毒状态的\n对手同时也会陷入混乱状态。", }, } as const; diff --git a/src/locales/zh_CN/achv.ts b/src/locales/zh_CN/achv.ts index 63ccc97058a..486ff3cc02b 100644 --- a/src/locales/zh_CN/achv.ts +++ b/src/locales/zh_CN/achv.ts @@ -127,7 +127,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "CATCH_SUB_LEGENDARY": { name: "二级传说", - description: "捕捉一只准传说宝可梦", + description: "捕捉一只二级传说宝可梦", }, "CATCH_LEGENDARY": { name: "传说", diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index 09bcb5b1c3d..ff2e90a2c59 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -4,128 +4,135 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出现了。", "trainerAppeared": "{{trainerName}}\n想要和你对战!", "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", - "trainerSendOut": "{{trainerName}} 派出了\n{{pokemonName}}!", - "singleWildAppeared": "一只野生 {{pokemonName}} 出现了!", - "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出现了!", - "playerComeBack": "回来吧, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", - "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了\n{{pokemonName}}!", + "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", + "singleWildAppeared": "一只野生的{{pokemonName}}出现了!", + "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出现了!", + "playerComeBack": "回来吧,{{pokemonName}}!", + "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!", + "playerGo": "去吧!{{pokemonName}}!", + "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!", "switchQuestion": "要更换\n{{pokemonName}}吗?", "trainerDefeated": "你击败了\n{{trainerName}}!", "moneyWon": "你赢得了\n₽{{moneyAmount}}!", - "pokemonCaught": "{{pokemonName}} 被抓住了!", - "partyFull": "你的队伍已满员.是否放生其他宝可梦\n为 {{pokemonName}} 腾出空间?", + "moneyPickedUp": "捡到了 ₽{{moneyAmount}}!", + "pokemonCaught": "{{pokemonName}}被抓住了!", + "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!", + "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", "pokemon": "宝可梦", "sendOutPokemon": "上吧!\n{{pokemonName}}!", "hitResultCriticalHit": "击中了要害!", "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "对 {{pokemonName}} 没有效果!!", + "hitResultNoEffect": "对{{pokemonName}}没有效果!!", "hitResultOneHitKO": "一击必杀!", "attackFailed": "但是失败了!", - "attackHitsCount": "击中 {{count}} 次!", - "expGain": "{{pokemonName}} 获得了 {{exp}} 经验值!", - "levelUp": "{{pokemonName}} 升级到 Lv.{{level}}!", + "attackMissed": "没有命中{{pokemonNameWithAffix}}!", + "attackHitsCount": "击中{{count}}次!", + "rewardGain": "你获得了\n{{modifierName}}!", + "expGain": "{{pokemonName}}获得了 {{exp}} 点经验值!", + "levelUp": "{{pokemonName}}升级到 Lv.{{level}}!", "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", - "learnMovePrompt": "{{pokemonName}} 想要学习 {{moveName}}。", - "learnMoveLimitReached": "但是,{{pokemonName}} 已经学会了\n四个技能", - "learnMoveReplaceQuestion": "要忘记一个技能并学习 {{moveName}} 吗?", - "learnMoveStopTeaching": "不再尝试学习 {{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}} 没有学会 {{moveName}}。", + "learnMovePrompt": "{{pokemonName}}想要学习{{moveName}}。", + "learnMoveLimitReached": "但是,{{pokemonName}}已经学会了\n四个技能", + "learnMoveReplaceQuestion": "要忘记一个技能并学习{{moveName}}吗?", + "learnMoveStopTeaching": "不再尝试学习{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}}没有学会{{moveName}}。", "learnMoveForgetQuestion": "要忘记哪个技能?", - "learnMoveForgetSuccess": "{{pokemonName}} 忘记了\n如何使用 {{moveName}}。", + "learnMoveForgetSuccess": "{{pokemonName}}忘记了\n如何使用{{moveName}}。", "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!", - "learnMoveAnd": "然后...", - "levelCapUp": "等级上限提升到 {{levelCap}}!", - "moveNotImplemented": "{{moveName}} 尚未实装,无法选择。", - "moveNoPP": "这个技能的 PP 用完了", - "moveDisabled": "{{moveName}} 被禁用!", + "learnMoveAnd": "然后……", + "levelCapUp": "等级上限提升到{{levelCap}}!", + "moveNotImplemented": "{{moveName}}尚未实装,无法选择。", + "moveNoPP": "这个技能的PP用完了", + "moveDisabled": "{{moveName}}被禁用!", "noPokeballForce": "一股无形的力量阻止了你使用精灵球。", "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", - "noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先\n削弱它!", + "noPokeballStrong": "目标宝可梦太强了,无法捕捉!\n你需要先削弱它!", "noEscapeForce": "一股无形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能从训练家战斗中逃跑!", - "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", - "runAwaySuccess": "你成功逃脱了!", - "runAwayCannotEscape": "你无法逃脱!", + "noEscapeTrainer": "你不能从与训练家的战斗中逃跑!", + "noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}!", + "runAwaySuccess": "成功逃走了!", + "runAwayCannotEscape": "无法逃走!", "escapeVerbSwitch": "切换", "escapeVerbFlee": "逃跑", - "notDisabled": "{{moveName}} 不再被禁用!", + "notDisabled": "{{moveName}}不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}的体力恢复了。", + "hpIsFull": "{{pokemonName}}的体力已满!", "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", - "ivScannerUseQuestion": "对 {{pokemonName}} 使用个体值扫描仪?", - "wildPokemonWithAffix": "野生的 {{pokemonName}}", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", + "wildPokemonWithAffix": "野生的{{pokemonName}}", "foePokemonWithAffix": "对手 {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!", - "drainMessage": "{{pokemonName}} 吸取了体力!", - "regainHealth": "{{pokemonName}} 回复了体力!", - "fainted": "{{pokemonNameWithAffix}} 倒下了!", - "statRose": "提高了!", - "statSharplyRose": "大幅提高了!", - "statRoseDrastically": "极大幅提高了!", - "statWontGoAnyHigher": "已经无法再提高了!", - "statFell": "降低了!", - "statHarshlyFell": "大幅降低了!", - "statSeverelyFell": "极大幅降低了!", - "statWontGoAnyLower": "已经无法再降低了!", - "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}点!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} 因为技能\n无法动弹!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} 不能逃跑!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} 摆脱了\n {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} 畏缩了!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} 混乱了!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} 的混乱\n解除了!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} 已经\n混乱了。", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} 正在\n混乱中!", - "battlerTagsConfusedLapseHurtItself": "不知所以地\n攻击了自己!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} 不再受到\n同命的影响", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和\n{{pokemonNameWithAffix2}} 同归于尽了!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} 对\n {{sourcePokemonName}}着迷了!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} 已经\n着迷了!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} 对\n{{sourcePokemonName}}着迷中!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不会着迷!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治愈了\n着迷状态!", - "battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}} 身上!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}用寄生种子\n回复了体力!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}的寄生种子\n被乌泥浆吸干了!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} 被恶梦缠身!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} 已经被恶梦缠身!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} 正被恶梦缠身!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} 接受了再来一次!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}} 的再来一次\n状态解除了!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} 摆出了帮助\n {{pokemonName}} 的架势!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} 用扎根回复了体力!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} 扎根了!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} 用水流环\n包裹了自己!", - "battlerTagsAquaRingLapse": "{{moveName}} 回复了\n{{pokemonName}}的体力!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} 产生睡意了!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} 受到了\n {{moveName}}的伤害!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} 被\n{{sourcePokemonName}}的 {{moveName}}紧紧束缚住了!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} 被\n{{sourcePokemonName}}绑紧了!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} 被困在了\n旋涡之中!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} 用贝壳夹住了\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} 被\nby {{moveName}}困住了!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} 被困在了\n熔岩旋涡之中!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} 被捕兽夹\n困住了!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} 困住了\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} 受到了 \n{{sourcePokemonNameWithAffix}} 的死缠烂打!", + "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!", + "drainMessage": "{{pokemonName}}\n吸取了体力!", + "regainHealth": "{{pokemonName}}\n回复了体力!", + "fainted": "{{pokemonNameWithAffix}}\n倒下了!", + "statRose": "{{pokemonNameWithAffix}}\n的{{stats}}提高了!", + "statSharplyRose": "{{pokemonNameWithAffix}}\n的{{stats}}大幅提高了!", + "statRoseDrastically": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅提高了!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再提高了!", + "statFell": "{{pokemonNameWithAffix}}\n的{{stats}}降低了!", + "statHarshlyFell": "{{pokemonNameWithAffix}}\n的{{stats}}大幅降低了!", + "statSeverelyFell": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅降低了!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再降低了!", + "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}点!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了,无法使出招式!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中!", + "battlerTagsConfusedLapseHurtItself": "不知所以地攻击了自己!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态!", + "battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}\n被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}\n被困在了熔岩风暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}\n被捕兽夹困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了\n{{sourcePokemonNameWithAffix}}的死缠烂打!", "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\n在攻击中\n保护了自己!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} 摆出了\n挺住攻击的架势!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} 挺住了攻击!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} 挺住了攻击!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的\n灭亡计时变成 {{turnCount}} 了!", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} 正在偷懒!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\n在攻击中保护了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}\n摆出了挺住攻击的架势!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}} 的 {{statName}}\n升高了!", - "battlerTagsHighestStatBoostOnRemove": " {{pokemonNameWithAffix}} 的\n{{abilityName}}效果解除了!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} \n现在干劲十足!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} \n如释重负似地放松了下来。", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了盐腌状态!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了 {{moveName}} 的伤害!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} 削减了自己的体力,\n并诅咒了 {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} 正受到诅咒!" + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!" } as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts new file mode 100644 index 00000000000..b582bc6a2d0 --- /dev/null +++ b/src/locales/zh_CN/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "BGM: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "黑2白2「决战!关都冠军」", + "battle_johto_champion": "黑2白2「决战!城都冠军」", + "battle_hoenn_champion": "黑2白2「决战!丰缘冠军」", + "battle_sinnoh_champion": "黑2白2「决战!神奥冠军」", + "battle_champion_alder": "黑白「决战!合众冠军」", + "battle_champion_iris": "黑2白2「决战!合众冠军」", + "battle_kalos_champion": "XY「决战!卡洛斯冠军」", + "battle_alola_champion": "究极日月「顶上决战!」", + "battle_galar_champion": "剑盾「决战!伽勒尔冠军」", + "battle_champion_geeta": "朱紫「决战!帕底亚首席也慈」", + "battle_champion_nemona": "朱紫「决战!帕底亚冠军妮莫」", + "battle_champion_kieran": "朱紫「决战!蓝莓学园冠军乌栗」", + "battle_hoenn_elite": "Ω红宝石α蓝宝石 「战斗!丰缘四天王」", + "battle_unova_elite": "黑白 「战斗!合众四天王」", + "battle_kalos_elite": "XY「战斗!卡洛斯四天王」", + "battle_alola_elite": "日月「战斗!阿罗拉四天王」", + "battle_galar_elite": "剑盾「联盟锦标赛」", + "battle_paldea_elite": "朱紫「战斗!帕底亚四天王」", + "battle_bb_elite": "朱紫「战斗!蓝之圆盘四天王」", + "battle_final_encounter": "探险队DX 「裂空座的领域」", + "battle_final": "黑白「战斗!魁奇思」", + "battle_kanto_gym": "黑2白2「战斗!关都道馆主」", + "battle_johto_gym": "黑2白2「战斗!城都道馆主」", + "battle_hoenn_gym": "黑2白2「战斗!合众道馆主」", + "battle_sinnoh_gym": "黑2白2「战斗!神奥道馆主」", + "battle_unova_gym": "黑白「战斗!合众道馆主」", + "battle_kalos_gym": "XY「战斗!卡洛斯道馆主」", + "battle_galar_gym": "剑盾「战斗!伽勒尔道馆主」", + "battle_paldea_gym": "朱紫「战斗!帕底亚道馆主」", + "battle_legendary_kanto": "XY「战斗!传说宝可梦(关都)」", + "battle_legendary_raikou": "心金魂银「战斗!雷公」", + "battle_legendary_entei": "心金魂银「战斗!炎帝」", + "battle_legendary_suicune": "心金魂银「战斗!水君」", + "battle_legendary_lugia": "心金魂银「战斗!洛奇亚」", + "battle_legendary_ho_oh": "心金魂银「战斗!凤王」", + "battle_legendary_regis_g5": "黑2白2「战斗!传说中的巨人」", + "battle_legendary_regis_g6": "Ω红宝石α蓝宝石「战斗!传说中的巨人」", + "battle_legendary_gro_kyo": "Ω红宝石α蓝宝石「战斗!原始回归」", + "battle_legendary_rayquaza": "Ω红宝石α蓝宝石「战斗!超古代宝可梦」", + "battle_legendary_deoxys": "Ω红宝石α蓝宝石「战斗!代欧奇希斯」", + "battle_legendary_lake_trio": "Ω红宝石α蓝宝石「战斗!由克希・艾姆利多・亚克诺姆」", + "battle_legendary_sinnoh": "Ω红宝石α蓝宝石「战斗!传说的宝可梦」", + "battle_legendary_dia_pal": "Ω红宝石α蓝宝石「战斗!帝牙卢卡・帕路奇亚」", + "battle_legendary_giratina": "Ω红宝石α蓝宝石「战斗!骑拉帝纳」", + "battle_legendary_arceus": "心金魂银「阿尔宙斯」", + "battle_legendary_unova": "黑白「战斗!传说的宝可梦」", + "battle_legendary_kyurem": "黑白「战斗!酋雷姆」", + "battle_legendary_res_zek": "黑白「战斗!莱希拉姆・捷克罗姆」", + "battle_legendary_xern_yvel": "XY「战斗!哲尔尼亚斯・伊裴尔塔尔」", + "battle_legendary_tapu": "日月「战斗!卡璞」", + "battle_legendary_sol_lun": "日月「战斗!露奈雅拉・索尔迦雷欧」", + "battle_legendary_ub": "日月「战斗!究极异兽」", + "battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」", + "battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」", + "battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」", + "battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」", + "battle_legendary_calyrex": "剑盾「战斗!蕾冠王」", + "battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」", + "battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」", + "battle_legendary_kor_mir": "朱紫「战斗!第零区的宝可梦2」", + "battle_legendary_loyal_three": "朱紫「战斗!宝伴」", + "battle_legendary_ogerpon": "朱紫「战斗!厄鬼椪」", + "battle_legendary_terapagos": "朱紫「战斗!太乐巴戈斯」", + "battle_legendary_pecharunt": "朱紫「战斗!桃歹郎」", + "battle_rival": "黑白「战斗!黑连・贝尔」", + "battle_rival_2": "黑白「战斗!N」", + "battle_rival_3": "黑白「决战!N」", + "battle_trainer": "黑白「战斗!训练师」", + "battle_wild": "黑白「战斗!野生宝可梦」", + "battle_wild_strong": "黑白「战斗!强大野生宝可梦」", + "end_summit": "探险队DX 「天空之柱 顶层」", + "battle_rocket_grunt": "心金魂银「战斗!火箭队」", + "battle_aqua_magma_grunt": "Ω红宝石α蓝宝石「战斗!熔岩队・海洋队」", + "battle_galactic_grunt": "晶灿钻石·明亮珍珠「战斗!银河队」", + "battle_plasma_grunt": "黑白「战斗!等离子团」", + "battle_flare_grunt": "XY「战斗!闪焰队」", + "battle_rocket_boss": "究极日月「战斗!坂木」", + "battle_aqua_magma_boss": "Ω红宝石α蓝宝石「战斗!水梧桐・赤焰松」", + "battle_galactic_boss": "晶灿钻石·明亮珍珠「战斗!赤日」", + "battle_plasma_boss": "黑2白2「战斗!魁奇思」", + "battle_flare_boss": "XY「战斗!弗拉达利」", + + // Biome Music + "abyss": "空之探险队「黑暗小丘」", + "badlands": "空之探险队「枯竭之谷」", + "beach": "空之探险队「潮湿岩地」", + "cave": "空之探险队「天空顶端(洞窟)」", + "construction_site": "空之探险队「幻影石室」", + "desert": "空之探险队「北方沙漠」", + "dojo": "空之探险队「嘎啦嘎啦道场」", + "end": "探险队DX「天空之柱」", + "factory": "空之探险队「隐藏遗迹」", + "fairy_cave": "空之探险队「星之洞窟」", + "forest": "空之探险队「黑暗森林」", + "grass": "空之探险队「苹果森林」", + "graveyard": "空之探险队「神秘森林」", + "ice_cave": "空之探险队「大冰山」", + "island": "空之探险队「沿岸岩地」", + "jungle": "Lmz - 丛林", // The composer thinks about a more creative name + "laboratory": "Firel - 研究所", // The composer thinks about a more creative name + "lake": "空之探险队「水晶洞窟」", + "meadow": "空之探险队「天空顶端(森林)」", + "metropolis": "Firel - 城市", // The composer thinks about a more creative name + "mountain": "空之探险队「角山」", + "plains": "空之探险队「天空顶端(草原)」", + "power_plant": "空之探险队「电气平原 深处」", + "ruins": "空之探险队「封印岩地 深处」", + "sea": "空之探险队「石滩洞窟」", + "seabed": "Firel - 海底", // The composer thinks about a more creative name + "slum": "空之探险队「天空顶端(岩场)」", + "snowy_forest": "空之探险队「天空顶端(雪山)」", + "space": "Firel - 太空", + "swamp": "空之探险队「封闭之海」", + "tall_grass": "空之探险队「浓雾森林」", + "temple": "空之探险队「守护洞穴」", + "town": "空之探险队「随机迷宫3」", + "volcano": "空之探险队「热水洞窟」", + "wasteland": "空之探险队「梦幻高原」", + + // Encounter + "encounter_ace_trainer": "黑白 「视线!精英训练师」", + "encounter_backpacker": "黑白 「视线!背包客」", + "encounter_clerk": "黑白 「视线!上班族」", + "encounter_cyclist": "黑白 「视线!自行车手」", + "encounter_lass": "黑白 「视线!迷你裙」", + "encounter_parasol_lady": "黑白 「视线!阳伞姐姐」", + "encounter_pokefan": "黑白 「视线!宝可梦爱好者」", + "encounter_psychic": "黑白 「视线!超能力者」", + "encounter_rich": "黑白 「视线!绅士」", + "encounter_rival": "黑白「黑连」", + "encounter_roughneck": "黑白 「视线!光头」", + "encounter_scientist": "黑白 「视线!科学家」", + "encounter_twins": "黑白 「视线!双胞胎」", + "encounter_youngster": "黑白 「视线!短裤小子」", + + // Other + "heal": "黑白「宝可梦回复」", + "menu": "空之探险队「欢迎来到宝可梦的世界」", + "title": "空之探险队「主题曲」", +} as const; diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index 697a97bda09..4c1b523ef16 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "适用挑战条件", - "points": "Bad Ideas", - "confirm_start": "要执行这些挑战吗?", - "singleGeneration.name": "单一世代", - "singleGeneration.value.0": "关闭", - "singleGeneration.desc.0": "你只能使用所选世代的宝可梦", - "singleGeneration.value.1": "第一世代", - "singleGeneration.desc.1": "你只能使用第一世代的宝可梦", - "singleGeneration.value.2": "第二世代", - "singleGeneration.desc.2": "你只能使用第二世代的宝可梦", - "singleGeneration.value.3": "第三世代", - "singleGeneration.desc.3": "你只能使用第三世代的宝可梦", - "singleGeneration.value.4": "第四世代", - "singleGeneration.desc.4": "你只能使用第四世代的宝可梦", - "singleGeneration.value.5": "第五世代", - "singleGeneration.desc.5": "你只能使用第五世代的宝可梦", - "singleGeneration.value.6": "第六世代", - "singleGeneration.desc.6": "你只能使用第六世代的宝可梦", - "singleGeneration.value.7": "第七世代", - "singleGeneration.desc.7": "你只能使用第七世代的宝可梦", - "singleGeneration.value.8": "第八世代", - "singleGeneration.desc.8": "你只能使用第八世代的宝可梦", - "singleGeneration.value.9": "第九世代", - "singleGeneration.desc.9": "你只能使用第九世代的宝可梦", - "singleType.name": "单属性", - "singleType.value.0": "关闭", - "singleType.desc.0": "你只能使用所选属性的宝可梦", - "singleType.value.1": "普通", - "singleType.desc.1": "你只能使用普通属性的宝可梦", - "singleType.value.2": "格斗", - "singleType.desc.2": "你只能使用格斗属性的宝可梦", - "singleType.value.3": "飞行", - "singleType.desc.3": "你只能使用飞行属性的宝可梦", - "singleType.value.4": "毒", - "singleType.desc.4": "你只能使用毒属性的宝可梦", - "singleType.value.5": "地面", - "singleType.desc.5": "你只能使用地面属性的宝可梦", - "singleType.value.6": "岩石", - "singleType.desc.6": "你只能使用岩石属性的宝可梦", - "singleType.value.7": "虫", - "singleType.desc.7": "你只能使用虫属性的宝可梦", - "singleType.value.8": "幽灵", - "singleType.desc.8": "你只能使用幽灵属性的宝可梦", - "singleType.value.9": "钢", - "singleType.desc.9": "你只能使用钢属性的宝可梦", - "singleType.value.10": "火", - "singleType.desc.10": "你只能使用火属性的宝可梦", - "singleType.value.11": "水", - "singleType.desc.11": "你只能使用水属性的宝可梦", - "singleType.value.12": "草", - "singleType.desc.12": "你只能使用草属性的宝可梦", - "singleType.value.13": "电", - "singleType.desc.13": "你只能使用电属性的宝可梦", - "singleType.value.14": "超能", - "singleType.desc.14": "你只能使用超能属性的宝可梦", - "singleType.value.15": "冰", - "singleType.desc.15": "你只能使用冰属性的宝可梦", - "singleType.value.16": "龙", - "singleType.desc.16": "你只能使用龙属性的宝可梦", - "singleType.value.17": "恶", - "singleType.desc.17": "你只能使用恶属性的宝可梦", - "singleType.value.18": "妖精", - "singleType.desc.18": "你只能使用妖精属性的宝可梦", + "illegalEvolution": "{{pokemon}}变成了\n不符合此挑战条件的宝可梦!", + "singleGeneration": { + "name": "单一世代", + "desc": "你只能使用第{{gen}}\n世代的宝可梦", + "desc_default": "你只能使用所选\n世代的宝可梦", + "gen_1": "一", + "gen_2": "二", + "gen_3": "三", + "gen_4": "四", + "gen_5": "五", + "gen_6": "六", + "gen_7": "七", + "gen_8": "八", + "gen_9": "九", + }, + "singleType": { + "name": "单属性", + "desc": "你只能使用{{type}}\n属性的宝可梦", + "desc_default": "你只能使用所选\n属性的宝可梦" + }, } as const; diff --git a/src/locales/zh_CN/common.ts b/src/locales/zh_CN/common.ts new file mode 100644 index 00000000000..7c2c73eb3c0 --- /dev/null +++ b/src/locales/zh_CN/common.ts @@ -0,0 +1,10 @@ +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 fdc54cb2be0..eaf7ba4cc09 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/zh_CN/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const zhCnConfig = { ability: ability, @@ -47,9 +52,11 @@ export const zhCnConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const zhCnConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const zhCnConfig = { 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 }; diff --git a/src/locales/zh_CN/dialogue.ts b/src/locales/zh_CN/dialogue.ts index b9bed8fe4c4..6afbcd71064 100644 --- a/src/locales/zh_CN/dialogue.ts +++ b/src/locales/zh_CN/dialogue.ts @@ -382,6 +382,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "好像是我晕船了…" }, }, + "rocket_grunt": { + "encounter": { + 1: "你要有麻烦了!" + }, + "victory": { + 1: "好讨厌的感觉啊!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "如果你挡在熔岩队路上,那就别指望我们手下留情!" + }, + "victory": { + 1: "哈?我输了?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!" + }, + "victory": { + 1: "你在开玩笑吧?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "别惹银河队!" + }, + "victory": { + 1: "停机了…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "异端不共戴天!" + }, + "victory": { + 1: "等离子子子子子子!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "时尚最重要!" + }, + "victory": { + 1: "未来一片黑暗啊…" + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "我不得不说,能来到这里,你的确很不简单!" + }, + "victory": { + 1: "什么!这不可能!" + }, + "defeat": { + 1: "记住我的话。无法衡量自己的力量,说明你还是个孩子。" + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "我的老伙计还需要我…你要挡我的路吗?" + }, + "victory": { + 1: "这怎么可能…?\n火箭队的梦想…就这么成为泡影了…" + }, + "defeat": { + 1: "火箭队会重生,而我会统治世界!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "我会亲手埋葬你,希望你能喜欢!" + }, + "victory": { + 1: "啊!你…很厉害…我落后了…一点…" + }, + "defeat": { + 1: "熔岩队必胜!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "你是我实现目标最后的障碍。\n准备好迎接我最强的一击吧!哈哈哈哈!" + }, + "victory": { + 1: "这…这不…呃" + }, + "defeat": { + 1: "现在…我要把这个星球变成人类的理想国度!" + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "我是海洋队的老大,所以,你的路大概走到头了。" + }, + "victory": { + 1: "下次再见吧。我会记住你的脸的。" + }, + "defeat": { + 1: "天才!我的队伍不会再退缩了!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "我等这一天很久了。\n这就是我的真实力量!" + }, + "victory": { + 1: "果然很强……啊!" + }, + "defeat": { + 1: "我会让这世界上的一切回归到最初的纯净状态!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "但在这之前,让我见识见识你那敢向银河队叫板的实力吧。" + }, + "victory": { + 1: "有意思,简直太有意思了。" + }, + "defeat": { + 1: "我要创造我的新世界…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "是啊,我和你还真是有缘呢。\n不过,这段孽缘…就让我在此斩断吧!" + }, + "victory": { + 1: "怎么可能!怎么可能!怎么可能!" + }, + "defeat": { + 1: "永别了。" + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "无论是谁做了什么!都无法阻止我!" + }, + "victory": { + 1: "怎么回事?我可是建立了等离子队的完美的人啊!\n是要改变世界的完美的统治者!" + }, + "defeat": { + 1: "我是坐拥世界的完美统治者!哇哈哈哈!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "来吧!让我看看你彻底绝望时的那张脸!" + }, + "victory": { + 1: "不!我的伟大目标!我要完全支配世界啊!" + }, + "defeat": { + 1: "酋雷姆!融合吧!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "你想要阻止我?在对战中展示给我看吧!" + }, + "victory": { + 1: "看来你的确是想要阻止我。但是,先等一下。" + }, + "defeat": { + 1: "宝可梦…不该存在。" + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "你我的未来…究竟哪个才正确,\n就让我们来问问各自的宝可梦吧!" + }, + "victory": { + 1: "哇啊啊啊!" + }, + "defeat": { + 1: "没有远见的蠢货会继续玷污这个美丽的世界。" + } + }, "brock": { "encounter": { 1: "我对岩石属性宝可梦的专精会击败你!来吧!", @@ -1444,10 +1624,10 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "让你亲身感受一下什么叫做猛烈的对战气息吧!", }, "victory": { - 1: "这次幸运之神对我微笑了,但是……$谁知道我下次会不会这么幸运。", + 1: "这次幸运之神对你微笑了,但是……$谁知道你下次还会不会这么幸运。", }, "defeat": { - 1: "那可真厉害!", + 1: "那挺厉害的吧!", } }, "blue": { @@ -1995,16 +2175,16 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "raihan_elite": { "encounter": { - 1: "风暴来临!你能挺过这场战斗吗!", - 2: "准备好面对风暴之眼!", + 1: "虽然没法打败丹帝夺冠,\n让我觉得很遗憾……$但是有你这家伙当对手,\b倒是也还不赖啊!", + 2: "准备好面对龙之风暴!", }, "victory": { - 1: "你战胜了风暴...难以置信!", - 2: "你完美地驾驭了风……打得好!", + 1: "你的气势就像暴风一样,\n连我都甘拜下风了!", + 2: "你完美地驾驭了我的风暴……打得好!", }, "defeat": { - 1: "又一场风暴袭来,又一场胜利!打得好!", - 2: "你被我的风暴卷入了!祝你下次好运!", + 1: "又一场龙之风暴袭来,又一场胜利!打得好!", + 2: "你被我的龙之风暴卷入了!祝你下次好运!", } }, "alder": { diff --git a/src/locales/zh_CN/egg.ts b/src/locales/zh_CN/egg.ts index 0ea464ca5a9..454cdb0af52 100644 --- a/src/locales/zh_CN/egg.ts +++ b/src/locales/zh_CN/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "你没有足够的兑换券!", "tooManyEggs": "你的蛋太多啦!", "pull": "次", - "pulls": "次" + "pulls": "次", + "sameSpeciesEgg": "{{species}}将会从蛋中孵化!", + "hatchFromTheEgg": "{{pokemonName}} 从蛋中孵化了!", + "eggMoveUnlock": "蛋招式已解锁: {{moveName}}", + "rareEggMoveUnlock": "稀有蛋招式已解锁: {{moveName}}", + "moveUPGacha": "蛋招式UP!", + "shinyUPGacha": "闪光UP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.ts index 39d4dbbfede..461f5bb9956 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Link Google", "unlinkGoogle": "Unlink Google", "cancel": "取消", - "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?" + "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。\n是否继续?", + "noEggs": "当前没有任何蛋\n正在孵化中!" } as const; diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index 006b285a5e2..b1b5b00d554 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "no": "否", "disclaimer": "免责声明", "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", + "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 52971fe08f3..539062875f1 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -17,7 +17,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonHpRestoreModifierType": { - description: "为一只宝可梦回复 {{restorePoints}} HP 或 {{restorePercent}}% HP,取较大值。", + description: "为一只宝可梦回复{{restorePoints}}HP或{{restorePercent}}%HP,取较大值。", extra: { "fully": "为一只宝可梦回复全部HP。", "fullyWithStatus": "为一只宝可梦回复全部HP并消除所有负面\n状态。", @@ -42,11 +42,11 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonPpUpModifierType": { - description: "为一只宝可梦的一个招式永久增加{{upPoints}}点\nPP每5点当前最大PP (最多3点)。", + description: "选择一只宝可梦的一个招式使用\n使其PP最大值提升基础的20% (最多3次)。", }, "PokemonNatureChangeModifierType": { name: "{{natureName}}薄荷", - description: "将一只宝可梦的性格改为{{natureName}}并为该宝可\n梦永久解锁该性格。", + description: "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。", }, "DoubleBattleChanceBoosterModifierType": { description: "接下来的{{battleCount}}场战斗是双打的概率翻倍。", @@ -64,16 +64,16 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "所有成员宝可梦等级提升1级。", }, "PokemonBaseStatBoosterModifierType": { - description: "增加持有者的{{statName}}10%,个体值越高堆叠\n上限越高。", + description: "增加10%持有者的{{statName}},\n个体值越高堆叠上限越高。", }, "AllPokemonFullHpRestoreModifierType": { description: "所有宝可梦完全回复HP。", }, "AllPokemonFullReviveModifierType": { - description: "复活所有濒死宝可梦,完全回复HP。", + description: "复活所有濒死的宝可梦,\n并完全回复HP。", }, "MoneyRewardModifierType": { - description: "获得{{moneyMultiplier}}金钱 (₽{{moneyAmount}})。", + description: "获得{{moneyMultiplier}}金钱(₽{{moneyAmount}})。", extra: { "small": "少量", "moderate": "中等", @@ -90,18 +90,18 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "每场战斗获得的好感度提升50%。", }, "PokemonMoveAccuracyBoosterModifierType": { - description: "招式命中率增加{{accuracyAmount}} (最大100)。", + description: "招式命中率增加{{accuracyAmount}}(最大100)。", }, "PokemonMultiHitModifierType": { - description: "攻击造成一次额外伤害,\n每堆叠一件会让攻击伤害\n衰减60/75/82.5%。", + description: "攻击以40/25/12.5%的伤害造成2/3/4次伤害", }, "TmModifierType": { - name: "招式学习器 {{moveId}} - {{moveName}}", + name: "招式学习器\n{{moveId}} - {{moveName}}", description: "教会一只宝可梦{{moveName}}。", }, "TmModifierTypeWithInfo": { - name: "招式学习器 {{moveId}} - {{moveName}}", - description: "教会一只宝可梦{{moveName}}\n(Hold C or Shift for more info)。", + name: "招式学习器\n{{moveId}} - {{moveName}}", + description: "教会一只宝可梦{{moveName}}\n(按住C或者Shift查看更多信息)。", }, "EvolutionItemModifierType": { description: "使某些宝可梦进化。", @@ -114,29 +114,29 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TerastallizeModifierType": { name: "{{teraType}}太晶碎块", - description: "持有者获得{{teraType}}太晶化10场战斗。", + description: "持有者获得{{teraType}}太晶化,\n持续10场战斗。", }, "ContactHeldItemTransferChanceModifierType": { - description: "攻击时{{chancePercent}}%概率偷取对手物品。", + description: "攻击时{{chancePercent}}%概率\n偷取对手物品。", }, "TurnHeldItemTransferModifierType": { - description: "持有者每回合从对手那里获得一个持有的物品。", + description: "持有者每回合从对手那里\n获得一个持有的物品。", }, "EnemyAttackStatusEffectChanceModifierType": { description: "攻击时{{chancePercent}}%概率造成{{statusEffect}}。", }, "EnemyEndureChanceModifierType": { - description: "敌方增加{{chancePercent}}%的概率在本回合不会倒下。", + description: "敌方增加{{chancePercent}}%的概率\n在本回合不会倒下。", }, "RARE_CANDY": { name: "神奇糖果" }, "RARER_CANDY": { name: "超神奇糖果" }, - "MEGA_BRACELET": { name: "超级手镯", description: "能让携带着超级石战斗的宝可梦进行\n超级进化。" }, - "DYNAMAX_BAND": { name: "极巨腕带", description: "能让携带着极巨菇菇战斗的宝可梦进行\n极巨化。" }, - "TERA_ORB": { name: "太晶珠", description: "能让携带着太晶碎块战斗的宝可梦进行\n太晶化。" }, + "MEGA_BRACELET": { name: "MEGA手镯", description: "能让携带着MEGA石战斗的宝可梦\n进行MEGA进化。" }, + "DYNAMAX_BAND": { name: "极巨腕带", description: "能让携带着极巨菇菇战斗的宝可梦\n进行超极巨化。" }, + "TERA_ORB": { name: "太晶珠", description: "能让携带着太晶碎块战斗的宝可梦\n进行太晶化。" }, - "MAP": { name: "地图", description: "允许你在切换宝可梦群落时选择目的地。"}, + "MAP": { name: "地图", description: "有概率允许你在切换地区时\n选择目的地。"}, "POTION": { name: "伤药" }, "SUPER_POTION": { name: "好伤药" }, @@ -151,7 +151,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "圣灰" }, - "REVIVER_SEED": { name: "复活种子", description: "恢复1只濒死宝可梦的HP至1/2。" }, + "REVIVER_SEED": { name: "复活种子", description: "受到技能攻击伤害濒死时,\n恢复该宝可梦的HP至1/2。" }, "ETHER": { name: "PP单项小补剂" }, "MAX_ETHER": { name: "PP单项全补剂" }, @@ -169,7 +169,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "MEMORY_MUSHROOM": { name: "回忆蘑菇", description: "回忆一个宝可梦已经遗忘的招式。" }, "EXP_SHARE": { name: "学习装置", description: "未参加对战的宝可梦获得20%的经验值。" }, - "EXP_BALANCE": { name: "均衡型学习装置", description: "队伍中的低级宝可梦获得更多经验值。" }, + "EXP_BALANCE": { name: "均衡型学习装置", description: "经验值会更多分给队伍中等级最低的宝可梦。" }, "OVAL_CHARM": { name: "圆形护符", description: "当多只宝可梦参与战斗,分别获得总经验值\n10%的额外经验值。" }, @@ -182,17 +182,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, - "SOUL_DEW": { name: "心之水滴", description: "增加宝可梦性格影响10% (加算)。" }, + "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, + + "SOUL_DEW": { name: "心之水滴", description: "增加10%宝可梦性格对数值的影响 (加算)。" }, "NUGGET": { name: "金珠" }, "BIG_NUGGET": { name: "巨大金珠" }, "RELIC_GOLD": { name: "古代金币" }, - "AMULET_COIN": { name: "护符金币", description: "金钱奖励增加20%。" }, + "AMULET_COIN": { name: "护符金币", description: "获得的金钱增加20%。" }, "GOLDEN_PUNCH": { name: "黄金拳头", description: "将50%造成的伤害转换为金钱。" }, - "COIN_CASE": { name: "代币盒", description: "每十场战斗, 获得自己金钱10%的利息。" }, + "COIN_CASE": { name: "代币盒", description: "每10场战斗, 获得自己金钱10%的利息。" }, - "LOCK_CAPSULE": { name: "上锁的容器", description: "允许在刷新物品时锁定物品稀有度。" }, + "LOCK_CAPSULE": { name: "上锁的容器", description: "允许在商店中刷新物品时,\n锁定物品的稀有度。" }, "GRIP_CLAW": { name: "紧缠钩爪" }, "WIDE_LENS": { name: "广角镜" }, @@ -204,14 +206,14 @@ export const modifierType: ModifierTypeTranslationEntries = { "BERRY_POUCH": { name: "树果袋", description: "使用树果时有30%的几率不会消耗树果。" }, - "FOCUS_BAND": { name: "气势头带", description: "携带该道具的宝可梦有10%几率在受到\n攻击而将陷入濒死状态时,保留1点HP不陷入濒死状态。" }, + "FOCUS_BAND": { name: "气势头带", description: "携带该道具的宝可梦有10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。" }, "QUICK_CLAW": { name: "先制之爪", description: "有10%的几率无视速度优先使出招式\n(先制技能优先)。" }, - "KINGS_ROCK": { name: "王者之证", description: "携带该道具的宝可梦使用任意原本不会造成\n畏缩状态的攻击招式并造成伤害时,有\n10%几率使目标陷入畏缩状态。" }, + "KINGS_ROCK": { name: "王者之证", description: "使用任意原本不会造成畏缩状态的攻击,\n有10%几率使目标陷入畏缩状态。" }, - "LEFTOVERS": { name: "吃剩的东西", description: "携带该道具的宝可梦在每个回合结束时恢复\n最大HP的1/16。" }, - "SHELL_BELL": { name: "贝壳之铃", description: "携带该道具的宝可梦在攻击对方成功造成伤\n害时,携带者的HP会恢复其所造成伤害\n的1/8。" }, + "LEFTOVERS": { name: "吃剩的东西", description: "携带后,在每个回合结束时恢复\n最大HP的1/16。" }, + "SHELL_BELL": { name: "贝壳之铃", description: "携带后,在攻击对方成功造成伤害时,\n携带者的HP会恢复其所造成伤害的1/8。" }, "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。携带后,在战斗时会变成剧毒状态。" }, "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, @@ -221,13 +223,13 @@ export const modifierType: ModifierTypeTranslationEntries = { "SHINY_CHARM": { name: "闪耀护符", description: "显著增加野生宝可梦的闪光概率。" }, "ABILITY_CHARM": { name: "特性护符", description: "显著增加野生宝可梦有隐藏特性的概率。" }, - "IV_SCANNER": { name: "个体值探测器", description: "允许扫描野生宝可梦的个体值。可叠加,每多拥有一个多显示\n2项个体值. 最好的个体值优先显示。" }, + "IV_SCANNER": { name: "个体值探测器", description: "允许扫描野生宝可梦的个体值。每多拥有一个\n多显示两项个体值,优先显示最高项。" }, "DNA_SPLICERS": { name: "基因之楔" }, "MINI_BLACK_HOLE": { name: "迷你黑洞" }, - "GOLDEN_POKEBALL": { name: "黄金精灵球", description: "在每场战斗结束后增加一个额外物品选项。" }, + "GOLDEN_POKEBALL": { name: "黄金精灵球", description: "在每场战斗结束后,增加一个额外物品选项。" }, "ENEMY_DAMAGE_BOOSTER": { name: "伤害硬币", description: "造成5%额外伤害(乘算)。" }, "ENEMY_DAMAGE_REDUCTION": { name: "防御硬币", description: "受到2.5%更少伤害(乘算)。" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "忍受硬币" }, "ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率。" }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会提高的神奇之球。" }, + "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, + "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。非常细腻坚硬。" }, + "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。非常细腻坚硬。" } + }, TempBattleStatBoosterItem: { "x_attack": "力量强化", "x_defense": "防御强化", diff --git a/src/locales/zh_CN/modifier.ts b/src/locales/zh_CN/modifier.ts new file mode 100644 index 00000000000..fabd17465b2 --- /dev/null +++ b/src/locales/zh_CN/modifier.ts @@ -0,0 +1,12 @@ +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恢复了活力!", + "moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!", + "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", + "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回复了一些体力!", +} as const; diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index e51addd0206..6513f3bcfc7 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: "三连踢", @@ -671,63 +671,63 @@ export const move: MoveTranslationEntries = { }, "thief": { name: "小偷", - effect: "攻击的同时盗取道具。当自\n己携带道具时,不会去盗取", + effect: "攻击的同时盗取对手的道具。", }, "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: "将凝缩在体内的能量从核心放出进行攻击", }, "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..4cb2f816b2e 100644 --- a/src/locales/zh_CN/party-ui-handler.ts +++ b/src/locales/zh_CN/party-ui-handler.ts @@ -6,5 +6,48 @@ export const partyUiHandler: SimpleTranslationEntries = { "CANCEL": "取消", "RELEASE": "放生", "APPLY": "应用", - "TEACH": "教授" + "TEACH": "教授", + "SPLICE": "融合", + "UNSPLICE": "分离", + "ACTIVATE": "激活", + "DEACTIVATE": "解除", + "TRANSFER": "交换", + "ALL": "全部道具", + "PASS_BATON": "接棒", + "UNPAUSE_EVOLUTION": "解除进化暂停", + "REVIVE": "复活", + + "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-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/settings.ts b/src/locales/zh_CN/settings.ts index f37a59613f5..3ca6cb435c6 100644 --- a/src/locales/zh_CN/settings.ts +++ b/src/locales/zh_CN/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (备用)", "mute": "静音", "controller": "控制器", - "gamepadSupport": "手柄支持" + "gamepadSupport": "手柄支持", + "showBgmBar": "显示音乐名称", } as const; diff --git a/src/locales/zh_CN/splash-messages.ts b/src/locales/zh_CN/splash-messages.ts index dfa5cc4529d..35551cf1163 100644 --- a/src/locales/zh_CN/splash-messages.ts +++ b/src/locales/zh_CN/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "Battles Won!", - "joinTheDiscord": "Join the Discord!", - "infiniteLevels": "Infinite Levels!", - "everythingStacks": "Everything Stacks!", - "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 Biomes!", - "openSource": "Open Source!", - "playWithSpeed": "Play with 5x Speed!", - "liveBugTesting": "Live Bug Testing!", - "heavyInfluence": "Heavy RoR2 Influence!", - "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", - "nowWithMoreSalt": "Now with 33% More Salt!", - "infiniteFusionAtHome": "Infinite Fusion at Home!", - "brokenEggMoves": "Broken Egg Moves!", - "magnificent": "Magnificent!", - "mubstitute": "Mubstitute!", - "thatsCrazy": "That\'s Crazy!", - "oranceJuice": "Orance Juice!", - "questionableBalancing": "Questionable Balancing!", - "coolShaders": "Cool Shaders!", - "aiFree": "AI-Free!", - "suddenDifficultySpikes": "Sudden Difficulty Spikes!", - "basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!", - "moreAddictiveThanIntended": "More Addictive than Intended!", - "mostlyConsistentSeeds": "Mostly Consistent Seeds!", - "achievementPointsDontDoAnything": "Achievement Points Don\'t Do Anything!", - "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", - "dontTalkAboutTheManaphyEggIncident": "Don\'t Talk About the Manaphy Egg Incident!", - "alsoTryPokengine": "Also Try Pokéngine!", - "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", - "alsoTryRadicalRed": "Also Try Radical Red!", - "eeveeExpo": "Eevee Expo!", - "ynoproject": "YNOproject!", + "battlesWon": "场胜利!", + "joinTheDiscord": "加入Discord!", + "infiniteLevels": "等级无限!", + "everythingStacks": "道具全部叠加!", + "optionalSaveScumming": "可用SL大法!", + "biomes": "35种地区!", + "openSource": "开源!", + "playWithSpeed": "请五倍速游玩!", + "liveBugTesting": "随时修复BUG!", + "heavyInfluence": "深受雨中冒险2影响!", + "pokemonRiskAndPokemonRain": "雨中宝可梦冒险!", + "nowWithMoreSalt": "增加33%的盐!", + "infiniteFusionAtHome": "无限融合家庭版!", + "brokenEggMoves": "超模的蛋招式!", + "magnificent": "华丽!", + "mubstitute": "替身!", + "thatsCrazy": "疯狂!", + "oranceJuice": "橙汁!", + "questionableBalancing": "游戏平衡性存疑!", + "coolShaders": "炫酷的配色!", + "aiFree": "不含AI!", + "suddenDifficultySpikes": "难度会突然飙升!", + "basedOnAnUnfinishedFlashGame": "基于未完成的Flash游戏!", + "moreAddictiveThanIntended": "比你想象的更上瘾!", + "mostlyConsistentSeeds": "随机数种子基本固定!", + "achievementPointsDontDoAnything": "成就点数没有任何用处!", + "youDoNotStartAtLevel": "你不能第一关就改个2000级!", + "dontTalkAboutTheManaphyEggIncident": "别再提玛纳霏蛋事件了!", + "alsoTryPokengine": "也玩玩看Pokéngine!", + "alsoTryEmeraldRogue": "也玩玩看绿宝石肉鸽!", + "alsoTryRadicalRed": "也玩玩看激进红!", + "eeveeExpo": "伊布博览会!", + "ynoproject": "Yume Nikki 页游项目!", } as const; diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index 669b8a5bb80..059358078f4 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -21,9 +21,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "被动:", "nature": "性格:", "eggMoves": "蛋招式", - "start": "开始", "addToParty": "加入队伍", - "toggleIVs": "切换个体值", + "toggleIVs": "显示个体", "manageMoves": "管理招式", "manageNature": "管理性格", "useCandies": "使用糖果", @@ -32,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "选择要替换成的招式", "unlockPassive": "解锁被动", "reduceCost": "降低花费", + "sameSpeciesEgg": "兑换一颗蛋", "cycleShiny": ": 闪光", "cycleForm": ": 形态", "cycleGender": ": 性别", diff --git a/src/locales/zh_CN/status-effect.ts b/src/locales/zh_CN/status-effect.ts new file mode 100644 index 00000000000..b9df1733bc1 --- /dev/null +++ b/src/locales/zh_CN/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "无", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "中毒", + description: "中毒", + obtain: "{{pokemonNameWithAffix}}中毒了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!", + activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", + overlap: "{{pokemonNameWithAffix}}已经中毒了!", + heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + toxic: { + name: "剧毒", + description: "中毒", + obtain: "{{pokemonNameWithAffix}}中了剧毒!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中了剧毒!", + activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", + overlap: "{{pokemonNameWithAffix}}已经中毒了!", + heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + paralysis: { + name: "麻痹", + description: "麻痹", + obtain: "{{pokemonNameWithAffix}}麻痹了,很难使出招式!", + obtainSource: "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很难使出招式!", + activation: "{{pokemonNameWithAffix}}因身体麻痹而无法行动!", + overlap: "{{pokemonNameWithAffix}}已经麻痹了!", + heal: "{{pokemonNameWithAffix}}的麻痹治愈了!" + }, + sleep: { + name: "睡眠", + description: "睡眠", + obtain: "{{pokemonNameWithAffix}}睡着了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}睡着了!", + activation: "{{pokemonNameWithAffix}}正在呼呼大睡。", + overlap: "{{pokemonNameWithAffix}}已经睡着了!", + heal: "{{pokemonNameWithAffix}}醒了!" + }, + freeze: { + name: "冰冻", + description: "冰冻", + obtain: "{{pokemonNameWithAffix}}冻住了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}冻住了!", + activation: "{{pokemonNameWithAffix}}因冻住了而无法行动!", + overlap: "{{pokemonNameWithAffix}}已经冻住了!", + heal: "{{pokemonNameWithAffix}}治愈了冰冻状态!" + }, + burn: { + name: "灼伤", + description: "灼伤", + obtain: "{{pokemonNameWithAffix}}被灼伤了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}被灼伤了!", + activation: "{{pokemonNameWithAffix}}受到了灼伤的伤害!", + overlap: "{{pokemonNameWithAffix}}已经被灼伤了!", + heal: "{{pokemonNameWithAffix}}的灼伤治愈了!" + }, +} as const; diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 9d7f647b891..534685d05d1 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = { "rival": "劲敌", "professor": "博士", "frontier_brain": "开拓头脑", + "rocket_boss": "火箭队老大", + "magma_boss": "熔岩队老大", + "aqua_boss": "海洋队老大", + "galactic_boss": "银河队老大", + "plasma_boss": "等离子队老大", + "flare_boss": "闪焰队老大", // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; @@ -118,7 +124,19 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "工人", "worker_female": "工人", "workers": "工人组合", - "youngster": "短裤小子" + "youngster": "短裤小子", + "rocket_grunt": "火箭队手下", + "rocket_grunt_female": "火箭队手下", + "magma_grunt": "熔岩队手下", + "magma_grunt_female": "熔岩队手下", + "aqua_grunt": "海洋队手下", + "aqua_grunt_female": "海洋队手下", + "galactic_grunt": "银河队手下", + "galactic_grunt_female": "银河队手下", + "plasma_grunt": "等离子队手下", + "plasma_grunt_female": "等离子队手下", + "flare_grunt": "闪焰队手下", + "flare_grunt_female": "闪焰队手下", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -304,6 +322,13 @@ export const trainerNames: SimpleTranslationEntries = { "rival": "芬恩", "rival_female": "艾薇", + // ---- 组织老大 Bosses ---- + "maxie": "赤焰松", + "archie": "水梧桐", + "cyrus": "赤日", + "ghetsis": "魁奇思", + "lysandre": "弗拉达利", + // Double Names "blue_red_double": "青绿 & 赤红", diff --git a/src/locales/zh_CN/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 8dcbd0e8408..c436e5021f7 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -1,8 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}} 被折磨着!", + "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", + "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", + "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", + "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/zh_TW/achv.ts b/src/locales/zh_TW/achv.ts index 4f59ecb2135..8b85f59447e 100644 --- a/src/locales/zh_TW/achv.ts +++ b/src/locales/zh_TW/achv.ts @@ -3,266 +3,266 @@ import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { "Achievements": { - name: "Achievements", + name: "成就", }, "Locked": { - name: "Locked", + name: "未解鎖", }, "MoneyAchv": { - description: "Accumulate a total of ₽{{moneyAmount}}", + description: "累計獲得 ₽{{moneyAmount}}", }, "10K_MONEY": { - name: "Money Haver", + name: "小有積蓄", }, "100K_MONEY": { - name: "Rich", + name: "大戶人家", }, "1M_MONEY": { - name: "Millionaire", + name: "百萬富翁", }, "10M_MONEY": { - name: "One Percenter", + name: "暴發戶", }, "DamageAchv": { - description: "Inflict {{damageAmount}} damage in one hit", + description: "在單次攻擊中造成 {{damageAmount}} 點傷害", }, "250_DMG": { - name: "Hard Hitter", + name: "重拳出擊", }, "1000_DMG": { - name: "Harder Hitter", + name: "神拳猛擊", }, "2500_DMG": { - name: "That's a Lotta Damage!", + name: "奪少?", }, "10000_DMG": { - name: "One Punch Man", + name: "一拳超人", }, "HealAchv": { - description: "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item", + description: "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點", }, "250_HEAL": { - name: "Novice Healer", + name: "新手奶媽", }, "1000_HEAL": { - name: "Big Healer", + name: "治療擔當", }, "2500_HEAL": { - name: "Cleric", + name: "牧師", }, "10000_HEAL": { - name: "Recovery Master", + name: "泉水", }, "LevelAchv": { - description: "Level up a Pokémon to Lv{{level}}", + description: "將一隻寶可夢提升到 Lv{{level}}", }, "LV_100": { - name: "But Wait, There's More!", + name: "别急,後面還有", }, "LV_250": { - name: "Elite", + name: "精英", }, "LV_1000": { - name: "To Go Even Further Beyond", + name: "天外有天", }, "RibbonAchv": { - description: "Accumulate a total of {{ribbonAmount}} Ribbons", + description: "累計獲得 {{ribbonAmount}} 個勛章", }, "10_RIBBONS": { - name: "Pokémon League Champion", + name: "寶可夢聯盟冠軍", }, "25_RIBBONS": { - name: "Great League Champion", + name: "超級球聯盟冠軍", }, "50_RIBBONS": { - name: "Ultra League Champion", + name: "高級球聯盟冠軍", }, "75_RIBBONS": { - name: "Rogue League Champion", + name: "肉鴿球聯盟冠軍", }, "100_RIBBONS": { - name: "Master League Champion", + name: "大師球聯盟冠軍", }, "TRANSFER_MAX_BATTLE_STAT": { - name: "Teamwork", - description: "Baton pass to another party member with at least one stat maxed out", + name: "團隊協作", + description: "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢", }, "MAX_FRIENDSHIP": { - name: "Friendmaxxing", - description: "Reach max friendship on a Pokémon", + name: "親密無間", + description: "使一隻寶可夢的親密度達到最大值", }, "MEGA_EVOLVE": { - name: "Megamorph", - description: "Mega evolve a Pokémon", + name: "大變身", + description: "超級進化一隻寶可夢", }, "GIGANTAMAX": { - name: "Absolute Unit", - description: "Gigantamax a Pokémon", + name: "這位更是重量級", + description: "極巨化一隻寶可夢", }, "TERASTALLIZE": { - name: "STAB Enthusiast", - description: "Terastallize a Pokémon", + name: "本系愛好者", + description: "太晶化一隻寶可夢", }, "STELLAR_TERASTALLIZE": { - name: "The Hidden Type", - description: "Stellar Terastallize a Pokémon", + name: "隱藏屬性", + description: "星晶化一隻寶可夢", }, "SPLICE": { - name: "Infinite Fusion", - description: "Splice two Pokémon together with DNA Splicers", + name: "無限融合", + description: "使用基因之楔將兩隻寶可夢融合在一起", }, "MINI_BLACK_HOLE": { - name: "A Hole Lot of Items", - description: "Acquire a Mini Black Hole", + name: "一大洞的道具", + description: "獲得一個迷你黑洞", }, "CATCH_MYTHICAL": { - name: "Mythical", - description: "Catch a mythical Pokémon", + name: "神秘禮物", + description: "捕捉一隻幻之寶可夢", }, "CATCH_SUB_LEGENDARY": { - name: "(Sub-)Legendary", - description: "Catch a sub-legendary Pokémon", + name: "二級傳說", + description: "捕捉一隻準傳說寶可夢", }, "CATCH_LEGENDARY": { - name: "Legendary", - description: "Catch a legendary Pokémon", + name: "傳說", + description: "捕捉一隻傳說寶可夢", }, "SEE_SHINY": { - name: "Shiny", - description: "Find a shiny Pokémon in the wild", + name: "閃耀奪目", + description: "在野外找到一隻閃光寶可夢", }, "SHINY_PARTY": { - name: "That's Dedication", - description: "Have a full party of shiny Pokémon", + name: "嘔心瀝血", + description: "擁有一支由閃光寶可夢組成的滿員隊伍", }, "HATCH_MYTHICAL": { - name: "Mythical Egg", - description: "Hatch a mythical Pokémon from an egg", + name: "幻獸蛋", + description: "從蛋中孵化出一隻幻之寶可夢", }, "HATCH_SUB_LEGENDARY": { - name: "Sub-Legendary Egg", - description: "Hatch a sub-legendary Pokémon from an egg", + name: "二級傳說蛋", + description: "從蛋中孵化出一隻準傳說寶可夢", }, "HATCH_LEGENDARY": { - name: "Legendary Egg", - description: "Hatch a legendary Pokémon from an egg", + name: "傳說蛋", + description: "從蛋中孵化出一隻傳說寶可夢", }, "HATCH_SHINY": { - name: "Shiny Egg", - description: "Hatch a shiny Pokémon from an egg", + name: "金色傳說!", + description: "從蛋中孵化出一隻閃光寶可夢", }, "HIDDEN_ABILITY": { - name: "Hidden Potential", - description: "Catch a Pokémon with a hidden ability", + name: "隱藏實力", + description: "捕捉一隻擁有隱藏特性的寶可夢", }, "PERFECT_IVS": { - name: "Certificate of Authenticity", - description: "Get perfect IVs on a Pokémon", + name: "合格證", + description: "獲得一隻擁有完美個體值的寶可夢", }, "CLASSIC_VICTORY": { - name: "Undefeated", - description: "Beat the game in classic mode", + name: "戰無不勝", + description: "在經典模式中通關遊戲", }, "MONO_GEN_ONE": { - name: "The Original Rival", - description: "Complete the generation one only challenge.", + name: "最初的勁敵", + description: "完成僅限第一世代的挑戰.", }, "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Complete the generation two only challenge.", + name: "1.5世代", + description: "完成僅限第二世代的挑戰.", }, "MONO_GEN_THREE": { - name: "Too much water?", - description: "Complete the generation three only challenge.", + name: "“水太多了”", + description: "完成僅限第三世代的挑戰.", }, "MONO_GEN_FOUR": { - name: "Is she really the hardest?", - description: "Complete the generation four only challenge.", + name: "她真是最強冠軍嗎?", + description: "完成僅限第四世代的挑戰.", }, "MONO_GEN_FIVE": { - name: "All Original", - description: "Complete the generation five only challenge.", + name: "完全原創", + description: "完成僅限第五世代的挑戰.", }, "MONO_GEN_SIX": { - name: "Almost Royalty", - description: "Complete the generation six only challenge.", + name: "女大公", + description: "完成僅限第六世代的挑戰.", }, "MONO_GEN_SEVEN": { - name: "Only Technically", - description: "Complete the generation seven only challenge.", + name: "首屆冠軍", + description: "完成僅限第七世代的挑戰.", }, "MONO_GEN_EIGHT": { - name: "A Champion Time!", - description: "Complete the generation eight only challenge.", + name: "冠軍時刻!", + description: "完成僅限第八世代的挑戰.", }, "MONO_GEN_NINE": { - name: "She was going easy on you", - description: "Complete the generation nine only challenge.", + name: "她又放水了", + description: "完成僅限第九世代的挑戰.", }, "MonoType": { - description: "Complete the {{type}} monotype challenge.", + description: "完成 {{type}} 單屬性挑戰.", }, "MONO_NORMAL": { - name: "Mono NORMAL", + name: "異乎尋常的尋常", }, "MONO_FIGHTING": { - name: "I Know Kung Fu", + name: "我有真功夫", }, "MONO_FLYING": { - name: "Mono FLYING", + name: "憤怒的小鳥", }, "MONO_POISON": { - name: "Kanto's Favourite", + name: "關都地區特色", }, "MONO_GROUND": { - name: "Mono GROUND", + name: "地震預報", }, "MONO_ROCK": { - name: "Brock Hard", + name: "堅如磐石", }, "MONO_BUG": { - name: "Sting Like A Beedrill", + name: "音箱蟀俠", }, "MONO_GHOST": { - name: "Who you gonna call?", + name: "捉鬼敢死隊", }, "MONO_STEEL": { - name: "Mono STEEL", + name: "鐵巨人", }, "MONO_FIRE": { - name: "Mono FIRE", + name: "搓火球解決一切", }, "MONO_WATER": { - name: "When It Rains, It Pours", + name: "當雨來臨,傾盆而下", }, "MONO_GRASS": { - name: "Mono GRASS", + name: "別踏這個青", }, "MONO_ELECTRIC": { - name: "Mono ELECTRIC", + name: "瞄準大岩蛇的角!", }, "MONO_PSYCHIC": { - name: "Mono PSYCHIC", + name: "腦洞大開", }, "MONO_ICE": { - name: "Mono ICE", + name: "如履薄冰", }, "MONO_DRAGON": { - name: "Mono DRAGON", + name: "準神俱樂部", }, "MONO_DARK": { - name: "It's just a phase", + name: "總有叛逆期", }, "MONO_FAIRY": { - name: "Mono FAIRY", + name: "林克,醒醒!", }, } as const; diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index b4d0aa9d50e..bc7b712185a 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -2,127 +2,134 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出現了.", - "trainerAppeared": "{{trainerName}}\n想要和你對戰!", - "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", - "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", - "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", - "playerComeBack": "回來吧, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", - "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", - "switchQuestion": "要更換\n{{pokemonName}}嗎?", - "trainerDefeated": "你擊敗了\n{{trainerName}}!", - "pokemonCaught": "{{pokemonName}} 被抓住了!", + "trainerAppeared": "{{trainerName}}\n想要和你對戰!", + "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", + "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", + "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", + "playerComeBack": "回來吧, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", + "playerGo": "去吧! {{pokemonName}}!", + "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", + "switchQuestion": "要更換\n{{pokemonName}}嗎?", + "trainerDefeated": "你擊敗了\n{{trainerName}}!", + "moneyPickedUp": "撿到了 ₽{{moneyAmount}}!", + "pokemonCaught": "{{pokemonName}} 被抓住了!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "pokemon": "寶可夢", - "sendOutPokemon": "上吧! {{pokemonName}}!", - "hitResultCriticalHit": "擊中了要害!", - "hitResultSuperEffective": "效果拔群!", + "sendOutPokemon": "上吧! {{pokemonName}}!", + "hitResultCriticalHit": "擊中了要害!", + "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", - "hitResultOneHitKO": "一擊切殺!", - "attackFailed": "但是失敗了!", - "attackHitsCount": "擊中 {{count}} 次!", - "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", - "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", - "learnMove": "{{pokemonName}} 學會了{{moveName}}!", + "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", + "hitResultOneHitKO": "一擊切殺!", + "attackFailed": "但是失敗了!", + "attackMissed": "沒有命中{{pokemonNameWithAffix}}!", + "attackHitsCount": "擊中 {{count}} 次!", + "rewardGain": "You received\n{{modifierName}}!", + "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", + "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", + "learnMove": "{{pokemonName}} 學會了{{moveName}}!", "learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.", "learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.", - "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", - "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", + "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", + "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", - "learnMoveForgetQuestion": "要忘記哪個技能?", + "learnMoveForgetQuestion": "要忘記哪個技能?", "learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", + "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", "learnMoveAnd": "然後…", - "levelCapUp": "等級上限提升到 {{levelCap}}!", + "levelCapUp": "等級上限提升到 {{levelCap}}!", "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", "moveNoPP": "這個技能的PP用完了", - "moveDisabled": "{{moveName}} 被禁用!", + "moveDisabled": "{{moveName}} 被禁用!", "noPokeballForce": "一股無形的力量阻止了你使用精靈球。", - "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", - "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", - "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", + "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", + "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", + "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", "noEscapeForce": "一股無形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", - "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", - "runAwaySuccess": "你成功逃脫了!", - "runAwayCannotEscape": "你無法逃脫!", + "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", + "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", + "runAwaySuccess": "你成功逃脫了!", + "runAwayCannotEscape": "你無法逃脫!", "escapeVerbSwitch": "切換", "escapeVerbFlee": "逃跑", - "notDisabled": "{{moveName}} 不再被禁用!", - "skipItemQuestion": "你要跳過拾取道具嗎?", - "eggHatching": "咦?", - "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描?", - "wildPokemonWithAffix": "Wild {{pokemonName}}", - "foePokemonWithAffix": "Foe {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} regained\nhealth!", - "fainted": "{{pokemonNameWithAffix}} fainted!", - "statRose": "rose", - "statSharplyRose": "sharply rose", - "statRoseDrastically": "rose drastically", - "statWontGoAnyHigher": "won't go any higher", - "statFell": "fell", - "statHarshlyFell": "harshly fell", - "statSeverelyFell": "severely fell", - "statWontGoAnyLower": "won't go any lower", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", - "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", - "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "notDisabled": "{{moveName}} 不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "skipItemQuestion": "你要跳過拾取道具嗎?", + "eggHatching": "咦?", + "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", + "wildPokemonWithAffix": "野生的 {{pokemonName}}", + "foePokemonWithAffix": "對手 {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!", + "drainMessage": "{{pokemonName}} 吸取了體力!", + "regainHealth": "{{pokemonName}} 回復了體力!", + "fainted": "{{pokemonNameWithAffix}} 倒下了!", + "statRose": "{{pokemonNameWithAffix}} 的 {{stats}} 提高了!", + "statSharplyRose": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅提高了!", + "statRoseDrastically": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅提高了!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再提高了!", + "statFell": "{{pokemonNameWithAffix}} 的 {{stats}} 降低了!", + "statHarshlyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅降低了!", + "statSeverelyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅降低了!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再降低了!", + "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏縮了!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混亂了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混亂解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已經混亂了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混亂中!", + "battlerTagsConfusedLapseHurtItself": "不知所以地攻擊了自己!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影響", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同歸於盡了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}已經著迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷中!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不會著迷!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治癒了著迷狀態!", + "battlerTagsSeededOnAdd": "將種子種植在了{{pokemonNameWithAffix}}身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}被寄生種子吸取了體力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥漿!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}開始做惡夢了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}已經被惡夢纏身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}正被惡夢纏身!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}接受了再來一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}的再來一次狀態解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}擺出了幫助{{pokemonName}} 的架勢!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}用扎根回復了體力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}用水流環包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回復了{{pokemonName}}的體力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}產生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的傷害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}緊緊束縛住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}綁緊了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋渦之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用貝殼夾住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩風暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}被捕獸夾困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死纏爛打!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}擺出了防守的架勢!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}在攻擊中保護了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}擺出了挺住攻擊的架勢!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", } as const; diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts new file mode 100644 index 00000000000..87d90dabc9d --- /dev/null +++ b/src/locales/zh_TW/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music: ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/zh_TW/biome.ts b/src/locales/zh_TW/biome.ts index d3f34c021d4..dbfa2f7adb9 100644 --- a/src/locales/zh_TW/biome.ts +++ b/src/locales/zh_TW/biome.ts @@ -1,40 +1,40 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { - "unknownLocation": "Somewhere you can\'t remember", - "TOWN": "Town", - "PLAINS": "Plains", - "GRASS": "Grassy Field", - "TALL_GRASS": "Tall Grass", - "METROPOLIS": "Metropolis", - "FOREST": "Forest", - "SEA": "Sea", - "SWAMP": "Swamp", - "BEACH": "Beach", - "LAKE": "Lake", - "SEABED": "Seabed", - "MOUNTAIN": "Mountain", - "BADLANDS": "Badlands", - "CAVE": "Cave", - "DESERT": "Desert", - "ICE_CAVE": "Ice Cave", - "MEADOW": "Meadow", - "POWER_PLANT": "Power Plant", - "VOLCANO": "Volcano", - "GRAVEYARD": "Graveyard", - "DOJO": "Dojo", - "FACTORY": "Factory", - "RUINS": "Ancient Ruins", - "WASTELAND": "Wasteland", - "ABYSS": "Abyss", - "SPACE": "Space", - "CONSTRUCTION_SITE": "Construction Site", - "JUNGLE": "Jungle", - "FAIRY_CAVE": "Fairy Cave", - "TEMPLE": "Temple", - "SLUM": "Slum", - "SNOWY_FOREST": "Snowy Forest", - "ISLAND": "Island", - "LABORATORY": "Laboratory", + "unknownLocation": "未知領域", + "TOWN": "城鎮", + "PLAINS": "平原", + "GRASS": "草地", + "TALL_GRASS": "高草叢", + "METROPOLIS": "城市", + "FOREST": "森林", + "SEA": "海洋", + "SWAMP": "沼澤", + "BEACH": "沙灘", + "LAKE": "湖泊", + "SEABED": "海底", + "MOUNTAIN": "山脈", + "BADLANDS": "不毛之地", + "CAVE": "洞窟", + "DESERT": "沙漠", + "ICE_CAVE": "寒冰洞窟", + "MEADOW": "花叢", + "POWER_PLANT": "發電廠", + "VOLCANO": "火山", + "GRAVEYARD": "墓地", + "DOJO": "道場", + "FACTORY": "工廠", + "RUINS": "遺跡", + "WASTELAND": "荒地龍巢", + "ABYSS": "幽谷深淵", + "SPACE": "太空", + "CONSTRUCTION_SITE": "工地", + "JUNGLE": "叢林", + "FAIRY_CAVE": "妖精洞窟", + "TEMPLE": "神殿", + "SLUM": "陋巷", + "SNOWY_FOREST": "冰雪森林", + "ISLAND": "島嶼", + "LABORATORY": "研究所", "END": "???", } as const; diff --git a/src/locales/zh_TW/challenges.ts b/src/locales/zh_TW/challenges.ts index 9da058001b1..e702ec4f278 100644 --- a/src/locales/zh_TW/challenges.ts +++ b/src/locales/zh_TW/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "適用挑戰條件", - "points": "Bad Ideas", - "confirm_start": "要執行這些挑戰嗎?", - "singleGeneration.name": "單一世代", - "singleGeneration.value.0": "關閉", - "singleGeneration.desc.0": "你只能使用所選世代的寶可夢", - "singleGeneration.value.1": "第一世代", - "singleGeneration.desc.1": "你只能使用第一世代的寶可夢", - "singleGeneration.value.2": "第二世代", - "singleGeneration.desc.2": "你只能使用第二世代的寶可夢", - "singleGeneration.value.3": "第三世代", - "singleGeneration.desc.3": "你只能使用第三世代的寶可夢", - "singleGeneration.value.4": "第四世代", - "singleGeneration.desc.4": "你只能使用第四世代的寶可夢", - "singleGeneration.value.5": "第五世代", - "singleGeneration.desc.5": "你只能使用第五世代的寶可夢", - "singleGeneration.value.6": "第六世代", - "singleGeneration.desc.6": "你只能使用第六世代的寶可夢", - "singleGeneration.value.7": "第七世代", - "singleGeneration.desc.7": "你只能使用第七世代的寶可夢", - "singleGeneration.value.8": "第八世代", - "singleGeneration.desc.8": "你只能使用第八世代的寶可夢", - "singleGeneration.value.9": "第九世代", - "singleGeneration.desc.9": "你只能使用第九世代的寶可夢", - "singleType.name": "單屬性", - "singleType.value.0": "關閉", - "singleType.desc.0": "你只能使用所選屬性的寶可夢", - "singleType.value.1": "普通", - "singleType.desc.1": "你只能使用普通屬性的寶可夢", - "singleType.value.2": "格鬥", - "singleType.desc.2": "你只能使用格鬥屬性的寶可夢", - "singleType.value.3": "飛行", - "singleType.desc.3": "你只能使用飛行屬性的寶可夢", - "singleType.value.4": "毒", - "singleType.desc.4": "你只能使用毒屬性的寶可夢", - "singleType.value.5": "地面", - "singleType.desc.5": "你只能使用地面屬性的寶可夢", - "singleType.value.6": "岩石", - "singleType.desc.6": "你只能使用岩石屬性的寶可夢", - "singleType.value.7": "蟲", - "singleType.desc.7": "你只能使用蟲屬性的寶可夢", - "singleType.value.8": "幽靈", - "singleType.desc.8": "你只能使用幽靈屬性的寶可夢", - "singleType.value.9": "鋼", - "singleType.desc.9": "你只能使用鋼屬性的寶可夢", - "singleType.value.10": "火", - "singleType.desc.10": "你只能使用火屬性的寶可夢", - "singleType.value.11": "水", - "singleType.desc.11": "你只能使用水屬性的寶可夢", - "singleType.value.12": "草", - "singleType.desc.12": "你只能使用草屬性的寶可夢", - "singleType.value.13": "電", - "singleType.desc.13": "你只能使用電屬性的寶可夢", - "singleType.value.14": "超能", - "singleType.desc.14": "你只能使用超能屬性的寶可夢", - "singleType.value.15": "冰", - "singleType.desc.15": "你只能使用冰屬性的寶可夢", - "singleType.value.16": "龍", - "singleType.desc.16": "你只能使用龍屬性的寶可夢", - "singleType.value.17": "惡", - "singleType.desc.17": "你只能使用惡屬性的寶可夢", - "singleType.value.18": "妖精", - "singleType.desc.18": "你只能使用妖精屬性的寶可夢", + "illegalEvolution": "{{pokemon}} 進化成了不符合\n挑戰條件的寶可夢!", + "singleGeneration": { + "name": "單一世代", + "desc": "你只能使用第{{gen}}\n世代的寶可夢", + "desc_default": "你只能使用所選\n世代的寶可夢", + "gen_1": "一", + "gen_2": "二", + "gen_3": "三", + "gen_4": "四", + "gen_5": "五", + "gen_6": "六", + "gen_7": "七", + "gen_8": "八", + "gen_9": "九", + }, + "singleType": { + "name": "單屬性", + "desc": "你只能使用{{type}}\n屬性的寶可夢", + "desc_default": "你只能使用所選\n屬性的寶可夢" + }, } as const; diff --git a/src/locales/zh_TW/command-ui-handler.ts b/src/locales/zh_TW/command-ui-handler.ts index 9fad34bb64f..300b20224b3 100644 --- a/src/locales/zh_TW/command-ui-handler.ts +++ b/src/locales/zh_TW/command-ui-handler.ts @@ -5,5 +5,5 @@ export const commandUiHandler: SimpleTranslationEntries = { "ball": "精靈球", "pokemon": "寶可夢", "run": "逃跑", - "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", + "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", } as const; diff --git a/src/locales/zh_TW/common.ts b/src/locales/zh_TW/common.ts new file mode 100644 index 00000000000..a2112cc594e --- /dev/null +++ b/src/locales/zh_TW/common.ts @@ -0,0 +1,10 @@ +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 5d6a2dd978d..f19a6941a88 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -24,6 +25,7 @@ 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"; @@ -34,12 +36,15 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; -import { weather } from "./weather"; +import { terrain, weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/zh_TW/settings.js"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const zhTwConfig = { ability: ability, @@ -47,9 +52,11 @@ export const zhTwConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -67,6 +74,7 @@ export const zhTwConfig = { growth: growth, menu: menu, menuUiHandler: menuUiHandler, + modifier: modifier, modifierType: modifierType, move: move, nature: nature, @@ -78,11 +86,14 @@ export const zhTwConfig = { 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 }; diff --git a/src/locales/zh_TW/dialogue.ts b/src/locales/zh_TW/dialogue.ts index 119f9e8bb8f..0823236bc84 100644 --- a/src/locales/zh_TW/dialogue.ts +++ b/src/locales/zh_TW/dialogue.ts @@ -382,6 +382,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "好像是我暈船了…" }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "我對岩石屬性寶可夢的專精會擊敗你!來吧!", @@ -2136,7 +2316,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_6_female": { "encounter": { - 1: "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。", + 1: "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。", }, "victory": { 1: "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答應我……在你拯救世界之後\n……要……平安到家。$@c{smile_ehalf}……謝謝你。", diff --git a/src/locales/zh_TW/egg.ts b/src/locales/zh_TW/egg.ts index 9668385f71e..666f6758d11 100644 --- a/src/locales/zh_TW/egg.ts +++ b/src/locales/zh_TW/egg.ts @@ -17,5 +17,12 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "你沒有足夠的兌換券!", "tooManyEggs": "你的蛋太多啦!", "pull": "抽", - "pulls": "抽" + "pulls": "抽", + "sameSpeciesEgg": "{{species}} 會從這個蛋裡孵化!", + "hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!", + "eggMoveUnlock": "蛋招式已解鎖: {{moveName}}", + "rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}", + "moveUPGacha": "蛋招式UP!", + "shinyUPGacha": "闪光UP!", + "legendaryUPGacha": "UP!", } as const; diff --git a/src/locales/zh_TW/fight-ui-handler.ts b/src/locales/zh_TW/fight-ui-handler.ts index 6885d0fcc2a..d86a703d844 100644 --- a/src/locales/zh_TW/fight-ui-handler.ts +++ b/src/locales/zh_TW/fight-ui-handler.ts @@ -4,6 +4,6 @@ export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "威力", "accuracy": "命中率", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important + "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", + "passive": "被動能力 ", // The space at the end is important } as const; diff --git a/src/locales/zh_TW/game-mode.ts b/src/locales/zh_TW/game-mode.ts index 903f1a63072..dc2a227d638 100644 --- a/src/locales/zh_TW/game-mode.ts +++ b/src/locales/zh_TW/game-mode.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { - "classic": "Classic", - "endless": "Endless", - "endlessSpliced": "Endless (Spliced)", - "dailyRun": "Daily Run", - "unknown": "Unknown", - "challenge": "Challenge", + "classic": "經典模式", + "endless": "無盡模式", + "endlessSpliced": "融合無盡模式", + "dailyRun": "每日挑戰", + "unknown": "未知", + "challenge": "挑戰模式", } as const; diff --git a/src/locales/zh_TW/game-stats-ui-handler.ts b/src/locales/zh_TW/game-stats-ui-handler.ts index a29eaf5d1b6..343ae7240cb 100644 --- a/src/locales/zh_TW/game-stats-ui-handler.ts +++ b/src/locales/zh_TW/game-stats-ui-handler.ts @@ -1,44 +1,44 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Stats", - "playTime": "Play Time", - "totalBattles": "Total Battles", - "starters": "Starters", - "shinyStarters": "Shiny Starters", - "speciesSeen": "Species Seen", - "speciesCaught": "Species Caught", - "ribbonsOwned": "Ribbons Owned", - "classicRuns": "Classic Runs", - "classicWins": "Classic Wins", - "dailyRunAttempts": "Daily Run Attempts", - "dailyRunWins": "Daily Run Wins", - "endlessRuns": "Endless Runs", - "highestWaveEndless": "Highest Wave (Endless)", - "highestMoney": "Highest Money", - "highestDamage": "Highest Damage", - "highestHPHealed": "Highest HP Healed", - "pokemonEncountered": "Pokémon Encountered", - "pokemonDefeated": "Pokémon Defeated", - "pokemonCaught": "Pokémon Caught", - "eggsHatched": "Eggs Hatched", - "subLegendsSeen": "Sub-Legends Seen", - "subLegendsCaught": "Sub-Legends Caught", - "subLegendsHatched": "Sub-Legends Hatched", - "legendsSeen": "Legends Seen", - "legendsCaught": "Legends Caught", - "legendsHatched": "Legends Hatched", - "mythicalsSeen": "Mythicals Seen", - "mythicalsCaught": "Mythicals Caught", - "mythicalsHatched": "Mythicals Hatched", - "shiniesSeen": "Shinies Seen", - "shiniesCaught": "Shinies Caught", - "shiniesHatched": "Shinies Hatched", - "pokemonFused": "Pokémon Fused", - "trainersDefeated": "Trainers Defeated", - "eggsPulled": "Eggs Pulled", - "rareEggsPulled": "Rare Eggs Pulled", - "epicEggsPulled": "Epic Eggs Pulled", - "legendaryEggsPulled": "Legendary Eggs Pulled", - "manaphyEggsPulled": "Manaphy Eggs Pulled", + "stats": "統計", + "playTime": "遊戲時間", + "totalBattles": "總戰鬥次數", + "starters": "初始寶可夢", + "shinyStarters": "閃光初始寶可夢", + "speciesSeen": "遇到的種類", + "speciesCaught": "捕捉的種類", + "ribbonsOwned": "擁有緞帶數", + "classicRuns": "經典模式次數", + "classicWins": "經典模式通關次數", + "dailyRunAttempts": "每日挑戰次數", + "dailyRunWins": "每日挑戰通關次數", + "endlessRuns": "無盡模式挑戰次數", + "highestWaveEndless": "最高層數(無盡)", + "highestMoney": "最多金錢", + "highestDamage": "最高傷害", + "highestHPHealed": "最多治療", + "pokemonEncountered": "遇敵數量", + "pokemonDefeated": "打倒數量", + "pokemonCaught": "捕捉數量", + "eggsHatched": "孵蛋數量", + "subLegendsSeen": "遇到的二級神寶可夢", + "subLegendsCaught": "捕捉的二級神寶可夢", + "subLegendsHatched": "孵化的二級神寶可夢", + "legendsSeen": "遇到的傳說寶可夢", + "legendsCaught": "捕捉的傳說寶可夢", + "legendsHatched": "孵化的傳說寶可夢", + "mythicalsSeen": "遇到的幻獸寶可夢", + "mythicalsCaught": "捕捉的幻獸寶可夢", + "mythicalsHatched": "孵化的幻獸寶可夢", + "shiniesSeen": "遇到的閃光寶可夢", + "shiniesCaught": "捕捉的閃光寶可夢", + "shiniesHatched": "孵化的閃光寶可夢", + "pokemonFused": "融合寶可夢次數", + "trainersDefeated": "打敗的訓練師數", + "eggsPulled": "總扭蛋次數", + "rareEggsPulled": "稀有扭蛋數", + "epicEggsPulled": "史詩扭蛋數", + "legendaryEggsPulled": "傳說扭蛋數", + "manaphyEggsPulled": "瑪娜霏扭蛋數", } as const; diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.ts index 77aa45ad1bf..e3675b0571e 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.ts @@ -23,5 +23,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "linkGoogle": "Link Google", "unlinkGoogle": "Unlink Google", "cancel": "取消", - "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?" + "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index 9758b0da175..e43264de2f6 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -11,7 +11,7 @@ export const menu: SimpleTranslationEntries = { "dailyRun": "每日挑戰 (Beta)", "loadGame": "加載遊戲", "newGame": "新遊戲", - "settings": "Settings", + "settings": "設定", "selectGameMode": "選擇遊戲模式", "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!", "username": "用戶名", @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "no":"否", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "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 769c01e072f..bf2032a7feb 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -153,7 +153,7 @@ export const modifierType: ModifierTypeTranslationEntries = { SACRED_ASH: { name: "聖灰" }, REVIVER_SEED: { name: "復活種子", - description: "恢復1隻瀕死寶可夢的HP至1/2。", + description: "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。", }, ETHER: { name: "PP單項小補劑" }, MAX_ETHER: { name: "PP單項全補劑" }, @@ -187,6 +187,10 @@ export const modifierType: ModifierTypeTranslationEntries = { LUCKY_EGG: { name: "幸運蛋" }, GOLDEN_EGG: { name: "金蛋" }, SOOTHE_BELL: { name: "安撫之鈴" }, + EVIOLITE: { + name: "進化奇石", + description: "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" + }, SOUL_DEW: { name: "心之水滴", description: "增加寶可夢性格影響10% (加算)。", @@ -243,14 +247,14 @@ export const modifierType: ModifierTypeTranslationEntries = { "攜帶該道具的寶可夢在攻擊對方成功造成傷\n害時,攜帶者的HP會恢復其所造成傷害\n的1/8。", }, TOXIC_ORB: { - name: "Toxic Orb", + name: "劇毒寶珠", description: - "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle" + "觸碰後會放出毒的神奇寶珠。\n攜帶後,在戰鬥時會變成劇毒狀態。" }, FLAME_ORB: { - name: "Flame Orb", + name: "火焰寶珠", description: - "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle" + "觸碰後會放出熱量的神奇寶珠。\n攜帶後,在戰鬥時會變成灼傷狀態。" }, BATON: { name: "接力棒", @@ -297,6 +301,12 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "增加1%野生融合寶可夢出現概率。", }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "電氣球", description: "讓皮卡丘攜帶後,攻擊和特攻就會 提高的神奇之球。" }, + "THICK_CLUB": { name: "粗骨頭", description: "某種堅硬的骨頭。讓卡拉卡拉或嘎啦嘎啦攜帶後,攻擊就會提高。" }, + "METAL_POWDER": { name: "金屬粉", description: "讓百變怪攜帶後,防禦就會提高的神奇粉末。非常細緻堅硬。" }, + "QUICK_POWDER": { name: "速度粉", description: "讓百變怪攜帶後,速度就會提高的神奇粉末。非常細緻堅硬。" } + }, TempBattleStatBoosterItem: { x_attack: "力量強化", x_defense: "防禦強化", @@ -308,14 +318,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": "攻擊", + "DEF": "防禦", + "SPATK": "特攻", + "SPDEF": "特防", + "SPD": "速度", + "ACC": "命中", + "CRIT": "會心", + "EVA": "閃避", "DEFAULT": "???", }, diff --git a/src/locales/zh_TW/modifier.ts b/src/locales/zh_TW/modifier.ts new file mode 100644 index 00000000000..01de87827c0 --- /dev/null +++ b/src/locales/zh_TW/modifier.ts @@ -0,0 +1,12 @@ +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回復了活力!", + "moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!", + "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", + "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", + "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回復了一些體力!", +} as const; diff --git a/src/locales/zh_TW/party-ui-handler.ts b/src/locales/zh_TW/party-ui-handler.ts index 894ea14bb12..efa9b2c8dab 100644 --- a/src/locales/zh_TW/party-ui-handler.ts +++ b/src/locales/zh_TW/party-ui-handler.ts @@ -1,10 +1,53 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" + "SEND_OUT": "上場", + "SUMMARY": "概要", + "CANCEL": "取消", + "RELEASE": "放生", + "APPLY": "應用", + "TEACH": "教授", + "SPLICE": "Splice", + "UNSPLICE": "Unsplice", + "ACTIVATE": "Activate", + "DEACTIVATE": "Deactivate", + "TRANSFER": "Transfer", + "ALL": "All", + "PASS_BATON": "Pass Baton", + "UNPAUSE_EVOLUTION": "Unpause Evolution", + "REVIVE": "Revive", + + "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-info-container.ts b/src/locales/zh_TW/pokemon-info-container.ts index 2d70e769b24..eca518c3806 100644 --- a/src/locales/zh_TW/pokemon-info-container.ts +++ b/src/locales/zh_TW/pokemon-info-container.ts @@ -1,11 +1,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Moveset", - "gender": "Gender:", - "ability": "Ability:", - "nature": "Nature:", - "epic": "Epic", - "rare": "Rare", - "common": "Common" + "moveset": "招式", + "gender": "性别:", + "ability": "特性:", + "nature": "性格:", } as const; diff --git a/src/locales/zh_TW/pokemon.ts b/src/locales/zh_TW/pokemon.ts index 7bbbfd6b08c..2a82f11f4c3 100644 --- a/src/locales/zh_TW/pokemon.ts +++ b/src/locales/zh_TW/pokemon.ts @@ -987,7 +987,7 @@ export const pokemon: SimpleTranslationEntries = { "great_tusk": "雄偉牙", "scream_tail": "吼叫尾", "brute_bonnet": "猛惡菇", - "flutter_mane": "振翼發", + "flutter_mane": "振翼髮", "slither_wing": "爬地翅", "sandy_shocks": "沙鐵皮", "iron_treads": "鐵轍跡", diff --git a/src/locales/zh_TW/save-slot-select-ui-handler.ts b/src/locales/zh_TW/save-slot-select-ui-handler.ts index 4a9e02eebee..68377aec4b2 100644 --- a/src/locales/zh_TW/save-slot-select-ui-handler.ts +++ b/src/locales/zh_TW/save-slot-select-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Overwrite the data in the selected slot?", - "loading": "Loading...", - "wave": "Wave", + "overwriteData": "要覆蓋該槽位的存檔嗎?", + "loading": "正在加載...", + "wave": "層數", "lv": "Lv", "empty": "空", } as const; diff --git a/src/locales/zh_TW/settings.ts b/src/locales/zh_TW/settings.ts index c70a8e0c625..dcb87fafe35 100644 --- a/src/locales/zh_TW/settings.ts +++ b/src/locales/zh_TW/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (備用)", "mute": "靜音", "controller": "控制器", - "gamepadSupport": "手柄支持" + "gamepadSupport": "手柄支持", + "showBgmBar": "Show Music Names", } 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 94ce83956cc..ae9a4083d20 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -32,6 +32,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "選擇想要替換成的招式", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", + "sameSpeciesEgg": "買蛋", "cycleShiny": ": 閃光", "cycleForm": ": 形態", "cycleGender": ": 性別", diff --git a/src/locales/zh_TW/status-effect.ts b/src/locales/zh_TW/status-effect.ts new file mode 100644 index 00000000000..1a402ac30fd --- /dev/null +++ b/src/locales/zh_TW/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + toxic: { + name: "Toxic", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + paralysis: { + name: "Paralysis", + description: "paralysis", + obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", + activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", + heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + sleep: { + name: "Sleep", + description: "sleep", + obtain: "{{pokemonNameWithAffix}}\nfell asleep!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is fast asleep.", + overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", + heal: "{{pokemonNameWithAffix}} woke up!" + }, + freeze: { + name: "Freeze", + description: "freezing", + obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", + overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", + heal: "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + burn: { + name: "Burn", + description: "burn", + obtain: "{{pokemonNameWithAffix}}\nwas burned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", + overlap: "{{pokemonNameWithAffix}} is\nalready burned!", + heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" + }, +} as const; diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 6fea28823f3..594363ce009 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -48,7 +48,7 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "鐵路員工", "doctor": "醫生", "doctor_female": "醫生", - "firebreather": "Firebreather", + "firebreather": "吹火人", "fisherman": "垂釣者", "fisherman_female": "垂釣者", "gentleman": "紳士", diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.ts index c83e0fdc5bf..bfc5e0998dc 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.ts @@ -4,7 +4,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "日照變強了!", + "sunnyStartMessage": "日照變強了!", "sunnyLapseMessage": "日照很強。", "sunnyClearMessage": "日照復原了。", @@ -15,22 +15,22 @@ export const weather: SimpleTranslationEntries = { "sandstormStartMessage": "開始刮沙暴了!", "sandstormLapseMessage": "沙暴肆虐。", "sandstormClearMessage": "沙暴停止了。", - "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", + "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", - "hailStartMessage": "開始下冰雹了!", + "hailStartMessage": "開始下冰雹了!", "hailLapseMessage": "冰雹繼續肆虐。", "hailClearMessage": "冰雹不再下了。", - "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", + "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", - "snowStartMessage": "開始下雪了!", + "snowStartMessage": "開始下雪了!", "snowLapseMessage": "雪繼續下。", "snowClearMessage": "雪停了。", - "fogStartMessage": "起霧了!", + "fogStartMessage": "起霧了!", "fogLapseMessage": "霧很濃。", "fogClearMessage": "霧散了。", - "heavyRainStartMessage": "開始下起了暴雨!", + "heavyRainStartMessage": "開始下起了暴雨!", "heavyRainLapseMessage": "暴雨勢頭不減。", "heavyRainClearMessage": "暴雨停了。", @@ -38,7 +38,29 @@ export const weather: SimpleTranslationEntries = { "harshSunLapseMessage": "強日照勢頭不減。", "harshSunClearMessage": "日照復原了。", - "strongWindsStartMessage": "吹起了神秘的亂流!", + "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/main.ts b/src/main.ts index e750335ddd4..41cd68afc1e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -150,7 +150,6 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); -document.fonts.load("12px unifont"); let game; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 7094185eff2..d8ec0072bd4 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,6 +1,6 @@ import * as Modifiers from "./modifier"; import { AttackMove, allMoves } from "../data/move"; -import { PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; +import { MAX_PER_TYPE_POKEBALLS, PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; import { Stat, getStatName } from "../data/pokemon-stat"; @@ -26,6 +26,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -44,7 +45,6 @@ type NewModifierFunc = (type: ModifierType, args: any[]) => Modifier; export class ModifierType { public id: string; - public generatorId: string; public localeKey: string; public iconImage: string; public group: string; @@ -101,7 +101,7 @@ export class ModifierType { if (!pool.hasOwnProperty(tier)) { continue; } - if (pool[tier].find(m => (m as WeightedModifierType).modifierType.id === (this.generatorId || this.id))) { + if (pool[tier].find(m => (m as WeightedModifierType).modifierType.id === this.id)) { return (this.tier = tier); } } @@ -132,7 +132,6 @@ export class ModifierTypeGenerator extends ModifierType { generateType(party: Pokemon[], pregenArgs?: any[]) { const ret = this.genTypeFunc(party, pregenArgs); if (ret) { - ret.generatorId = ret.id; ret.id = this.id; ret.setTier(this.tier); } @@ -539,6 +538,28 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i } } +export type SpeciesStatBoosterItem = keyof typeof SpeciesStatBoosterModifierTypeGenerator.items; + +/** + * Modifier type for {@linkcode Modifiers.SpeciesStatBoosterModifier} + * @extends PokemonHeldItemModifierType + * @implements GeneratedPersistentModifierType + */ +export class SpeciesStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { + private key: SpeciesStatBoosterItem; + + constructor(key: SpeciesStatBoosterItem) { + const item = SpeciesStatBoosterModifierTypeGenerator.items[key]; + super(`modifierType:SpeciesBoosterItem.${key}`, key.toLowerCase(), (type, args) => new Modifiers.SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species)); + + this.key = key; + } + + getPregenArgs(): any[] { + return [ this.key ]; + } +} + export class PokemonLevelIncrementModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), (_pokemon: PlayerPokemon) => null); @@ -870,6 +891,81 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { } } +/** + * Modifier type generator for {@linkcode SpeciesStatBoosterModifierType}, which + * encapsulates the logic for weighting the most useful held item from + * the current list of {@linkcode items}. + * @extends ModifierTypeGenerator + */ +class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { + /** Object comprised of the currently available species-based stat boosting held items */ + public static items = { + LIGHT_BALL: { stats: [Stat.ATK, Stat.SPATK], multiplier: 2, species: [Species.PIKACHU] }, + THICK_CLUB: { stats: [Stat.ATK], multiplier: 2, species: [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK] }, + METAL_POWDER: { stats: [Stat.DEF], multiplier: 2, species: [Species.DITTO] }, + QUICK_POWDER: { stats: [Stat.SPD], multiplier: 2, species: [Species.DITTO] }, + }; + + constructor() { + super((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem); + } + + const values = Object.values(SpeciesStatBoosterModifierTypeGenerator.items); + const keys = Object.keys(SpeciesStatBoosterModifierTypeGenerator.items); + const weights = keys.map(() => 0); + + for (const p of party) { + const speciesId = p.getSpeciesForm(true).speciesId; + const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null; + const hasFling = p.getMoveset(true).some(m => m.moveId === Moves.FLING); + + for (const i in values) { + const checkedSpecies = values[i].species; + const checkedStats = values[i].stats; + + // If party member already has the item being weighted currently, skip to the next item + const hasItem = p.getHeldItems().some(m => m instanceof Modifiers.SpeciesStatBoosterModifier + && (m as Modifiers.SpeciesStatBoosterModifier).contains(checkedSpecies[0], checkedStats[0])); + + if (!hasItem) { + if (checkedSpecies.includes(speciesId) || (!!fusionSpeciesId && checkedSpecies.includes(fusionSpeciesId))) { + // Add weight if party member has a matching species or, if applicable, a matching fusion species + weights[i]++; + } else if (checkedSpecies.includes(Species.PIKACHU) && hasFling) { + // Add weight to Light Ball if party member has Fling + weights[i]++; + } + } + } + } + + let totalWeight = 0; + for (const weight of weights) { + totalWeight += weight; + } + + if (totalWeight !== 0) { + const randInt = Utils.randSeedInt(totalWeight, 1); + let weight = 0; + + for (const i in weights) { + if (weights[i] !== 0) { + const curWeight = weight + weights[i]; + if (randInt <= weight + weights[i]) { + return new SpeciesStatBoosterModifierType(keys[i] as SpeciesStatBoosterItem); + } + weight = curWeight; + } + } + } + + return null; + }); + } +} + class TmModifierTypeGenerator extends ModifierTypeGenerator { constructor(tier: ModifierTier) { super((party: Pokemon[]) => { @@ -1110,6 +1206,8 @@ export const modifierTypes = { SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 10), MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 25), + SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(), + TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs) { return new TempBattleStatBoosterModifierType(pregenArgs[0] as TempBattleStat); @@ -1193,6 +1291,8 @@ export const modifierTypes = { SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), + EVIOLITE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVIOLITE", "eviolite", (type, args) => new Modifiers.EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [Stat.DEF, Stat.SPDEF], 1.5)), + SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.NUGGET", "nugget", 1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small"), @@ -1260,9 +1360,19 @@ interface ModifierPool { [tier: string]: WeightedModifierType[] } +/** + * Used to check if the player has max of a given ball type in Classic + * @param party The player's party, just used to access the scene + * @param ballType The {@linkcode PokeballType} being checked + * @returns boolean: true if the player has the maximum of a given ball type + */ +function hasMaximumBalls(party: Pokemon[], ballType: PokeballType): boolean { + return (party[0].scene.gameMode.isClassic && party[0].scene.pokeballCounts[ballType] >= MAX_PER_TYPE_POKEBALLS); +} + const modifierPool: ModifierPool = { [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.POKEBALL, 6), + new WeightedModifierType(modifierTypes.POKEBALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.POKEBALL)) ? 0 : 6, 6), new WeightedModifierType(modifierTypes.RARE_CANDY, 2), new WeightedModifierType(modifierTypes.POTION, (party: Pokemon[]) => { const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 10 || p.getHpRatio() <= 0.875) && !p.isFainted()).length, 3); @@ -1283,12 +1393,13 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.LURE, 2), new WeightedModifierType(modifierTypes.TEMP_STAT_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), - new WeightedModifierType(modifierTypes.TM_COMMON, 1), + new WeightedModifierType(modifierTypes.TM_COMMON, 2), ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.GREAT_BALL, 6), + new WeightedModifierType(modifierTypes.GREAT_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.GREAT_BALL)) ? 0 : 6, 6), + new WeightedModifierType(modifierTypes.PP_UP, 2), new WeightedModifierType(modifierTypes.FULL_HEAL, (party: Pokemon[]) => { const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { if (i instanceof Modifiers.TurnStatusEffectModifier) { @@ -1342,7 +1453,7 @@ const modifierPool: ModifierPool = { return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15), 8); }, 8), new WeightedModifierType(modifierTypes.MAP, (party: Pokemon[]) => party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex < 180 ? 1 : 0, 1), - new WeightedModifierType(modifierTypes.TM_GREAT, 2), + new WeightedModifierType(modifierTypes.TM_GREAT, 3), new WeightedModifierType(modifierTypes.MEMORY_MUSHROOM, (party: Pokemon[]) => { if (!party.find(p => p.getLearnableLevelMoves().length)) { return 0; @@ -1358,14 +1469,15 @@ const modifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ULTRA_BALL, 24), + new WeightedModifierType(modifierTypes.ULTRA_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ULTRA_BALL)) ? 0 : 15, 15), new WeightedModifierType(modifierTypes.MAX_LURE, 4), new WeightedModifierType(modifierTypes.BIG_NUGGET, skipInLastClassicWaveOrDefault(12)), - new WeightedModifierType(modifierTypes.PP_UP, 9), new WeightedModifierType(modifierTypes.PP_MAX, 3), new WeightedModifierType(modifierTypes.MINT, 4), new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32), - new WeightedModifierType(modifierTypes.AMULET_COIN, 3), + new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), + //new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0), + new WeightedModifierType(modifierTypes.SPECIES_STAT_BOOSTER, 12), new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; @@ -1380,49 +1492,49 @@ const modifierPool: ModifierPool = { }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.TM_ULTRA, 8), + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), + new WeightedModifierType(modifierTypes.TM_ULTRA, 11), new WeightedModifierType(modifierTypes.RARER_CANDY, 4), - new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 2), + new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.IV_SCANNER, 4), new WeightedModifierType(modifierTypes.EXP_CHARM, 8), - new WeightedModifierType(modifierTypes.EXP_SHARE, 12), - new WeightedModifierType(modifierTypes.EXP_BALANCE, 4), + new WeightedModifierType(modifierTypes.EXP_SHARE, 10), + new WeightedModifierType(modifierTypes.EXP_BALANCE, 3), new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), + new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.WIDE_LENS, 4), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.ROGUE_BALL, 24), + new WeightedModifierType(modifierTypes.ROGUE_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ROGUE_BALL)) ? 0 : 16, 16), new WeightedModifierType(modifierTypes.RELIC_GOLD, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.LEFTOVERS, 3), new WeightedModifierType(modifierTypes.SHELL_BELL, 3), new WeightedModifierType(modifierTypes.BERRY_POUCH, 4), new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), new WeightedModifierType(modifierTypes.BATON, 2), - new WeightedModifierType(modifierTypes.SOUL_DEW, 8), + new WeightedModifierType(modifierTypes.SOUL_DEW, 7), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), - new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3), - new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 10), - new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, 18), - new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32), - new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32), - new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(5 - rerollCount * 2, 0) : 0, 5), + new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 8), + new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), + new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), + new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), + new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ - new WeightedModifierType(modifierTypes.MASTER_BALL, 24), + new WeightedModifierType(modifierTypes.MASTER_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.MASTER_BALL)) ? 0 : 24, 24), new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(6 - rerollCount * 2, 0) : 0, 6), + new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1), ].map(m => { @@ -1628,7 +1740,7 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod let i = 0; pool[t].reduce((total: integer, modifierType: WeightedModifierType) => { const weightedModifierType = modifierType as WeightedModifierType; - const existingModifiers = party[0].scene.findModifiers(m => (m.type.generatorId || m.type.id) === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); + const existingModifiers = party[0].scene.findModifiers(m => m.type.id === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); const itemModifierType = weightedModifierType.modifierType instanceof ModifierTypeGenerator ? weightedModifierType.modifierType.generateType(party) : weightedModifierType.modifierType; @@ -1641,7 +1753,7 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod : weightedModifierType.weight as integer : 0; if (weightedModifierType.maxWeight) { - const modifierId = weightedModifierType.modifierType.generatorId || weightedModifierType.modifierType.id; + const modifierId = weightedModifierType.modifierType.id; tierModifierIds.push(modifierId); const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; modifierTableData[modifierId] = { weight: outputWeight, tier: parseInt(t), tierPercent: 0, totalPercent: 0 }; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 626d744eef2..6f098ade124 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2,14 +2,14 @@ import * as ModifierTypes from "./modifier-type"; import { LearnMovePhase, LevelUpPhase, PokemonHealPhase } from "../phases"; import BattleScene from "../battle-scene"; import { getLevelTotalExp } from "../data/exp"; -import { PokeballType } from "../data/pokeball"; +import { MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball"; import Pokemon, { PlayerPokemon } from "../field/pokemon"; import { Stat } from "../data/pokemon-stat"; import { addTextObject, TextStyle } from "../ui/text"; import { Type } from "../data/type"; import { EvolutionPhase } from "../evolution-phase"; import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; -import { getPokemonMessage } from "../messages"; +import {getPokemonMessage, getPokemonNameWithAffix} from "../messages"; import * as Utils from "../utils"; import { TempBattleStat } from "../data/temp-battle-stat"; import { getBerryEffectFunc, getBerryPredicate } from "../data/berry"; @@ -23,6 +23,8 @@ import { Nature } from "#app/data/nature"; import * as Overrides from "../overrides"; import { ModifierType, modifierTypes } from "./modifier-type"; import { Command } from "#app/ui/command-ui-handler.js"; +import { Species } from "#enums/species"; +import i18next from "i18next"; import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; @@ -64,13 +66,19 @@ export class ModifierBar extends Phaser.GameObjects.Container { this.setScale(0.5); } - updateModifiers(modifiers: PersistentModifier[]) { + /** + * Method to update content displayed in {@linkcode ModifierBar} + * @param {PersistentModifier[]} modifiers - The list of modifiers to be displayed in the {@linkcode ModifierBar} + * @param {boolean} hideHeldItems - If set to "true", only modifiers not assigned to a Pokémon are displayed + */ + updateModifiers(modifiers: PersistentModifier[], hideHeldItems: boolean = false) { this.removeAll(true); const visibleIconModifiers = modifiers.filter(m => m.isIconVisible(this.scene as BattleScene)); const nonPokemonSpecificModifiers = visibleIconModifiers.filter(m => !(m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); const pokemonSpecificModifiers = visibleIconModifiers.filter(m => (m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); - const sortedVisibleIconModifiers = nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); + + const sortedVisibleIconModifiers = hideHeldItems ? nonPokemonSpecificModifiers : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); const thisArg = this; @@ -256,7 +264,7 @@ export class AddPokeballModifier extends ConsumableModifier { apply(args: any[]): boolean { const pokeballCounts = (args[0] as BattleScene).pokeballCounts; - pokeballCounts[this.pokeballType] = Math.min(pokeballCounts[this.pokeballType] + this.count, 99); + pokeballCounts[this.pokeballType] = Math.min(pokeballCounts[this.pokeballType] + this.count, MAX_PER_TYPE_POKEBALLS); return true; } @@ -322,7 +330,8 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier match(modifier: Modifier): boolean { if (modifier instanceof DoubleBattleChanceBoosterModifier) { - return (modifier as DoubleBattleChanceBoosterModifier).battlesLeft === this.battlesLeft; + // Check type id to not match different tiers of lures + return modifier.type.id === this.type.id && modifier.battlesLeft === this.battlesLeft; } return false; } @@ -334,9 +343,15 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier getArgs(): any[] { return [ this.battlesLeft ]; } - + /** + * Modifies the chance of a double battle occurring + * @param args A single element array containing the double battle chance as a NumberHolder + * @returns {boolean} Returns true if the modifier was applied + */ apply(args: any[]): boolean { const doubleBattleChance = args[0] as Utils.NumberHolder; + // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt + // A double battle will initiate if the generated number is 0 doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 2); return true; @@ -693,6 +708,180 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for held items that apply {@linkcode Stat} boost(s) + * using a multiplier. + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class StatBoosterModifier extends PokemonHeldItemModifier { + /** The stats that the held item boosts */ + protected stats: Stat[]; + /** The multiplier used to increase the relevant stat(s) */ + protected multiplier: number; + + constructor(type: ModifierType, pokemonId: integer, stats: Stat[], multiplier: number, stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.stats = stats; + this.multiplier = multiplier; + } + + clone() { + return new StatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.stats, this.multiplier ]; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof StatBoosterModifier) { + const modifierInstance = modifier as StatBoosterModifier; + if ((modifierInstance.multiplier === this.multiplier) && (modifierInstance.stats.length === this.stats.length)) { + return modifierInstance.stats.every((e, i) => e === this.stats[i]); + } + } + + return false; + } + + /** + * Checks if the incoming stat is listed in {@linkcode stats} + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Stat} being checked at the time + * [2] {@linkcode Utils.NumberHolder} N/A + * @returns true if the stat could be boosted, false otherwise + */ + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && this.stats.includes(args[1] as Stat); + } + + /** + * Boosts the incoming stat by a {@linkcode multiplier} if the stat is listed + * in {@linkcode stats}. + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Stat} N/A + * [2] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat + * @returns true if the stat boost applies successfully, false otherwise + * @see shouldApply + */ + apply(args: any[]): boolean { + const statValue = args[2] as Utils.NumberHolder; + + statValue.value *= this.multiplier; + return true; + } + + getMaxHeldItemCount(_pokemon: Pokemon): number { + return 1; + } +} + +/** + * Modifier used for held items, specifically Eviolite, that apply + * {@linkcode Stat} boost(s) using a multiplier if the holder can evolve. + * @extends StatBoosterModifier + * @see {@linkcode apply} + */ +export class EvolutionStatBoosterModifier extends StatBoosterModifier { + clone() { + return super.clone() as EvolutionStatBoosterModifier; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof EvolutionStatBoosterModifier; + } + + /** + * Boosts the incoming stat value by a {@linkcode multiplier} if the holder + * can evolve. Note that, if the holder is a fusion, they will receive + * only half of the boost if either of the fused members are fully + * evolved. However, if they are both unevolved, the full boost + * will apply. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Stat} N/A + * [2] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat + * @returns true if the stat boost applies successfully, false otherwise + * @see shouldApply + */ + apply(args: any[]): boolean { + const holder = args[0] as Pokemon; + const statValue = args[2] as Utils.NumberHolder; + const isUnevolved = holder.getSpeciesForm(true).speciesId in pokemonEvolutions; + + if (holder.isFusion() && (holder.getFusionSpeciesForm(true).speciesId in pokemonEvolutions) !== isUnevolved) { + // Half boost applied if holder is fused and either part of fusion is fully evolved + statValue.value *= 1 + (this.multiplier - 1) / 2; + return true; + } else if (isUnevolved) { + // Full boost applied if holder is unfused and unevolved or, if fused, both parts of fusion are unevolved + return super.apply(args); + } + + return false; + } +} + +/** + * Modifier used for held items that apply {@linkcode Stat} boost(s) using a + * multiplier if the holder is of a specific {@linkcode Species}. + * @extends StatBoosterModifier + * @see {@linkcode apply} + */ +export class SpeciesStatBoosterModifier extends StatBoosterModifier { + /** The species that the held item's stat boost(s) apply to */ + private species: Species[]; + + constructor(type: ModifierType, pokemonId: integer, stats: Stat[], multiplier: number, species: Species[], stackCount?: integer) { + super(type, pokemonId, stats, multiplier, stackCount); + + this.species = species; + } + + clone() { + return new SpeciesStatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.species, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.species ]; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof SpeciesStatBoosterModifier) { + const modifierInstance = modifier as SpeciesStatBoosterModifier; + if (modifierInstance.species.length === this.species.length) { + return super.matchType(modifier) && modifierInstance.species.every((e, i) => e === this.species[i]); + } + } + + return false; + } + + /** + * Checks if the incoming stat is listed in {@linkcode stats} and if the holder's {@linkcode Species} + * (or its fused species) is listed in {@linkcode species}. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Stat} being checked at the time + * [2] {@linkcode Utils.NumberHolder} N/A + * @returns true if the stat could be boosted, false otherwise + */ + shouldApply(args: any[]): boolean { + const holder = args[0] as Pokemon; + return super.shouldApply(args) && (this.species.includes(holder.getSpeciesForm(true).speciesId) || (holder.isFusion() && this.species.includes(holder.getFusionSpeciesForm(true).speciesId))); + } + + /** + * Checks if either parameter is included in the corresponding lists + * @param speciesId {@linkcode Species} being checked + * @param stat {@linkcode Stat} being checked + * @returns true if both parameters are in {@linkcode species} and {@linkcode stats} respectively, false otherwise + */ + contains(speciesId: Species, stat: Stat): boolean { + return this.species.includes(speciesId) && this.stats.includes(stat); + } +} + /** * Applies Specific Type item boosts (e.g., Magnet) */ @@ -777,7 +966,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; } @@ -882,7 +1071,7 @@ export class TurnHealModifier extends PokemonHeldItemModifier { if (pokemon.getHpRatio() < 1) { 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; } @@ -973,7 +1162,7 @@ export class HitHealModifier extends PokemonHeldItemModifier { if (pokemon.turnData.damageDealt && pokemon.getHpRatio() < 1) { 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; @@ -1108,7 +1297,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; @@ -1822,7 +2011,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; } @@ -1928,14 +2120,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; @@ -1992,6 +2208,11 @@ 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 { constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -2014,7 +2235,7 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { } 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 { @@ -2022,6 +2243,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; @@ -2031,6 +2258,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; } @@ -2048,7 +2289,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 { @@ -2206,7 +2447,7 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { if (pokemon.getHpRatio() < 1) { 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; } @@ -2281,7 +2522,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier apply(args: any[]): boolean { const target = (args[0] as Pokemon); if (target.status && Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { - target.scene.queueMessage(getPokemonMessage(target, getStatusEffectHealText(target.status.effect))); + target.scene.queueMessage(getStatusEffectHealText(target.status.effect, getPokemonNameWithAffix(target))); target.resetStatus(); target.updateInfo(); return true; diff --git a/src/overrides.ts b/src/overrides.ts index 6ae3af64299..3e894967893 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -8,7 +8,9 @@ import { PokeballCounts } from "./battle-scene"; import { PokeballType } from "./data/pokeball"; import { Gender } from "./data/gender"; import { StatusEffect } from "./data/status-effect"; -import { modifierTypes } from "./modifier/modifier-type"; +import { SpeciesStatBoosterItem, modifierTypes } from "./modifier/modifier-type"; +import { VariantTier } from "./enums/variant-tiers"; +import { EggTier } from "#enums/egg-type"; import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; @@ -36,9 +38,9 @@ export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override export const XP_MULTIPLIER_OVERRIDE: number = null; -export const IMMEDIATE_HATCH_EGGS_OVERRIDE: boolean = false; // default 1000 export const STARTING_MONEY_OVERRIDE: integer = 0; +export const FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = { active: false, pokeballs: { @@ -98,6 +100,17 @@ export const OPP_SHINY_OVERRIDE: boolean = false; export const OPP_VARIANT_OVERRIDE: Variant = 0; export const OPP_IVS_OVERRIDE: integer | integer[] = []; +/** + * EGG OVERRIDES + */ + +export const EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; +export const EGG_TIER_OVERRIDE: EggTier = null; +export const EGG_SHINY_OVERRIDE: boolean = false; +export const EGG_VARIANT_OVERRIDE: VariantTier = null; +export const EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; +export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; + /** * MODIFIER / ITEM OVERRIDES * if count is not provided, it will default to 1 @@ -112,11 +125,12 @@ export const OPP_IVS_OVERRIDE: integer | integer[] = []; * - Nature is for MINT * - Type is for TERA_SHARD or ATTACK_TYPE_BOOSTER (type boosting items i.e Silk Scarf) * - BerryType is for BERRY + * - SpeciesStatBoosterItem is for SPECIES_STAT_BOOSTER */ interface ModifierOverride { name: keyof typeof modifierTypes & string, count?: integer - type?: TempBattleStat|Stat|Nature|Type|BerryType + type?: TempBattleStat|Stat|Nature|Type|BerryType|SpeciesStatBoosterItem } export const STARTING_MODIFIER_OVERRIDE: Array = []; export const OPP_MODIFIER_OVERRIDE: Array = []; diff --git a/src/phases.ts b/src/phases.ts index 4c63aaabf42..c34889be8f3 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -19,14 +19,14 @@ import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags"; +import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr } from "./data/ability"; +import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -878,9 +878,11 @@ export class EncounterPhase extends BattlePhase { if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); } else { + // This block only applies for double battles to init the boss segments (idk why it's split up like this) if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { for (const enemyPokemon of battle.enemyParty) { - if (enemyPokemon.isBoss()) { + // If the enemy pokemon is a boss and wasn't populated from data source, then set it up + if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); enemyPokemon.initBattleInfo(); } @@ -2249,6 +2251,7 @@ export class TurnStartPhase extends FieldPhase { this.scene.getField(true).filter(p => p.summonData).map(p => { const bypassSpeed = new Utils.BooleanHolder(false); + applyAbAttrs(BypassSpeedChanceAbAttr, p, null, bypassSpeed); this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; }); @@ -2432,7 +2435,7 @@ export class TurnEndPhase extends FieldPhase { if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), - Math.max(pokemon.getMaxHp() >> 4, 1), getPokemonMessage(pokemon, "'s HP was restored."), true)); + Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); } if (!pokemon.isPlayer()) { @@ -2592,7 +2595,7 @@ export class MovePhase extends BattlePhase { if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) { this.scene.queueMessage(`${this.move.getName()} is disabled!`); } - if (this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails + if (this.pokemon.isActive(true) && this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails this.fail(); this.showMoveText(); this.showFailedText(); @@ -2788,12 +2791,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(); } @@ -2887,6 +2890,7 @@ export class MoveEffectPhase extends PokemonPhase { const hitCount = new Utils.IntegerHolder(1); // Assume single target for multi hit applyMoveAttrs(MultiHitAttr, user, this.getTarget(), move, hitCount); + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, targets.length, hitCount, new Utils.IntegerHolder(0)); if (move instanceof AttackMove && !move.hasAttr(FixedDamageAttr)) { this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); } @@ -2894,21 +2898,20 @@ export class MoveEffectPhase extends PokemonPhase { } const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - user.pushMoveHistory(moveHistoryEntry); const targetHitChecks = Object.fromEntries(targets.map(p => [p.getBattlerIndex(), this.hitCheck(p)])); const activeTargets = targets.map(t => t.isActive(true)); if (!activeTargets.length || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]])) { - user.turnData.hitCount = 1; - user.turnData.hitsLeft = 1; + this.stopMultiHit(); if (activeTargets.length) { - this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(this.getTarget()) })); moveHistoryEntry.result = MoveResult.MISS; applyMoveAttrs(MissEffectAttr, user, null, move); } else { this.scene.queueMessage(i18next.t("battle:attackFailed")); moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); return this.end(); } @@ -2918,9 +2921,8 @@ export class MoveEffectPhase extends PokemonPhase { new MoveAnim(move.id as Moves, user, this.getTarget()?.getBattlerIndex()).play(this.scene, () => { for (const target of targets) { if (!targetHitChecks[target.getBattlerIndex()]) { - user.turnData.hitCount = 1; - user.turnData.hitsLeft = 1; - this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); + this.stopMultiHit(target); + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; } @@ -2930,25 +2932,34 @@ export class MoveEffectPhase extends PokemonPhase { const isProtected = !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target) && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)); - const firstHit = moveHistoryEntry.result !== MoveResult.SUCCESS; + const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + const firstTarget = (moveHistoryEntry.result === MoveResult.PENDING); + + if (firstHit) { + user.pushMoveHistory(moveHistoryEntry); + } moveHistoryEntry.result = MoveResult.SUCCESS; const hitResult = !isProtected ? target.apply(user, move) : HitResult.NO_EFFECT; - this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); + + if (lastHit) { + this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + } applyAttrs.push(new Promise(resolve => { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit), + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move).then(() => { if (hitResult !== HitResult.FAIL) { const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget(), move)); // Charge attribute with charge effect takes all effect attributes and applies them to charge stage, so ignore them if this is present Utils.executeIf(!chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY - && attr.selfTarget && (!attr.firstHitOnly || firstHit), user, target, move)).then(() => { + && attr.selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move)).then(() => { if (hitResult !== HitResult.NO_EFFECT) { applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_APPLY - && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit), user, target, this.move.getMove()).then(() => { + && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()).then(() => { if (hitResult < HitResult.NO_EFFECT && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr)) { const flinched = new Utils.BooleanHolder(false); user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); @@ -2956,8 +2967,8 @@ export class MoveEffectPhase extends PokemonPhase { target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); } } - Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT && (!attr.firstHitOnly || firstHit), - user, target, this.move.getMove()).then(() => { + Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT + && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()).then(() => { return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult).then(() => { if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); @@ -2965,7 +2976,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(); }); @@ -2983,14 +2994,17 @@ export class MoveEffectPhase extends PokemonPhase { }); })); } - // Trigger effect which should only apply one time after all targeted effects have already applied - const postTarget = applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, - user, null, move); + // Trigger effect which should only apply one time on the last hit after all targeted effects have already applied + const postTarget = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()) ? + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : + null; - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); + if (!!postTarget) { + if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after + applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); + } else { // Otherwise, push a new asynchronous move effect + applyAttrs.push(postTarget); + } } Promise.allSettled(applyAttrs).then(() => this.end()); @@ -3043,7 +3057,7 @@ export class MoveEffectPhase extends PokemonPhase { return true; } - const hiddenTag = target.getTag(HiddenTag); + const hiddenTag = target.getTag(SemiInvulnerableTag); if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === hiddenTag.tagType)) { return false; } @@ -3091,7 +3105,7 @@ export class MoveEffectPhase extends PokemonPhase { applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier, this.move.getMove()); const evasionMultiplier = new Utils.NumberHolder(1); - applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this.getTarget(), BattleStat.EVA, evasionMultiplier); + applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier); accuracyMultiplier.value /= evasionMultiplier.value; @@ -3113,6 +3127,28 @@ export class MoveEffectPhase extends PokemonPhase { return this.getTargets().find(() => true); } + removeTarget(target: Pokemon): void { + const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); + if (targetIndex !== -1) { + this.targets.splice(this.targets.findIndex(ind => ind === target.getBattlerIndex()), 1); + } + } + + stopMultiHit(target?: Pokemon): void { + /** If given a specific target, remove the target from subsequent strikes */ + if (target) { + this.removeTarget(target); + } + /** + * If no target specified, or the specified target was the last of this move's + * targets, completely cancel all subsequent strikes. + */ + if (!target || this.targets.length === 0 ) { + this.getUserPokemon().turnData.hitCount = 1; + this.getUserPokemon().turnData.hitsLeft = 1; + } + } + getNewHitPhase() { return new MoveEffectPhase(this.scene, this.battlerIndex, this.targets, this.move); } @@ -3390,7 +3426,7 @@ export class StatChangePhase extends PokemonPhase { } else { statsFragment = getBattleStatName(relLevelStats[0]); } - messages.push(getPokemonMessage(this.getPokemon(), `'s ${statsFragment} ${getBattleStatLevelChangeDescription(Math.abs(parseInt(rl)), levels >= 1)}!`)); + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1)); }); return messages; @@ -3480,7 +3516,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)); } @@ -3489,7 +3525,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(); } @@ -3506,9 +3542,10 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { pokemon.status.incrementTurn(); const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectActivationText(pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); let damage: integer = 0; switch (pokemon.status.effect) { case StatusEffect.POISON: @@ -3589,7 +3626,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(); @@ -4019,6 +4058,10 @@ export class MoneyRewardPhase extends BattlePhase { this.scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + if (this.scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + this.scene.addMoney(moneyAmount.value); const userLocale = navigator.language || "en-US"; @@ -4049,7 +4092,7 @@ export class ModifierRewardPhase extends BattlePhase { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { this.scene.playSound("item_fanfare"); - this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => resolve(), null, true); + this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier.type.name }), null, () => resolve(), null, true); }); }); } @@ -4067,7 +4110,7 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { this.scene.playSound("level_up_fanfare"); this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { + this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier.type.name }), null, () => { this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); resolve(); }, null, true, 1500); @@ -4718,7 +4761,7 @@ export class PokemonHealPhase extends CommonAnimPhase { pokemon.resetStatus(); pokemon.updateInfo().then(() => super.end()); } else if (this.showFullHpMessage) { - this.message = getPokemonMessage(pokemon, "'s\nHP is full!"); + this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); } if (this.message) { @@ -4726,7 +4769,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) { @@ -5265,7 +5308,7 @@ export class EggLapsePhase extends Phase { super.start(); const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => { - return Overrides.IMMEDIATE_HATCH_EGGS_OVERRIDE ? true : --egg.hatchWaves < 1; + return Overrides.EGG_IMMEDIATE_HATCH_OVERRIDE ? true : --egg.hatchWaves < 1; }); let eggCount: integer = eggsToHatch.length; diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 14e5c74f12c..3bcac101465 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -12,12 +12,45 @@ import { ptBrConfig } from "#app/locales/pt_BR/config.js"; import { zhCnConfig } from "#app/locales/zh_CN/config.js"; import { zhTwConfig } from "#app/locales/zh_TW/config.js"; +const unicodeHalfAndFullWidthForms = [ + "U+FF00-FFEF" +]; + +const unicodeCJK = [ + "U+2E80-2EFF", + "U+3000-303F", + "U+31C0-31EF", + "U+3200-32FF", + "U+3400-4DBF", + "U+4E00-9FFF", + "U+F900-FAFF", + "U+FE30-FE4F", +].join(","); + +const unicodeHangul = [ + "U+1100-11FF", + "U+3130-318F", + "U+A960-A97F", + "U+AC00-D7AF", + "U+D7B0-D7FF", +].join(","); + const fonts = [ - new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: "U+AC00-D7AC"}), + // korean + new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), Object.assign( - new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: "U+AC00-D7AC"}), + new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), { sizeAdjust: "133%" } ), + // unicode + Object.assign( + new FontFace("emerald", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), + { sizeAdjust: "70%", format: "opentype" } + ), + Object.assign( + new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), + { format: "opentype" } + ), ]; async function initFonts() { diff --git a/src/scene-base.ts b/src/scene-base.ts index 48b7238387c..1d7a2518300 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -1,6 +1,19 @@ export const legacyCompatibleImages: string[] = []; export class SceneBase extends Phaser.Scene { + /** + * Since everything is scaled up by 6 by default using the game.canvas is annoying + * Until such point that we use the canvas normally, this will be easier than + * having to divide every width and heigh by 6 to position and scale the ui + * @readonly + * @defaultValue + * width: `320` + * height: `180` + */ + public readonly scaledCanvas = { + width: 1920 / 6, + height: 1080 / 6 + }; constructor(config?: string | Phaser.Types.Scenes.SettingsConfig) { super(config); } diff --git a/src/system/achv.ts b/src/system/achv.ts index 511ddd1eb8e..dda6e5c511b 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -316,10 +316,10 @@ 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), diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index 9bacb357035..b4bd4368bd9 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -1,20 +1,49 @@ -import { Egg, GachaType } from "../data/egg"; +import { EggTier } from "#enums/egg-type"; +import { Species } from "#enums/species"; +import { VariantTier } from "#enums/variant-tiers"; +import { EGG_SEED, Egg } from "../data/egg"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export default class EggData { public id: integer; - public gachaType: GachaType; + public tier: EggTier; + public sourceType: EggSourceType; public hatchWaves: integer; public timestamp: integer; + public variantTier: VariantTier; + public isShiny: boolean; + public species: Species; + public eggMoveIndex: number; + public overrideHiddenAbility: boolean; constructor(source: Egg | any) { const sourceEgg = source instanceof Egg ? source as Egg : null; this.id = sourceEgg ? sourceEgg.id : source.id; - this.gachaType = sourceEgg ? sourceEgg.gachaType : source.gachaType; + this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); + // legacy egg + if (source.species === 0) { + // check if it has a gachaType (deprecated) + this.sourceType = source.gachaType ?? source.sourceType; + } else { + this.sourceType = sourceEgg ? sourceEgg.sourceType : source.sourceType; + } this.hatchWaves = sourceEgg ? sourceEgg.hatchWaves : source.hatchWaves; this.timestamp = sourceEgg ? sourceEgg.timestamp : source.timestamp; + this.variantTier = sourceEgg ? sourceEgg.variantTier : source.variantTier; + this.isShiny = sourceEgg ? sourceEgg.isShiny : source.isShiny; + this.species = sourceEgg ? sourceEgg.species : source.species; + this.eggMoveIndex = sourceEgg ? sourceEgg.eggMoveIndex : source.eggMoveIndex; + this.overrideHiddenAbility = sourceEgg ? sourceEgg.overrideHiddenAbility : source.overrideHiddenAbility; } toEgg(): Egg { - return new Egg(this.id, this.gachaType, this.hatchWaves, this.timestamp); + // Species will be 0 if an old legacy is loaded from DB + if (!this.species) { + return new Egg({ id: this.id, hatchWaves: this.hatchWaves, sourceType: this.sourceType, timestamp: this.timestamp, tier: Math.floor(this.id / EGG_SEED) }); + } else { + return new Egg({id: this.id, tier: this.tier, sourceType: this.sourceType, hatchWaves: this.hatchWaves, + timestamp: this.timestamp, variantTier: this.variantTier, isShiny: this.isShiny, species: this.species, + eggMoveIndex: this.eggMoveIndex, overrideHiddenAbility: this.overrideHiddenAbility }); + } } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index f36bf1af229..ac54c942fc7 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,3 +1,4 @@ +import i18next from "i18next"; import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; @@ -1485,7 +1486,7 @@ export class GameData { if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(`${species.name} has been\nadded as a starter!`, null, () => checkPrevolution(), null, true); + this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(), null, true); } else { checkPrevolution(); } @@ -1551,7 +1552,9 @@ export class GameData { this.starterData[speciesId].eggMoves |= value; this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(`${eggMoveIndex === 3 ? "Rare " : ""}Egg Move unlocked: ${allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name}`, null, () => resolve(true), null, true); + + const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name; + this.scene.ui.showText(eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }), null, () => resolve(true), null, true); }); } diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index d79206d89df..6f169280da1 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -5,7 +5,6 @@ import { GeneratedPersistentModifierType, ModifierTypeGenerator, getModifierType export default class ModifierData { private player: boolean; private typeId: string; - private typeGeneratorId: string; private typePregenArgs: any[]; private args: any[]; private stackCount: integer; @@ -16,7 +15,6 @@ export default class ModifierData { const sourceModifier = source instanceof PersistentModifier ? source as PersistentModifier : null; this.player = player; this.typeId = sourceModifier ? sourceModifier.type.id : source.typeId; - this.typeGeneratorId = sourceModifier ? sourceModifier.type.generatorId : source.typeGeneratorId; if (sourceModifier) { if ("getPregenArgs" in source.type) { this.typePregenArgs = (source.type as GeneratedPersistentModifierType).getPregenArgs(); @@ -38,7 +36,6 @@ export default class ModifierData { try { let type = typeFunc(); type.id = this.typeId; - type.generatorId = this.typeGeneratorId; if (type instanceof ModifierTypeGenerator) { type = (type as ModifierTypeGenerator).generateType(this.player ? scene.getParty() : scene.getEnemyField(), this.typePregenArgs); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index e30cfd7e24e..57f4c0aea93 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -50,6 +50,7 @@ export default class PokemonData { public fusionLuck: integer; public boss: boolean; + public bossSegments?: integer; public summonData: PokemonSummonData; @@ -96,6 +97,7 @@ export default class PokemonData { if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); + this.bossSegments = source.bossSegments; } if (sourcePokemon) { diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 1cc525b0bac..b09de095259 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -96,7 +96,8 @@ export const SettingKeys = { Master_Volume: "MASTER_VOLUME", BGM_Volume: "BGM_VOLUME", SE_Volume: "SE_VOLUME", - Music_Preference: "MUSIC_PREFERENCE" + Music_Preference: "MUSIC_PREFERENCE", + Show_BGM_Bar: "SHOW_BGM_BAR", }; /** @@ -488,6 +489,14 @@ export const Setting: Array = [ default: 0, type: SettingType.DISPLAY }, + { + key: SettingKeys.Show_BGM_Bar, + label: i18next.t("settings:showBgmBar"), + options: OFF_ON, + default: 0, + type: SettingType.DISPLAY, + requireReload: true + }, { key: SettingKeys.Master_Volume, label: i18next.t("settings:masterVolume"), @@ -525,7 +534,8 @@ export const Setting: Array = [ default: 0, type: SettingType.AUDIO, requireReload: true - } + }, + ]; /** @@ -600,11 +610,13 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): case SettingKeys.Battle_Style: scene.battleStyle = value; break; + case SettingKeys.Show_BGM_Bar: + scene.showBgmBar = Setting[index].options[value].value === "On"; + break; case SettingKeys.Candy_Upgrade_Notification: if (scene.candyUpgradeNotification === value) { break; } - scene.candyUpgradeNotification = value; scene.eventTarget.dispatchEvent(new CandyUpgradeNotificationChangedEvent(value)); break; diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts new file mode 100644 index 00000000000..bfd1fdf59fe --- /dev/null +++ b/src/test/abilities/aura_break.test.ts @@ -0,0 +1,95 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { MoveEffectPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import Move, { allMoves } from "#app/data/move.js"; +import Pokemon from "#app/field/pokemon.js"; +import { FieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; +import { NumberHolder } from "#app/utils.js"; + +describe("Abilities - Aura Break", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const multiplier = 9 / 16; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + }); + + it("reverses the effect of fairy aura", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); + const basePower = allMoves[Moves.MOONBLAST].power; + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MOONBLAST)); + + const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.MOONBLAST]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(appliedPower).not.toBe(undefined); + expect(appliedPower).not.toBe(basePower); + expect(appliedPower).toBe(basePower * multiplier); + + }); + + it("reverses the effect of dark aura", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); + const basePower = allMoves[Moves.DARK_PULSE].power; + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DARK_PULSE)); + + const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.DARK_PULSE]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(appliedPower).not.toBe(undefined); + expect(appliedPower).not.toBe(basePower); + expect(appliedPower).toBe(basePower * multiplier); + }); +}); + +/** + * Calculates the mocked power of a move in a Pokémon battle, taking into account certain abilities. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used in the attack. + * @returns The calculated power of the move after applying any relevant ability effects. + * + * @remarks + * This function creates a NumberHolder with the initial power of the move. + * It then checks if the defender has an ability with the FieldMoveTypePowerBoostAbAttr. + * If so, it applies a power modification of 9/16 using an instance of FieldMoveTypePowerBoostAbAttr. + * The final calculated power is then returned. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move): number => { + const powerHolder = new NumberHolder(move.power); + + if (defender.hasAbilityWithAttr(FieldMoveTypePowerBoostAbAttr)) { + const auraBreakInstance = new FieldMoveTypePowerBoostAbAttr(move.type, 9 / 16); + auraBreakInstance.applyPreAttack(attacker, false, defender, move, [powerHolder]); + } + + return powerHolder.value; +}; diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 93bac836f61..53a04732b74 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -3,7 +3,6 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import * as overrides from "#app/overrides"; import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import Move, { allMoves, MoveCategory } from "#app/data/move.js"; @@ -42,13 +41,11 @@ describe("Abilities - Battery", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); }); it("does not raise the power of allies' non-special moves", async () => { @@ -61,13 +58,11 @@ describe("Abilities - Battery", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).toBe(basePower); - expect(appliedPower).not.toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); }); it("does not raise the power of the ability owner's special moves", async () => { @@ -80,25 +75,25 @@ describe("Abilities - Battery", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).toBe(basePower); - expect(appliedPower).not.toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); }); }); /** - * Calculates the adjusted applied power of a move. + * 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 getAppliedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { const powerHolder = new NumberHolder(move.power); /** diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts new file mode 100644 index 00000000000..ecd70088aa2 --- /dev/null +++ b/src/test/abilities/costar.test.ts @@ -0,0 +1,93 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import Phaser from "phaser"; +import * as Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { CommandPhase, MessagePhase } from "#app/phases.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { Abilities } from "#app/enums/abilities.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - COSTAR", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + + test( + "ability copies positive stat changes", + async () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + 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, 1, Moves.SPLASH)); + await game.toNextTurn(); + + expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + }, + TIMEOUT, + ); + + test( + "ability copies negative stat changes", + async () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon).toBeDefined(); + expect(rightPokemon).toBeDefined(); + + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(rightPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + }, + TIMEOUT, + ); +}); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index cf8ba386b2e..297aa33e06c 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -64,4 +64,35 @@ describe("Abilities - DISGUISE", () => { }, TIMEOUT ); + + test( + "damage taken should be equal to 1/8 of its maximum HP, rounded down", + async () => { + const baseForm = 0, + bustedForm = 1; + + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + [Species.MIMIKYU]: baseForm, + }); + + await game.startBattle([Species.MIMIKYU]); + + const mimikyu = game.scene.getPlayerPokemon(); + const damage = (Math.floor(mimikyu.getMaxHp()/8)); + + expect(mimikyu).not.toBe(undefined); + expect(mimikyu.formIndex).toBe(baseForm); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mimikyu.formIndex).toBe(bustedForm); + expect(game.scene.getEnemyPokemon().turnData.currDamageDealt).toBe(damage); + }, + TIMEOUT + ); }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts new file mode 100644 index 00000000000..bfb8f45a11f --- /dev/null +++ b/src/test/abilities/dry_skin.test.ts @@ -0,0 +1,163 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { TurnEndPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#app/enums/species.js"; + +describe("Abilities - Dry Skin", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHARMANDER); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); + }); + + it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUNNY_DAY, Moves.SPLASH]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + // first turn + let previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.SUNNY_DAY)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeLessThan(previousEnemyHp); + + // second turn + previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeLessThan(previousEnemyHp); + }); + + it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.RAIN_DANCE, Moves.SPLASH]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + + // first turn + let previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.RAIN_DANCE)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeGreaterThan(previousEnemyHp); + + // second turn + previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeGreaterThan(previousEnemyHp); + }); + + it("opposing fire attacks do 25% more damage", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EMBER]); + + // ensure the enemy doesn't die to this + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(30); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + // first turn + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); // this makes moves always deal 85% damage + game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + await game.phaseInterceptor.to(TurnEndPhase); + const fireDamageTakenWithDrySkin = enemy.getMaxHp() - enemy.hp; + + expect(enemy.hp > 0); + enemy.hp = enemy.getMaxHp(); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + + // second turn + game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + await game.phaseInterceptor.to(TurnEndPhase); + const fireDamageTakenWithoutDrySkin = enemy.getMaxHp() - enemy.hp; + + expect(fireDamageTakenWithDrySkin).toBeGreaterThan(fireDamageTakenWithoutDrySkin); + }); + + it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeGreaterThan(1); + }); + + it("opposing water attacks do not heal if they were protected from", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBe(1); + }); + + it("multi-strike water attacks only heal once", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + + // first turn + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_SHURIKEN)); + await game.phaseInterceptor.to(TurnEndPhase); + const healthGainedFromWaterShuriken = enemy.hp - 1; + + enemy.hp = 1; + + // second turn + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to(TurnEndPhase); + const healthGainedFromWaterGun = enemy.hp - 1; + + expect(healthGainedFromWaterShuriken).toBe(healthGainedFromWaterGun); + }); +}); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 09fd8733f93..7d85f5bbc55 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -55,7 +55,7 @@ describe("Abilities - Ice Face", () => { 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(5); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); await game.startBattle([Species.HITMONLEE]); game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES)); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index a11feea9f88..a00239a651b 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Protean", () => { TIMEOUT, ); - test( + test.skip( "ability applies only once per switch in", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts new file mode 100644 index 00000000000..4401ee0d40a --- /dev/null +++ b/src/test/abilities/parental_bond.test.ts @@ -0,0 +1,650 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import * as Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Type } from "#app/data/type.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { StatusEffect } from "#app/data/status-effect.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Parental Bond", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + test( + "ability should add second strike to attack move", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + let enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); + + await game.phaseInterceptor.to(DamagePhase); + const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; + enemyStartingHp = enemyPokemon.hp; + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(secondStrikeDamage).toBe(Math.ceil(0.25 * firstStrikeDamage)); + }, TIMEOUT + ); + + test( + "ability should apply secondary effects to both strikes", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWER_UP_PUNCH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.POWER_UP_PUNCH)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2); + }, TIMEOUT + ); + + test( + "ability should not apply to Status moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BABY_DOLL_EYES]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BABY_DOLL_EYES)); + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1); + }, TIMEOUT + ); + + test( + "ability should not apply to multi-hit moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_HIT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DOUBLE_HIT)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + }, TIMEOUT + ); + + test( + "ability should not apply to self-sacrifice moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SELF_DESTRUCT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SELF_DESTRUCT)); + + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(1); + }, TIMEOUT + ); + + test( + "ability should not apply to Rollout", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROLLOUT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ROLLOUT)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(1); + }, TIMEOUT + ); + + test( + "ability should not apply multiplier to fixed-damage moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 80); + }, TIMEOUT + ); + + test( + "ability should not apply multiplier to counter moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.COUNTER]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const playerStartingHp = leadPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.COUNTER)); + await game.phaseInterceptor.to(DamagePhase); + + const playerDamage = playerStartingHp - leadPokemon.hp; + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 4*playerDamage); + }, TIMEOUT + ); + + test( + "ability should not apply to multi-target moves", + async () => { + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + + await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(BerryPhase, false); + + playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); + }, TIMEOUT + ); + + test( + "ability should apply to multi-target moves when hitting only one target", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + }, TIMEOUT + ); + + test( + "ability should only trigger post-target move effects once", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MIND_BLOWN]); + + await game.startBattle([Species.PIDGEOT]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MIND_BLOWN)); + + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + // This test will time out if the user faints + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.hp).toBe(Math.floor(leadPokemon.getMaxHp()/2)); + }, TIMEOUT + ); + + test( + "Burn Up only removes type after second strike with this ability", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BURN_UP)); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.hp).toBeGreaterThan(0); + expect(leadPokemon.isOfType(Type.FIRE)).toBe(true); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.isOfType(Type.FIRE)).toBe(false); + }, TIMEOUT + ); + + test( + "Moves boosted by this ability and Multi-Lens should strike 4 times", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(4); + }, TIMEOUT + ); + + test( + "Super Fang boosted by this ability and Multi-Lens should strike twice", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUPER_FANG]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.SUPER_FANG)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon.hp).toBe(Math.ceil(enemyStartingHp * 0.25)); + }, TIMEOUT + ); + + test( + "Seismic Toss boosted by this ability and Multi-Lens should strike twice", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SEISMIC_TOSS]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.SEISMIC_TOSS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); + }, TIMEOUT + ); + + test( + "Hyper Beam boosted by this ability should strike twice, then recharge", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HYPER_BEAM)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + }, TIMEOUT + ); + + /** TODO: Fix TRAPPED tag lapsing incorrectly, then run this test */ + test.skip( + "Anchor Shot boosted by this ability should only trap the target after the second hit", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ANCHOR_SHOT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ANCHOR_SHOT)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); // Passes + + await game.phaseInterceptor.to(MoveEndPhase); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); // Passes + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); // Fails :( + }, TIMEOUT + ); + + test( + "Smack Down boosted by this ability should only ground the target after the second hit", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SMACK_DOWN]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SMACK_DOWN)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + }, TIMEOUT + ); + + test( + "U-turn boosted by this ability should strike twice before forcing a switch", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.U_TURN]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.U_TURN)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(MoveEffectPhase); + expect(leadPokemon.turnData.hitCount).toBe(2); + + // This will cause this test to time out if the switch was forced on the first hit. + await game.phaseInterceptor.to(MoveEffectPhase, false); + }, TIMEOUT + ); + + test( + "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WAKE_UP_SLAP]); + vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WAKE_UP_SLAP)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.status?.effect).toBeUndefined(); + }, TIMEOUT + ); + + test( + "ability should not cause user to hit into King's Shield more than once", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1); + }, TIMEOUT + ); + + test( + "ability should not cause user to hit into Storm Drain more than once", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STORM_DRAIN); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1); + }, TIMEOUT + ); + + test( + "ability should not apply to multi-target moves with Multi-Lens", + async () => { + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); + + await game.phaseInterceptor.to(DamagePhase); + const enemyFirstHitDamage = enemyStartingHp.map((hp, i) => hp - enemyPokemon[i].hp); + + await game.phaseInterceptor.to(BerryPhase, false); + + enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(2*enemyFirstHitDamage[i])); + + }, TIMEOUT + ); +}); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 5450aee9742..0ed2b10f4be 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -3,7 +3,6 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import * as overrides from "#app/overrides"; import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import Move, { allMoves, MoveCategory } from "#app/data/move.js"; @@ -42,13 +41,11 @@ describe("Abilities - Power Spot", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); }); it("raises the power of allies' physical moves by 30%", async () => { @@ -61,13 +58,11 @@ describe("Abilities - Power Spot", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); }); it("does not raise the power of the ability owner's moves", async () => { @@ -80,25 +75,25 @@ describe("Abilities - Power Spot", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).toBe(basePower); - expect(appliedPower).not.toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); }); }); /** - * Calculates the adjusted applied power of a move. + * 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 getAppliedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { const powerHolder = new NumberHolder(move.power); /** diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index d102daf7fcc..125c03eb39c 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Protean", () => { TIMEOUT, ); - test( + test.skip( "ability applies only once per switch in", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts new file mode 100644 index 00000000000..884b108381d --- /dev/null +++ b/src/test/abilities/quick_draw.test.ts @@ -0,0 +1,90 @@ +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as Overrides from "#app/overrides"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import { FaintPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allAbilities, BypassSpeedChanceAbAttr } from "#app/data/ability"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; + +describe("Abilities - Quick Draw", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + + vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); + }); + + test("makes pokemon going first in its priority bracket", async () => { + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(FaintPhase, false); + + expect(pokemon.isFainted()).toBe(false); + expect(enemy.isFainted()).toBe(true); + expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); + }, 20000); + + test("does not triggered by non damage moves", async () => { + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAIL_WHIP)); + await game.phaseInterceptor.to(FaintPhase, false); + + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); + }, 20000); + + test("does not increase priority", async () => { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.EXTREME_SPEED)); + + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(FaintPhase, false); + + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); + }, 20000); +}); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts new file mode 100644 index 00000000000..221d48d3ca1 --- /dev/null +++ b/src/test/abilities/sand_veil.test.ts @@ -0,0 +1,83 @@ +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 { CommandPhase, MoveEffectPhase, MoveEndPhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { WeatherType } from "#app/data/weather.js"; +import { BattleStatMultiplierAbAttr, allAbilities } from "#app/data/ability.js"; + +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); + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEOWSCARADA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SANDSTORM); + }); + + 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].hp).toBe(leadPokemon[0].getMaxHp()); + expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); + }, TIMEOUT + ); +}); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 1c9943fbfc8..d790469e952 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -27,6 +27,7 @@ describe("Abilities - Screen Cleaner", () => { game = new GameManager(phaserGame); vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); }); it("removes Aurora Veil", async () => { diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts new file mode 100644 index 00000000000..e9c673a102a --- /dev/null +++ b/src/test/abilities/steely_spirit.test.ts @@ -0,0 +1,115 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { allAbilities, applyPreAttackAbAttrs, UserFieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; +import { Abilities } from "#app/enums/abilities.js"; + +describe("Abilities - Steely Spirit", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const steelySpiritMultiplier = 1.5; + const moveToCheck = Moves.IRON_HEAD; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("increases Steel-type moves used by the user and its allies", async () => { + await game.startBattle([Species.MAGIKARP, Species.PERRSERKER]); + const perserrker = game.scene.getPlayerField()[1]; + + vi.spyOn(perserrker, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + + expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), perserrker, allMoves[moveToCheck]); + + expect(mockedMovePower).toBe(allMoves[moveToCheck].power * steelySpiritMultiplier); + }); + + it("stacks if multiple users with this ability are on the field.", async () => { + await game.startBattle([Species.PERRSERKER, Species.PERRSERKER]); + + 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)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToCheck]); + + expect(mockedMovePower).toBe(allMoves[moveToCheck].power * Math.pow(steelySpiritMultiplier, 2)); + }); + + it("does not take effect when suppressed", async () => { + await game.startBattle([Species.MAGIKARP, Species.PERRSERKER]); + const perserrker = game.scene.getPlayerField()[1]; + + vi.spyOn(perserrker, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + + perserrker.summonData.abilitySuppressed = true; + + expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(false); + expect(perserrker.summonData.abilitySuppressed).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), perserrker, allMoves[moveToCheck]); + + expect(mockedMovePower).toBe(allMoves[moveToCheck].power); + }); +}); + +/** + * Calculates the mocked power of a move. + * Note this does not consider other damage calculations + * except the power multiplier from Steely Spirit. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used by the attacker. + * @returns The adjusted power of the move. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const powerHolder = new NumberHolder(move.power); + + /** + * Check if pokemon has the specified ability and is in effect. + * See Pokemon.hasAbility {@linkcode Pokemon.hasAbility} + */ + if (attacker.hasAbility(Abilities.STEELY_SPIRIT)) { + const alliedField: Pokemon[] = attacker instanceof PlayerPokemon ? attacker.scene.getPlayerField() : attacker.scene.getEnemyField(); + alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, this, move, powerHolder)); + } + + return powerHolder.value; +}; diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 7bfac5e8f18..b9d764971f0 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -3,7 +3,8 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import * as overrides from "#app/overrides"; import { - TurnEndPhase, + DamagePhase, + MoveEndPhase, } from "#app/phases"; import {getMovePosition} from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; @@ -45,7 +46,7 @@ describe("Abilities - Sturdy", () => { async () => { await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); expect(game.scene.getEnemyParty()[0].hp).toBe(1); }, TIMEOUT @@ -55,10 +56,13 @@ describe("Abilities - Sturdy", () => { "Sturdy doesn't activate when user is not at full HP", async () => { await game.startBattle(); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; + game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(DamagePhase); + expect(enemyPokemon.hp).toBe(0); expect(enemyPokemon.isFainted()).toBe(true); }, @@ -66,11 +70,12 @@ describe("Abilities - Sturdy", () => { ); test( - "Sturdy pokemon should be inmune to OHKO moves", + "Sturdy pokemon should be immune to OHKO moves", async () => { await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }, @@ -84,7 +89,8 @@ describe("Abilities - Sturdy", () => { await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(DamagePhase); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; expect(enemyPokemon.hp).toBe(0); expect(enemyPokemon.isFainted()).toBe(true); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index a799e203f03..c53be8c82a4 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -31,6 +31,7 @@ describe("Abilities - Unseen Fist", () => { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); test( @@ -81,7 +82,7 @@ async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, pro const enemyStartingHp = enemyPokemon.hp; game.doAttack(getMovePosition(game.scene, 0, attackMove)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); if (shouldSucceed) { expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 8c629d8d771..86efd1a9d93 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -41,7 +41,7 @@ describe("Abilities - Volt Absorb", () => { vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); await game.startBattle(); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts new file mode 100644 index 00000000000..89957362268 --- /dev/null +++ b/src/test/abilities/wind_power.test.ts @@ -0,0 +1,97 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +describe("Abilities - Wind Power", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("it becomes charged when hit by wind moves", async () => { + await game.startBattle([Species.MAGIKARP]); + const shiftry = game.scene.getEnemyPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + }); + + it("it becomes charged when Tailwind takes effect on its side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + }); + + it("does not become charged when Tailwind takes effect on opposing side", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + }); + + it("does not interact with Sandstorm", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + }); +}); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts new file mode 100644 index 00000000000..2b9361f5839 --- /dev/null +++ b/src/test/abilities/wind_rider.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; + +describe("Abilities - Wind Rider", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => { + await game.startBattle([Species.MAGIKARP]); + const shiftry = game.scene.getEnemyPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + }); + + it("Attack is increased by one stage when Tailwind is present on its side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + }); + + it("does not increase Attack when Tailwind is present on opposing side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + }); + + it("does not increase Attack when Tailwind is present on opposing side", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + }); + + it("does not interact with Sandstorm", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(shiftry.hp).equals(shiftry.getMaxHp()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(shiftry.hp).lessThan(shiftry.getMaxHp()); + }); +}); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index b5572bb4117..4dc4b1d4282 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -39,13 +39,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).not.toBe(100); - expect(appliedAccuracy).toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).not.toBe(100); + expect(mockedAccuracy).toBe(50); }); it("does not lower accuracy of non-status moves", async () => { @@ -53,13 +53,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); it("does not affect pokemon with Mold Breaker", async () => { @@ -69,13 +69,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); it("does not affect pokemon with Teravolt", async () => { @@ -85,13 +85,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); it("does not affect pokemon with Turboblaze", async () => { @@ -101,25 +101,28 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); }); /** - * Calculates the adjusted applied accuracy of a move. + * 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 getAppliedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { +const getMockedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { const accuracyHolder = new NumberHolder(move.accuracy); /** 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/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts new file mode 100644 index 00000000000..d022d69a772 --- /dev/null +++ b/src/test/arena/weather_strong_winds.test.ts @@ -0,0 +1,82 @@ +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 { + TurnStartPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { allMoves } from "#app/data/move.js"; + +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); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TAILLOW); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DELTA_STREAM); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); + }); + + it("electric type move is not very effective on Rayquaza", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(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-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/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index e6c4ad0e16e..a098620f5eb 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,17 +1,35 @@ -import {beforeAll, describe, expect, it} from "vitest"; +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import BattleScene from "../../battle-scene"; -import { getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; +import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; import { Species } from "#enums/species"; import Phaser from "phaser"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggTier } from "#app/enums/egg-type.js"; +import { VariantTier } from "#app/enums/variant-tiers.js"; +import GameManager from "../utils/gameManager"; +import EggData from "#app/system/egg-data.js"; +import * as Utils from "#app/utils.js"; -describe("getLegendaryGachaSpeciesForTimestamp", () => { +describe("Egg Generation Tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; beforeAll(() => { - new Phaser.Game({ + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); }); + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.restoreAllMocks(); + }); + + beforeEach(async() => { + game = new GameManager(phaserGame); + await game.importData("src/test/utils/saves/everything.prsv"); + }); + it("should return Arceus for the 10th of June", () => { const scene = new BattleScene(); const timestamp = new Date(2024, 5, 10, 15, 0, 0, 0).getTime(); @@ -30,4 +48,259 @@ describe("getLegendaryGachaSpeciesForTimestamp", () => { expect(result).toBe(expectedSpecies); }); + it("should hatch an Arceus. Set from legendary gacha", async() => { + const scene = game.scene; + const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime(); + const expectedSpecies = Species.ARCEUS; + + const result = new Egg({scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.MASTER}).generatePlayerPokemon(scene).species.speciesId; + + expect(result).toBe(expectedSpecies); + }); + it("should hatch an Arceus. Set from species", () => { + const scene = game.scene; + const expectedSpecies = Species.ARCEUS; + + const result = new Egg({scene,species: expectedSpecies}).generatePlayerPokemon(scene).species.speciesId; + + expect(result).toBe(expectedSpecies); + }); + it("should return an common tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.COMMON; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an rare tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.GREAT; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an epic tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.ULTRA; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an legendary tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.MASTER; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return a manaphy egg set via species", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, species: Species.MANAPHY}).isManaphyEgg(); + + expect(result).toBe(expectedResult); + }); + it("should return a manaphy egg set via id", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, tier: EggTier.COMMON, id: 204}).isManaphyEgg(); + + expect(result).toBe(expectedResult); + }); + it("should return an egg with 1000 hatch waves", () => { + const scene = game.scene; + const expectedHatchWaves = 1000; + + const result = new Egg({scene, hatchWaves: expectedHatchWaves}).hatchWaves; + + expect(result).toBe(expectedHatchWaves); + }); + it("should return an shiny pokemon", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, isShiny: expectedResult, species: Species.BULBASAUR}).generatePlayerPokemon(scene).isShiny(); + + expect(result).toBe(expectedResult); + }); + it("should return a shiny common variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.COMMON; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return a shiny rare variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.RARE; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return a shiny epic variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.EPIC; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return an egg with an egg move index of 0, 1, 2 or 3", () => { + const scene = game.scene; + + const eggMoveIndex = new Egg({scene}).eggMoveIndex; + const result = eggMoveIndex && eggMoveIndex >= 0 && eggMoveIndex <= 3; + + expect(result).toBe(true); + }); + it("should return an egg with an rare egg move. Egg move index should be 3", () => { + const scene = game.scene; + const expectedEggMoveIndex = 3; + + const result = new Egg({scene, eggMoveIndex: expectedEggMoveIndex}).eggMoveIndex; + + expect(result).toBe(expectedEggMoveIndex); + }); + it("should return a hatched pokemon with a hidden ability", () => { + const scene = game.scene; + + const playerPokemon = new Egg({scene, overrideHiddenAbility: true, species: Species.BULBASAUR}).generatePlayerPokemon(scene); + const expectedAbilityIndex = playerPokemon.species.ability2 ? 2 : 1; + + const result = playerPokemon.abilityIndex; + + expect(result).toBe(expectedAbilityIndex); + }); + it("should add the egg to the game data", () => { + const scene = game.scene; + const expectedEggCount = 1; + + new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}); + + const result = scene.gameData.eggs.length; + + expect(result).toBe(expectedEggCount); + }); + it("should override the egg tier to common", () => { + const scene = game.scene; + const expectedEggTier = EggTier.COMMON; + + const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).tier; + + expect(result).toBe(expectedEggTier); + }); + it("should override the egg hatch waves", () => { + const scene = game.scene; + const expectedHatchWaves = 10; + + const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).hatchWaves; + + expect(result).toBe(expectedHatchWaves); + }); + it("should correctly load a legacy egg", () => { + const legacyEgg = { + gachaType: 1, + hatchWaves: 25, + id: 2077000788, + timestamp: 1718908955085, + isShiny: false, + overrideHiddenAbility: false, + sourceType: 0, + species: 0, + tier: 0, + variantTier: 0, + eggMoveIndex: 0, + }; + + const result = new EggData(legacyEgg).toEgg(); + + expect(result.tier).toBe(EggTier.GREAT); + expect(result.id).toBe(legacyEgg.id); + expect(result.timestamp).toBe(legacyEgg.timestamp); + expect(result.hatchWaves).toBe(legacyEgg.hatchWaves); + expect(result.sourceType).toBe(legacyEgg.gachaType); + }); + it("should increase egg pity", () => { + const scene = game.scene; + const startPityValues = [...scene.gameData.eggPity]; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON}); + + expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); + expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); + expect(scene.gameData.eggPity[EggTier.MASTER]).toBe(startPityValues[EggTier.MASTER] + 1); + }); + it("should increase legendary egg pity by two", () => { + const scene = game.scene; + const startPityValues = [...scene.gameData.eggPity]; + + new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON}); + + expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); + expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); + expect(scene.gameData.eggPity[EggTier.MASTER]).toBe(startPityValues[EggTier.MASTER] + 2); + }); + it("should not increase manaphy egg count if bulbasaurs are pulled", () => { + const scene = game.scene; + const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; + + for (let i = 0; i < 200; i++) { + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR}); + } + + expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount); + }); + it("should increase manaphy egg count", () => { + const scene = game.scene; + const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON}); + + expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount + 1); + }); + it("should increase rare eggs pulled statistic", () => { + const scene = game.scene; + const startingRareEggsPulled = scene.gameData.gameStats.rareEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.GREAT}); + + expect(scene.gameData.gameStats.rareEggsPulled).toBe(startingRareEggsPulled + 1); + }); + it("should increase epic eggs pulled statistic", () => { + const scene = game.scene; + const startingEpicEggsPulled = scene.gameData.gameStats.epicEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.ULTRA}); + + expect(scene.gameData.gameStats.epicEggsPulled).toBe(startingEpicEggsPulled + 1); + }); + it("should increase legendary eggs pulled statistic", () => { + const scene = game.scene; + const startingLegendaryEggsPulled = scene.gameData.gameStats.legendaryEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.MASTER}); + + expect(scene.gameData.gameStats.legendaryEggsPulled).toBe(startingLegendaryEggsPulled + 1); + }); + it("should increase legendary egg rate", () => { + vi.spyOn(Utils, "randInt").mockReturnValue(1); + + const scene = game.scene; + const expectedTier1 = EggTier.MASTER; + const expectedTier2 = EggTier.ULTRA; + + const result1 = new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}).tier; + const result2 = new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true}).tier; + + expect(result1).toBe(expectedTier1); + expect(result2).toBe(expectedTier2); + }); }); diff --git a/src/test/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/items/eviolite.test.ts b/src/test/items/eviolite.test.ts new file mode 100644 index 00000000000..5b4561d4877 --- /dev/null +++ b/src/test/items/eviolite.test.ts @@ -0,0 +1,278 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Stat } from "#app/data/pokemon-stat"; +import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; +import { Species } from "#enums/species"; + +describe("Items - Eviolite", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("EVIOLITE activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.PICHU + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Eviolite is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + }); + + it("EVIOLITE held by unevolved, unfused pokemon", async() => { + await game.startBattle([ + Species.PICHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.5); + expect(spDefValue.value / spDefStat).toBe(1.5); + }, 20000); + + it("EVIOLITE held by fully evolved, unfused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + }, 20000); + + it("EVIOLITE held by completely unevolved, fused pokemon", async() => { + await game.startBattle([ + Species.PICHU, + Species.CLEFFA + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.5); + expect(spDefValue.value / spDefStat).toBe(1.5); + }, 20000); + + it("EVIOLITE held by partially unevolved (base), fused pokemon", async() => { + await game.startBattle([ + Species.PICHU, + Species.CLEFABLE + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.25); + expect(spDefValue.value / spDefStat).toBe(1.25); + }, 20000); + + it("EVIOLITE held by partially unevolved (fusion), fused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + Species.CLEFFA + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.25); + expect(spDefValue.value / spDefStat).toBe(1.25); + }, 20000); + + it("EVIOLITE held by completely evolved, fused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + Species.CLEFABLE + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts new file mode 100644 index 00000000000..ae621770da6 --- /dev/null +++ b/src/test/items/grip_claw.test.ts @@ -0,0 +1,75 @@ +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 { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { BerryType } from "#app/enums/berry-type.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { CommandPhase, MoveEndPhase, SelectTargetPhase } from "#app/phases.js"; +import { BattlerIndex } from "#app/battle.js"; +import { allMoves } from "#app/data/move.js"; + +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); + + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + vi.spyOn(overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ + {name: "BERRY", type: BerryType.SITRUS, count: 2}, + {name: "BERRY", type: BerryType.LUM, count: 2} + ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + 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/light_ball.test.ts b/src/test/items/light_ball.test.ts new file mode 100644 index 00000000000..52fab7b044a --- /dev/null +++ b/src/test/items/light_ball.test.ts @@ -0,0 +1,200 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Light Ball", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("LIGHT_BALL activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Light Ball is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + }); + + it("LIGHT_BALL held by PIKACHU", async() => { + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(2); + expect(spAtkValue.value / spAtkStat).toBe(2); + }, 20000); + + it("LIGHT_BALL held by fused PIKACHU (base)", async() => { + await game.startBattle([ + Species.PIKACHU, + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(2); + expect(spAtkValue.value / spAtkStat).toBe(2); + }, 20000); + + it("LIGHT_BALL held by fused PIKACHU (part)", async() => { + await game.startBattle([ + Species.MAROWAK, + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(2); + expect(spAtkValue.value / spAtkStat).toBe(2); + }, 20000); + + it("LIGHT_BALL not held by PIKACHU", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts new file mode 100644 index 00000000000..5aa2c517ac9 --- /dev/null +++ b/src/test/items/metal_powder.test.ts @@ -0,0 +1,176 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Metal Powder", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("METAL_POWDER activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Metal Powder is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + }); + + it("METAL_POWDER held by DITTO", async() => { + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(2); + }, 20000); + + it("METAL_POWDER held by fused DITTO (base)", async() => { + await game.startBattle([ + Species.DITTO, + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(2); + }, 20000); + + it("METAL_POWDER held by fused DITTO (part)", async() => { + await game.startBattle([ + Species.MAROWAK, + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(2); + }, 20000); + + it("METAL_POWDER not held by DITTO", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts new file mode 100644 index 00000000000..753f62e36eb --- /dev/null +++ b/src/test/items/quick_powder.test.ts @@ -0,0 +1,176 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Quick Powder", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("QUICK_POWDER activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Quick Powder is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + }); + + it("QUICK_POWDER held by DITTO", async() => { + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(2); + }, 20000); + + it("QUICK_POWDER held by fused DITTO (base)", async() => { + await game.startBattle([ + Species.DITTO, + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(2); + }, 20000); + + it("QUICK_POWDER held by fused DITTO (part)", async() => { + await game.startBattle([ + Species.MAROWAK, + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(2); + }, 20000); + + it("QUICK_POWDER not held by DITTO", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts new file mode 100644 index 00000000000..3356196e8c5 --- /dev/null +++ b/src/test/items/thick_club.test.ts @@ -0,0 +1,228 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Thick Club", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("THICK_CLUB activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.CUBONE + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Thick Club is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + }); + + it("THICK_CLUB held by CUBONE", async() => { + await game.startBattle([ + Species.CUBONE + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by MAROWAK", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by ALOLA_MAROWAK", async() => { + await game.startBattle([ + Species.ALOLA_MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by fused CUBONE line (base)", async() => { + // Randomly choose from the Cubone line + const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; + const randSpecies = Utils.randInt(species.length); + + await game.startBattle([ + species[randSpecies], + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by fused CUBONE line (part)", async() => { + // Randomly choose from the Cubone line + const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; + const randSpecies = Utils.randInt(species.length); + + await game.startBattle([ + Species.PIKACHU, + species[randSpecies] + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB not held by CUBONE", async() => { + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 6aacfd0e5e7..64dc3191d88 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -15,6 +15,7 @@ import {StatusEffect} from "#app/data/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import i18next, { initI18n } from "#app/plugins/i18n"; describe("Items - Toxic orb", () => { @@ -48,6 +49,8 @@ describe("Items - Toxic orb", () => { }); it("TOXIC ORB", async() => { + initI18n(); + i18next.changeLanguage("en"); const moveToUse = Moves.GROWTH; await game.startBattle([ Species.MIGHTYENA, diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/localization/battle-stat.test.ts similarity index 98% rename from src/test/lokalisation/battle-stat.test.ts rename to src/test/localization/battle-stat.test.ts index cd21f638258..d894d705947 100644 --- a/src/test/lokalisation/battle-stat.test.ts +++ b/src/test/localization/battle-stat.test.ts @@ -41,7 +41,7 @@ function testBattleStatName(stat: BattleStat, expectMessage: string) { } function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { - const message = getBattleStatLevelChangeDescription(levels, up); + const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); console.log(`message ${message}, expected ${expectMessage}`); expect(message).toBe(expectMessage); } 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..89884290e00 --- /dev/null +++ b/src/test/localization/terrain.test.ts @@ -0,0 +1,192 @@ +import { beforeAll, describe, beforeEach, afterEach, 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 { TerrainType, getTerrainName } from "#app/data/terrain"; +import { getTerrainStartMessage, getTerrainClearMessage, getTerrainBlockMessage } from "#app/data/weather"; +import i18next from "i18next"; +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); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + 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/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts new file mode 100644 index 00000000000..e9c3d920717 --- /dev/null +++ b/src/test/moves/aurora_veil.test.ts @@ -0,0 +1,124 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { WeatherType } from "#app/data/weather.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Aurora Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); + }); + + it("reduces damage of physical attacks by half in a single battle", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of physical attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.ROCK_SLIDE; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("reduces damage of special attacks by half in a single battle", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of special attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.DAZZLING_GLEAM; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Auroa Veil in this case {@linkcode Moves.AURORA_VEIL}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts new file mode 100644 index 00000000000..6443e34d8d2 --- /dev/null +++ b/src/test/moves/ceaseless_edge.test.ts @@ -0,0 +1,137 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + MoveEffectPhase, + TurnEndPhase +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { allMoves } from "#app/data/move"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { Abilities } from "#app/enums/abilities"; + +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); + 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.RUN_AWAY); + vi.spyOn(overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); + 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.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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 () => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{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 () => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(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/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts new file mode 100644 index 00000000000..f94af93fc66 --- /dev/null +++ b/src/test/moves/flower_shield.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Biome } from "#app/enums/biome.js"; +import { Type } from "#app/data/type.js"; +import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; + +describe("Moves - Flower Shield", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); + + await game.startBattle([Species.MAGIKARP]); + const cherrim = game.scene.getEnemyPokemon(); + const magikarp = game.scene.getPlayerPokemon(); + + expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1); + }); + + it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); + const field = game.scene.getField(true); + + const grassPokemons = field.filter(p => p.getTypes().includes(Type.GRASS)); + const nonGrassPokemons = field.filter(pokemon => !grassPokemons.includes(pokemon)); + + grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(1)); + nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + }); + + /** + * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} + */ + it("does not increase defense of a pokemon in semi-vulnerable state", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); + + await game.startBattle([Species.CHERRIM]); + const paras = game.scene.getEnemyPokemon(); + const cherrim = game.scene.getPlayerPokemon(); + + expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(paras.getTag(SemiInvulnerableTag)).toBeUndefined; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(paras.getTag(SemiInvulnerableTag)).toBeDefined(); + expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1); + }); + + it("does nothing if there are no Grass-type pokemon on the field", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.MAGIKARP]); + const enemy = game.scene.getEnemyPokemon(); + const ally = game.scene.getPlayerPokemon(); + + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0); + }); +}); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 54b972e7cc0..f0b80ab90c0 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -36,6 +36,7 @@ describe("Moves - Follow Me", () => { 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]); }); @@ -53,7 +54,7 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - playerPokemon.forEach(p => p.hp = 200); + const playerStartingHp = playerPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); await game.phaseInterceptor.to(CommandPhase); @@ -62,10 +63,10 @@ describe("Moves - Follow Me", () => { await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(playerPokemon[0].hp).toBeLessThan(200); - expect(playerPokemon[1].hp).toBe(200); + expect(playerPokemon[0].hp).toBeLessThan(playerStartingHp[0]); + expect(playerPokemon[1].hp).toBe(playerStartingHp[1]); }, TIMEOUT ); @@ -82,18 +83,18 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - playerPokemon.forEach(p => p.hp = 200); + const playerStartingHp = playerPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); await game.phaseInterceptor.to(CommandPhase); game.doAttack(getMovePosition(game.scene, 1, Moves.FOLLOW_ME)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); playerPokemon.sort((a, b) => a.getBattleStat(Stat.SPD) - b.getBattleStat(Stat.SPD)); - expect(playerPokemon[1].hp).toBeLessThan(200); - expect(playerPokemon[0].hp).toBe(200); + expect(playerPokemon[1].hp).toBeLessThan(playerStartingHp[1]); + expect(playerPokemon[0].hp).toBe(playerStartingHp[0]); }, TIMEOUT ); @@ -114,7 +115,7 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -124,10 +125,11 @@ describe("Moves - Follow Me", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); @@ -147,7 +149,7 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.SNIPE_SHOT)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -157,10 +159,11 @@ describe("Moves - Follow Me", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SNIPE_SHOT)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); }); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts new file mode 100644 index 00000000000..063a17aead9 --- /dev/null +++ b/src/test/moves/gastro_acid.test.ts @@ -0,0 +1,93 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import { + Moves +} from "#app/enums/moves.js"; +import * as overrides from "#app/overrides"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveResult } from "#app/field/pokemon.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { Species } from "#app/enums/species.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Gastro Acid", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); + }); + + it("suppresses effect of ability", async () => { + /* + * Expected flow (enemies have WATER ABSORD, can only use SPLASH) + * - player mon 1 uses GASTRO ACID, player mon 2 uses SPLASH + * - both player mons use WATER GUN on their respective enemy mon + * - player mon 1 should have dealt damage, player mon 2 should have not + */ + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + game.doSelectTarget(BattlerIndex.ENEMY); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnInitPhase"); + + const enemyField = game.scene.getEnemyField(); + expect(enemyField[0].summonData.abilitySuppressed).toBe(true); + expect(enemyField[1].summonData.abilitySuppressed).toBe(false); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.doSelectTarget(BattlerIndex.ENEMY); + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.doSelectTarget(BattlerIndex.ENEMY_2); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyField[0].hp).toBeLessThan(enemyField[0].getMaxHp()); + expect(enemyField[1].hp).toBe(enemyField[1].getMaxHp()); + }, TIMEOUT); + + it("fails if used on an enemy with an already-suppressed ability", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + + await game.startBattle(); + + // Force player to be slower to enable Core Enforcer to proc its suppression effect + game.scene.getPlayerPokemon().stats[Stat.SPD] = 1; + game.scene.getEnemyPokemon().stats[Stat.SPD] = 2; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CORE_ENFORCER)); + + await game.phaseInterceptor.to("TurnInitPhase"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + + await game.phaseInterceptor.to("TurnInitPhase"); + + expect(game.scene.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }, TIMEOUT); +}); diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts new file mode 100644 index 00000000000..c6f071a699f --- /dev/null +++ b/src/test/moves/hard_press.test.ts @@ -0,0 +1,83 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + MoveEffectPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { NumberHolder } from "#app/utils.js"; +import Move from "#app/data/move.js"; +import Pokemon from "#app/field/pokemon.js"; +import { allMoves, OpponentHighHpPowerAttr } from "#app/data/move.js"; + +describe("Moves - Hard Press", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); + }); + + it("power varies between 1 and 100, and is greater the more HP the target has", async () => { + await game.startBattle([Species.GRAVELER]); + const moveToBeUsed = allMoves[Moves.HARD_PRESS]; + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.phaseInterceptor.to(MoveEffectPhase); + + const enemy = game.scene.getEnemyPokemon(); + const movePower = getMockedMovePower(enemy, game.scene.getPlayerPokemon(), moveToBeUsed); + const moveMaxBasePower = getMoveMaxBasePower(moveToBeUsed); + + expect(movePower).toBe(moveMaxBasePower * enemy.getHpRatio()); + }); +}); + +/** + * Calculates the mocked move power based on the attributes of the move and the opponent's high HP. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move power. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const powerHolder = new NumberHolder(move.power); + + if (move.hasAttr(OpponentHighHpPowerAttr)) { + const attr = move.getAttrs(OpponentHighHpPowerAttr); + attr[0].apply(attacker, defender, move, [ powerHolder ]); + } + + return powerHolder.value; +}; + +/** + * Retrieves the maximum base power of a move based on its attributes. + * + * @param move - The move which maximum base power is being retrieved. + * @returns The maximum base power of the move. + */ +const getMoveMaxBasePower = (move: Move) => { + const attr = move.getAttrs(OpponentHighHpPowerAttr); + + return (attr[0] as OpponentHighHpPowerAttr)["maxBasePower"]; +}; diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts new file mode 100644 index 00000000000..30a27ce4412 --- /dev/null +++ b/src/test/moves/light_screen.test.ts @@ -0,0 +1,106 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Light Screen", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("reduces damage of special attacks by half in a single battle", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of special attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.DAZZLING_GLEAM; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("does not affect physical attacks", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Light Screen in this case {@linkcode Moves.LIGHT_SCREEN}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts new file mode 100644 index 00000000000..a700ff10aae --- /dev/null +++ b/src/test/moves/make_it_rain.test.ts @@ -0,0 +1,106 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + CommandPhase, + MoveEndPhase, + StatChangePhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Make It Rain", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + it("should only reduce Sp. Atk. once in a double battle", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).toBeDefined()); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).toBeDefined()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(MoveEndPhase); + + expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); + + it("should apply effects even if the target faints", async () => { + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon(); + expect(playerPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + + await game.phaseInterceptor.to(StatChangePhase); + + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); + + it("should reduce Sp. Atk. once after KOing two enemies", async () => { + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + playerPokemon.forEach(p => expect(p).toBeDefined()); + + const enemyPokemon = game.scene.getEnemyField(); + enemyPokemon.forEach(p => expect(p).toBeDefined()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(StatChangePhase); + + enemyPokemon.forEach(p => expect(p.isFainted()).toBe(true)); + expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); +}); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts new file mode 100644 index 00000000000..21ebb3d5515 --- /dev/null +++ b/src/test/moves/purify.test.ts @@ -0,0 +1,81 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + MoveEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Purify", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + }); + + test( + "Purify heals opponent status effect and restores user hp", + async () => { + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon(); + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon(); + + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + enemyPokemon.status = new Status(StatusEffect.BURN); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PURIFY)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(enemyPokemon.status).toBe(undefined); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + }, + TIMEOUT + ); + + test( + "Purify does not heal if opponent doesnt have any status effect", + async () => { + await game.startBattle(); + + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon(); + + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + const playerInitialHp = playerPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.PURIFY)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(playerPokemon.hp).toBe(playerInitialHp); + }, + TIMEOUT + ); + +}); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 6a204877150..1116810f743 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -35,6 +35,7 @@ describe("Moves - Rage Powder", () => { 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]); }); @@ -54,7 +55,7 @@ describe("Moves - Rage Powder", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -64,10 +65,11 @@ describe("Moves - Rage Powder", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); @@ -88,7 +90,7 @@ describe("Moves - Rage Powder", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -98,10 +100,11 @@ describe("Moves - Rage Powder", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); }); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts new file mode 100644 index 00000000000..00fb9a69f2f --- /dev/null +++ b/src/test/moves/reflect.test.ts @@ -0,0 +1,106 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Reflect", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("reduces damage of physical attacks by half in a single battle", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of physical attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.ROCK_SLIDE; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("does not affect special attacks", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Reflect in this case {@linkcode Moves.REFLECT}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts new file mode 100644 index 00000000000..db9363313a1 --- /dev/null +++ b/src/test/moves/roost.test.ts @@ -0,0 +1,64 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Roost", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); + }); + + test( + "move should ground the user until the end of turn", + async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOMPING_TANTRUM)); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(enemyPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.getTag(BattlerTagType.ROOSTED)).toBeUndefined(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 188207b713c..ec3f4977007 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -35,6 +35,7 @@ describe("Moves - Spotlight", () => { 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]); }); @@ -52,7 +53,7 @@ describe("Moves - Spotlight", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -62,10 +63,10 @@ describe("Moves - Spotlight", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(enemyPokemon[0].hp).toBeLessThan(200); - expect(enemyPokemon[1].hp).toBe(200); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBe(enemyStartingHp[1]); }, TIMEOUT ); @@ -84,8 +85,6 @@ describe("Moves - Spotlight", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); - /** * Spotlight will target the slower enemy. In this situation without Spotlight being used, * the faster enemy would normally end up with the Center of Attention tag. @@ -94,6 +93,8 @@ describe("Moves - Spotlight", () => { const spotTarget = enemyPokemon[1].getBattlerIndex(); const attackTarget = enemyPokemon[0].getBattlerIndex(); + const enemyStartingHp = enemyPokemon.map(p => p.hp); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(spotTarget); @@ -102,10 +103,10 @@ describe("Moves - Spotlight", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(attackTarget); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(enemyPokemon[1].hp).toBeLessThan(200); - expect(enemyPokemon[0].hp).toBe(200); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + expect(enemyPokemon[0].hp).toBe(enemyStartingHp[0]); }, TIMEOUT ); }); diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts new file mode 100644 index 00000000000..efba97f8fe1 --- /dev/null +++ b/src/test/moves/tailwind.test.ts @@ -0,0 +1,108 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; + +describe("Abilities - Wind Rider", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("doubles the Speed stat of the Pokemons on its side", async () => { + await game.startBattle([Species.MAGIKARP, Species.MEOWTH]); + const magikarp = game.scene.getPlayerField()[0]; + const meowth = game.scene.getPlayerField()[1]; + + const magikarpSpd = magikarp.getStat(Stat.SPD); + const meowthSpd = meowth.getStat(Stat.SPD); + + expect(magikarp.getBattleStat(Stat.SPD)).equal(magikarpSpd); + expect(meowth.getBattleStat(Stat.SPD)).equal(meowthSpd); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.getBattleStat(Stat.SPD)).toBe(magikarpSpd * 2); + expect(meowth.getBattleStat(Stat.SPD)).toBe(meowthSpd * 2); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("lasts for 4 turns", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); + }); + + it("does not affect the opposing side", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.MAGIKARP]); + + const ally = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + const allySpd = ally.getStat(Stat.SPD); + const enemySpd = enemy.getStat(Stat.SPD); + + + expect(ally.getBattleStat(Stat.SPD)).equal(allySpd); + expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(ally.getBattleStat(Stat.SPD)).toBe(allySpd * 2); + expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined(); + }); +}); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts new file mode 100644 index 00000000000..c641643593e --- /dev/null +++ b/src/test/moves/thousand_arrows.test.ts @@ -0,0 +1,95 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + MoveEffectPhase, + TurnEndPhase +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Thousand Arrows", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + }); + + test( + "move should hit and ground Flying-type targets", + async () => { + await game.startBattle([ Species.ILLUMISE ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); + + test( + "move should hit and ground targets with Levitate", + async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); + + await game.startBattle([ Species.ILLUMISE ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts new file mode 100644 index 00000000000..78b72492e04 --- /dev/null +++ b/src/test/moves/tidy_up.test.ts @@ -0,0 +1,122 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { MoveEndPhase, TurnEndPhase } from "#app/phases"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { BattleStat } from "#app/data/battle-stat.js"; + + +describe("Moves - Tidy Up", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + }); + + it("spikes are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPIKES)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.SPIKES)).toBeUndefined(); + + }, 20000); + + it("stealth rocks are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STEALTH_ROCK)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.STEALTH_ROCK)).toBeUndefined(); + + }, 20000); + + it("toxic spikes are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_SPIKES)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.TOXIC_SPIKES)).toBeUndefined(); + + }, 20000); + + it("sticky webs are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STICKY_WEB)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.STICKY_WEB)).toBeUndefined(); + + }, 20000); + + it.skip("substitutes are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SUBSTITUTE)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + // TODO: check for subs here once the move is implemented + + }, 20000); + + it("user's stats are raised with no traps set", async() => { + await game.startBattle(); + const player = game.scene.getPlayerPokemon().summonData.battleStats; + + expect(player[BattleStat.ATK]).toBe(0); + expect(player[BattleStat.SPD]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player[BattleStat.ATK]).toBe(+1); + expect(player[BattleStat.SPD]).toBe(+1); + + }, 20000); + +}); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts new file mode 100644 index 00000000000..336e5bccd26 --- /dev/null +++ b/src/test/ui/transfer-item.test.ts @@ -0,0 +1,100 @@ +import { BerryType } from "#app/enums/berry-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Button } from "#app/enums/buttons"; +import * as overrides from "#app/overrides"; +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, vi } 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); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ + { name: "BERRY", count: 1, type: BerryType.SITRUS }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + { name: "BERRY", count: 2, type: BerryType.LUM }, + ]); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_CLAW]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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/gameWrapper.ts b/src/test/utils/gameWrapper.ts index da54471a7e3..b1b00c8e15d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -24,6 +24,7 @@ import BattleScene from "#app/battle-scene.js"; import {MoveAnim} from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as battleScene from "#app/battle-scene"; +import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage.js"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -35,6 +36,7 @@ Object.defineProperty(window, "console", { InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; +Phaser.GameObjects.Image = MockImage; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { localStorage.setItem("toExport", data); diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 699dea31ad5..2eb77f81302 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -122,6 +122,10 @@ export default class MockSprite { return this.phaserSprite.setPositionRelative(source, x, y); } + setY(y) { + return this.phaserSprite.setY(y); + } + setCrop(x, y, width, height) { // Sets the crop size of this Game Object. return this.phaserSprite.setCrop(x, y, width, height); diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts new file mode 100644 index 00000000000..b922fc9c61c --- /dev/null +++ b/src/test/utils/testUtils.ts @@ -0,0 +1,23 @@ +import i18next, { type ParseKeys } from "i18next"; +import { vi } from "vitest"; + +/** + * Sets up the i18next mock. + * Includes a i18next.t mocked implementation only returning the raw key (`(key) => key`) + * + * @returns A spy/mock of i18next + */ +export function mockI18next() { + return vi.spyOn(i18next, "t").mockImplementation((key: ParseKeys) => key); +} + +/** + * Creates an array of range `start - end` + * + * @param start start number e.g. 1 + * @param end end number e.g. 10 + * @returns an array of numbers + */ +export function arrayOfRange(start: integer, end: integer) { + return Array.from({ length: end - start }, (_v, k) => k + start); +} diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 18ff40aec50..dac67bd7b4e 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -1,3 +1,5 @@ +import BattleScene from "#app/battle-scene.js"; +import { TextStyle, addTextObject } from "#app/ui/text.js"; export enum EventType { SHINY @@ -18,7 +20,7 @@ const timedEvents: TimedEvent[] = [ eventType: EventType.SHINY, shinyMultiplier: 2, startDate: new Date(Date.UTC(2024, 5, 14, 0)), - endDate: new Date(Date.UTC(2024, 5, 21, 0)), + endDate: new Date(Date.UTC(2024, 5, 23, 0)), bannerFilename: "pride-update" }, ]; @@ -60,3 +62,89 @@ export class TimedEventManager { return timedEvents.find((te: TimedEvent) => this.isActive(te)).bannerFilename ?? null; } } + +export class TimedEventDisplay extends Phaser.GameObjects.Container { + private event: TimedEvent; + private eventTimerText: Phaser.GameObjects.Text; + private banner: Phaser.GameObjects.Image; + private bannerShadow: Phaser.GameObjects.Rectangle; + private eventTimer: NodeJS.Timeout; + + constructor(scene: BattleScene, x: number, y: number, event: TimedEvent) { + super(scene, x, y); + this.event = event; + this.setVisible(false); + } + + setup() { + this.banner = new Phaser.GameObjects.Image(this.scene, 29, 64, this.event.bannerFilename); + this.banner.setName("img-event-banner"); + this.banner.setOrigin(0, 0); + this.banner.setScale(0.07); + this.bannerShadow = new Phaser.GameObjects.Rectangle( + this.scene, + this.banner.x - 2, + this.banner.y + 2, + this.banner.width, + this.banner.height, + 0x484848 + ); + this.bannerShadow.setName("rect-event-banner-shadow"); + this.bannerShadow.setScale(0.07); + this.bannerShadow.setAlpha(0.5); + this.bannerShadow.setOrigin(0,0); + this.eventTimerText = addTextObject( + this.scene, + this.banner.x + 8, + this.banner.y + 100, + this.timeToGo(this.event.endDate), + TextStyle.WINDOW + ); + this.eventTimerText.setName("text-event-timer"); + this.eventTimerText.setScale(0.15); + this.eventTimerText.setOrigin(0,0); + + this.add([this.eventTimerText, this.bannerShadow, this.banner]); + } + + show() { + this.setVisible(true); + this.updateCountdown(); + + this.eventTimer = setInterval(() => { + this.updateCountdown(); + }, 1000); + } + + clear() { + this.setVisible(false); + clearInterval(this.eventTimer); + this.eventTimer = null; + } + + private timeToGo(date: Date) { + + // Utility to add leading zero + function z(n) { + return (n < 10? "0" : "") + n; + } + const now = new Date(); + let diff = Math.abs(date.getTime() - now.getTime()); + + // Allow for previous times + diff = Math.abs(diff); + + // Get time components + const days = diff/8.64e7 | 0; + const hours = diff%8.64e7 / 3.6e6 | 0; + const mins = diff%3.6e6 / 6e4 | 0; + const secs = Math.round(diff%6e4 / 1e3); + + // Return formatted string + return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs)+ "s"; + } + + updateCountdown() { + this.eventTimerText.setText(this.timeToGo(this.event.endDate)); + } +} diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 2bc5f028ddb..a0b249695b9 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -44,9 +44,6 @@ export default class AbilityBar extends Phaser.GameObjects.Container { (this.scene as BattleScene).fieldUI.bringToTop(this); - if (this.tween) { - this.tween.stop(); - } this.y = baseY + ((this.scene as BattleScene).currentBattle.double ? 14 : 0); this.tween = this.scene.tweens.add({ diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index c4877cfca59..2069f034e89 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -58,10 +58,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const ui = this.getUi(); this.optionSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -48); + this.optionSelectContainer.setName(`option-select-${Mode[this.mode]}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); this.optionSelectBg = addWindow(this.scene, 0, 0, this.getWindowWidth(), this.getWindowHeight()); + this.optionSelectBg.setName("option-select-bg"); this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); @@ -82,6 +84,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join("\n"), TextStyle.WINDOW, { maxLines: options.length }); + this.optionSelectText.setName("text-option-select"); this.optionSelectText.setLineSpacing(12); this.optionSelectContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 963b1ac4eb1..9c0a2e7c8ce 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -89,6 +89,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { constructor(scene: Phaser.Scene) { super(scene, 0, 0); + this.setName("arena-flyout"); this.battleScene = this.scene as BattleScene; this.translationX = this.flyoutWidth; @@ -183,19 +184,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); } - /** - * Formats a string to title case - * @param unformattedText Text to be formatted - * @returns the formatted string - */ - private formatText(unformattedText: string): string { - const text = unformattedText.split("_"); - for (let i = 0; i < text.length; i++) { - text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); - } - return text.join(" "); - } /** Clears out the current string stored in all arena effect texts */ private clearText() { @@ -232,7 +221,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { break; } - textObject.text += this.formatText(fieldEffectInfo.name); + textObject.text += Utils.formatText(fieldEffectInfo.name); if (fieldEffectInfo.effecType === ArenaEffectType.TERRAIN) { textObject.text += " Terrain"; // Adds 'Terrain' since the enum does not contain it } @@ -273,16 +262,16 @@ 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]; - if (isArenaTrapTag && tagAddedEvent.arenaTagMaxLayers > 1) { + if (isArenaTrapTag) { if (existingTrapTagIndex !== -1) { - this.fieldEffectInfo[existingTrapTagIndex].name = `${name} (${tagAddedEvent.arenaTagLayers})`; + const layers = tagAddedEvent.arenaTagMaxLayers > 1 ? ` (${tagAddedEvent.arenaTagLayers})` : ""; + this.fieldEffectInfo[existingTrapTagIndex].name = `${name}${layers}`; break; - } else { + } else if (tagAddedEvent.arenaTagMaxLayers > 1) { name = `${name} (${tagAddedEvent.arenaTagLayers})`; } } - this.fieldEffectInfo.push({ name, effecType: arenaEffectType, diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index c246af73d07..3b889228e27 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 ]; @@ -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()); } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 49482d5c575..f2da553c6da 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -16,7 +16,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { private nameBox: Phaser.GameObjects.NineSlice; private nameText: Phaser.GameObjects.Text; - public bg: Phaser.GameObjects.Image; + public bg: Phaser.GameObjects.Sprite; public commandWindow: Phaser.GameObjects.NineSlice; public movesWindowContainer: Phaser.GameObjects.Container; public nameBoxContainer: Phaser.GameObjects.Container; @@ -31,33 +31,30 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textTimer = null; this.textCallbackTimer = null; - const bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); - bg.setOrigin(0, 1); - ui.add(bg); + this.bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); + this.bg.setName("sprite-battle-msg-bg"); + this.bg.setOrigin(0, 1); + ui.add(this.bg); - this.bg = bg; - - this.commandWindow = addWindow(this.scene, 201, -1, 118, 46); + this.commandWindow = addWindow(this.scene, 202, 0, 118, 48); + this.commandWindow.setName("window-command"); this.commandWindow.setOrigin(0, 1); this.commandWindow.setVisible(false); ui.add(this.commandWindow); - this.movesWindowContainer = this.scene.add.container(1, -1); + this.movesWindowContainer = this.scene.add.container(0, 0); + this.movesWindowContainer.setName("moves-bg"); this.movesWindowContainer.setVisible(false); - const movesWindow = addWindow(this.scene, 0, 0, 243, 46); + const movesWindow = addWindow(this.scene, 0, 0, 243, 48); + movesWindow.setName("moves-window"); movesWindow.setOrigin(0, 1); - this.movesWindowContainer.add(movesWindow); - const moveDetailsWindow = addWindow(this.scene, 238, 0, 80, 46, false, true, 2, 133); + const moveDetailsWindow = addWindow(this.scene, 240, 0, 80, 48, false, false, -1, 132); + moveDetailsWindow.setName("move-details-window"); moveDetailsWindow.setOrigin(0, 1); - this.movesWindowContainer.add(moveDetailsWindow); - - // TODO: Maybe remove this asset definitively if it's no longer needed? - // const commandFightLabels = this.scene.add.image(246, -10, 'command_fight_labels'); - // commandFightLabels.setOrigin(0, 1); - // this.movesWindowContainer.add(commandFightLabels); + this.movesWindowContainer.add([movesWindow, moveDetailsWindow]); ui.add(this.movesWindowContainer); const messageContainer = this.scene.add.container(12, -39); diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts new file mode 100644 index 00000000000..f4366ef9c65 --- /dev/null +++ b/src/ui/bgm-bar.ts @@ -0,0 +1,86 @@ +import BattleScene from "../battle-scene"; +import {addTextObject, TextStyle} from "./text"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; + +const hiddenX = -150; +const shownX = 0; +const baseY = 0; + +export default class BgmBar extends Phaser.GameObjects.Container { + private defaultWidth: number; + private defaultHeight: number; + + private bg: Phaser.GameObjects.NineSlice; + private musicText: Phaser.GameObjects.Text; + + public shown: boolean; + + constructor(scene: BattleScene) { + super(scene, hiddenX, baseY); + } + + setup(): void { + this.defaultWidth = 230; + this.defaultHeight = 100; + + 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.musicText = addTextObject(this.scene, 5, 5, "", TextStyle.BGM_BAR); + this.musicText.setOrigin(0, 0); + this.musicText.setWordWrapWidth(650, true); + + this.add(this.musicText); + + this.setVisible(false); + this.shown = false; + } + + /* + * Set the BGM Name to the BGM bar. + * @param {string} bgmName The name of the BGM to set. + */ + setBgmToBgmBar(bgmName: string): void { + this.musicText.setText(`${i18next.t("bgmName:music")}${this.getRealBgmName(bgmName)}`); + if (!(this.scene as BattleScene).showBgmBar) { + return; + } + + this.musicText.width = this.bg.width - 20; + this.musicText.setWordWrapWidth(this.defaultWidth * 4); + + this.bg.width = Math.min(this.defaultWidth, this.musicText.displayWidth + 23); + this.bg.height = Math.min(this.defaultHeight, this.musicText.displayHeight + 20); + + (this.scene as BattleScene).fieldUI.bringToTop(this); + + this.y = baseY; + } + + /* + Show or hide the BGM bar. + @param {boolean} visible Whether to show or hide the BGM bar. + */ + public toggleBgmBar(visible: boolean): void { + if (!(this.scene as BattleScene).showBgmBar) { + this.setVisible(false); + return; + } + this.scene.tweens.add({ + targets: this, + x: visible ? shownX : hiddenX, + duration: 500, + ease: "Sine.easeInOut", + onComplete: () => { + this.setVisible(true); + } + }); + } + + getRealBgmName(bgmName: string): string { + return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], {name: Utils.formatText(bgmName)}); + } +} diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index 1104b048f93..dce04276a4d 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -6,7 +6,11 @@ import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; import i18next from "i18next"; import { SelectStarterPhase, TitlePhase } from "#app/phases.js"; -import { Challenge } from "#app/data/challenge.js"; +import { Challenge, ChallengeType } from "#app/data/challenge.js"; +import * as Utils from "../utils"; +import { Challenges } from "#app/enums/challenges.js"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { Color, ShadowColor } from "#app/enums/color.js"; /** * Handles all the UI for choosing optional challenges. @@ -21,10 +25,9 @@ export default class GameChallengesUiHandler extends UiHandler { // private difficultyText: Phaser.GameObjects.Text; - private descriptionText: Phaser.GameObjects.Text; + private descriptionText: BBCodeText; - private challengeLabels: Phaser.GameObjects.Text[]; - private challengeValueLabels: Phaser.GameObjects.Text[]; + private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text | Phaser.GameObjects.Sprite }>; private cursorObj: Phaser.GameObjects.NineSlice; @@ -38,14 +41,22 @@ export default class GameChallengesUiHandler extends UiHandler { const ui = this.getUi(); this.challengesContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.challengesContainer.setName("challenges"); this.challengesContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + const bgOverlay = this.scene.add.rectangle(-1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0x424242, 0.8); + bgOverlay.setName("rect-challenge-overlay"); + bgOverlay.setOrigin(0, 0); + this.challengesContainer.add(bgOverlay); + // TODO: Change this back to /9 when adding in difficulty const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6), 24); + headerBg.setName("window-header-bg"); headerBg.setOrigin(0, 0); const headerText = addTextObject(this.scene, 0, 0, i18next.t("challenges:title"), TextStyle.SETTINGS_LABEL); + headerText.setName("text-header"); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); @@ -62,45 +73,78 @@ export default class GameChallengesUiHandler extends UiHandler { // difficultyName.setPositionRelative(difficultyBg, difficultyBg.width - difficultyName.displayWidth - 8, 4); this.optionsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 9), (this.scene.game.canvas.height / 6) - headerBg.height - 2); + this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); const descriptionBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 18) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 26); + descriptionBg.setName("window-desc-bg"); descriptionBg.setOrigin(0, 0); descriptionBg.setPositionRelative(this.optionsBg, this.optionsBg.width, 0); - this.descriptionText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL); + this.descriptionText = new BBCodeText(this.scene, descriptionBg.x + 6, descriptionBg.y + 4, "", { + fontFamily: "emerald", + fontSize: 96, + color: Color.ORANGE, + padding: { + bottom: 6 + }, + wrap: { + mode: "word", + width: (descriptionBg.width - 12) * 6, + } + }); + this.descriptionText.setName("text-desc"); + this.scene.add.existing(this.descriptionText); + this.descriptionText.setScale(1/6); + this.descriptionText.setShadow(4, 5, ShadowColor.ORANGE); this.descriptionText.setOrigin(0, 0); - this.descriptionText.setWordWrapWidth(500, true); - this.descriptionText.setPositionRelative(descriptionBg, 6, 4); const startBg = addWindow(this.scene, 0, 0, descriptionBg.width, 24); + startBg.setName("window-start-bg"); startBg.setOrigin(0, 0); startBg.setPositionRelative(descriptionBg, 0, descriptionBg.height); - const startText = addTextObject(this.scene, 0, 0, i18next.t("challenges:start"), TextStyle.SETTINGS_LABEL); + const startText = addTextObject(this.scene, 0, 0, i18next.t("common:start"), TextStyle.SETTINGS_LABEL); + startText.setName("text-start"); startText.setOrigin(0, 0); startText.setPositionRelative(startBg, 8, 4); this.startCursor = this.scene.add.nineslice(0, 0, "summary_moves_cursor", null, (this.scene.game.canvas.width / 18) - 10, 16, 1, 1, 1, 1); + this.startCursor.setName("9s-start-cursor"); this.startCursor.setOrigin(0, 0); this.startCursor.setPositionRelative(startBg, 4, 4); this.startCursor.setVisible(false); this.valuesContainer = this.scene.add.container(0, 0); + this.valuesContainer.setName("values"); this.challengeLabels = []; - this.challengeValueLabels = []; - for (let i = 0; i < 9; i++) { - this.challengeLabels[i] = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); - this.challengeLabels[i].setOrigin(0, 0); + for (let i = 0; i < Object.keys(ChallengeType).length; i++) { + const label = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + label.setName(`text-challenge-label-${i}`); + label.setOrigin(0, 0); - this.valuesContainer.add(this.challengeLabels[i]); + this.valuesContainer.add(label); - this.challengeValueLabels[i] = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); - this.challengeValueLabels[i].setPositionRelative(this.challengeLabels[i], 100, 0); + let value; + if (i === Challenges.SINGLE_TYPE) { + const type = `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; + value = this.scene.add.sprite(8, 98, type); + value.setName("sprite-single-type"); + value.setScale(0.86); + value.setPositionRelative(label, 113, 8); + } else { + value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + value.setName(`text-challenge-value-label-${i}`); + value.setPositionRelative(label, 100, 0); + } - this.valuesContainer.add(this.challengeValueLabels[i]); + this.valuesContainer.add(value); + this.challengeLabels[i] = { + label: label, + value: value + }; } this.challengesContainer.add(headerBg); @@ -124,31 +168,49 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengesContainer.setVisible(false); } + /** + * Adds the default text color to the description text + * @param text text to set to the BBCode description + */ + setDescription(text: string): void { + this.descriptionText.setText(`[color=${Color.ORANGE}][shadow=${ShadowColor.ORANGE}]${text}`); + } + /** + * initLabels + * init all challenge labels + */ + initLabels(): void { + this.setDescription(this.scene.gameMode.challenges[this.cursor].getDescription()); + this.scene.gameMode.challenges.forEach((challenge, i) => { + this.challengeLabels[i].label.setVisible(true); + this.challengeLabels[i].value.setVisible(true); + this.challengeLabels[i].label.setText(challenge.getName()); + if (this.challengeLabels[i].value.type.toLowerCase() === "sprite") { + (this.challengeLabels[i].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); + } else { + (this.challengeLabels[i].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + } + }); + } + + /** + * update the text the cursor is on + */ updateText(): void { - if (this.scene.gameMode.challenges.length > 0) { - this.descriptionText.text = this.getActiveChallenge().getDescription(); - this.descriptionText.updateText(); - } + const challenge = this.getActiveChallenge(); + const { id } = challenge; + this.setDescription(this.getActiveChallenge().getDescription()); + if (this.challengeLabels[id].value.type.toLowerCase() === "sprite") { + (this.challengeLabels[id].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); + } else { + (this.challengeLabels[id].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + } // const totalDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getDifficulty(), 0); // const totalMinDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getMinDifficulty(), 0); // this.difficultyText.text = `${totalDifficulty}` + (totalMinDifficulty ? `/${totalMinDifficulty}` : ""); // this.difficultyText.updateText(); - - for (let i = 0; i < this.challengeLabels.length; i++) { - if (i + this.scrollCursor < this.scene.gameMode.challenges.length) { - this.challengeLabels[i].setVisible(true); - this.challengeValueLabels[i].setVisible(true); - this.challengeLabels[i].text = this.scene.gameMode.challenges[i + this.scrollCursor].getName(); - this.challengeValueLabels[i].text = this.scene.gameMode.challenges[i + this.scrollCursor].getValue(); - this.challengeLabels[i].updateText(); - this.challengeValueLabels[i].updateText(); - } else { - this.challengeLabels[i].setVisible(false); - this.challengeValueLabels[i].setVisible(false); - } - } } show(args: any[]): boolean { @@ -158,7 +220,7 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengesContainer.setVisible(true); this.setCursor(0); - this.updateText(); + this.initLabels(); this.getUi().moveTo(this.challengesContainer, this.getUi().length - 1); diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 852b1f855b6..8ccd05675c8 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -34,12 +34,14 @@ export default class CommandUiHandler extends UiHandler { i18next.t("commandUiHandler:run") ]; - this.commandsContainer = this.scene.add.container(216, -38.7); + this.commandsContainer = this.scene.add.container(217, -38.7); + this.commandsContainer.setName("commands"); this.commandsContainer.setVisible(false); ui.add(this.commandsContainer); for (let c = 0; c < commands.length; c++) { const commandText = addTextObject(this.scene, c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); + commandText.setName(commands[c]); this.commandsContainer.add(commandText); } } @@ -60,6 +62,7 @@ export default class CommandUiHandler extends UiHandler { } const messageHandler = this.getUi().getMessageHandler(); + messageHandler.bg.setVisible(true); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index c17816c4c55..b5335ed8f2e 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -3,12 +3,14 @@ import { Mode } from "./ui"; import { TextStyle, addTextObject, getEggTierTextTint } from "./text"; import MessageUiHandler from "./message-ui-handler"; import * as Utils from "../utils"; -import { EGG_SEED, Egg, GachaType, getEggTierDefaultHatchWaves, getEggDescriptor, getLegendaryGachaSpeciesForTimestamp } from "../data/egg"; +import { Egg, getLegendaryGachaSpeciesForTimestamp, IEggOptions } from "../data/egg"; import { VoucherType, getVoucherTypeIcon } from "../system/voucher"; import { getPokemonSpecies } from "../data/pokemon-species"; import { addWindow } from "./ui-theme"; import { Tutorial, handleTutorial } from "../tutorial"; import {Button} from "#enums/buttons"; +import * as Overrides from "../overrides"; +import { GachaType } from "#app/enums/gacha-types"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; @@ -94,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; @@ -285,6 +333,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { } pull(pullCount?: integer, count?: integer, eggs?: Egg[]): void { + if (Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE && !count) { + pullCount = Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE; + } + this.eggGachaOptionsContainer.setVisible(false); this.setTransitioning(true); @@ -379,56 +431,24 @@ export default class EggGachaUiHandler extends MessageUiHandler { } if (!eggs) { eggs = []; - const tierValueOffset = this.gachaCursor === GachaType.LEGENDARY ? 1 : 0; - const tiers = new Array(pullCount).fill(null).map(() => { - const tierValue = Utils.randInt(256); - return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; - }); - if (pullCount >= 25 && !tiers.filter(t => t >= EggTier.ULTRA).length) { - tiers[Utils.randInt(tiers.length)] = EggTier.ULTRA; - } else if (pullCount >= 10 && !tiers.filter(t => t >= EggTier.GREAT).length) { - tiers[Utils.randInt(tiers.length)] = EggTier.GREAT; - } - for (let i = 0; i < pullCount; i++) { - this.scene.gameData.eggPity[EggTier.GREAT] += 1; - this.scene.gameData.eggPity[EggTier.ULTRA] += 1; - this.scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; - // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. - if (this.scene.gameData.eggPity[EggTier.MASTER] >= 412 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.MASTER; - } else if (this.scene.gameData.eggPity[EggTier.ULTRA] >= 59 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.ULTRA; - } else if (this.scene.gameData.eggPity[EggTier.GREAT] >= 9 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.GREAT; - } - this.scene.gameData.eggPity[tiers[i]] = 0; - } + for (let i = 1; i <= pullCount; i++) { + const eggOptions: IEggOptions = { scene: this.scene, pulled: true, sourceType: this.gachaCursor }; - const timestamp = new Date().getTime(); - - for (const tier of tiers) { - const eggId = Utils.randInt(EGG_SEED, EGG_SEED * tier); - const egg = new Egg(eggId, this.gachaCursor, getEggTierDefaultHatchWaves(tier), timestamp); - if (egg.isManaphyEgg()) { - this.scene.gameData.gameStats.manaphyEggsPulled++; - egg.hatchWaves = getEggTierDefaultHatchWaves(EggTier.ULTRA); - } else { - switch (tier) { - case EggTier.GREAT: - this.scene.gameData.gameStats.rareEggsPulled++; - break; - case EggTier.ULTRA: - this.scene.gameData.gameStats.epicEggsPulled++; - break; - case EggTier.MASTER: - this.scene.gameData.gameStats.legendaryEggsPulled++; - break; + // Before creating the last egg, check if the guaranteed egg tier was already generated + // if not, override the egg tier + if (i === pullCount) { + const guaranteedEggTier = this.getGuaranteedEggTierFromPullCount(pullCount); + if (!eggs.some(egg => egg.tier >= guaranteedEggTier) && guaranteedEggTier !== EggTier.COMMON) { + eggOptions.tier = guaranteedEggTier; } } + + const egg = new Egg(eggOptions); eggs.push(egg); - this.scene.gameData.eggs.push(egg); - this.scene.gameData.gameStats.eggsPulled++; } + // Shuffle the eggs in case the guaranteed one got added as last egg + eggs = Utils.randSeedShuffle(eggs); + (this.scene.currentBattle ? this.scene.gameData.saveAll(this.scene, true, true, true) : this.scene.gameData.saveSystem()).then(success => { if (!success) { @@ -442,6 +462,17 @@ export default class EggGachaUiHandler extends MessageUiHandler { doPull(); } + getGuaranteedEggTierFromPullCount(pullCount: number): EggTier { + switch (pullCount) { + case 10: + return EggTier.GREAT; + case 25: + return EggTier.ULTRA; + default: + return EggTier.COMMON; + } + } + showSummary(eggs: Egg[]): void { this.transitioning = false; this.eggGachaSummaryContainer.setVisible(true); @@ -470,7 +501,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const eggSprite = this.scene.add.sprite(0, 0, "egg", `egg_${egg.getKey()}`); ret.add(eggSprite); - const eggText = addTextObject(this.scene, 0, 14, getEggDescriptor(egg), TextStyle.PARTY, { align: "center" }); + const eggText = addTextObject(this.scene, 0, 14, egg.getEggDescriptor(), TextStyle.PARTY, { align: "center" }); eggText.setOrigin(0.5, 0); eggText.setTint(getEggTierTextTint(!egg.isManaphyEgg() ? egg.tier : EggTier.ULTRA)); ret.add(eggText); @@ -586,11 +617,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { case Button.ACTION: switch (this.cursor) { case 0: - if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) { + if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 99) { - this.consumeVouchers(VoucherType.REGULAR, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 1); + } this.pull(); success = true; } else { @@ -599,11 +632,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 2: - if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) { + if (!this.scene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 95) { - this.consumeVouchers(VoucherType.PLUS, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PLUS, 1); + } this.pull(5); success = true; } else { @@ -613,15 +648,19 @@ export default class EggGachaUiHandler extends MessageUiHandler { break; case 1: case 3: - if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10) - || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM])) { + if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) + || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE)) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 90) { if (this.cursor === 3) { - this.consumeVouchers(VoucherType.PREMIUM, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PREMIUM, 1); + } } else { - this.consumeVouchers(VoucherType.REGULAR, 10); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 10); + } } this.pull(10); success = true; @@ -631,11 +670,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 4: - if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) { + if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 75) { - this.consumeVouchers(VoucherType.GOLDEN, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.GOLDEN, 1); + } this.pull(25); success = true; } else { diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index e4223824a2e..fd8444f73ef 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -3,7 +3,7 @@ import { Mode } from "./ui"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "./text"; import MessageUiHandler from "./message-ui-handler"; -import { Egg, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg"; +import { Egg } from "../data/egg"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; import i18next from "i18next"; @@ -163,7 +163,7 @@ export default class EggListUiHandler extends MessageUiHandler { setEggDetails(egg: Egg): void { this.eggSprite.setFrame(`egg_${egg.getKey()}`); - this.eggNameText.setText(`${i18next.t("egg:egg")} (${getEggDescriptor(egg)})`); + this.eggNameText.setText(`${i18next.t("egg:egg")} (${egg.getEggDescriptor()})`); this.eggDateText.setText( new Date(egg.timestamp).toLocaleString(undefined, { weekday: "short", @@ -172,8 +172,8 @@ export default class EggListUiHandler extends MessageUiHandler { day: "numeric" }) ); - this.eggHatchWavesText.setText(getEggHatchWavesMessage(egg.hatchWaves)); - this.eggGachaInfoText.setText(getEggGachaTypeDescriptor(this.scene, egg)); + this.eggHatchWavesText.setText(egg.getEggHatchWavesMessage()); + this.eggGachaInfoText.setText(egg.getEggTypeDescriptor(this.scene)); } setCursor(cursor: integer): boolean { diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 0ee5b511b31..ed520512443 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -13,6 +13,7 @@ import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; export default class FightUiHandler extends UiHandler { private movesContainer: Phaser.GameObjects.Container; + private moveInfoContainer: Phaser.GameObjects.Container; private typeIcon: Phaser.GameObjects.Sprite; private ppLabel: Phaser.GameObjects.Text; private ppText: Phaser.GameObjects.Text; @@ -34,48 +35,53 @@ export default class FightUiHandler extends UiHandler { const ui = this.getUi(); this.movesContainer = this.scene.add.container(18, -38.7); + this.movesContainer.setName("moves"); ui.add(this.movesContainer); - this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); + this.moveInfoContainer = this.scene.add.container(1, 0); + this.moveInfoContainer.setName("move-info"); + ui.add(this.moveInfoContainer); + + this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); this.typeIcon.setVisible(false); - ui.add(this.typeIcon); + this.moveInfoContainer.add(this.typeIcon); - this.moveCategoryIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 25, -36, "categories", "physical"); + this.moveCategoryIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 25, -36, "categories", "physical"); this.moveCategoryIcon.setVisible(false); - ui.add(this.moveCategoryIcon); + this.moveInfoContainer.add(this.moveCategoryIcon); - this.ppLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); + this.ppLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); this.ppLabel.setOrigin(0.0, 0.5); this.ppLabel.setVisible(false); this.ppLabel.setText(i18next.t("fightUiHandler:pp")); - ui.add(this.ppLabel); + this.moveInfoContainer.add(this.ppLabel); - this.ppText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); + this.ppText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); this.ppText.setOrigin(1, 0.5); this.ppText.setVisible(false); - ui.add(this.ppText); + this.moveInfoContainer.add(this.ppText); - this.powerLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); + this.powerLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); this.powerLabel.setOrigin(0.0, 0.5); this.powerLabel.setVisible(false); this.powerLabel.setText(i18next.t("fightUiHandler:power")); - ui.add(this.powerLabel); + this.moveInfoContainer.add(this.powerLabel); - this.powerText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); + this.powerText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); this.powerText.setOrigin(1, 0.5); this.powerText.setVisible(false); - ui.add(this.powerText); + this.moveInfoContainer.add(this.powerText); - this.accuracyLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); + this.accuracyLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); this.accuracyLabel.setOrigin(0.0, 0.5); this.accuracyLabel.setVisible(false); this.accuracyLabel.setText(i18next.t("fightUiHandler:accuracy")); - ui.add(this.accuracyLabel); + this.moveInfoContainer.add(this.accuracyLabel); - this.accuracyText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); + this.accuracyText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); this.accuracyText.setOrigin(1, 0.5); this.accuracyText.setVisible(false); - ui.add(this.accuracyText); + this.moveInfoContainer.add(this.accuracyText); } show(args: any[]): boolean { @@ -84,6 +90,7 @@ export default class FightUiHandler extends UiHandler { this.fieldIndex = args.length ? args[0] as integer : 0; const messageHandler = this.getUi().getMessageHandler(); + messageHandler.bg.setVisible(false); messageHandler.commandWindow.setVisible(false); messageHandler.movesWindowContainer.setVisible(true); this.setCursor(this.getCursor()); @@ -236,10 +243,12 @@ export default class FightUiHandler extends UiHandler { for (let moveIndex = 0; moveIndex < 4; moveIndex++) { const moveText = addTextObject(this.scene, moveIndex % 2 === 0 ? 0 : 100, moveIndex < 2 ? 0 : 16, "-", TextStyle.WINDOW); + moveText.setName("text-empty-move"); if (moveIndex < moveset.length) { const pokemonMove = moveset[moveIndex]; moveText.setText(pokemonMove.getName()); + moveText.setName(pokemonMove.getName()); moveText.setColor(this.getMoveColor(pokemon, pokemonMove) ?? moveText.style.color); } @@ -273,6 +282,7 @@ export default class FightUiHandler extends UiHandler { clear() { super.clear(); + const messageHandler = this.getUi().getMessageHandler(); this.clearMoves(); this.typeIcon.setVisible(false); this.ppLabel.setVisible(false); @@ -282,6 +292,7 @@ export default class FightUiHandler extends UiHandler { this.accuracyLabel.setVisible(false); this.accuracyText.setVisible(false); this.moveCategoryIcon.setVisible(false); + messageHandler.bg.setVisible(true); this.eraseCursor(); } diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 81c22323618..782498e03de 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -10,8 +10,9 @@ import { loggedInUser, updateUserInfo } from "../account"; import i18next from "i18next"; import {Button} from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; +import BgmBar from "#app/ui/bgm-bar"; -export enum MenuOptions { +enum MenuOptions { GAME_SETTINGS, ACHIEVEMENTS, STATS, @@ -24,7 +25,7 @@ export enum MenuOptions { LOG_OUT, } -const wikiUrl = "https://wiki.pokerogue.net/start"; +let wikiUrl = "https://wiki.pokerogue.net/start"; const discordUrl = "https://discord.gg/uWpTfdKG49"; const githubUrl = "https://github.com/pagefaultgames/pokerogue"; const redditUrl = "https://www.reddit.com/r/pokerogue"; @@ -32,6 +33,7 @@ const redditUrl = "https://www.reddit.com/r/pokerogue"; export default class MenuUiHandler extends MessageUiHandler { private menuContainer: Phaser.GameObjects.Container; private menuMessageBoxContainer: Phaser.GameObjects.Container; + private menuOverlay: Phaser.GameObjects.Rectangle; private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; @@ -44,6 +46,9 @@ export default class MenuUiHandler extends MessageUiHandler { protected manageDataConfig: OptionSelectConfig; protected communityConfig: OptionSelectConfig; + public bgmBar: BgmBar; + + constructor(scene: BattleScene, mode?: Mode) { super(scene, mode); @@ -55,12 +60,28 @@ export default class MenuUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); + // wiki url directs based on languges available on wiki + const lang = i18next.resolvedLanguage.substring(0,2); + if (["de", "fr", "ko", "zh"].includes(lang)) { + wikiUrl = `https://wiki.pokerogue.net/${lang}:start`; + } + + this.bgmBar = new BgmBar(this.scene); + this.bgmBar.setup(); + + ui.bgmBar = this.bgmBar; this.menuContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - + this.menuContainer.setName("menu"); this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.menuOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0xffffff, 0.3); + this.menuOverlay.setName("menu-overlay"); + this.menuOverlay.setOrigin(0,0); + this.menuContainer.add(this.menuOverlay); + const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); menuMessageText.setWordWrapWidth(1224); menuMessageText.setOrigin(0, 0); @@ -79,6 +100,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.add(this.menuContainer); this.menuMessageBoxContainer = this.scene.add.container(0, 130); + this.menuMessageBoxContainer.setName("menu-message-box"); this.menuMessageBoxContainer.setVisible(false); this.menuContainer.add(this.menuMessageBoxContainer); @@ -88,6 +110,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuMessageBoxContainer.add(menuMessageText); + this.menuContainer.add(this.bgmBar); + this.message = menuMessageText; this.menuContainer.add(this.menuMessageBoxContainer); @@ -240,6 +264,7 @@ export default class MenuUiHandler extends MessageUiHandler { } show(args: any[]): boolean { + super.show(args); this.menuContainer.setVisible(true); @@ -253,6 +278,9 @@ export default class MenuUiHandler extends MessageUiHandler { handleTutorial(this.scene, Tutorial.Menu); + this.bgmBar.toggleBgmBar(true); + + return true; } @@ -294,6 +322,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.EGG_LIST); success = true; } else { + ui.showText(i18next.t("menuUiHandler:noEggs"), null, () => ui.showText(""), Utils.fixedInt(1500)); error = true; } break; @@ -453,6 +482,7 @@ export default class MenuUiHandler extends MessageUiHandler { clear() { super.clear(); this.menuContainer.setVisible(false); + this.bgmBar.toggleBgmBar(false); this.eraseCursor(); } diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 09f73ac2749..3cfd103b4e2 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,7 @@ import {Button} from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; import { allMoves } from "../data/move"; import * as Utils from "./../utils"; +import i18next from "i18next"; export const SHOP_OPTIONS_ROW_LIMIT = 6; @@ -27,6 +28,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,32 +49,39 @@ 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); - this.transferButtonContainer.setName("container-transfer-btn"); + 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.setName("container-use-btn"); + 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); this.rerollButtonContainer = this.scene.add.container(16, -64); - this.rerollButtonContainer.setName("container-reroll-brn"); + this.rerollButtonContainer.setName("reroll-brn"); this.rerollButtonContainer.setVisible(false); ui.add(this.rerollButtonContainer); - 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 +96,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); @@ -180,8 +190,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const maxUpgradeCount = typeOptions.map(to => to.upgradeCount).reduce((max, current) => Math.max(current, max), 0); - this.scene.showFieldOverlay(750); + /* Force updateModifiers without pokemonSpecificModifiers */ + this.scene.getModifierBar().updateModifiers(this.scene.modifiers, true); + + /* Multiplies the appearance duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ + this.scene.showShopOverlay(750 * this.scene.gameSpeed); this.scene.updateAndShowText(750); + this.scene.updateBiomeWaveText(); this.scene.updateMoneyText(); let i = 0; @@ -385,16 +400,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; @@ -451,7 +466,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)); } @@ -472,9 +487,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.getUi().clearText(); this.eraseCursor(); - this.scene.hideFieldOverlay(250); + /* Multiplies the fade time duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ + this.scene.hideShopOverlay(750 * this.scene.gameSpeed); this.scene.hideLuckText(250); + /* Normally already called just after the shop, but not sure if it happens in 100% of cases */ + this.scene.getModifierBar().updateModifiers(this.scene.modifiers); + const options = this.options.concat(this.shopOptionsRows.flat()); this.options.splice(0, this.options.length); this.shopOptionsRows.splice(0, this.shopOptionsRows.length); @@ -711,7 +730,7 @@ class ModifierOption extends Phaser.GameObjects.Container { const formattedMoney = Utils.formatMoney(scene.moneyFormat, this.modifierTypeOption.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 e487f5ce7ca..e820c8cb0d2 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,10 @@ 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"; -const defaultMessage = "Choose a Pokémon."; +const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); export enum PartyUiMode { SWITCH, @@ -85,7 +86,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 +115,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: pokemon.name }); } return null; }; public static FilterFainted = (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { - return `${pokemon.name} still has energy\nto battle!`; + return i18next.t("partyUiHandler:hasEnergy", { pokemonName: pokemon.name }); } return null; }; @@ -134,7 +136,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: pokemon.name }); } return null; }; @@ -144,14 +146,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: pokemon.name }); } 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]; constructor(scene: BattleScene) { super(scene, Mode.PARTY); @@ -161,31 +163,37 @@ export default class PartyUiHandler extends MessageUiHandler { const ui = this.getUi(); const partyContainer = this.scene.add.container(0, 0); + partyContainer.setName("party"); partyContainer.setVisible(false); ui.add(partyContainer); this.partyContainer = partyContainer; this.partyBg = this.scene.add.image(0, 0, "party_bg"); + this.partyBg.setName("img-party-bg"); partyContainer.add(this.partyBg); this.partyBg.setOrigin(0, 1); const partySlotsContainer = this.scene.add.container(0, 0); + partySlotsContainer.setName("party-slots"); partyContainer.add(partySlotsContainer); this.partySlotsContainer = partySlotsContainer; const partyMessageBoxContainer = this.scene.add.container(0, -32); + partyMessageBoxContainer.setName("party-msg-box"); partyContainer.add(partyMessageBoxContainer); const partyMessageBox = addWindow(this.scene, 1, 31, 262, 30); + partyMessageBox.setName("window-party-msg-box"); partyMessageBox.setOrigin(0, 1); partyMessageBoxContainer.add(partyMessageBox); this.partyMessageBox = partyMessageBox; - const partyMessageText = addTextObject(this.scene, 8, 10, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + const partyMessageText = addTextObject(this.scene, 10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + partyMessageText.setName("text-party-msg"); partyMessageText.setOrigin(0, 0); partyMessageBoxContainer.add(partyMessageText); @@ -370,18 +378,18 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = false; - this.showText(`Evolutions have been unpaused for ${pokemon.name}.`, null, () => this.showText(null, 0), null, true); + this.showText(i18next.t("partyUiHandler:unpausedEvolutions", { pokemonName: pokemon.name }), 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); @@ -395,7 +403,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: pokemon.name }), null, () => { ui.setModeWithoutClear(Mode.CONFIRM, () => { ui.setMode(Mode.PARTY); this.doRelease(this.cursor); @@ -405,7 +413,7 @@ 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.CANCEL) { @@ -645,20 +653,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; } @@ -813,7 +821,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)]; @@ -841,7 +849,7 @@ export default class PartyUiHandler extends MessageUiHandler { default: if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; - optionName = `${modifier.active ? "Deactivate" : "Activate"} ${modifier.type.name}`; + optionName = `${modifier.active ? i18next.t("partyUiHandler:DEACTIVATE") : i18next.t("partyUiHandler:ACTIVATE")} ${modifier.type.name}`; } else { if (this.localizedOptions.includes(option)) { optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); @@ -855,27 +863,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); @@ -926,25 +949,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 }); } } @@ -1073,7 +1096,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { slotGenderText.setPositionRelative(slotLevelLabel, 36, 0); } else { - slotGenderText.setPositionRelative(slotName, 76, 3); + slotGenderText.setPositionRelative(slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); } slotGenderText.setOrigin(0, 0.25); @@ -1085,9 +1108,9 @@ class PartySlot extends Phaser.GameObjects.Container { splicedIcon.setScale(0.5); splicedIcon.setOrigin(0, 0); if (this.slotIndex >= battlerCount) { - splicedIcon.setPositionRelative(slotLevelLabel, 36 - (genderSymbol ? 8 : 0), 0.5); + splicedIcon.setPositionRelative(slotLevelLabel, 36 + (genderSymbol ? 8 : 0), 0.5); } else { - splicedIcon.setPositionRelative(slotName, 76 - (genderSymbol ? 8 : 0), 3.5); + splicedIcon.setPositionRelative(slotName, 76, 3.5); } slotInfoContainer.add(splicedIcon); @@ -1143,13 +1166,13 @@ class PartySlot extends Phaser.GameObjects.Container { 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; } @@ -1224,7 +1247,7 @@ class PartyCancelButton extends Phaser.GameObjects.Container { this.partyCancelPb = partyCancelPb; - const partyCancelText = addTextObject(this.scene, -7, -6, "Cancel", TextStyle.PARTY); + const partyCancelText = addTextObject(this.scene, -8, -7, 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 482aeec6871..9f4df2b20b4 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -79,7 +79,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { } setup(): void { - this.setName("container-pkmn-info"); + this.setName("pkmn-info"); const currentLanguage = i18next.resolvedLanguage; const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)); const textSettings = languageSettings[langSettingKey]; @@ -88,7 +88,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { infoBg.setName("window-info-bg"); this.pokemonMovesContainer = this.scene.add.container(6, 14); - this.pokemonMovesContainer.setName("container-pkmn-moves"); + this.pokemonMovesContainer.setName("pkmn-moves"); this.movesContainerInitialX = this.pokemonMovesContainer.x; @@ -109,7 +109,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { for (let m = 0; m < 4; m++) { const moveContainer = this.scene.add.container(-6, 18 + 7 * m); moveContainer.setScale(0.5); - moveContainer.setName("container-move"); + moveContainer.setName("move"); const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); @@ -300,9 +300,9 @@ 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))); diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 47c61011f8c..8a81ac4858d 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -119,7 +119,15 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { }; if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => saveAndCallback(), () => { + ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.gameData.deleteSession(cursor).then(response => { + if (response === false) { + this.scene.reset(true); + } else { + saveAndCallback(); + } + }); + }, () => { ui.revertMode(); ui.showText(null, 0); }, false, 0, 19, 2000); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 2ec4c437b3c..9bf0cb40975 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -98,6 +98,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler this.navigationIcons = {}; this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.settingsContainer.setName(`settings-${this.titleSelected}`); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 1834d5f09dd..6763c8d3d85 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -54,7 +54,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { const ui = this.getUi(); this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - + this.settingsContainer.setName(`settings-${this.title}`); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6 - 20), Phaser.Geom.Rectangle.Contains); this.navigationIcons = {}; @@ -62,6 +62,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.navigationContainer = new NavigationMenu(this.scene, 0, 0); this.optionsBg = addWindow(this.scene, 0, this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); const actionsBg = addWindow(this.scene, 0, (this.scene.game.canvas.height / 6) - this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, 22); diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index a0c59efdc06..f0e84f29e00 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -73,6 +73,7 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler }; break; case "ko": + case "ko-KR": this.settings[languageIndex].options[0] = { value: "한국어", label: "한국어", diff --git a/public/images/pokemon/678ms.json b/src/ui/settings/shiny_icons.json similarity index 58% rename from public/images/pokemon/678ms.json rename to src/ui/settings/shiny_icons.json index 0fac19c59c4..d6465cf2c3a 100644 --- a/public/images/pokemon/678ms.json +++ b/src/ui/settings/shiny_icons.json @@ -1,33 +1,33 @@ { "textures": [ { - "image": "678ms.png", + "image": "shiny_icons.png", "format": "RGBA8888", "size": { - "w": 56, - "h": 56 + "w": 45, + "h": 14 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0", "rotated": false, "trimmed": false, "sourceSize": { "w": 45, - "h": 56 + "h": 14 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 45, - "h": 56 + "w": 15, + "h": 14 }, "frame": { "x": 0, "y": 0, - "w": 45, - "h": 56 + "w": 15, + "h": 14 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:935ddcd2ff1f413e94967151e2f4cc6d:bdb048fb547d7ebb9a83d391e8f1c9ba:81f219fee9493a3658266d8c5e858b9e$" + "smartupdate": "$TexturePacker:SmartUpdate:a3275c7504a9b35b288265e191b1d14c:420725f3fb73c2cac0ab3bbc0a46f2e1:3a8b8ca0f0e4be067dd46c07b78ee013$" } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 2dd77b53ae0..0caf9ef6fa6 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,6 +1,6 @@ import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "../events/battle-scene"; import { pokemonPrevolutions } from "#app/data/pokemon-evolutions"; -import { Variant, getVariantTint } from "#app/data/variant"; +import { Variant, getVariantTint, getVariantIcon } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; @@ -27,6 +27,8 @@ import { StatsContainer } from "./stats-container"; import { TextStyle, addBBCodeTextObject, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; +import { Egg } from "#app/data/egg"; +import * as Overrides from "../overrides"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; import {Passive as PassiveAttr} from "#enums/passive"; import * as Challenge from "../data/challenge"; @@ -36,6 +38,7 @@ import { Device } from "#enums/devices"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import {Button} from "#enums/buttons"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -98,17 +101,17 @@ const languageSettings: { [key: string]: LanguageSetting } = { } }; -const starterCandyCosts: { passive: integer, costReduction: [integer, integer] }[] = [ - { passive: 50, costReduction: [30, 75] }, // 1 - { passive: 45, costReduction: [25, 60] }, // 2 - { passive: 40, costReduction: [20, 50] }, // 3 - { passive: 30, costReduction: [15, 40] }, // 4 - { passive: 25, costReduction: [12, 35] }, // 5 - { passive: 20, costReduction: [10, 30] }, // 6 - { passive: 15, costReduction: [8, 20] }, // 7 - { passive: 10, costReduction: [5, 15] }, // 8 - { passive: 10, costReduction: [3, 10] }, // 9 - { passive: 10, costReduction: [3, 10] }, // 10 +const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ + { passive: 50, costReduction: [30, 75], egg: 35 }, // 1 + { passive: 45, costReduction: [25, 60], egg: 35 }, // 2 + { passive: 40, costReduction: [20, 50], egg: 35 }, // 3 + { passive: 30, costReduction: [15, 40], egg: 30 }, // 4 + { passive: 25, costReduction: [12, 35], egg: 25 }, // 5 + { passive: 20, costReduction: [10, 30], egg: 20 }, // 6 + { passive: 15, costReduction: [8, 20], egg: 15 }, // 7 + { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 + { passive: 10, costReduction: [3, 10], egg: 10 }, // 9 + { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 ]; function getPassiveCandyCount(baseValue: integer): integer { @@ -119,6 +122,10 @@ function getValueReductionCandyCounts(baseValue: integer): [integer, integer] { return starterCandyCosts[baseValue - 1].costReduction; } +function getSameSpeciesEggCandyCounts(baseValue: integer): integer { + return starterCandyCosts[baseValue - 1].egg; +} + /** * Calculates the icon position for a Pokemon of a given UI index * @param index UI index to calculate the icon position of @@ -192,6 +199,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonCaughtCountText: Phaser.GameObjects.Text; private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; + private pokemonShinyIcon: Phaser.GameObjects.Sprite; private genOptionsText: Phaser.GameObjects.Text; private instructionsContainer: Phaser.GameObjects.Container; @@ -432,7 +440,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.valueLimitLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(this.valueLimitLabel); - const startLabel = addTextObject(this.scene, 124, 162, i18next.t("starterSelectUiHandler:start"), TextStyle.TOOLTIP_CONTENT); + const startLabel = addTextObject(this.scene, 124, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); startLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(startLabel); @@ -547,15 +555,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); this.starterSelectContainer.add(this.pokemonSprite); - this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); this.type1Icon.setScale(0.5); + this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type1Icon.setScale(0.5); this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); this.type2Icon.setScale(0.5); + this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - 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); @@ -607,6 +617,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); + this.pokemonShinyIcon = this.scene.add.sprite(14, 76, "shiny_icons"); + this.pokemonShinyIcon.setOrigin(0.15, 0.2); + this.pokemonShinyIcon.setScale(1); + this.pokemonCaughtHatchedContainer.add ((this.pokemonShinyIcon)); + this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); @@ -678,35 +693,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.instructionsContainer); // instruction rows that will be pushed into the container dynamically based on need - this.shinyIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + // creating new sprites since they will be added to the scene later + this.shinyIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + this.shinyIconElement.setName("sprite-shiny-icon-element"); this.shinyIconElement.setScale(0.675); this.shinyIconElement.setOrigin(0.0, 0.0); this.shinyLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel.setName("text-shiny-label"); - this.formIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement.setName("sprite-form-icon-element"); this.formIconElement.setScale(0.675); this.formIconElement.setOrigin(0.0, 0.0); this.formLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel.setName("text-form-label"); - this.genderIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement.setName("sprite-gender-icon-element"); this.genderIconElement.setScale(0.675); this.genderIconElement.setOrigin(0.0, 0.0); this.genderLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel.setName("text-gender-label"); - this.abilityIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement.setName("sprite-ability-icon-element"); this.abilityIconElement.setScale(0.675); this.abilityIconElement.setOrigin(0.0, 0.0); this.abilityLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.abilityLabel.setName("text-ability-label"); - this.natureIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement.setName("sprite-nature-icon-element"); this.natureIconElement.setScale(0.675); this.natureIconElement.setOrigin(0.0, 0.0); this.natureLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.natureLabel.setName("text-nature-label"); - this.variantIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement.setName("sprite-variant-icon-element"); this.variantIconElement.setScale(0.675); this.variantIconElement.setOrigin(0.0, 0.0); this.variantLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.variantLabel.setName("text-variant-label"); this.hideInstructions(); @@ -878,6 +906,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { && starterData.valueReduction < 2; } + /** + * Determines if an same species egg can be baught for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = this.scene.gameData.starterData[speciesId]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarters[speciesId]); + } + /** * Sets a bounce animation if enabled and the Pokemon has an upgrade * @param icon {@linkcode Phaser.GameObjects.GameObject} to animate @@ -1309,9 +1349,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name})`, handler: () => { - if (candyCount >= passiveCost) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; - starterData.candyCount -= passiveCost; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= passiveCost; + } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { if (!success) { @@ -1344,9 +1386,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, handler: () => { - if (candyCount >= reductionCost) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { starterData.valueReduction++; - starterData.candyCount -= reductionCost; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= reductionCost; + } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { if (!success) { @@ -1377,6 +1421,49 @@ export default class StarterSelectUiHandler extends MessageUiHandler { itemArgs: starterColors[this.lastSpecies.speciesId] }); } + + // Same species egg menu option. Only visible if passive is bought + if (passiveAttr & PassiveAttr.UNLOCKED) { + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= sameSpeciesEggCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG}); + egg.addEggToGameData(this.scene); + + this.scene.gameData.saveSystem().then(success => { + if (!success) { + return this.scene.reset(true); + } + }); + ui.setMode(Mode.STARTER_SELECT); + this.scene.playSound("buy"); + + // If the notification setting is set to 'On', update the candy upgrade display + // if (this.scene.candyUpgradeNotification === 2) { + // if (this.isUpgradeIconEnabled() ) { + // this.setUpgradeIcon(this.cursor); + // } + // if (this.isUpgradeAnimationEnabled()) { + // const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; + // this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); + // } + // } + + return true; + } + return false; + }, + item: "candy", + itemArgs: starterColors[this.lastSpecies.speciesId] + }); + } options.push({ label: i18next.t("menu:cancel"), handler: () => { @@ -1425,11 +1512,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { - starterAttributes.variant = !props.shiny ? props.variant : -1; // update shiny setting + const newVariant = props.variant; this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); if (this.dexAttrCursor & DexAttr.SHINY) { this.scene.playSound("sparkle"); + // Set the variant label to the shiny tint + const tint = getVariantTint(newVariant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setVisible(true); } else { + this.pokemonShinyIcon.setVisible(false); success = true; } } @@ -1512,13 +1605,11 @@ 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); - this.variantLabel.setTint(tint); - + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + this.pokemonShinyIcon.setTint(tint); success = true; } break; @@ -1794,8 +1885,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); const variant = defaultProps.variant; const tint = getVariantTint(variant); - - this.variantLabel.setTint(tint); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); this.setSpecies(species); this.updateInstructions(); } @@ -1843,6 +1934,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + + setSpecies(species: PokemonSpecies) { this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; this.dexAttrCursor = species ? this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true) : 0n; @@ -1941,6 +2034,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonLuckText.setText(luck.toString()); this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); + this.pokemonShinyIcon.setVisible(this.pokemonLuckText.visible); //Growth translate let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]); @@ -1964,9 +2058,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); } this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry.hatchedCount}`); + const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const variant = defaultProps.variant; + const tint = getVariantTint(variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); this.pokemonCaughtHatchedContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { this.pokemonCaughtHatchedContainer.setY(16); + this.pokemonShinyIcon.setY(135); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); [ this.pokemonCandyIcon, this.pokemonCandyOverlayIcon, @@ -1976,11 +2078,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedCountText ].map(c => c.setVisible(false)); this.pokemonFormText.setY(25); - } else if (species.speciesId === Species.ETERNATUS) { - this.pokemonHatchedIcon.setVisible(false); - this.pokemonHatchedCountText.setVisible(false); } else { this.pokemonCaughtHatchedContainer.setY(25); + this.pokemonShinyIcon.setY(117); this.pokemonCandyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); this.pokemonCandyIcon.setVisible(true); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); @@ -2072,6 +2172,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); + this.pokemonShinyIcon.setVisible(false); this.pokemonUncaughtText.setVisible(true); this.pokemonAbilityLabelText.setVisible(false); this.pokemonPassiveLabelText.setVisible(false); @@ -2100,6 +2201,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); + this.pokemonShinyIcon.setVisible(false); this.pokemonUncaughtText.setVisible(!!species); this.pokemonAbilityLabelText.setVisible(false); this.pokemonPassiveLabelText.setVisible(false); @@ -2116,6 +2218,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } + + setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, variant: Variant, abilityIndex: integer, natureIndex: integer, forSeen: boolean = false): void { const oldProps = species ? this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -2218,10 +2322,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isValidForChallenge = new Utils.BooleanHolder(true); + const currentPartyValue = this.starterGens.reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.genSpecies[gen][this.starterCursors[i]].speciesId), 0); + const cursorCost = this.scene.gameData.getSpeciesStarterValue(species.speciesId); + const isValidNextPartyValue = (currentPartyValue + cursorCost) <= this.getValueLimit(); Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterGens.length); const starterSprite = this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite; starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant)); - starterSprite.setAlpha(isValidForChallenge.value ? 1 : 0.375); + starterSprite.setAlpha(isValidForChallenge.value && isValidNextPartyValue ? 1 : 0.375); this.checkIconId((this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite), species, female, formIndex, shiny, variant); this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY); this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); @@ -2262,7 +2369,7 @@ 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)) { diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 11154bd700b..b4e799bafc0 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -26,7 +26,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { } setup() { - this.setName("container-stats"); + this.setName("stats"); const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 73edda0ba44..ae94951bc4c 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -345,9 +345,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()); } @@ -717,7 +717,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); diff --git a/src/ui/text.ts b/src/ui/text.ts index b74742fef74..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,14 +84,14 @@ 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; const defaultFontSize = 96; let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { - fontFamily: "emerald, unifont", + fontFamily: "emerald", fontSize: 96, color: getTextColor(style, false, uiTheme), padding: { @@ -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); @@ -198,10 +210,10 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui case TextStyle.PARTY_RED: return !shadow ? "#f89890" : "#984038"; case TextStyle.SUMMARY: - return !shadow ? "#ffffff" : "#636363"; + return !shadow ? "#f8f8f8" : "#636363"; case TextStyle.SUMMARY_ALT: if (uiTheme) { - return !shadow ? "#ffffff" : "#636363"; + return !shadow ? "#f8f8f8" : "#636363"; } return !shadow ? "#484848" : "#d0d0c8"; case TextStyle.SUMMARY_RED: @@ -227,23 +239,27 @@ 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"; } } export function getModifierTierTextTint(tier: ModifierTier): integer { switch (tier) { case ModifierTier.COMMON: - return 0xffffff; + return 0xf8f8f8; case ModifierTier.GREAT: - return 0x3890f8; + return 0x4998f8; case ModifierTier.ULTRA: return 0xf8d038; case ModifierTier.ROGUE: - return 0xd52929; + return 0xdb4343; case ModifierTier.MASTER: - return 0xe020c0; + return 0xe331c5; case ModifierTier.LUXURY: - return 0xe64a18; + return 0xe74c18; } } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 54c478a7ad7..4036e0b9922 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,22 +1,20 @@ import BattleScene from "../battle-scene"; -import { DailyRunScoreboard } from "./daily-run-scoreboard"; import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; +import { TimedEventDisplay } from "#app/timed-event-manager.js"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; - private dailyRunScoreboard: DailyRunScoreboard; private playerCountLabel: Phaser.GameObjects.Text; private splashMessage: string; private splashMessageText: Phaser.GameObjects.Text; - private eventTimerText: Phaser.GameObjects.Text; + private eventDisplay: TimedEventDisplay; private titleStatsTimer: NodeJS.Timeout; - private eventTimer: NodeJS.Timeout; constructor(scene: BattleScene, mode: Mode = Mode.TITLE) { super(scene, mode); @@ -28,7 +26,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); this.titleContainer = this.scene.add.container(0, -(this.scene.game.canvas.height / 6)); - this.titleContainer.setName("container-title"); + this.titleContainer.setName("title"); this.titleContainer.setAlpha(0); ui.add(this.titleContainer); @@ -37,36 +35,9 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.add(logo); if (this.scene.eventManager.isEventActive()) { - const event = this.scene.eventManager.activeEvent(); - const banner = this.scene.add.image(29, 64, event.bannerFilename); - banner.setName("img-event-banner"); - banner.setOrigin(0, 0); - banner.setScale(0.07); - const bannerShadow = this.scene.add.rectangle( - banner.x - 2, - banner.y + 2, - banner.width, - banner.height, - 0x484848 - ); - bannerShadow.setName("rect-event-banner-shadow"); - bannerShadow.setScale(0.07); - bannerShadow.setAlpha(0.5); - bannerShadow.setOrigin(0,0); - this.eventTimerText = addTextObject( - this.scene, - banner.x + 8, - banner.y + 100, - this.timeToGo(event.endDate), - TextStyle.WINDOW - ); - this.eventTimerText.setName("text-event-timer"); - this.eventTimerText.setScale(0.15); - this.eventTimerText.setOrigin(0,0); - - this.titleContainer.add(bannerShadow); - this.titleContainer.add(banner); - this.titleContainer.add(this.eventTimerText); + this.eventDisplay = new TimedEventDisplay(this.scene, 0, 0, this.scene.eventManager.activeEvent()); + this.eventDisplay.setup(); + this.titleContainer.add(this.eventDisplay); } this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 109, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: "54px" }); @@ -89,33 +60,6 @@ export default class TitleUiHandler extends OptionSelectUiHandler { }); } - timeToGo(date: Date) { - - // Utility to add leading zero - function z(n) { - return (n < 10? "0" : "") + n; - } - const now = new Date(); - let diff = Math.abs(date.getTime() - now.getTime()); - - // Allow for previous times - diff = Math.abs(diff); - - // Get time components - const days = diff/8.64e7 | 0; - const hours = diff%8.64e7 / 3.6e6 | 0; - const mins = diff%3.6e6 / 6e4 | 0; - const secs = Math.round(diff%6e4 / 1e3); - - // Return formatted string - return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs)+ "s"; - } - - updateCountdown() { - const event = this.scene.eventManager.activeEvent(); - this.eventTimerText.setText(this.timeToGo(event.endDate)); - } - updateTitleStats(): void { Utils.apiFetch("game/titlestats") .then(request => request.json()) @@ -139,14 +83,8 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - // this.dailyRunScoreboard.update(); - if (this.scene.eventManager.isEventActive()) { - this.updateCountdown(); - - this.eventTimer = setInterval(() => { - this.updateCountdown(); - }, 1000); + this.eventDisplay.show(); } this.updateTitleStats(); @@ -171,8 +109,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - clearInterval(this.eventTimer); - this.eventTimer = null; + this.eventDisplay?.clear(); clearInterval(this.titleStatsTimer); this.titleStatsTimer = null; diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index b2992d049cb..58490e1c618 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -46,13 +46,25 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, null, width, height, borderSize, borderSize, borderSize, borderSize); window.setOrigin(0, 0); - if (mergeMaskTop || mergeMaskLeft) { - const maskRect = scene.make.graphics({}); + if (mergeMaskLeft || mergeMaskTop || maskOffsetX || maskOffsetY) { + /** + * x: left + * y: top + * width: right + * height: bottom + */ + const maskRect = new Phaser.GameObjects.Rectangle( + scene, + 6*(x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), + 6*(y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0)), + width - (mergeMaskLeft ? 2 : 0), + height - (mergeMaskTop ? 2 : 0), + 0xffffff + ); + maskRect.setOrigin(0); maskRect.setScale(6); - maskRect.fillStyle(0xFFFFFF); - maskRect.beginPath(); - maskRect.fillRect(window.x + (mergeMaskLeft ? 2 : 0) + (maskOffsetX || 0), window.y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0), window.width - (mergeMaskLeft ? 2 : 0), window.height - (mergeMaskTop ? 2 : 0)); - window.setMask(maskRect.createGeometryMask()); + const mask = maskRect.createGeometryMask(); + window.setMask(mask); } return window; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 55982d049cf..ce834a83645 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -45,6 +45,7 @@ import KeyboardBindingUiHandler from "#app/ui/settings/keyboard-binding-ui-handl import SettingsDisplayUiHandler from "./settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./settings/settings-audio-ui-handler"; import { PlayerGender } from "#enums/player-gender"; +import BgmBar from "#app/ui/bgm-bar"; export enum Mode { MESSAGE, @@ -127,6 +128,7 @@ export default class UI extends Phaser.GameObjects.Container { public handlers: UiHandler[]; private overlay: Phaser.GameObjects.Rectangle; public achvBar: AchvBar; + public bgmBar: BgmBar; public savingIcon: SavingIconHandler; private tooltipContainer: Phaser.GameObjects.Container; @@ -159,6 +161,7 @@ export default class UI extends Phaser.GameObjects.Container { new OptionSelectUiHandler(scene), new MenuUiHandler(scene), new OptionSelectUiHandler(scene, Mode.MENU_OPTION_SELECT), + // settings new SettingsUiHandler(scene), new SettingsDisplayUiHandler(scene), new SettingsAudioUiHandler(scene), @@ -182,11 +185,12 @@ export default class UI extends Phaser.GameObjects.Container { } setup(): void { - this.setName("container-ui"); + this.setName(`ui-${Mode[this.mode]}`); for (const handler of this.handlers) { handler.setup(); } this.overlay = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0); + this.overlay.setName("rect-ui-overlay"); this.overlay.setOrigin(0, 0); (this.scene as BattleScene).uiContainer.add(this.overlay); this.overlay.setVisible(false); @@ -205,15 +209,19 @@ export default class UI extends Phaser.GameObjects.Container { private setupTooltip() { this.tooltipContainer = this.scene.add.container(0, 0); + this.tooltipContainer.setName("tooltip"); this.tooltipContainer.setVisible(false); this.tooltipBg = addWindow(this.scene as BattleScene, 0, 0, 128, 31); + this.tooltipBg.setName("window-tooltip-bg"); this.tooltipBg.setOrigin(0, 0); this.tooltipTitle = addTextObject(this.scene, 64, 4, "", TextStyle.TOOLTIP_TITLE); + this.tooltipTitle.setName("text-tooltip-title"); this.tooltipTitle.setOrigin(0.5, 0); this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT); + this.tooltipContent.setName("text-tooltip-content"); this.tooltipContent.setWordWrapWidth(696); this.tooltipContainer.add(this.tooltipBg); @@ -241,7 +249,6 @@ export default class UI extends Phaser.GameObjects.Container { battleScene?.processInfoButton(pressed); return true; } - battleScene?.processInfoButton(false); return true; } diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index cddcde2a1b3..2f6e1c08832 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -4,6 +4,7 @@ import { addTextObject, TextStyle } from "./text"; import { Mode } from "./ui"; import { updateUserInfo } from "#app/account"; import * as Utils from "#app/utils"; +import i18next from "i18next"; export default class UnavailableModalUiHandler extends ModalUiHandler { private reconnectTimer: NodeJS.Timeout; @@ -43,7 +44,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", TextStyle.WINDOW, { fontSize: "48px", align: "center" }); + const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, i18next.t("menu:errorServerDown"), TextStyle.WINDOW, { fontSize: "48px", align: "center" }); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); diff --git a/src/utils.ts b/src/utils.ts index 6667d2522f5..5aa558bae3a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -288,8 +288,7 @@ 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; @@ -396,6 +395,20 @@ export function fixedInt(value: integer): integer { return new FixedInt(value) as unknown as integer; } +/** + * Formats a string to title case + * @param unformattedText Text to be formatted + * @returns the formatted string + */ +export function formatText(unformattedText: string): string { + const text = unformattedText.split("_"); + for (let i = 0; i < text.length; i++) { + text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); + } + + return text.join(" "); +} + export function rgbToHsv(r: integer, g: integer, b: integer) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); @@ -450,9 +463,9 @@ export function verifyLang(lang?: string): boolean { case "fr": case "de": case "it": - case "zh_CN": - case "zh_TW": - case "pt_BR": + case "zh-CN": + case "zh-TW": + case "pt-BR": case "ko": return true; default: