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/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 index b3f3375b16c..1bee013e5c5 100644 Binary files a/public/audio/bgm/battle_aqua_magma_boss.mp3 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 index 8dafa05dac5..019d7d40e35 100644 Binary files a/public/audio/bgm/battle_aqua_magma_grunt.mp3 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 index 0c46d364e68..fd2e2a544d9 100644 Binary files a/public/audio/bgm/battle_flare_boss.mp3 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 index be9d5895259..7e2805f8675 100644 Binary files a/public/audio/bgm/battle_flare_grunt.mp3 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 index 1d4b3ad7c7c..3d6c624130e 100644 Binary files a/public/audio/bgm/battle_galactic_boss.mp3 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 index 098d14dab68..17d8295c50c 100644 Binary files a/public/audio/bgm/battle_galactic_grunt.mp3 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 index 5bfd024e09d..124b8f4a230 100644 Binary files a/public/audio/bgm/battle_plasma_boss.mp3 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 index 2a966e20fb7..757eaa38c70 100644 Binary files a/public/audio/bgm/battle_rocket_boss.mp3 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 index 178141a13df..e8f5faf86d7 100644 Binary files a/public/audio/bgm/battle_rocket_grunt.mp3 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 index ee498b8bb91..1f2c6229f5d 100644 Binary files a/public/audio/bgm/bw/victory_team_plasma.mp3 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 5ba36aee4e3..d514814d3f6 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -621,7 +621,7 @@ "777", "778-busted", "778-busted", - "778", + "778-disguised", "778", "779", "779", @@ -1753,7 +1753,7 @@ "777b", "778b-busted", "778b-busted", - "778b", + "778b-disguised", "778b", "779b", "779b", @@ -2885,7 +2885,7 @@ "777sb", "778sb-busted", "778sb-busted", - "778sb", + "778sb-disguised", "778sb", "779sb", "779sb", @@ -4024,7 +4024,7 @@ "777s", "778s-busted", "778s-busted", - "778s", + "778s-disguised", "778s", "779s", "779s", 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/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/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/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/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/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/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/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..0c48fed625b 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 @@ -5832,7 +5837,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -7371,10 +7381,15 @@ 1, 1 ], - "778": [ + "778-busted": [ 0, 1, - 2 + 1 + ], + "778-disguised": [ + 0, + 1, + 1 ], "779": [ 0, @@ -8653,7 +8668,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -9320,4 +9340,4 @@ 1 ] } -} \ 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/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_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_zh-CN.png b/public/images/types_zh-CN.png index 8b644f1041c..a1a41a663fd 100644 Binary files a/public/images/types_zh-CN.png and b/public/images/types_zh-CN.png differ diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a41c3427e1f..1b1d1fde83f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1875,6 +1875,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 diff --git a/src/battle.ts b/src/battle.ts index 349d8cc4618..c3a481e9956 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -311,6 +311,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"; } diff --git a/src/data/ability.ts b/src/data/ability.ts index c3881bd4856..b1f0d2b197c 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -9,7 +9,7 @@ import { Weather, WeatherType } from "./weather"; import { BattlerTag, GroundedTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr } 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"; @@ -1231,6 +1231,84 @@ 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)) { + 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 @@ -4632,7 +4710,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), diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 1a4a590e2a7..015b8b44984 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; } diff --git a/src/data/move.ts b/src/data/move.ts index 6a48e588827..5ab4b1e8a64 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -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; } @@ -2013,7 +2019,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; } @@ -2327,8 +2333,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 +2776,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; @@ -3139,8 +3145,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 +3159,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)); } @@ -3862,7 +3875,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[]) { @@ -3905,8 +3918,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; @@ -4071,7 +4084,7 @@ export class ConfuseAttr extends AddBattlerTagAttr { export class RechargeAttr extends AddBattlerTagAttr { constructor() { - super(BattlerTagType.RECHARGING, true); + super(BattlerTagType.RECHARGING, true, false, 1, 1, true); } } @@ -4468,7 +4481,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; } @@ -4583,7 +4596,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; @@ -5391,7 +5404,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 { @@ -6947,7 +6960,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) + .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) @@ -7331,14 +7344,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) + .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) @@ -7480,7 +7493,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), @@ -7524,7 +7537,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), @@ -7548,9 +7561,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() @@ -8006,6 +8019,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), @@ -8024,6 +8038,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) @@ -8034,6 +8049,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) @@ -8247,7 +8263,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) @@ -8270,8 +8286,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), 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-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-species.ts b/src/data/pokemon-species.ts index b2cdeac6b45..962772d6e78 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; } @@ -2157,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), diff --git a/src/field/arena.ts b/src/field/arena.ts index a5e62872152..2d20abeedd1 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -661,7 +661,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 +691,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/pokemon.ts b/src/field/pokemon.ts index 8b8ae4aba35..40d6be65480 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -17,13 +17,13 @@ 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, 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 } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -1802,6 +1802,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; @@ -1887,8 +1888,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); @@ -2258,6 +2267,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); @@ -2532,6 +2552,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; @@ -3385,12 +3413,15 @@ 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(boss, dataSource?.bossSegments); } @@ -3440,6 +3471,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); diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index d6c48555d51..4e69db20231 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -7,5 +7,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", - "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "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 a042a997afe..72acb7d073e 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -39,7 +39,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!", @@ -56,8 +56,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": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "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)", @@ -74,7 +74,7 @@ export const battle: SimpleTranslationEntries = { "statHarshlyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", "statSeverelyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", "statWontGoAnyLower": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", + "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.", diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts index 30a3c5fae32..71e775c8846 100644 --- a/src/locales/de/bgm-name.ts +++ b/src/locales/de/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD Erkundungsteam Himmel Verwirrwald", "ice_cave": "PMD Erkundungsteam Himmel Rieseneisberg", "island": "PMD Erkundungsteam Himmel Schroffküste", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PMD Erkundungsteam Himmel Untere 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": "PMD Erkundungsteam Himmel Schicksalsschlucht", + "space": "Firel - Aether", "swamp": "PMD Erkundungsteam Himmel Ringmeer", "tall_grass": "PMD Erkundungsteam Himmel Nebelwald", "temple": "PMD Erkundungsteam Himmel Ägishöhle", diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index 3b0764bf261..0338ba6f399 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -20,5 +20,5 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportData": "Daten exportieren", "cancel": "Abbrechen", "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", - "noEggs": "You are not hatching\nany eggs at the moment!" + "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 8f8beffc2cb..bffcdeb1c3e 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -53,5 +53,6 @@ export const menu: SimpleTranslationEntries = { "no":"Nein", "disclaimer": "HAFTUNGSAUSSCHLUSS", "disclaimerDescription": "Dieses Spiel ist ein unfertiges Produkt. Es kann spielbeinträchtigende Fehler (bis hin zum Verlust des Speicherstandes)\n aufweisen, sich ohne Vorankündigung ändern und es gibt keine Garantie dass es weiterentwickelt oder fertiggestellt wird.", - "choosePokemon": "Choose a Pokémon.", + "choosePokemon": "Wähle ein Pokémon.", + "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/en/bgm-name.ts b/src/locales/en/bgm-name.ts index 1e35a2a095b..ef15c6c6dcb 100644 --- a/src/locales/en/bgm-name.ts +++ b/src/locales/en/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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", @@ -91,7 +92,7 @@ export const bgmName: SimpleTranslationEntries = { "cave": "PMD EoS Sky Peak Cave", "construction_site": "PMD EoS Boulder Quarry", "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowa Dojo", + "dojo": "PMD EoS Marowak Dojo", "end": "PMD RTDX Sky Tower", "factory": "PMD EoS Concealed Ruins", "fairy_cave": "PMD EoS Star Cave", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD EoS Mystifying Forest", "ice_cave": "PMD EoS Vast Ice Mountain", "island": "PMD EoS Craggy Coast", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PMD EoS Lower 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": "PMD EoS Fortune Ravine", + "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", "tall_grass": "PMD EoS Foggy Forest", "temple": "PMD EoS Aegis Cave", diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index 95faeacc9c7..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..." @@ -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?!" diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 9be87724ea8..47d19bd56b6 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", "choosePokemon": "Choose a Pokémon.", + "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/es/bgm-name.ts b/src/locales/es/bgm-name.ts index 2433c66bf98..cda6fba84f4 100644 --- a/src/locales/es/bgm-name.ts +++ b/src/locales/es/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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!", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD EoS - Bosque Misterio", "ice_cave": "PMD EoS - Gran Iceberg", "island": "PMD EoS - Costa Escarpada", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PMD EoS - Fosa 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": "PMD EoS - Risco Fortuna", + "space": "Firel - Aether", "swamp": "PMD EoS - Mar Circundante", "tall_grass": "PMD EoS - Bosque Niebla", "temple": "PMD EoS - Cueva Regia", diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index d5030c8d98c..8176af456e1 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "AVISO", "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado),cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", "choosePokemon": "Choose a Pokémon.", + "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/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts index 3a563df631a..025f339ee86 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PDM EdS - Forêt Trompeuse", "ice_cave": "PDM EdS - Montagne Glacier", "island": "PDM EdS - Côte Escarpée", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PDM EdS - Caverne Saline profondeurs", + "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": "PDM EdS - Ravin Aubaine", + "space": "Firel - Aether", "swamp": "PDM EdS - Mer Fermée", "tall_grass": "PDM EdS - Forêt Brumeuse", "temple": "PDM EdS - Grotte Égide", diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts index 0f69af356ff..ab192963cad 100644 --- a/src/locales/fr/dialogue.ts +++ b/src/locales/fr/dialogue.ts @@ -447,7 +447,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" }, "victory": { - 1: "Comment c'est possible… ?\nLe grand dessein de la Team Rocket n’est plus qu’une illusion…" + 1: "Comment c'est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" }, "defeat": { 1: "La Team Rocket renaitra, et je dominerai le monde !" @@ -499,7 +499,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_1": { "encounter": { - 1: "Tu t’es senti obligé de venir ici dans un acte vide de sens.\nJe vais te le faire regretter." + 1: "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter." }, "victory": { 1: "Intéressant. Et plutôt curieux." @@ -510,7 +510,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_2": { "encounter": { - 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées.\nIl est l’heure d’y mettre un terme." + 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 ?!" @@ -2954,7 +2954,7 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" }, "victory": { - 1: "Comment c'est possible… ?\nLe grand dessein de la Team Rocket n’est plus qu’une illusion…" + 1: "Comment c'est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" }, "defeat": { 1: "La Team Rocket renaitra, et je dominerai le monde !" @@ -3006,7 +3006,7 @@ export const PGFdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_1": { "encounter": { - 1: "Tu t’es sentie obligée de venir ici dans un acte vide de sens.\nJe vais te le faire regretter." + 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." @@ -3017,7 +3017,7 @@ export const PGFdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_2": { "encounter": { - 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées.\nIl est l’heure d’y mettre un terme." + 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 ?!" diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.ts index 8ed1273d6f7..0402bd4bfda 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -49,4 +49,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "AVERTISSEMENT", "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", "choosePokemon": "Sélectionnez un Pokémon.", + "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/it/bgm-name.ts b/src/locales/it/bgm-name.ts index 1e35a2a095b..ef15c6c6dcb 100644 --- a/src/locales/it/bgm-name.ts +++ b/src/locales/it/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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", @@ -91,7 +92,7 @@ export const bgmName: SimpleTranslationEntries = { "cave": "PMD EoS Sky Peak Cave", "construction_site": "PMD EoS Boulder Quarry", "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowa Dojo", + "dojo": "PMD EoS Marowak Dojo", "end": "PMD RTDX Sky Tower", "factory": "PMD EoS Concealed Ruins", "fairy_cave": "PMD EoS Star Cave", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD EoS Mystifying Forest", "ice_cave": "PMD EoS Vast Ice Mountain", "island": "PMD EoS Craggy Coast", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PMD EoS Lower 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": "PMD EoS Fortune Ravine", + "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", "tall_grass": "PMD EoS Foggy Forest", "temple": "PMD EoS Aegis Cave", diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index 91d2a0251ce..3336373a6c3 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "DISCLAIMER", "disclaimerDescription": "Questo gioco è un prodotto incompleto; si potrebbero riscontrare errori (inclusa la perdita dei dati di salvataggio),\ncambiamenti impercettibili, e non è detto che venga aggiornato nel tempo o mai completato del tutto.", "choosePokemon": "Choose a Pokémon.", + "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index 7bc38977278..58ba7bf9aa6 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -9,5 +9,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", - "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", } as const; diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts index 59ee2d1adf9..c133a93450e 100644 --- a/src/locales/ko/bgm-name.ts +++ b/src/locales/ko/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_legendary_calyrex": "SWSH 버드렉스 배틀", "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", "battle_legendary_ruinous": "SV 재앙의 보물 배틀", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", "battle_legendary_loyal_three": "SV 세벗들 배틀", "battle_legendary_ogerpon": "SV 오거폰 배틀", "battle_legendary_terapagos": "SV 테라파고스 배틀", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "불가사의 던전 하늘의 탐험대 신비의 숲", "ice_cave": "불가사의 던전 하늘의 탐험대 광대한 얼음산", "island": "불가사의 던전 하늘의 탐험대 연안의 암반", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name "mountain": "불가사의 던전 하늘의 탐험대 뿔산", "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", - "seabed": "불가사의 던전 하늘의 탐험대 바닷가 동굴(저층)", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", - "space": "불가사의 던전 하늘의 탐험대 행운 협곡", + "space": "Firel - Aether", "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", "tall_grass": "불가사의 던전 하늘의 탐험대 짙은 안개의 숲", "temple": "불가사의 던전 하늘의 탐험대 파수꾼의 동굴", diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.ts index 7e0b61ef992..cf72dab8a37 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", "choosePokemon": "포켓몬을 선택하세요.", + "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", } 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 9ab6f91996d..e5ec5cb9917 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -19,7 +19,7 @@ export const battle: SimpleTranslationEntries = { "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}}!", diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts index 1e35a2a095b..ef15c6c6dcb 100644 --- a/src/locales/pt_BR/bgm-name.ts +++ b/src/locales/pt_BR/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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", @@ -91,7 +92,7 @@ export const bgmName: SimpleTranslationEntries = { "cave": "PMD EoS Sky Peak Cave", "construction_site": "PMD EoS Boulder Quarry", "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowa Dojo", + "dojo": "PMD EoS Marowak Dojo", "end": "PMD RTDX Sky Tower", "factory": "PMD EoS Concealed Ruins", "fairy_cave": "PMD EoS Star Cave", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD EoS Mystifying Forest", "ice_cave": "PMD EoS Vast Ice Mountain", "island": "PMD EoS Craggy Coast", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PMD EoS Lower 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": "PMD EoS Fortune Ravine", + "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", "tall_grass": "PMD EoS Foggy Forest", "temple": "PMD EoS Aegis Cave", diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index ea6c94fe509..a200f2c9abe 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "AVISO", "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído.", "choosePokemon": "Escolha um Pokémon.", + "errorServerDown": "Opa! Não foi possível conectar-se ao servidor.\n\nVocê pode deixar essa janela aberta,\npois o jogo irá se reconectar automaticamente.", } as const; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index bf3b65d9b09..a6504b931f0 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -242,6 +242,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "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", diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index 092cc0583ad..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", @@ -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/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index fef4c718d3a..a9d7fa5b202 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -1,11 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", - "iceFaceAvoidedDamage": "{{pokemonName}} 因为 {{abilityName}}\n避免了伤害!", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", - "windPowerCharged": "受 {{moveName}} 的影响, {{pokemonName}} 提升了能力!", + "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/battle.ts b/src/locales/zh_CN/battle.ts index f944a534b6c..5fab96c422b 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -4,132 +4,132 @@ 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}} 被抓住了!", + "pokemonCaught": "{{pokemonName}}被抓住了!", "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!", - "partyFull": "你的队伍已满员.是否放生其他宝可梦\n为 {{pokemonName}} 腾出空间?", + "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", "pokemon": "宝可梦", "sendOutPokemon": "上吧!\n{{pokemonName}}!", "hitResultCriticalHit": "击中了要害!", "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "对 {{pokemonName}} 没有效果!!", + "hitResultNoEffect": "对{{pokemonName}}没有效果!!", "hitResultOneHitKO": "一击必杀!", "attackFailed": "但是失败了!", - "attackHitsCount": "击中 {{count}} 次!", + "attackHitsCount": "击中{{count}}次!", "rewardGain": "你获得了\n{{modifierName}}!", - "expGain": "{{pokemonName}} 获得了 {{exp}} 经验值!", - "levelUp": "{{pokemonName}} 升级到 Lv.{{level}}!", + "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}}", + "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}}因攻击的反作用力而无法动弹!", + "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}}摆脱了{{moveName}}!", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏缩了!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混乱了!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混乱解除了!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已经混乱了。", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混乱中!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了,无法使出招式!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中!", "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}}正受到诅咒!" + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态!", + "battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}\n被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}\n被困在了熔岩风暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}\n被捕兽夹困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了\n{{sourcePokemonNameWithAffix}}的死缠烂打!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\n在攻击中保护了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}\n摆出了挺住攻击的架势!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!" } as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts index 615511d4605..70e969d7b5e 100644 --- a/src/locales/zh_CN/bgm-name.ts +++ b/src/locales/zh_CN/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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": "朱紫「战斗!太乐巴戈斯」", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "空之探险队「神秘森林」", "ice_cave": "空之探险队「大冰山」", "island": "空之探险队「沿岸岩地」", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "jungle": "Lmz - 丛林", // The composer thinks about a more creative name + "laboratory": "Firel - 研究所", // The composer thinks about a more creative name "lake": "空之探险队「水晶洞窟」", "meadow": "空之探险队「天空顶端(森林)」", - //"metropolis": "metropolis", // The composer thinks about a more creative name + "metropolis": "Firel - 城市", // The composer thinks about a more creative name "mountain": "空之探险队「角山」", "plains": "空之探险队「天空顶端(草原)」", "power_plant": "空之探险队「电气平原 深处」", "ruins": "空之探险队「封印岩地 深处」", "sea": "空之探险队「石滩洞窟」", - "seabed": "空之探险队「石滩洞窟 下层」", + "seabed": "Firel - 海底", // The composer thinks about a more creative name "slum": "空之探险队「天空顶端(岩场)」", "snowy_forest": "空之探险队「天空顶端(雪山)」", - "space": "空之探险队「财宝岩地」", + "space": "Firel - 太空", "swamp": "空之探险队「封闭之海」", "tall_grass": "空之探险队「浓雾森林」", "temple": "空之探险队「守护洞穴」", diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index 0a7156b2b8c..4c1b523ef16 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -2,7 +2,7 @@ import { TranslationEntries } from "#app/interfaces/locales"; export const challenges: TranslationEntries = { "title": "适用挑战条件", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "illegalEvolution": "{{pokemon}}变成了\n不符合此挑战条件的宝可梦!", "singleGeneration": { "name": "单一世代", "desc": "你只能使用第{{gen}}\n世代的宝可梦", diff --git a/src/locales/zh_CN/dialogue.ts b/src/locales/zh_CN/dialogue.ts index 4db591fab9b..6afbcd71064 100644 --- a/src/locales/zh_CN/dialogue.ts +++ b/src/locales/zh_CN/dialogue.ts @@ -2175,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/menu.ts b/src/locales/zh_CN/menu.ts index 418693cc140..c19c41333e8 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "免责声明", "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", "choosePokemon": "选择一只宝可梦。", + "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。", } as const; diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 594a85cbdfe..3ac9ac196cd 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: "攻击以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: "好伤药" }, @@ -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,19 +182,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, - "EVIOLITE": { name: "进化奇石", description: "进化的神奇石块。携带后,还能进化的宝可梦的 防御和特防就会提高。" }, + "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, - "SOUL_DEW": { name: "心之水滴", description: "增加宝可梦性格影响10% (加算)。" }, + "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: "广角镜" }, @@ -206,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: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, @@ -223,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%更少伤害(乘算)。" }, @@ -242,7 +242,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率。" }, }, SpeciesBoosterItem: { - "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会 提高的神奇之球。" }, + "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会提高的神奇之球。" }, "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。非常细腻坚硬。" }, "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。非常细腻坚硬。" } diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index e51addd0206..f75ca001548 100644 --- a/src/locales/zh_CN/move.ts +++ b/src/locales/zh_CN/move.ts @@ -671,7 +671,7 @@ export const move: MoveTranslationEntries = { }, "thief": { name: "小偷", - effect: "攻击的同时盗取道具。当自\n己携带道具时,不会去盗取", + effect: "攻击的同时盗取对手的道具。", }, "spiderWeb": { name: "蛛网", 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 fe9e48be79d..059358078f4 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -22,7 +22,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "性格:", "eggMoves": "蛋招式", "addToParty": "加入队伍", - "toggleIVs": "切换个体值", + "toggleIVs": "显示个体", "manageMoves": "管理招式", "manageNature": "管理性格", "useCandies": "使用糖果", diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts index 1e35a2a095b..ef15c6c6dcb 100644 --- a/src/locales/zh_TW/bgm-name.ts +++ b/src/locales/zh_TW/bgm-name.ts @@ -62,6 +62,7 @@ export const bgmName: SimpleTranslationEntries = { "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", @@ -91,7 +92,7 @@ export const bgmName: SimpleTranslationEntries = { "cave": "PMD EoS Sky Peak Cave", "construction_site": "PMD EoS Boulder Quarry", "desert": "PMD EoS Northern Desert", - "dojo": "PMD EoS Marowa Dojo", + "dojo": "PMD EoS Marowak Dojo", "end": "PMD RTDX Sky Tower", "factory": "PMD EoS Concealed Ruins", "fairy_cave": "PMD EoS Star Cave", @@ -100,20 +101,20 @@ export const bgmName: SimpleTranslationEntries = { "graveyard": "PMD EoS Mystifying Forest", "ice_cave": "PMD EoS Vast Ice Mountain", "island": "PMD EoS Craggy Coast", - //"jungle": "jungle", // The composer thinks about a more creative name - //"labratory": "labratory", // The composer thinks about a more creative name + "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": "metropolis", // The composer thinks about a more creative name + "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": "PMD EoS Lower 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": "PMD EoS Fortune Ravine", + "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", "tall_grass": "PMD EoS Foggy Forest", "temple": "PMD EoS Aegis Cave", diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index 4ecaf8d4d9d..6d89bc256c6 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -54,4 +54,5 @@ export const menu: SimpleTranslationEntries = { "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", "choosePokemon": "Choose a Pokémon.", + "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/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index a7bb9dd1839..b99777bb44c 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"; @@ -1362,9 +1362,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); @@ -1390,7 +1400,7 @@ const modifierPool: ModifierPool = { 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 => { @@ -1461,13 +1471,13 @@ const modifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ULTRA_BALL, 15), + 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_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[]) => { @@ -1487,7 +1497,7 @@ const modifierPool: ModifierPool = { 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, 10), @@ -1499,7 +1509,7 @@ const modifierPool: ModifierPool = { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.ROGUE_BALL, 16), + 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), @@ -1513,16 +1523,16 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3), - new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 9), - new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 5, 20), - 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(3 - rerollCount * 2, 0) : 0, 3), + new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 8), + new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), + new WeightedModifierType(modifierTypes.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), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index c4081aacd65..b6d68b03ed7 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2,7 +2,7 @@ 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"; @@ -263,7 +263,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; } @@ -753,7 +753,7 @@ export class StatBoosterModifier extends PokemonHeldItemModifier { * @returns true if the stat could be boosted, false otherwise */ shouldApply(args: any[]): boolean { - return this.stats.includes(args[1] as Stat); + return super.shouldApply(args) && this.stats.includes(args[1] as Stat); } /** diff --git a/src/phases.ts b/src/phases.ts index 110d87d527b..b14a84526c7 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -26,7 +26,7 @@ import { Gender } from "./data/gender"; import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr } 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"; @@ -868,9 +868,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(); } @@ -2878,6 +2880,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)); } @@ -2885,13 +2888,11 @@ 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!")); moveHistoryEntry.result = MoveResult.MISS; @@ -2900,6 +2901,7 @@ export class MoveEffectPhase extends PokemonPhase { this.scene.queueMessage(i18next.t("battle:attackFailed")); moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); return this.end(); } @@ -2909,8 +2911,7 @@ 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.stopMultiHit(target); this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; @@ -2921,25 +2922,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); @@ -2947,8 +2957,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); @@ -2974,14 +2984,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()); @@ -3104,6 +3117,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); } diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 1caa7da0b3b..bfb8f45a11f 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -6,6 +6,7 @@ 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; @@ -26,6 +27,9 @@ describe("Abilities - Dry Skin", () => { 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 () => { @@ -84,6 +88,7 @@ describe("Abilities - Dry Skin", () => { 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; 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/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 6b72b83bd18..884b108381d 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -1,16 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {Species} from "#enums/species"; -import {EnemyCommandPhase, TitlePhase, TurnEndPhase, TurnStartPhase, -} from "#app/phases"; +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 { Stat } from "#app/data/pokemon-stat"; 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; @@ -28,90 +25,66 @@ describe("Abilities - Quick Draw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue( - Abilities.QUICK_DRAW - ); - vi.spyOn(overrides, "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(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); + vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); }); - it("makes pokemon going first in its priority bracket", async() => { + test("makes pokemon going first in its priority bracket", async () => { await game.startBattle([Species.SLOWBRO]); - const pokemon = game.scene.getParty()[0]; - const enemy = game.scene.getEnemyParty()[0]; + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); - pokemon.stats[Stat.SPD] = 50; - enemy.stats[Stat.SPD] = 150; pokemon.hp = 1; enemy.hp = 1; game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(FaintPhase, false); - await game.phaseInterceptor.run(EnemyCommandPhase); - await game.phaseInterceptor.run(TurnStartPhase); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(pokemon.battleData.abilityRevealed).toBe(true); + expect(pokemon.isFainted()).toBe(false); + expect(enemy.isFainted()).toBe(true); + expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); }, 20000); - it("does not triggered by non damage moves", async () => { + test("does not triggered by non damage moves", async () => { await game.startBattle([Species.SLOWBRO]); - const pokemon = game.scene.getParty()[0]; - const enemy = game.scene.getEnemyParty()[0]; + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); - pokemon.stats[Stat.SPD] = 50; - enemy.stats[Stat.SPD] = 150; pokemon.hp = 1; enemy.hp = 1; - game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC)); + game.doAttack(getMovePosition(game.scene, 0, Moves.TAIL_WHIP)); + await game.phaseInterceptor.to(FaintPhase, false); - await game.phaseInterceptor.run(EnemyCommandPhase); - await game.phaseInterceptor.run(TurnStartPhase); - await game.phaseInterceptor.to(TitlePhase); - - expect(pokemon.battleData.abilityRevealed).not.toBe(true); + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); }, 20000); - it("does not increase priority", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ - Moves.EXTREME_SPEED, - Moves.EXTREME_SPEED, - Moves.EXTREME_SPEED, - Moves.EXTREME_SPEED, - ]); + 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.getParty()[0]; - const enemy = game.scene.getEnemyParty()[0]; + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); - pokemon.stats[Stat.SPD] = 50; - enemy.stats[Stat.SPD] = 150; pokemon.hp = 1; enemy.hp = 1; game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(FaintPhase, false); - await game.phaseInterceptor.run(EnemyCommandPhase); - await game.phaseInterceptor.run(TurnStartPhase); - await game.phaseInterceptor.to(TitlePhase); - - expect(pokemon.battleData.abilityRevealed).toBe(true); + 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/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/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/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/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);