diff --git a/.gitignore b/.gitignore index 1b1bc0743c3..669f8df003f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ src/data/battle-anim-data.ts src/overrides.ts coverage +/.vs # Local Documentation /typedoc diff --git a/index.html b/index.html index b2e8bf3ec0f..0e8afed6b03 100644 --- a/index.html +++ b/index.html @@ -19,6 +19,11 @@ font-family: 'emerald'; src: url('./fonts/pokemon-emerald-pro.ttf') format('truetype'); } + @font-face { + font-family: 'unifont'; + src: url('./fonts/unifont-15.1.05.otf') format('opentype'); + size-adjust: 70%; + } @font-face { font-family: 'pkmnems'; diff --git a/public/audio/bgm/battle_plasma_grunt.mp3 b/public/audio/bgm/battle_plasma_grunt.mp3 new file mode 100644 index 00000000000..fe371f21f9f Binary files /dev/null and b/public/audio/bgm/battle_plasma_grunt.mp3 differ diff --git a/public/audio/bgm/encounter_plasma_grunt.mp3 b/public/audio/bgm/encounter_plasma_grunt.mp3 new file mode 100644 index 00000000000..478d3f8edc5 Binary files /dev/null and b/public/audio/bgm/encounter_plasma_grunt.mp3 differ diff --git a/public/fonts/unifont-15.1.05.otf b/public/fonts/unifont-15.1.05.otf new file mode 100644 index 00000000000..3d0dcd3c1a0 Binary files /dev/null and b/public/fonts/unifont-15.1.05.otf differ diff --git a/public/images/items.json b/public/images/items.json index dc05a39354d..6af2029efd9 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,13 +4,13 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 399, - "h": 399 + "w": 414, + "h": 414 }, "scale": 1, "frames": [ { - "filename": "galarica_cuff", + "filename": "relic_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -18,1507 +18,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 30 - } - }, - { - "filename": "galarica_wreath", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 32, - "h": 27 - }, - "frame": { - "x": 29, - "y": 0, - "w": 32, - "h": 27 - } - }, - { - "filename": "max_mushrooms", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 29, - "h": 28 - }, - "frame": { - "x": 0, - "y": 30, - "w": 29, - "h": 28 - } - }, - { - "filename": "bronze_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 29, - "y": 27, - "w": 22, - "h": 31 - } - }, - { - "filename": "great_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 58, - "w": 22, - "h": 31 - } - }, - { - "filename": "linking_cord", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 27, - "h": 26 - }, - "frame": { - "x": 61, - "y": 0, - "w": 27, - "h": 26 - } - }, - { - "filename": "master_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 89, - "w": 22, - "h": 31 - } - }, - { - "filename": "rogue_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 22, - "y": 58, - "w": 22, - "h": 31 - } - }, - { - "filename": "ultra_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 120, - "w": 22, - "h": 31 - } - }, - { - "filename": "cornerstone_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 24, - "h": 26 - }, - "frame": { - "x": 88, - "y": 0, - "w": 24, - "h": 26 - } - }, - { - "filename": "ability_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 23, - "h": 26 - }, - "frame": { - "x": 112, - "y": 0, - "w": 23, - "h": 26 - } - }, - { - "filename": "map", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 27, - "h": 22 - }, - "frame": { - "x": 135, - "y": 0, - "w": 27, - "h": 22 - } - }, - { - "filename": "mint_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 162, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 190, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_neutral", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 218, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_spatk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 246, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_spd", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 274, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_spdef", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 302, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 89, - "w": 17, - "h": 31 - } - }, - { - "filename": "golden_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 0, - "y": 151, - "w": 17, - "h": 31 - } - }, - { - "filename": "super_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 120, - "w": 17, - "h": 31 - } - }, - { - "filename": "black_augurite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 17, - "y": 151, - "w": 22, - "h": 25 - } - }, - { - "filename": "prison_bottle", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 30 - }, - "frame": { - "x": 0, - "y": 182, - "w": 17, - "h": 30 - } - }, - { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 17, - "y": 176, - "w": 23, - "h": 24 - } - }, - { - "filename": "chipped_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 330, - "y": 0, - "w": 26, - "h": 20 - } - }, - { - "filename": "cracked_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 356, - "y": 0, - "w": 26, - "h": 20 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 382, - "y": 0, - "w": 17, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 0, - "y": 212, - "w": 21, - "h": 24 - } - }, - { - "filename": "choice_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 236, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 260, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 284, - "w": 24, - "h": 24 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 308, - "w": 24, - "h": 24 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 332, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 0, - "y": 356, - "w": 24, - "h": 24 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 0, - "y": 380, - "w": 23, - "h": 19 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 23, - "y": 380, - "w": 23, - "h": 19 - } - }, - { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 51, - "y": 27, - "w": 16, - "h": 24 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 67, - "y": 26, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 91, - "y": 26, - "w": 24, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 115, - "y": 26, - "w": 23, - "h": 24 - } - }, - { - "filename": "lucky_punch_ultra", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 138, - "y": 22, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 162, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 186, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 210, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 234, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "silk_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 258, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 282, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 306, - "y": 21, - "w": 24, - "h": 23 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 330, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 354, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 378, - "y": 24, - "w": 21, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 44, - "y": 58, - "w": 16, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 21, - "y": 200, - "w": 22, - "h": 24 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 24, - "y": 224, - "w": 20, - "h": 24 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 24, - "y": 248, - "w": 23, - "h": 24 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 24, - "y": 272, - "w": 23, - "h": 23 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 24, - "y": 295, - "w": 23, - "h": 23 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 24, - "y": 318, - "w": 23, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 24, - "y": 341, - "w": 24, - "h": 23 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 24, - "y": 364, - "w": 20, - "h": 16 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 89, - "w": 18, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 113, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 137, - "w": 18, - "h": 24 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, + "x": 9, "y": 11, - "w": 24, - "h": 15 + "w": 15, + "h": 11 }, "frame": { - "x": 39, - "y": 161, - "w": 24, - "h": 15 - } - }, - { - "filename": "shiny_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 40, - "y": 176, - "w": 21, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 43, - "y": 200, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 44, - "y": 224, - "w": 18, - "h": 24 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 47, - "y": 248, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 47, - "y": 272, - "w": 16, - "h": 24 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 47, - "y": 296, - "w": 17, - "h": 24 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 47, - "y": 320, - "w": 23, - "h": 21 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 48, - "y": 341, - "w": 22, - "h": 23 + "x": 0, + "y": 0, + "w": 15, + "h": 11 } }, { @@ -1536,957 +45,12 @@ "h": 14 }, "frame": { - "x": 44, - "y": 364, + "x": 15, + "y": 0, "w": 24, "h": 14 } }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 46, - "y": 378, - "w": 23, - "h": 21 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 138, - "y": 46, - "w": 24, - "h": 18 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 162, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 186, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 210, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 234, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 258, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 282, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 306, - "y": 44, - "w": 23, - "h": 23 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 61, - "y": 176, - "w": 18, - "h": 24 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 61, - "y": 200, - "w": 17, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 62, - "y": 224, - "w": 16, - "h": 24 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 63, - "y": 248, - "w": 16, - "h": 24 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 63, - "y": 272, - "w": 16, - "h": 24 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 64, - "y": 296, - "w": 16, - "h": 24 - } - }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 70, - "y": 320, - "w": 16, - "h": 24 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 70, - "y": 344, - "w": 19, - "h": 20 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 69, - "y": 364, - "w": 22, - "h": 23 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 69, - "y": 387, - "w": 15, - "h": 11 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 330, - "y": 43, - "w": 24, - "h": 18 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 354, - "y": 43, - "w": 24, - "h": 20 - } - }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 378, - "y": 48, - "w": 21, - "h": 23 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 329, - "y": 61, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 353, - "y": 63, - "w": 24, - "h": 20 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 377, - "y": 71, - "w": 22, - "h": 23 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 67, - "y": 50, - "w": 24, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 91, - "y": 50, - "w": 24, - "h": 20 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 115, - "y": 50, - "w": 23, - "h": 21 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 138, - "y": 64, - "w": 23, - "h": 20 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 161, - "y": 67, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 184, - "y": 67, - "w": 23, - "h": 17 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 207, - "y": 68, - "w": 23, - "h": 17 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 230, - "y": 68, - "w": 23, - "h": 17 - } - }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 253, - "y": 68, - "w": 23, - "h": 22 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 276, - "y": 68, - "w": 18, - "h": 22 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 294, - "y": 67, - "w": 23, - "h": 23 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 317, - "y": 67, - "w": 12, - "h": 17 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 60, - "y": 70, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 83, - "y": 70, - "w": 23, - "h": 21 - } - }, - { - "filename": "stick", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 57, - "y": 91, - "w": 23, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 80, - "y": 91, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 114, - "w": 22, - "h": 23 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 57, - "y": 137, - "w": 16, - "h": 24 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 114, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 73, - "y": 137, - "w": 22, - "h": 23 - } - }, { "filename": "candy_overlay", "rotated": false, @@ -2502,516 +66,12 @@ "h": 15 }, "frame": { - "x": 63, - "y": 161, + "x": 39, + "y": 0, "w": 16, "h": 15 } }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 79, - "y": 160, - "w": 16, - "h": 24 - } - }, - { - "filename": "n_solarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 106, - "y": 71, - "w": 23, - "h": 21 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 102, - "y": 92, - "w": 23, - "h": 22 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 101, - "y": 114, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 95, - "y": 137, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 95, - "y": 160, - "w": 22, - "h": 23 - } - }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 79, - "y": 184, - "w": 16, - "h": 16 - } - }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 78, - "y": 200, - "w": 22, - "h": 23 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 78, - "y": 223, - "w": 22, - "h": 23 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 95, - "y": 183, - "w": 23, - "h": 17 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 246, - "w": 22, - "h": 23 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 269, - "w": 22, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 100, - "y": 200, - "w": 22, - "h": 23 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 100, - "y": 223, - "w": 22, - "h": 23 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 101, - "y": 246, - "w": 21, - "h": 23 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 101, - "y": 269, - "w": 21, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 80, - "y": 292, - "w": 22, - "h": 23 - } - }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 102, - "y": 292, - "w": 20, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 86, - "y": 315, - "w": 22, - "h": 23 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 108, - "y": 315, - "w": 15, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 89, - "y": 338, - "w": 22, - "h": 23 - } - }, - { - "filename": "psychic_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 91, - "y": 361, - "w": 22, - "h": 23 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 111, - "y": 338, - "w": 17, - "h": 23 - } - }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 113, - "y": 361, - "w": 17, - "h": 23 - } - }, { "filename": "prism_scale", "rotated": false, @@ -3027,56 +87,14 @@ "h": 15 }, "frame": { - "x": 91, - "y": 384, + "x": 55, + "y": 0, "w": 15, "h": 15 } }, { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 117, - "y": 137, - "w": 16, - "h": 24 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 117, - "y": 161, - "w": 22, - "h": 22 - } - }, - { - "filename": "wise_glasses", + "filename": "silver_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -3085,733 +103,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, - "w": 23, - "h": 17 + "y": 11, + "w": 24, + "h": 15 }, "frame": { - "x": 118, - "y": 183, - "w": 23, - "h": 17 + "x": 70, + "y": 0, + "w": 24, + "h": 15 } }, { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 122, - "y": 200, - "w": 22, - "h": 23 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 122, - "y": 223, - "w": 22, - "h": 23 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 122, - "y": 246, - "w": 22, - "h": 23 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 122, - "y": 269, - "w": 22, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 122, - "y": 292, - "w": 22, - "h": 23 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 123, - "y": 315, - "w": 21, - "h": 23 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 128, - "y": 338, - "w": 18, - "h": 23 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 130, - "y": 361, - "w": 17, - "h": 23 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 123, - "y": 114, - "w": 21, - "h": 23 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 125, - "y": 92, - "w": 22, - "h": 22 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 147, - "y": 84, - "w": 22, - "h": 23 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 169, - "y": 84, - "w": 22, - "h": 22 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 191, - "y": 84, - "w": 15, - "h": 22 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 206, - "y": 85, - "w": 23, - "h": 21 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 229, - "y": 85, - "w": 22, - "h": 21 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 251, - "y": 90, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 274, - "y": 90, - "w": 23, - "h": 19 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 297, - "y": 90, - "w": 20, - "h": 20 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 317, - "y": 84, - "w": 22, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 133, - "y": 137, - "w": 22, - "h": 22 - } - }, - { - "filename": "ganlon_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 139, - "y": 159, - "w": 22, - "h": 22 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 141, - "y": 181, - "w": 22, - "h": 19 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 144, - "y": 200, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 144, - "y": 222, - "w": 22, - "h": 22 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 144, - "y": 244, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 144, - "y": 266, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 144, - "y": 288, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 144, - "y": 310, - "w": 22, - "h": 22 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 146, - "y": 332, - "w": 20, - "h": 22 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 147, - "y": 354, - "w": 19, - "h": 22 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 147, - "y": 107, - "w": 22, - "h": 20 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 169, - "y": 106, - "w": 22, - "h": 21 - } - }, - { - "filename": "memory_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 106, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 106, - "w": 22, - "h": 22 - } - }, - { - "filename": "mystery_egg", + "filename": "abomasite", "rotated": false, "trimmed": true, "sourceSize": { @@ -3822,160 +126,13 @@ "x": 8, "y": 8, "w": 16, - "h": 18 + "h": 16 }, "frame": { - "x": 235, - "y": 106, + "x": 94, + "y": 0, "w": 16, - "h": 18 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 251, - "y": 109, - "w": 23, - "h": 18 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 274, - "y": 109, - "w": 23, - "h": 20 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 297, - "y": 110, - "w": 20, - "h": 20 - } - }, - { - "filename": "memory_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 317, - "y": 106, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 155, - "y": 127, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 339, - "y": 83, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 339, - "y": 105, - "w": 22, - "h": 22 + "h": 16 } }, { @@ -3993,33 +150,12 @@ "h": 16 }, "frame": { - "x": 361, - "y": 83, + "x": 110, + "y": 0, "w": 16, "h": 16 } }, - { - "filename": "memory_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 377, - "y": 94, - "w": 22, - "h": 22 - } - }, { "filename": "aerodactylite", "rotated": false, @@ -4035,8 +171,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 99, + "x": 126, + "y": 0, "w": 16, "h": 16 } @@ -4056,243 +192,12 @@ "h": 16 }, "frame": { - "x": 361, - "y": 115, + "x": 142, + "y": 0, "w": 16, "h": 16 } }, - { - "filename": "memory_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 377, - "y": 116, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 177, - "y": 128, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 199, - "y": 128, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 199, - "y": 128, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 221, - "y": 128, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 243, - "y": 127, - "w": 22, - "h": 22 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 265, - "y": 129, - "w": 23, - "h": 20 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 288, - "y": 130, - "w": 22, - "h": 19 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 147, - "y": 376, - "w": 19, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 339, - "y": 127, - "w": 22, - "h": 20 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 317, - "y": 128, - "w": 22, - "h": 20 - } - }, { "filename": "alakazite", "rotated": false, @@ -4308,33 +213,12 @@ "h": 16 }, "frame": { - "x": 361, - "y": 131, + "x": 158, + "y": 0, "w": 16, "h": 16 } }, - { - "filename": "memory_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 377, - "y": 138, - "w": 22, - "h": 22 - } - }, { "filename": "altarianite", "rotated": false, @@ -4350,138 +234,12 @@ "h": 16 }, "frame": { - "x": 161, - "y": 149, + "x": 174, + "y": 0, "w": 16, "h": 16 } }, - { - "filename": "memory_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 177, - "y": 150, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 199, - "y": 150, - "w": 22, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 221, - "y": 150, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 243, - "y": 149, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 265, - "y": 149, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 287, - "y": 149, - "w": 22, - "h": 22 - } - }, { "filename": "ampharosite", "rotated": false, @@ -4497,1986 +255,12 @@ "h": 16 }, "frame": { - "x": 161, - "y": 165, + "x": 190, + "y": 0, "w": 16, "h": 16 } }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 163, - "y": 181, - "w": 20, - "h": 19 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 166, - "y": 200, - "w": 19, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 222, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 244, - "w": 22, - "h": 22 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 266, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 288, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 310, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 332, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 166, - "y": 354, - "w": 22, - "h": 22 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 166, - "y": 376, - "w": 22, - "h": 21 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 183, - "y": 172, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 205, - "y": 172, - "w": 22, - "h": 22 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 227, - "y": 172, - "w": 17, - "h": 22 - } - }, - { - "filename": "tm_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 244, - "y": 171, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 266, - "y": 171, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 288, - "y": 171, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 185, - "y": 194, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 207, - "y": 194, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 216, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 238, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 260, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 282, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 304, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 326, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 348, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 188, - "y": 370, - "w": 22, - "h": 22 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 210, - "y": 216, - "w": 20, - "h": 22 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 238, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 260, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 282, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 304, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 326, - "w": 22, - "h": 22 - } - }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 210, - "y": 348, - "w": 22, - "h": 21 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 210, - "y": 369, - "w": 22, - "h": 21 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 229, - "y": 194, - "w": 17, - "h": 22 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 246, - "y": 193, - "w": 21, - "h": 21 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 267, - "y": 193, - "w": 21, - "h": 21 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 288, - "y": 193, - "w": 21, - "h": 21 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 230, - "y": 216, - "w": 20, - "h": 21 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 250, - "y": 214, - "w": 22, - "h": 20 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 272, - "y": 214, - "w": 22, - "h": 19 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 232, - "y": 237, - "w": 19, - "h": 21 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 232, - "y": 258, - "w": 19, - "h": 21 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 232, - "y": 279, - "w": 21, - "h": 21 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 232, - "y": 300, - "w": 20, - "h": 20 - } - }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 232, - "y": 320, - "w": 20, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 232, - "y": 340, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 232, - "y": 360, - "w": 20, - "h": 20 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 232, - "y": 380, - "w": 21, - "h": 19 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 251, - "y": 234, - "w": 20, - "h": 20 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 251, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 294, - "y": 214, - "w": 19, - "h": 20 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 253, - "y": 274, - "w": 19, - "h": 20 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 253, - "y": 294, - "w": 20, - "h": 17 - } - }, - { - "filename": "smooth_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 252, - "y": 311, - "w": 20, - "h": 20 - } - }, - { - "filename": "strange_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 252, - "y": 331, - "w": 20, - "h": 20 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 252, - "y": 351, - "w": 20, - "h": 20 - } - }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 253, - "y": 371, - "w": 19, - "h": 19 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 339, - "y": 147, - "w": 21, - "h": 18 - } - }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 360, - "y": 147, - "w": 17, - "h": 20 - } - }, - { - "filename": "sharp_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 377, - "y": 160, - "w": 21, - "h": 18 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 272, - "y": 233, - "w": 21, - "h": 18 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 271, - "y": 251, - "w": 20, - "h": 19 - } - }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 293, - "y": 234, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 291, - "y": 252, - "w": 20, - "h": 18 - } - }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 272, - "y": 270, - "w": 18, - "h": 20 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 270, - "w": 20, - "h": 18 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 273, - "y": 290, - "w": 17, - "h": 20 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 288, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 306, - "w": 20, - "h": 18 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 272, - "y": 311, - "w": 18, - "h": 19 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 272, - "y": 330, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 324, - "w": 20, - "h": 18 - } - }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 272, - "y": 348, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 342, - "w": 20, - "h": 18 - } - }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 272, - "y": 366, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 360, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 378, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 311, - "y": 252, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 270, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 288, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ice_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 306, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_item_drop", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 324, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_item_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 342, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 360, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 378, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 309, - "y": 193, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 313, - "y": 211, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_paralyze_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 313, - "y": 229, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 309, - "y": 149, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_reset_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 310, - "y": 167, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 330, - "y": 165, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 350, - "y": 167, - "w": 20, - "h": 18 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 333, - "y": 183, - "w": 17, - "h": 16 - } - }, { "filename": "audinite", "rotated": false, @@ -6492,8 +276,8 @@ "h": 16 }, "frame": { - "x": 350, - "y": 185, + "x": 206, + "y": 0, "w": 16, "h": 16 } @@ -6513,8 +297,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 199, + "x": 222, + "y": 0, "w": 16, "h": 16 } @@ -6534,8 +318,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 215, + "x": 238, + "y": 0, "w": 16, "h": 16 } @@ -6555,8 +339,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 231, + "x": 254, + "y": 0, "w": 16, "h": 16 } @@ -6576,8 +360,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 201, + "x": 270, + "y": 0, "w": 16, "h": 16 } @@ -6597,8 +381,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 217, + "x": 286, + "y": 0, "w": 16, "h": 16 } @@ -6618,8 +402,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 233, + "x": 302, + "y": 0, "w": 16, "h": 16 } @@ -6639,8 +423,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 247, + "x": 318, + "y": 0, "w": 16, "h": 16 } @@ -6660,8 +444,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 249, + "x": 334, + "y": 0, "w": 16, "h": 16 } @@ -6681,8 +465,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 263, + "x": 350, + "y": 0, "w": 16, "h": 16 } @@ -6702,8 +486,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 279, + "x": 366, + "y": 0, "w": 16, "h": 16 } @@ -6723,8 +507,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 295, + "x": 382, + "y": 0, "w": 16, "h": 16 } @@ -6744,12 +528,33 @@ "h": 16 }, "frame": { - "x": 330, - "y": 311, + "x": 398, + "y": 0, "w": 16, "h": 16 } }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 0, + "y": 11, + "w": 12, + "h": 17 + } + }, { "filename": "glalitite", "rotated": false, @@ -6765,8 +570,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 327, + "x": 12, + "y": 14, "w": 16, "h": 16 } @@ -6786,8 +591,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 343, + "x": 28, + "y": 15, "w": 16, "h": 16 } @@ -6807,8 +612,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 359, + "x": 44, + "y": 15, "w": 16, "h": 16 } @@ -6828,8 +633,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 375, + "x": 60, + "y": 15, "w": 16, "h": 16 } @@ -6849,8 +654,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 265, + "x": 76, + "y": 15, "w": 16, "h": 16 } @@ -6870,8 +675,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 281, + "x": 92, + "y": 16, "w": 16, "h": 16 } @@ -6891,8 +696,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 297, + "x": 108, + "y": 16, "w": 16, "h": 16 } @@ -6912,8 +717,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 313, + "x": 124, + "y": 16, "w": 16, "h": 16 } @@ -6933,8 +738,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 329, + "x": 140, + "y": 16, "w": 16, "h": 16 } @@ -6954,8 +759,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 345, + "x": 156, + "y": 16, "w": 16, "h": 16 } @@ -6975,8 +780,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 361, + "x": 172, + "y": 16, "w": 16, "h": 16 } @@ -6996,12 +801,33 @@ "h": 16 }, "frame": { - "x": 346, - "y": 377, + "x": 188, + "y": 16, "w": 16, "h": 16 } }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 204, + "y": 16, + "w": 20, + "h": 16 + } + }, { "filename": "metagrossite", "rotated": false, @@ -7017,8 +843,8 @@ "h": 16 }, "frame": { - "x": 366, - "y": 185, + "x": 224, + "y": 16, "w": 16, "h": 16 } @@ -7038,8 +864,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 201, + "x": 240, + "y": 16, "w": 16, "h": 16 } @@ -7059,8 +885,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 217, + "x": 256, + "y": 16, "w": 16, "h": 16 } @@ -7080,8 +906,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 233, + "x": 272, + "y": 16, "w": 16, "h": 16 } @@ -7101,8 +927,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 249, + "x": 288, + "y": 16, "w": 16, "h": 16 } @@ -7122,8 +948,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 265, + "x": 304, + "y": 16, "w": 16, "h": 16 } @@ -7143,12 +969,33 @@ "h": 16 }, "frame": { - "x": 362, - "y": 281, + "x": 320, + "y": 16, "w": 16, "h": 16 } }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 336, + "y": 16, + "w": 17, + "h": 16 + } + }, { "filename": "sablenite", "rotated": false, @@ -7164,8 +1011,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 297, + "x": 353, + "y": 16, "w": 16, "h": 16 } @@ -7185,8 +1032,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 313, + "x": 369, + "y": 16, "w": 16, "h": 16 } @@ -7206,8 +1053,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 329, + "x": 385, + "y": 16, "w": 16, "h": 16 } @@ -7227,8 +1074,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 345, + "x": 0, + "y": 30, "w": 16, "h": 16 } @@ -7248,8 +1095,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 361, + "x": 16, + "y": 31, "w": 16, "h": 16 } @@ -7269,8 +1116,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 377, + "x": 32, + "y": 31, "w": 16, "h": 16 } @@ -7290,8 +1137,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 178, + "x": 48, + "y": 31, "w": 16, "h": 16 } @@ -7311,8 +1158,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 194, + "x": 64, + "y": 31, "w": 16, "h": 16 } @@ -7332,8 +1179,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 210, + "x": 80, + "y": 32, "w": 16, "h": 16 } @@ -7353,8 +1200,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 226, + "x": 96, + "y": 32, "w": 16, "h": 16 } @@ -7374,8 +1221,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 242, + "x": 112, + "y": 32, "w": 16, "h": 16 } @@ -7395,60 +1242,6612 @@ "h": 16 }, "frame": { - "x": 379, - "y": 258, + "x": 128, + "y": 32, "w": 16, "h": 16 } }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 379, - "y": 274, - "w": 18, - "h": 18 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 379, - "y": 292, - "w": 18, - "h": 18 - } - } + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 144, + "y": 32, + "w": 23, + "h": 17 + } + }, + { + "filename": "burn_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 167, + "y": 32, + "w": 23, + "h": 17 + } + }, + { + "filename": "chill_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 190, + "y": 32, + "w": 23, + "h": 17 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 213, + "y": 32, + "w": 23, + "h": 17 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 236, + "y": 32, + "w": 20, + "h": 17 + } + }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 256, + "y": 32, + "w": 23, + "h": 17 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 279, + "y": 32, + "w": 23, + "h": 17 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 302, + "y": 32, + "w": 18, + "h": 18 + } + }, + { + "filename": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 320, + "y": 32, + "w": 24, + "h": 18 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 344, + "y": 32, + "w": 18, + "h": 18 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 362, + "y": 32, + "w": 24, + "h": 18 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 386, + "y": 32, + "w": 18, + "h": 18 + } + }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 0, + "y": 46, + "w": 16, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 16, + "y": 47, + "w": 18, + "h": 18 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 34, + "y": 47, + "w": 21, + "h": 18 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 55, + "y": 47, + "w": 23, + "h": 18 + } + }, + { + "filename": "sharp_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 21, + "h": 18 + }, + "frame": { + "x": 78, + "y": 48, + "w": 21, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 99, + "y": 48, + "w": 18, + "h": 18 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 117, + "y": 48, + "w": 21, + "h": 18 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 138, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 158, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 178, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 198, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 218, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 238, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 258, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 278, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 298, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 318, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 338, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 358, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ice_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 378, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 398, + "y": 50, + "w": 15, + "h": 22 + } + }, + { + "filename": "wl_item_drop", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 0, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 20, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 40, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 60, + "y": 65, + "w": 18, + "h": 19 + } + }, + { + "filename": "wl_max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 78, + "y": 66, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 98, + "y": 66, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 118, + "y": 66, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_paralyze_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 138, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 158, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_reset_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 178, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 198, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 218, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 238, + "y": 67, + "w": 19, + "h": 19 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 257, + "y": 67, + "w": 22, + "h": 19 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 279, + "y": 67, + "w": 19, + "h": 19 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 298, + "y": 68, + "w": 23, + "h": 19 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 321, + "y": 68, + "w": 22, + "h": 19 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 343, + "y": 68, + "w": 23, + "h": 19 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 366, + "y": 68, + "w": 20, + "h": 19 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 386, + "y": 72, + "w": 21, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 0, + "y": 83, + "w": 23, + "h": 19 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 23, + "y": 83, + "w": 23, + "h": 19 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 46, + "y": 84, + "w": 20, + "h": 19 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 66, + "y": 84, + "w": 22, + "h": 19 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 88, + "y": 84, + "w": 19, + "h": 20 + } + }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 107, + "y": 84, + "w": 20, + "h": 20 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 127, + "y": 85, + "w": 23, + "h": 20 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 150, + "y": 85, + "w": 20, + "h": 20 + } + }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 170, + "y": 85, + "w": 19, + "h": 20 + } + }, + { + "filename": "chipped_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 26, + "h": 20 + }, + "frame": { + "x": 189, + "y": 85, + "w": 26, + "h": 20 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 215, + "y": 85, + "w": 22, + "h": 20 + } + }, + { + "filename": "cracked_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 26, + "h": 20 + }, + "frame": { + "x": 237, + "y": 86, + "w": 26, + "h": 20 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 263, + "y": 86, + "w": 22, + "h": 20 + } + }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 285, + "y": 87, + "w": 20, + "h": 20 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 305, + "y": 87, + "w": 17, + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 322, + "y": 87, + "w": 19, + "h": 20 + } + }, + { + "filename": "icy_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 341, + "y": 87, + "w": 24, + "h": 20 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 365, + "y": 87, + "w": 17, + "h": 20 + } + }, + { + "filename": "legend_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 25, + "h": 20 + }, + "frame": { + "x": 382, + "y": 91, + "w": 25, + "h": 20 + } + }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 0, + "y": 102, + "w": 20, + "h": 20 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 20, + "y": 102, + "w": 22, + "h": 20 + } + }, + { + "filename": "mb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 42, + "y": 103, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 62, + "y": 103, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 82, + "y": 104, + "w": 20, + "h": 20 + } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 102, + "y": 104, + "w": 18, + "h": 20 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 120, + "y": 105, + "w": 20, + "h": 20 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 140, + "y": 105, + "w": 23, + "h": 20 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 163, + "y": 105, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 187, + "y": 105, + "w": 24, + "h": 20 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 211, + "y": 105, + "w": 24, + "h": 20 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 235, + "y": 106, + "w": 23, + "h": 20 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 258, + "y": 106, + "w": 20, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 278, + "y": 107, + "w": 24, + "h": 20 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 302, + "y": 107, + "w": 20, + "h": 20 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 322, + "y": 107, + "w": 22, + "h": 20 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 344, + "y": 107, + "w": 20, + "h": 20 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 364, + "y": 107, + "w": 18, + "h": 22 + } + }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 382, + "y": 111, + "w": 23, + "h": 21 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 0, + "y": 122, + "w": 23, + "h": 21 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 23, + "y": 122, + "w": 19, + "h": 21 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 42, + "y": 123, + "w": 23, + "h": 21 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 65, + "y": 124, + "w": 20, + "h": 21 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 85, + "y": 124, + "w": 22, + "h": 21 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 107, + "y": 125, + "w": 21, + "h": 21 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 128, + "y": 125, + "w": 22, + "h": 21 + } + }, + { + "filename": "mint_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 + }, + "frame": { + "x": 150, + "y": 125, + "w": 28, + "h": 21 + } + }, + { + "filename": "mint_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 + }, + "frame": { + "x": 178, + "y": 125, + "w": 28, + "h": 21 + } + }, + { + "filename": "mint_neutral", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 + }, + "frame": { + "x": 206, + "y": 125, + "w": 28, + "h": 21 + } + }, + { + "filename": "mint_spatk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 + }, + "frame": { + "x": 234, + "y": 126, + "w": 28, + "h": 21 + } + }, + { + "filename": "mint_spd", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 + }, + "frame": { + "x": 262, + "y": 127, + "w": 28, + "h": 21 + } + }, + { + "filename": "mint_spdef", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 + }, + "frame": { + "x": 290, + "y": 127, + "w": 28, + "h": 21 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 318, + "y": 127, + "w": 23, + "h": 21 + } + }, + { + "filename": "n_lunarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 341, + "y": 127, + "w": 23, + "h": 21 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 364, + "y": 129, + "w": 17, + "h": 22 + } + }, + { + "filename": "n_solarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 381, + "y": 132, + "w": 23, + "h": 21 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 0, + "y": 143, + "w": 21, + "h": 21 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 21, + "y": 143, + "w": 21, + "h": 21 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 42, + "y": 144, + "w": 19, + "h": 21 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 61, + "y": 145, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 83, + "y": 145, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 105, + "y": 146, + "w": 22, + "h": 21 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 127, + "y": 146, + "w": 23, + "h": 21 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 150, + "y": 146, + "w": 21, + "h": 21 + } + }, + { + "filename": "blank_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 171, + "y": 146, + "w": 22, + "h": 22 + } + }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 193, + "y": 146, + "w": 22, + "h": 22 + } + }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 215, + "y": 146, + "w": 19, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 234, + "y": 147, + "w": 22, + "h": 22 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 256, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 278, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 300, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 322, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 344, + "y": 148, + "w": 20, + "h": 22 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 364, + "y": 151, + "w": 17, + "h": 22 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 381, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 164, + "w": 22, + "h": 22 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 22, + "y": 164, + "w": 19, + "h": 22 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 41, + "y": 165, + "w": 20, + "h": 22 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 61, + "y": 166, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 83, + "y": 166, + "w": 22, + "h": 22 + } + }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 105, + "y": 167, + "w": 24, + "h": 22 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 129, + "y": 167, + "w": 24, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 153, + "y": 168, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 175, + "y": 168, + "w": 22, + "h": 22 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 197, + "y": 168, + "w": 22, + "h": 22 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 219, + "y": 168, + "w": 15, + "h": 23 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 234, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 256, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 278, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 300, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 322, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 344, + "y": 170, + "w": 17, + "h": 23 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 361, + "y": 173, + "w": 20, + "h": 23 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 381, + "y": 175, + "w": 23, + "h": 22 + } + }, + { + "filename": "ice_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 186, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 187, + "w": 22, + "h": 22 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 44, + "y": 188, + "w": 22, + "h": 22 + } + }, + { + "filename": "map", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 27, + "h": 22 + }, + "frame": { + "x": 66, + "y": 188, + "w": 27, + "h": 22 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 93, + "y": 189, + "w": 22, + "h": 22 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 115, + "y": 189, + "w": 24, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 139, + "y": 190, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 161, + "y": 190, + "w": 22, + "h": 22 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 183, + "y": 190, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 191, + "w": 22, + "h": 22 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 227, + "y": 191, + "w": 23, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 193, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 360, + "y": 196, + "w": 21, + "h": 23 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 381, + "y": 197, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 208, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 209, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 44, + "y": 210, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 66, + "y": 210, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 88, + "y": 211, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 110, + "y": 211, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 132, + "y": 212, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 154, + "y": 212, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 176, + "y": 212, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 198, + "y": 213, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 220, + "y": 213, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 242, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 264, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 286, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 308, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 330, + "y": 215, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 352, + "y": 219, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 374, + "y": 219, + "w": 22, + "h": 22 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 396, + "y": 219, + "w": 17, + "h": 23 + } + }, + { + "filename": "water_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 230, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 231, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_accuracy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 44, + "y": 232, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_attack", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 66, + "y": 232, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_defense", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 88, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 110, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 132, + "y": 234, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 154, + "y": 234, + "w": 22, + "h": 22 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 176, + "y": 234, + "w": 22, + "h": 23 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 198, + "y": 235, + "w": 23, + "h": 23 + } + }, + { + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 221, + "y": 235, + "w": 21, + "h": 23 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 242, + "y": 236, + "w": 22, + "h": 23 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 264, + "y": 236, + "w": 24, + "h": 23 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 288, + "y": 236, + "w": 24, + "h": 23 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 312, + "y": 236, + "w": 18, + "h": 23 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 330, + "y": 237, + "w": 22, + "h": 23 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 352, + "y": 241, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 374, + "y": 241, + "w": 22, + "h": 23 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 396, + "y": 242, + "w": 17, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 0, + "y": 252, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 22, + "y": 253, + "w": 22, + "h": 23 + } + }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 44, + "y": 254, + "w": 23, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 67, + "y": 254, + "w": 21, + "h": 23 + } + }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 88, + "y": 255, + "w": 24, + "h": 23 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 112, + "y": 255, + "w": 16, + "h": 24 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 128, + "y": 256, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 150, + "y": 256, + "w": 22, + "h": 23 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 172, + "y": 257, + "w": 22, + "h": 23 + } + }, + { + "filename": "focus_sash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 194, + "y": 258, + "w": 22, + "h": 23 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 216, + "y": 258, + "w": 22, + "h": 23 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 238, + "y": 259, + "w": 22, + "h": 23 + } + }, + { + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 260, + "y": 259, + "w": 23, + "h": 23 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 283, + "y": 259, + "w": 22, + "h": 23 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 305, + "y": 259, + "w": 24, + "h": 23 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 329, + "y": 260, + "w": 22, + "h": 23 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 351, + "y": 264, + "w": 24, + "h": 23 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 375, + "y": 264, + "w": 21, + "h": 23 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 396, + "y": 265, + "w": 16, + "h": 24 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 0, + "y": 275, + "w": 22, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 22, + "y": 276, + "w": 22, + "h": 23 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 44, + "y": 277, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 66, + "y": 277, + "w": 22, + "h": 23 + } + }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 88, + "y": 278, + "w": 22, + "h": 23 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 110, + "y": 279, + "w": 23, + "h": 23 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 133, + "y": 279, + "w": 23, + "h": 23 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 156, + "y": 279, + "w": 16, + "h": 24 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 172, + "y": 280, + "w": 22, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 194, + "y": 281, + "w": 22, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 216, + "y": 281, + "w": 22, + "h": 23 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 238, + "y": 282, + "w": 24, + "h": 23 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 262, + "y": 282, + "w": 22, + "h": 23 + } + }, + { + "filename": "stick", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 284, + "y": 282, + "w": 23, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 307, + "y": 282, + "w": 22, + "h": 23 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 329, + "y": 283, + "w": 21, + "h": 23 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 350, + "y": 287, + "w": 24, + "h": 23 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 374, + "y": 287, + "w": 22, + "h": 23 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 396, + "y": 289, + "w": 18, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 0, + "y": 298, + "w": 21, + "h": 24 + } + }, + { + "filename": "big_root", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 21, + "y": 299, + "w": 23, + "h": 24 + } + }, + { + "filename": "blank_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 44, + "y": 300, + "w": 24, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 68, + "y": 300, + "w": 18, + "h": 24 + } + }, + { + "filename": "choice_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 86, + "y": 301, + "w": 24, + "h": 24 + } + }, + { + "filename": "draco_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 110, + "y": 302, + "w": 24, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 134, + "y": 302, + "w": 18, + "h": 24 + } + }, + { + "filename": "dread_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 152, + "y": 303, + "w": 24, + "h": 24 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 176, + "y": 303, + "w": 16, + "h": 24 + } + }, + { + "filename": "earth_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 192, + "y": 304, + "w": 24, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 216, + "y": 304, + "w": 17, + "h": 24 + } + }, + { + "filename": "fist_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 233, + "y": 305, + "w": 24, + "h": 24 + } + }, + { + "filename": "flame_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 257, + "y": 305, + "w": 24, + "h": 24 + } + }, + { + "filename": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 281, + "y": 305, + "w": 24, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 305, + "y": 305, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 329, + "y": 306, + "w": 18, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 347, + "y": 310, + "w": 24, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 371, + "y": 310, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 395, + "y": 313, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 0, + "y": 322, + "w": 17, + "h": 24 + } + }, + { + "filename": "icicle_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 17, + "y": 323, + "w": 24, + "h": 24 + } + }, + { + "filename": "insect_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 41, + "y": 324, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 65, + "y": 324, + "w": 18, + "h": 24 + } + }, + { + "filename": "iron_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 83, + "y": 325, + "w": 24, + "h": 24 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 107, + "y": 326, + "w": 23, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 130, + "y": 326, + "w": 16, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 146, + "y": 327, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 170, + "y": 327, + "w": 22, + "h": 24 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 192, + "y": 328, + "w": 24, + "h": 24 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 216, + "y": 328, + "w": 16, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 232, + "y": 329, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 256, + "y": 329, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 280, + "y": 329, + "w": 24, + "h": 24 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 304, + "y": 329, + "w": 24, + "h": 24 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 328, + "y": 330, + "w": 16, + "h": 24 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 344, + "y": 334, + "w": 24, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 368, + "y": 334, + "w": 24, + "h": 24 + } + }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 392, + "y": 337, + "w": 21, + "h": 24 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 0, + "y": 346, + "w": 16, + "h": 24 + } + }, + { + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 16, + "y": 347, + "w": 24, + "h": 24 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 40, + "y": 348, + "w": 20, + "h": 24 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 60, + "y": 348, + "w": 16, + "h": 24 + } + }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 76, + "y": 349, + "w": 23, + "h": 24 + } + }, + { + "filename": "salac_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 99, + "y": 350, + "w": 24, + "h": 24 + } + }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 123, + "y": 350, + "w": 21, + "h": 24 + } + }, + { + "filename": "scanner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 144, + "y": 351, + "w": 24, + "h": 24 + } + }, + { + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 168, + "y": 351, + "w": 24, + "h": 24 + } + }, + { + "filename": "sky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 192, + "y": 352, + "w": 24, + "h": 24 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 216, + "y": 352, + "w": 16, + "h": 24 + } + }, + { + "filename": "splash_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 232, + "y": 353, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 256, + "y": 353, + "w": 24, + "h": 24 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 280, + "y": 353, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 304, + "y": 353, + "w": 24, + "h": 24 + } + }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 328, + "y": 354, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 344, + "y": 358, + "w": 17, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 361, + "y": 358, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 385, + "y": 361, + "w": 24, + "h": 24 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 0, + "y": 370, + "w": 16, + "h": 24 + } + }, + { + "filename": "black_augurite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 16, + "y": 371, + "w": 22, + "h": 25 + } + }, + { + "filename": "ability_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 23, + "h": 26 + }, + "frame": { + "x": 38, + "y": 372, + "w": 23, + "h": 26 + } + }, + { + "filename": "cornerstone_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 24, + "h": 26 + }, + "frame": { + "x": 61, + "y": 373, + "w": 24, + "h": 26 + } + }, + { + "filename": "linking_cord", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 27, + "h": 26 + }, + "frame": { + "x": 85, + "y": 374, + "w": 27, + "h": 26 + } + }, + { + "filename": "galarica_wreath", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 32, + "h": 27 + }, + "frame": { + "x": 112, + "y": 374, + "w": 32, + "h": 27 + } + }, + { + "filename": "max_mushrooms", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 29, + "h": 28 + }, + "frame": { + "x": 144, + "y": 375, + "w": 29, + "h": 28 + } + }, + { + "filename": "prison_bottle", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 30 + }, + "frame": { + "x": 173, + "y": 375, + "w": 17, + "h": 30 + } + }, + { + "filename": "galarica_cuff", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 29, + "h": 30 + }, + "frame": { + "x": 190, + "y": 376, + "w": 29, + "h": 30 + } + }, + { + "filename": "bronze_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 219, + "y": 377, + "w": 22, + "h": 31 + } + }, + { + "filename": "exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 241, + "y": 377, + "w": 17, + "h": 31 + } + }, + { + "filename": "golden_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 258, + "y": 377, + "w": 17, + "h": 31 + } + }, + { + "filename": "great_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 275, + "y": 377, + "w": 22, + "h": 31 + } + }, + { + "filename": "master_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 297, + "y": 377, + "w": 22, + "h": 31 + } + }, + { + "filename": "rogue_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 319, + "y": 378, + "w": 22, + "h": 31 + } + }, + { + "filename": "super_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 341, + "y": 382, + "w": 17, + "h": 31 + } + }, + { + "filename": "ultra_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 358, + "y": 382, + "w": 22, + "h": 31 + } + } ] } ], "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5676fc2ef4e2b6e18c96ca3c80e7521d:a6286201546cef975121cad6b35c7005:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:b516eabbda93be0375a8d45471c54e6c:5bf73f118de19726fc5d5a538ddc6f22:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index d19bb003b93..51d692b1c73 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/blank_memory.png b/public/images/items/blank_memory.png new file mode 100644 index 00000000000..ddc22d1d4ab Binary files /dev/null and b/public/images/items/blank_memory.png differ diff --git a/public/images/items/blank_plate.png b/public/images/items/blank_plate.png new file mode 100644 index 00000000000..ec82203340c Binary files /dev/null and b/public/images/items/blank_plate.png differ diff --git a/public/images/items/memory_bug.png b/public/images/items/bug_memory.png similarity index 100% rename from public/images/items/memory_bug.png rename to public/images/items/bug_memory.png diff --git a/public/images/items/memory_dark.png b/public/images/items/dark_memory.png similarity index 100% rename from public/images/items/memory_dark.png rename to public/images/items/dark_memory.png diff --git a/public/images/items/draco_plate.png b/public/images/items/draco_plate.png new file mode 100644 index 00000000000..b25df530171 Binary files /dev/null and b/public/images/items/draco_plate.png differ diff --git a/public/images/items/memory_dragon.png b/public/images/items/dragon_memory.png similarity index 100% rename from public/images/items/memory_dragon.png rename to public/images/items/dragon_memory.png diff --git a/public/images/items/dread_plate.png b/public/images/items/dread_plate.png new file mode 100644 index 00000000000..4cdbb76f180 Binary files /dev/null and b/public/images/items/dread_plate.png differ diff --git a/public/images/items/earth_plate.png b/public/images/items/earth_plate.png new file mode 100644 index 00000000000..d40da06f6b6 Binary files /dev/null and b/public/images/items/earth_plate.png differ diff --git a/public/images/items/memory_electric.png b/public/images/items/electric_memory.png similarity index 100% rename from public/images/items/memory_electric.png rename to public/images/items/electric_memory.png diff --git a/public/images/items/memory_fairy.png b/public/images/items/fairy_memory.png similarity index 100% rename from public/images/items/memory_fairy.png rename to public/images/items/fairy_memory.png diff --git a/public/images/items/memory_fighting.png b/public/images/items/fighting_memory.png similarity index 100% rename from public/images/items/memory_fighting.png rename to public/images/items/fighting_memory.png diff --git a/public/images/items/memory_fire.png b/public/images/items/fire_memory.png similarity index 100% rename from public/images/items/memory_fire.png rename to public/images/items/fire_memory.png diff --git a/public/images/items/fist_plate.png b/public/images/items/fist_plate.png new file mode 100644 index 00000000000..6892d821da6 Binary files /dev/null and b/public/images/items/fist_plate.png differ diff --git a/public/images/items/flame_plate.png b/public/images/items/flame_plate.png new file mode 100644 index 00000000000..26a56f18462 Binary files /dev/null and b/public/images/items/flame_plate.png differ diff --git a/public/images/items/memory_flying.png b/public/images/items/flying_memory.png similarity index 100% rename from public/images/items/memory_flying.png rename to public/images/items/flying_memory.png diff --git a/public/images/items/memory_ghost.png b/public/images/items/ghost_memory.png similarity index 100% rename from public/images/items/memory_ghost.png rename to public/images/items/ghost_memory.png diff --git a/public/images/items/memory_grass.png b/public/images/items/grass_memory.png similarity index 100% rename from public/images/items/memory_grass.png rename to public/images/items/grass_memory.png diff --git a/public/images/items/memory_ground.png b/public/images/items/ground_memory.png similarity index 100% rename from public/images/items/memory_ground.png rename to public/images/items/ground_memory.png diff --git a/public/images/items/memory_ice.png b/public/images/items/ice_memory.png similarity index 100% rename from public/images/items/memory_ice.png rename to public/images/items/ice_memory.png diff --git a/public/images/items/icicle_plate.png b/public/images/items/icicle_plate.png new file mode 100644 index 00000000000..67b5138e3e6 Binary files /dev/null and b/public/images/items/icicle_plate.png differ diff --git a/public/images/items/insect_plate.png b/public/images/items/insect_plate.png new file mode 100644 index 00000000000..75b44640a1b Binary files /dev/null and b/public/images/items/insect_plate.png differ diff --git a/public/images/items/iron_plate.png b/public/images/items/iron_plate.png new file mode 100644 index 00000000000..ee892755660 Binary files /dev/null and b/public/images/items/iron_plate.png differ diff --git a/public/images/items/legend_plate.png b/public/images/items/legend_plate.png new file mode 100644 index 00000000000..5b8681ebfe7 Binary files /dev/null and b/public/images/items/legend_plate.png differ diff --git a/public/images/items/meadow_plate.png b/public/images/items/meadow_plate.png new file mode 100644 index 00000000000..a687cb7920d Binary files /dev/null and b/public/images/items/meadow_plate.png differ diff --git a/public/images/items/memory_normal.png b/public/images/items/memory_normal.png deleted file mode 100644 index ab6e5e82729..00000000000 Binary files a/public/images/items/memory_normal.png and /dev/null differ diff --git a/public/images/items/mind_plate.png b/public/images/items/mind_plate.png new file mode 100644 index 00000000000..04001796831 Binary files /dev/null and b/public/images/items/mind_plate.png differ diff --git a/public/images/items/pixie_plate.png b/public/images/items/pixie_plate.png new file mode 100644 index 00000000000..dcc829c107f Binary files /dev/null and b/public/images/items/pixie_plate.png differ diff --git a/public/images/items/memory_poison.png b/public/images/items/poison_memory.png similarity index 100% rename from public/images/items/memory_poison.png rename to public/images/items/poison_memory.png diff --git a/public/images/items/memory_psychic.png b/public/images/items/psychic_memory.png similarity index 100% rename from public/images/items/memory_psychic.png rename to public/images/items/psychic_memory.png diff --git a/public/images/items/memory_rock.png b/public/images/items/rock_memory.png similarity index 100% rename from public/images/items/memory_rock.png rename to public/images/items/rock_memory.png diff --git a/public/images/items/sky_plate.png b/public/images/items/sky_plate.png new file mode 100644 index 00000000000..1fed973142b Binary files /dev/null and b/public/images/items/sky_plate.png differ diff --git a/public/images/items/splash_plate.png b/public/images/items/splash_plate.png new file mode 100644 index 00000000000..a832f3dbf8a Binary files /dev/null and b/public/images/items/splash_plate.png differ diff --git a/public/images/items/spooky_plate.png b/public/images/items/spooky_plate.png new file mode 100644 index 00000000000..b5794713d0d Binary files /dev/null and b/public/images/items/spooky_plate.png differ diff --git a/public/images/items/memory_steel.png b/public/images/items/steel_memory.png similarity index 100% rename from public/images/items/memory_steel.png rename to public/images/items/steel_memory.png diff --git a/public/images/items/stone_plate.png b/public/images/items/stone_plate.png new file mode 100644 index 00000000000..44653583e60 Binary files /dev/null and b/public/images/items/stone_plate.png differ diff --git a/public/images/items/toxic_plate.png b/public/images/items/toxic_plate.png new file mode 100644 index 00000000000..8538e9fce2a Binary files /dev/null and b/public/images/items/toxic_plate.png differ diff --git a/public/images/items/memory_water.png b/public/images/items/water_memory.png similarity index 100% rename from public/images/items/memory_water.png rename to public/images/items/water_memory.png diff --git a/public/images/items/zap_plate.png b/public/images/items/zap_plate.png new file mode 100644 index 00000000000..e582b41937f Binary files /dev/null and b/public/images/items/zap_plate.png differ diff --git a/public/images/pokemon/variant/641-incarnate.json b/public/images/pokemon/variant/641-incarnate.json deleted file mode 100644 index 973f983d2cd..00000000000 --- a/public/images/pokemon/variant/641-incarnate.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "0": { - "737373": "737373", - "ffffff": "ffffff", - "101010": "101010", - "b5b5bd": "b5b5bd", - "8442ad": "282828", - "5a3173": "121212", - "294a31": "294a31", - "4a9c42": "5fd054", - "422152": "000000", - "ffc500": "ffc500", - "42733a": "317c25", - "6b4229": "6b4229", - "ad7b4a": "ad7b4a", - "deb56b": "deb56b" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/641-therian.json b/public/images/pokemon/variant/641-therian.json deleted file mode 100644 index 5b43a3d7fbf..00000000000 --- a/public/images/pokemon/variant/641-therian.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "0": { - "5a3a73": "121212", - "8442ad": "282828", - "101010": "101010", - "422152": "000000", - "737373": "737373", - "ffffff": "ffffff", - "b5b5bd": "b5b5bd", - "294a31": "294a31", - "4a9c42": "5fd054", - "deb56b": "ffc500", - "42733a": "317c25", - "ad7b4a": "ad7b4a", - "6b4229": "6b4229", - "de3a29": "deb56b" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/642-incarnate.json b/public/images/pokemon/variant/642-incarnate.json deleted file mode 100644 index 6c247996481..00000000000 --- a/public/images/pokemon/variant/642-incarnate.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "0": { - "737373": "737373", - "101010": "101010", - "b5b5bd": "878787", - "ffffff": "ffffff", - "102152": "521010", - "5a42ad": "992828", - "29426b": "6b2929", - "5284a5": "952f2f", - "63c5ff": "ff6363", - "313131": "313131", - "31317b": "3a1111", - "4a4a4a": "4a4a4a", - "212121": "212121", - "ffc55a": "ffc55a", - "d69431": "d69431" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/642-therian.json b/public/images/pokemon/variant/642-therian.json deleted file mode 100644 index c53d2dbc0fc..00000000000 --- a/public/images/pokemon/variant/642-therian.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "0": { - "192952": "521010", - "737373": "6a0d0d", - "ffffff": "ffffff", - "101010": "101010", - "5a4aad": "952f2f", - "b5b5bd": "a49696", - "3a3a84": "3a1111", - "5284a5": "7c0b0b", - "29426b": "6b2929", - "63c5ff": "c83f3f", - "d69431": "ffc55a", - "ffc55a": "d69431", - "313131": "313131", - "212121": "212121" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/645-incarnate.json b/public/images/pokemon/variant/645-incarnate.json deleted file mode 100644 index 01a6c034b19..00000000000 --- a/public/images/pokemon/variant/645-incarnate.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "0": { - "b5b5bd": "999999", - "737373": "737373", - "101010": "101010", - "ffffff": "d0d0d0", - "6b213a": "838383", - "bd4a52": "380d5f", - "a55a3a": "451c6a", - "f77b42": "69418e", - "633110": "2c2c2c", - "ffce63": "9386ff", - "4a2919": "191919", - "634231": "2c143a", - "84634a": "311e42", - "943142": "0b0b0b" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/645-therian.json b/public/images/pokemon/variant/645-therian.json deleted file mode 100644 index b18f38dcfab..00000000000 --- a/public/images/pokemon/variant/645-therian.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "0": { - "634231": "2c143a", - "101010": "101010", - "bd4a52": "380d5f", - "84634a": "311e42", - "4a2919": "191919", - "737373": "737373", - "ffffff": "d0d0d0", - "b5b5bd": "999999", - "73313a": "838383", - "633110": "2c2c2c", - "f77b42": "69418e", - "a55a3a": "451c6a", - "943142": "0b0b0b", - "ffce63": "9386ff" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index bc03c8cc517..e2802ad3e50 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1770,7 +1770,7 @@ 0 ], "645-therian": [ - 1, + 0, 0, 0 ], diff --git a/public/images/pokemon/variant/back/641-incarnate.json b/public/images/pokemon/variant/back/641-incarnate.json deleted file mode 100644 index 200c2bbd112..00000000000 --- a/public/images/pokemon/variant/back/641-incarnate.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "0": { - "737373": "737373", - "101010": "101010", - "ffffff": "ffffff", - "b5b5bd": "b5b5bd", - "6b4229": "6b4229", - "deb56b": "deb56b", - "ad7b4a": "ad7b4a", - "5a3173": "121212", - "8442ad": "282828", - "4a9c42": "5fd054", - "294a31": "294a31", - "42733a": "317c25", - "422152": "000000" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/641-therian.json b/public/images/pokemon/variant/back/641-therian.json deleted file mode 100644 index b4ecb861ac8..00000000000 --- a/public/images/pokemon/variant/back/641-therian.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "0": { - "422152": "000000", - "5a3a73": "121212", - "8442ad": "282828", - "101010": "101010", - "ffffff": "ffffff", - "b5b5bd": "b5b5bd", - "737373": "737373", - "294a31": "294a31", - "42733a": "317c25", - "4a9c42": "5fd054", - "ad7b4a": "ad7b4a", - "deb56b": "deb56b", - "6b4229": "6b4229" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/642-incarnate.json b/public/images/pokemon/variant/back/642-incarnate.json deleted file mode 100644 index 10125a512ee..00000000000 --- a/public/images/pokemon/variant/back/642-incarnate.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "0": { - "737373": "737373", - "b5b5bd": "878787", - "ffffff": "ffffff", - "101010": "101010", - "31317b": "3a1111", - "5a42ad": "992828", - "102152": "521010", - "5284a5": "952f2f", - "63c5ff": "ff6363", - "313131": "313131", - "4a4a4a": "4a4a4a", - "212121": "212121", - "29426b": "6b2929" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/642-therian.json b/public/images/pokemon/variant/back/642-therian.json deleted file mode 100644 index 181321289c6..00000000000 --- a/public/images/pokemon/variant/back/642-therian.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "0": { - "737373": "6a0d0d", - "ffffff": "ffffff", - "101010": "101010", - "192952": "521010", - "5a4aad": "952f2f", - "3a3a84": "3a1111", - "b5b5bd": "a49696", - "29426b": "6b2929", - "63c5ff": "c83f3f", - "5284a5": "7c0b0b", - "ffc55a": "d69431", - "d69431": "ffc55a", - "313131": "313131", - "212121": "212121" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/645-incarnate.json b/public/images/pokemon/variant/back/645-incarnate.json deleted file mode 100644 index c3e0980c7eb..00000000000 --- a/public/images/pokemon/variant/back/645-incarnate.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "0": { - "101010": "101010", - "ffffff": "d0d0d0", - "737373": "737373", - "4a2919": "191919", - "bd4a52": "380d5f", - "943142": "0b0b0b", - "b5b5bd": "999999", - "84634a": "311e42", - "634231": "2c143a", - "6b213a": "838383", - "a55a3a": "451c6a", - "633110": "2c2c2c", - "f77b42": "69418e" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/645-therian.json b/public/images/pokemon/variant/back/645-therian.json deleted file mode 100644 index 7b38aaeb747..00000000000 --- a/public/images/pokemon/variant/back/645-therian.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "0": { - "101010": "101010", - "634231": "531975", - "84634a": "311e42", - "4a2919": "191919", - "bd4a52": "380d5f", - "737373": "737373", - "b5b5bd": "999999", - "ffffff": "d0d0d0", - "73313a": "2c143a", - "943142": "311e42", - "633110": "2c2c2c", - "a55a3a": "451c6a", - "ad8c3a": "380d5f", - "f77b42": "69418e", - "ffce63": "9386ff" - } -} \ No newline at end of file diff --git a/public/images/trainer/aqua_grunt_f.json b/public/images/trainer/aqua_grunt_f.json new file mode 100644 index 00000000000..20515f30e5e --- /dev/null +++ b/public/images/trainer/aqua_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aqua_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 71, + "h": 71 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 36, + "h": 71 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 71 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:6db25cb5753163d19bca8e2db45849ae:7d8f51509862bfdf8a78bf42dd0005cd:af0aa9494be37941522487032b556989$" + } +} diff --git a/public/images/trainer/aqua_grunt_f.png b/public/images/trainer/aqua_grunt_f.png new file mode 100644 index 00000000000..132d239c0b8 Binary files /dev/null and b/public/images/trainer/aqua_grunt_f.png differ diff --git a/public/images/trainer/aqua_grunt_m.json b/public/images/trainer/aqua_grunt_m.json new file mode 100644 index 00000000000..93408cc40c8 --- /dev/null +++ b/public/images/trainer/aqua_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aqua_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 73, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 6, + "w": 46, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 46, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:efd07ff3ed1e610150a4b8ca18974343:d9b85b9eb11182e9e4669e2bd8b08694:72b7b50231708a9486d5f315824e4df1$" + } +} diff --git a/public/images/trainer/aqua_grunt_m.png b/public/images/trainer/aqua_grunt_m.png new file mode 100644 index 00000000000..87dbfd566a1 Binary files /dev/null and b/public/images/trainer/aqua_grunt_m.png differ diff --git a/public/images/trainer/archie.json b/public/images/trainer/archie.json new file mode 100644 index 00000000000..63837d40847 --- /dev/null +++ b/public/images/trainer/archie.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "archie.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 42, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 42, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:bfa7fdd7b6ac9be68dc9dc562fb8339f:06f87a279450b21b19294ba956b69c26:4b7980be4e3ac1d20c9eaf970913ec63$" + } +} diff --git a/public/images/trainer/archie.png b/public/images/trainer/archie.png new file mode 100644 index 00000000000..c83975c0690 Binary files /dev/null and b/public/images/trainer/archie.png differ diff --git a/public/images/trainer/cyrus.json b/public/images/trainer/cyrus.json new file mode 100644 index 00000000000..8a3044f4034 --- /dev/null +++ b/public/images/trainer/cyrus.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "cyrus.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 0, + "w": 48, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:5fc65535a23867fca7511cc9d7fc15b3:f328e97821f4faffcbca155cc2c5dc2c:55da82f1e1919212896c9c96b682cbd1$" + } +} diff --git a/public/images/trainer/cyrus.png b/public/images/trainer/cyrus.png new file mode 100644 index 00000000000..f7351340568 Binary files /dev/null and b/public/images/trainer/cyrus.png differ diff --git a/public/images/trainer/flare_grunt_f.json b/public/images/trainer/flare_grunt_f.json new file mode 100644 index 00000000000..e536d28a1aa --- /dev/null +++ b/public/images/trainer/flare_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "flare_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 31, + "y": 0, + "w": 23, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 23, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c30bf82452209a923f4becf13d275a9a:a6355b09f92c9c0388d0b919010f587f:0638dbf213f8a974eb5af76eb1e5ddeb$" + } +} diff --git a/public/images/trainer/flare_grunt_f.png b/public/images/trainer/flare_grunt_f.png new file mode 100644 index 00000000000..4446675dc44 Binary files /dev/null and b/public/images/trainer/flare_grunt_f.png differ diff --git a/public/images/trainer/flare_grunt_m.json b/public/images/trainer/flare_grunt_m.json new file mode 100644 index 00000000000..4d54acbf810 --- /dev/null +++ b/public/images/trainer/flare_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "flare_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 77, + "h": 77 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 24, + "y": 2, + "w": 31, + "h": 77 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 77 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a26606e70778f88a1a7053b2f2420dde:84abf0d0f6bc90c6a60f660567b2d641:adc35a4070bac9fe828c2605a3b15744$" + } +} diff --git a/public/images/trainer/flare_grunt_m.png b/public/images/trainer/flare_grunt_m.png new file mode 100644 index 00000000000..79eb98449ca Binary files /dev/null and b/public/images/trainer/flare_grunt_m.png differ diff --git a/public/images/trainer/galactic_grunt_f.json b/public/images/trainer/galactic_grunt_f.json new file mode 100644 index 00000000000..d98809432ca --- /dev/null +++ b/public/images/trainer/galactic_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "galactic_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 68, + "h": 68 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 57, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 57, + "h": 68 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:3012867f03f02c4ee67a8ab3ad5a000e:77a5f60f1adc158664b3b2ee17bf30fe:7e8259b5177c0a76e5d02d6bdc66affe$" + } +} diff --git a/public/images/trainer/galactic_grunt_f.png b/public/images/trainer/galactic_grunt_f.png new file mode 100644 index 00000000000..209d8ae09ba Binary files /dev/null and b/public/images/trainer/galactic_grunt_f.png differ diff --git a/public/images/trainer/galactic_grunt_m.json b/public/images/trainer/galactic_grunt_m.json new file mode 100644 index 00000000000..508c3fd182a --- /dev/null +++ b/public/images/trainer/galactic_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "galactic_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 73, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 6, + "w": 37, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:856b85bb5d7a1ea2e7a76708ebf82d21:1687dff972369c6248e4aa5b0795fe62:259dd316440c335df5dc6008166d69ca$" + } +} diff --git a/public/images/trainer/galactic_grunt_m.png b/public/images/trainer/galactic_grunt_m.png new file mode 100644 index 00000000000..1fff818266c Binary files /dev/null and b/public/images/trainer/galactic_grunt_m.png differ diff --git a/public/images/trainer/lysandre.json b/public/images/trainer/lysandre.json new file mode 100644 index 00000000000..931b1633a32 --- /dev/null +++ b/public/images/trainer/lysandre.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "lysandre.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 0, + "w": 52, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 52, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:6b887c8bab74885a1b05f2b382759db6:ba102d9d25ddd794a3a17f029b971daf:e6066149f6ec4ccb9fc28faea3d64a7f$" + } +} diff --git a/public/images/trainer/lysandre.png b/public/images/trainer/lysandre.png new file mode 100644 index 00000000000..b83b649d142 Binary files /dev/null and b/public/images/trainer/lysandre.png differ diff --git a/public/images/trainer/magma_grunt_f.json b/public/images/trainer/magma_grunt_f.json new file mode 100644 index 00000000000..05c0512bbf0 --- /dev/null +++ b/public/images/trainer/magma_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "magma_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 60, + "h": 80 + }, + "frame": { + "x": 10, + "y": 0, + "w": 60, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f63ad48affc076f60fae78992c96a2bf:80928b32710abcb28c07c6fc5a425d99:3b961d8852b62aaf24ceb2030c036515$" + } +} diff --git a/public/images/trainer/magma_grunt_f.png b/public/images/trainer/magma_grunt_f.png new file mode 100644 index 00000000000..215ad83eea1 Binary files /dev/null and b/public/images/trainer/magma_grunt_f.png differ diff --git a/public/images/trainer/magma_grunt_m.json b/public/images/trainer/magma_grunt_m.json new file mode 100644 index 00000000000..ac8cd838c5a --- /dev/null +++ b/public/images/trainer/magma_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "magma_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 60, + "h": 80 + }, + "frame": { + "x": 10, + "y": 0, + "w": 60, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:96aa833d987a01bcdcb6f0e7809f5daf:791cce8d026f92b2e52f0b66df8b8e11:35532fd5d9aea30957d50d06f2d2f9a6$" + } +} diff --git a/public/images/trainer/magma_grunt_m.png b/public/images/trainer/magma_grunt_m.png new file mode 100644 index 00000000000..a37b9acbb52 Binary files /dev/null and b/public/images/trainer/magma_grunt_m.png differ diff --git a/public/images/trainer/maxie.json b/public/images/trainer/maxie.json new file mode 100644 index 00000000000..46914ada760 --- /dev/null +++ b/public/images/trainer/maxie.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "maxie.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 0, + "w": 35, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a943a18803f18065ae5f19e5089c83bb:33a1c168d314f5fb32f9b34244201178:54a227d24523907b8adf8e907821dcd9$" + } +} diff --git a/public/images/trainer/maxie.png b/public/images/trainer/maxie.png new file mode 100644 index 00000000000..232082f869f Binary files /dev/null and b/public/images/trainer/maxie.png differ diff --git a/public/images/trainer/plasma_grunt_f.json b/public/images/trainer/plasma_grunt_f.json new file mode 100644 index 00000000000..4d23eeeb483 --- /dev/null +++ b/public/images/trainer/plasma_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "plasma_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 75, + "h": 75 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 4, + "w": 37, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 75 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c3001e18f1878c01a4825697200e823e:2003e0d4db249f7020c3471872198ac8:b01645b9e941158814978f2126e7e995$" + } +} diff --git a/public/images/trainer/plasma_grunt_f.png b/public/images/trainer/plasma_grunt_f.png new file mode 100644 index 00000000000..95b065f4360 Binary files /dev/null and b/public/images/trainer/plasma_grunt_f.png differ diff --git a/public/images/trainer/plasma_grunt_m.json b/public/images/trainer/plasma_grunt_m.json new file mode 100644 index 00000000000..7c34b16790f --- /dev/null +++ b/public/images/trainer/plasma_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "plasma_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 72, + "h": 72 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 7, + "w": 47, + "h": 72 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 72 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:61f195ebbcde93ab7442408edad7fe7a:28ae203b3cb42a94c4ba4420fdebdccc:9ae0ee174d431d48052a2f6b74e9d40c$" + } +} diff --git a/public/images/trainer/plasma_grunt_m.png b/public/images/trainer/plasma_grunt_m.png new file mode 100644 index 00000000000..e3ec6dd8c35 Binary files /dev/null and b/public/images/trainer/plasma_grunt_m.png differ diff --git a/public/images/trainer/rocket_grunt_f.json b/public/images/trainer/rocket_grunt_f.json new file mode 100644 index 00000000000..091fedd31f0 --- /dev/null +++ b/public/images/trainer/rocket_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rocket_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 67, + "h": 67 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 18, + "y": 9, + "w": 50, + "h": 67 + }, + "frame": { + "x": 0, + "y": 0, + "w": 50, + "h": 67 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f2e4df704ed3262efeba03b98c4f34b6:856ea7816491331f96e020076871263b:fadb24d665ba1be4d210fe9064954d5b$" + } +} diff --git a/public/images/trainer/rocket_grunt_f.png b/public/images/trainer/rocket_grunt_f.png new file mode 100644 index 00000000000..c4f6e96dec4 Binary files /dev/null and b/public/images/trainer/rocket_grunt_f.png differ diff --git a/public/images/trainer/rocket_grunt_m.json b/public/images/trainer/rocket_grunt_m.json new file mode 100644 index 00000000000..b8417d3b763 --- /dev/null +++ b/public/images/trainer/rocket_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rocket_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 65, + "h": 65 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 9, + "w": 42, + "h": 65 + }, + "frame": { + "x": 0, + "y": 0, + "w": 42, + "h": 65 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} diff --git a/public/images/trainer/rocket_grunt_m.png b/public/images/trainer/rocket_grunt_m.png new file mode 100644 index 00000000000..027da6cacb0 Binary files /dev/null and b/public/images/trainer/rocket_grunt_m.png differ diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c2097391894..5d2e2888c64 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -58,7 +58,7 @@ import * as Overrides from "./overrides"; import {InputsController} from "./inputs-controller"; import {UiInputs} from "./ui-inputs"; import { MoneyFormat } from "./enums/money-format"; -import { NewArenaEvent } from "./battle-scene-events"; +import { NewArenaEvent } from "./events/battle-scene"; import { Abilities } from "./data/enums/abilities"; import ArenaFlyout from "./ui/arena-flyout"; import { EaseType } from "./ui/enums/ease-type"; @@ -314,7 +314,6 @@ export default class BattleScene extends SceneBase { } update() { - this.inputController.update(); this.ui?.update(); } @@ -1820,6 +1819,8 @@ export default class BattleScene extends SceneBase { return 13.940; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; + case "battle_plasma_grunt": //BW Team Plasma Battle + return 12.974; } return 0; diff --git a/src/battle.ts b/src/battle.ts index 104c35a5e9f..68e16cb28bb 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -423,7 +423,14 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get export interface FixedBattleConfigs { [key: integer]: FixedBattleConfig } - +/** + * Youngster/Lass on 5 + * Rival on 8, 55, 95, 145, 195 + * Evil team grunts on 35, 62, 64, 65, 112, 114 (Not currently spawning) + * Evil leader on 115, 165 (Not currently spawning) + * E4 on 182, 184, 186, 188 + * Champion on 190 + */ export const classicFixedBattles: FixedBattleConfigs = { [5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), @@ -431,12 +438,28 @@ export const classicFixedBattles: FixedBattleConfigs = { .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + // [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + // [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + // [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + // [65]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + // [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + // [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + // [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + // [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) diff --git a/src/data/ability.ts b/src/data/ability.ts index 3e2f1d30f40..459b1223e91 100755 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -4037,8 +4037,7 @@ export function initAbilities() { .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) - .attr(NoFusionAbilityAbAttr) - .unimplemented(), + .attr(NoFusionAbilityAbAttr), new Ability(Abilities.FLOWER_GIFT, 4) .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5) .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), BattleStatMultiplierAbAttr, BattleStat.SPDEF, 1.5) @@ -4390,8 +4389,7 @@ export function initAbilities() { .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) - .attr(NoFusionAbilityAbAttr) - .unimplemented(), + .attr(NoFusionAbilityAbAttr), new Ability(Abilities.ELECTRIC_SURGE, 7) .attr(PostSummonTerrainChangeAbAttr, TerrainType.ELECTRIC) .attr(PostBiomeChangeTerrainChangeAbAttr, TerrainType.ELECTRIC), diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 2076123610f..5b5e0d865ba 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -449,6 +449,222 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.ROCKET_GRUNT]: [ + { + encounter: [ + "dialogue:rocket_grunt.encounter.1" + ], + victory: [ + "dialogue:rocket_grunt.victory.1" + ] + } + ], + [TrainerType.MAGMA_GRUNT]: [ + { + encounter: [ + "dialogue:magma_grunt.encounter.1" + ], + victory: [ + "dialogue:magma_grunt.victory.1" + ] + } + ], + [TrainerType.AQUA_GRUNT]: [ + { + encounter: [ + "dialogue:aqua_grunt.encounter.1" + ], + victory: [ + "dialogue:aqua_grunt.victory.1" + ] + } + ], + [TrainerType.GALACTIC_GRUNT]: [ + { + encounter: [ + "dialogue:galactic_grunt.encounter.1" + ], + victory: [ + "dialogue:galactic_grunt.victory.1" + ] + } + ], + [TrainerType.PLASMA_GRUNT]: [ + { + encounter: [ + "dialogue:plasma_grunt.encounter.1" + ], + victory: [ + "dialogue:plasma_grunt.victory.1" + ] + } + ], + [TrainerType.FLARE_GRUNT]: [ + { + encounter: [ + "dialogue:flare_grunt.encounter.1" + ], + victory: [ + "dialogue:flare_grunt.victory.1" + ] + } + ], + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ + { + encounter: [ + "dialogue:rocket_boss_giovanni_1.encounter.1" + ], + victory: [ + "dialogue:rocket_boss_giovanni_1.victory.1" + ], + defeat: [ + "dialogue:rocket_boss_giovanni_1.defeat.1" + ] + } + ], + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: [ + { + encounter: [ + "dialogue:rocket_boss_giovanni_2.encounter.1" + ], + victory: [ + "dialogue:rocket_boss_giovanni_2.victory.1" + ], + defeat: [ + "dialogue:rocket_boss_giovanni_2.defeat.1" + ] + } + ], + [TrainerType.MAXIE]: [ + { + encounter: [ + "dialogue:magma_boss_maxie_1.encounter.1" + ], + victory: [ + "dialogue:magma_boss_maxie_1.victory.1" + ], + defeat: [ + "dialogue:magma_boss_maxie_1.defeat.1" + ] + } + ], + [TrainerType.MAXIE_2]: [ + { + encounter: [ + "dialogue:magma_boss_maxie_2.encounter.1" + ], + victory: [ + "dialogue:magma_boss_maxie_2.victory.1" + ], + defeat: [ + "dialogue:magma_boss_maxie_2.defeat.1" + ] + } + ], + [TrainerType.ARCHIE]: [ + { + encounter: [ + "dialogue:aqua_boss_archie_1.encounter.1" + ], + victory: [ + "dialogue:aqua_boss_archie_1.victory.1" + ], + defeat: [ + "dialogue:aqua_boss_archie_1.defeat.1" + ] + } + ], + [TrainerType.ARCHIE_2]: [ + { + encounter: [ + "dialogue:aqua_boss_archie_2.encounter.1" + ], + victory: [ + "dialogue:aqua_boss_archie_2.victory.1" + ], + defeat: [ + "dialogue:aqua_boss_archie_2.defeat.1" + ] + } + ], + [TrainerType.CYRUS]: [ + { + encounter: [ + "dialogue:galactic_boss_cyrus_1.encounter.1" + ], + victory: [ + "dialogue:galactic_boss_cyrus_1.victory.1" + ], + defeat: [ + "dialogue:galactic_boss_cyrus_1.defeat.1" + ] + } + ], + [TrainerType.CYRUS_2]: [ + { + encounter: [ + "dialogue:galactic_boss_cyrus_2.encounter.1" + ], + victory: [ + "dialogue:galactic_boss_cyrus_2.victory.1" + ], + defeat: [ + "dialogue:galactic_boss_cyrus_2.defeat.1" + ] + } + ], + [TrainerType.GHETSIS]: [ + { + encounter: [ + "dialogue:plasma_boss_ghetsis_1.encounter.1" + ], + victory: [ + "dialogue:plasma_boss_ghetsis_1.victory.1" + ], + defeat: [ + "dialogue:plasma_boss_ghetsis_1.defeat.1" + ] + } + ], + [TrainerType.GHETSIS_2]: [ + { + encounter: [ + "dialogue:plasma_boss_ghetsis_2.encounter.1" + ], + victory: [ + "dialogue:plasma_boss_ghetsis_2.victory.1" + ], + defeat: [ + "dialogue:plasma_boss_ghetsis_2.defeat.1" + ] + } + ], + [TrainerType.LYSANDRE]: [ + { + encounter: [ + "dialogue:flare_boss_lysandre_1.encounter.1" + ], + victory: [ + "dialogue:flare_boss_lysandre_1.victory.1" + ], + defeat: [ + "dialogue:flare_boss_lysandre_1.defeat.1" + ] + } + ], + [TrainerType.LYSANDRE_2]: [ + { + encounter: [ + "dialogue:flare_boss_lysandre_2.encounter.1" + ], + victory: [ + "dialogue:flare_boss_lysandre_2.victory.1" + ], + defeat: [ + "dialogue:flare_boss_lysandre_2.defeat.1" + ] + } + ], [TrainerType.BROCK]: { encounter: [ "dialogue:brock.encounter.1", diff --git a/src/data/enums/trainer-type.ts b/src/data/enums/trainer-type.ts index 64eb07e22ce..6bd8f567acb 100644 --- a/src/data/enums/trainer-type.ts +++ b/src/data/enums/trainer-type.ts @@ -52,6 +52,24 @@ export enum TrainerType { WAITER, WORKER, YOUNGSTER, + ROCKET_GRUNT, + MAGMA_GRUNT, + AQUA_GRUNT, + GALACTIC_GRUNT, + PLASMA_GRUNT, + FLARE_GRUNT, + ROCKET_BOSS_GIOVANNI_1, + ROCKET_BOSS_GIOVANNI_2, + MAXIE, + MAXIE_2, + ARCHIE, + ARCHIE_2, + CYRUS, + CYRUS_2, + GHETSIS, + GHETSIS_2, + LYSANDRE, + LYSANDRE_2, BROCK = 200, MISTY, diff --git a/src/data/move.ts b/src/data/move.ts index c0678005df0..62c4d968e86 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3328,6 +3328,19 @@ export class VariableMoveTypeAttr extends MoveAttr { } } +export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.ARCEUS) || [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.SILVALLY)) { + const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies.formIndex; + + move.type = Type[Type[form]]; + return true; + } + + return false; + } +} + export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.GENESECT)) { @@ -5041,7 +5054,7 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { target.summonData.abilitySuppressed = true; - target.scene.queueMessage(getPokemonMessage(target, " ability\nwas suppressed!")); + target.scene.queueMessage(getPokemonMessage(target, "'s ability\nwas suppressed!")); return true; } @@ -5051,6 +5064,35 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { } } +/** + * Applies the effects of {@linkcode SuppressAbilitiesAttr} if the target has already moved this turn. + * @extends MoveEffectAttr + * @see {@linkcode Moves.CORE_ENFORCER} (the move which uses this effect) + */ +export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { + /** + * If the target has already acted this turn, apply a {@linkcode SuppressAbilitiesAttr} effect unless the + * abillity cannot be suppressed. This is a secondary effect and has no bearing on the success or failure of the move. + * + * @returns True if the move occurred, otherwise false. Note that true will be returned even if the target has not + * yet moved or if the target's abiilty is un-suppressable. + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + if (target.turnData.acted) { + const suppressAttr = new SuppressAbilitiesAttr(); + if (suppressAttr.getCondition()(user, target, move)) { + suppressAttr.apply(user, target, move, args); + } + } + + return true; + } +} + export class TransformAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { @@ -6553,7 +6595,7 @@ export function initMoves() { .attr(ConfuseAttr) .soundBased(), new AttackMove(Moves.JUDGMENT, Type.NORMAL, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 4) - .partial(), + .attr(FormChangeItemTypeAttr), new AttackMove(Moves.BUG_BITE, Type.BUG, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) .attr(StealEatBerryAttr), new AttackMove(Moves.CHARGE_BEAM, Type.ELECTRIC, MoveCategory.SPECIAL, 50, 90, 10, 70, 0, 4) @@ -7239,7 +7281,7 @@ export function initMoves() { .attr(MatchUserTypeAttr), new AttackMove(Moves.CORE_ENFORCER, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 7) .target(MoveTarget.ALL_NEAR_ENEMIES) - .partial(), + .attr(SuppressAbilitiesIfActedAttr), new AttackMove(Moves.TROP_KICK, Type.GRASS, MoveCategory.PHYSICAL, 70, 100, 15, 100, 0, 7) .attr(StatChangeAttr, BattleStat.ATK, -1), new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7) @@ -7323,7 +7365,7 @@ export function initMoves() { new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) .attr(TargetHalfHpDamageAttr), new AttackMove(Moves.MULTI_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 7) - .partial(), + .attr(FormChangeItemTypeAttr), /* Unused */ new AttackMove(Moves.TEN_MILLION_VOLT_THUNDERBOLT, Type.ELECTRIC, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) .partial() diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 77991ee6434..998752f4d34 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -86,7 +86,45 @@ export enum FormChangeItem { SHOCK_DRIVE, BURN_DRIVE, CHILL_DRIVE, - DOUSE_DRIVE + DOUSE_DRIVE, + + FIST_PLATE = 100, + SKY_PLATE, + TOXIC_PLATE, + EARTH_PLATE, + STONE_PLATE, + INSECT_PLATE, + SPOOKY_PLATE, + IRON_PLATE, + FLAME_PLATE, + SPLASH_PLATE, + MEADOW_PLATE, + ZAP_PLATE, + MIND_PLATE, + ICICLE_PLATE, + DRACO_PLATE, + DREAD_PLATE, + PIXIE_PLATE, + BLANK_PLATE, // TODO: Find a potential use for this + LEGEND_PLATE, // TODO: Find a potential use for this + FIGHTING_MEMORY, + FLYING_MEMORY, + POISON_MEMORY, + GROUND_MEMORY, + ROCK_MEMORY, + BUG_MEMORY, + GHOST_MEMORY, + STEEL_MEMORY, + FIRE_MEMORY, + WATER_MEMORY, + GRASS_MEMORY, + ELECTRIC_MEMORY, + PSYCHIC_MEMORY, + ICE_MEMORY, + DRAGON_MEMORY, + DARK_MEMORY, + FAIRY_MEMORY, + BLANK_MEMORY // TODO: Find a potential use for this } export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean; @@ -533,6 +571,25 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.SHAYMIN, "sky", "land", new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAWN, TimeOfDay.NIGHT)), new SpeciesFormChange(Species.SHAYMIN, "sky", "land", new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE)) ], + [Species.ARCEUS]: [ + new SpeciesFormChange(Species.ARCEUS, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIST_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "flying", new SpeciesFormChangeItemTrigger(FormChangeItem.SKY_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "poison", new SpeciesFormChangeItemTrigger(FormChangeItem.TOXIC_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "ground", new SpeciesFormChangeItemTrigger(FormChangeItem.EARTH_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "rock", new SpeciesFormChangeItemTrigger(FormChangeItem.STONE_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "bug", new SpeciesFormChangeItemTrigger(FormChangeItem.INSECT_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "ghost", new SpeciesFormChangeItemTrigger(FormChangeItem.SPOOKY_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "steel", new SpeciesFormChangeItemTrigger(FormChangeItem.IRON_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "fire", new SpeciesFormChangeItemTrigger(FormChangeItem.FLAME_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "water", new SpeciesFormChangeItemTrigger(FormChangeItem.SPLASH_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "grass", new SpeciesFormChangeItemTrigger(FormChangeItem.MEADOW_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "electric", new SpeciesFormChangeItemTrigger(FormChangeItem.ZAP_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "psychic", new SpeciesFormChangeItemTrigger(FormChangeItem.MIND_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICICLE_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "dragon", new SpeciesFormChangeItemTrigger(FormChangeItem.DRACO_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "dark", new SpeciesFormChangeItemTrigger(FormChangeItem.DREAD_PLATE)), + new SpeciesFormChange(Species.ARCEUS, "normal", "fairy", new SpeciesFormChangeItemTrigger(FormChangeItem.PIXIE_PLATE)) + ], [Species.DARMANITAN]: [ new SpeciesFormChange(Species.DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true) @@ -597,6 +654,25 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.WISHIWASHI, "", "school", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.WISHIWASHI, "school", "", new SpeciesFormChangeManualTrigger(), true) ], + [Species.SILVALLY]: [ + new SpeciesFormChange(Species.SILVALLY, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIGHTING_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "flying", new SpeciesFormChangeItemTrigger(FormChangeItem.FLYING_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "poison", new SpeciesFormChangeItemTrigger(FormChangeItem.POISON_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "ground", new SpeciesFormChangeItemTrigger(FormChangeItem.GROUND_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "rock", new SpeciesFormChangeItemTrigger(FormChangeItem.ROCK_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "bug", new SpeciesFormChangeItemTrigger(FormChangeItem.BUG_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "ghost", new SpeciesFormChangeItemTrigger(FormChangeItem.GHOST_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "steel", new SpeciesFormChangeItemTrigger(FormChangeItem.STEEL_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "fire", new SpeciesFormChangeItemTrigger(FormChangeItem.FIRE_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "water", new SpeciesFormChangeItemTrigger(FormChangeItem.WATER_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "grass", new SpeciesFormChangeItemTrigger(FormChangeItem.GRASS_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "electric", new SpeciesFormChangeItemTrigger(FormChangeItem.ELECTRIC_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "psychic", new SpeciesFormChangeItemTrigger(FormChangeItem.PSYCHIC_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICE_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "dragon", new SpeciesFormChangeItemTrigger(FormChangeItem.DRAGON_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "dark", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_MEMORY)), + new SpeciesFormChange(Species.SILVALLY, "normal", "fairy", new SpeciesFormChangeItemTrigger(FormChangeItem.FAIRY_MEMORY)) + ], [Species.MINIOR]: [ new SpeciesFormChange(Species.MINIOR, "red-meteor", "red", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.MINIOR, "red", "red-meteor", new SpeciesFormChangeManualTrigger(), true), diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 12c3bdb52d9..43ce8c8444a 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -295,6 +295,25 @@ export class TrainerConfig { case TrainerType.LARRY_ELITE: trainerType = TrainerType.LARRY; break; + case TrainerType.ROCKET_BOSS_GIOVANNI_1: + case TrainerType.ROCKET_BOSS_GIOVANNI_2: + trainerType = TrainerType.GIOVANNI; + break; + case TrainerType.MAXIE_2: + trainerType = TrainerType.MAXIE; + break; + case TrainerType.ARCHIE_2: + trainerType = TrainerType.ARCHIE; + break; + case TrainerType.CYRUS_2: + trainerType = TrainerType.CYRUS; + break; + case TrainerType.GHETSIS_2: + trainerType = TrainerType.GHETSIS; + break; + case TrainerType.LYSANDRE_2: + trainerType = TrainerType.LYSANDRE; + break; case TrainerType.MARNIE_ELITE: trainerType = TrainerType.MARNIE; break; @@ -508,6 +527,39 @@ export class TrainerConfig { return this; } + /** + * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. + * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader. + * @param {Type[]} specialtyTypes - The specialty types for the evil team Leader. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + * **/ + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { + if (!getIsInitialized()) { + initI18n(); + } + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + signatureSpecies.forEach((speciesPool, s) => { + if (!Array.isArray(speciesPool)) { + speciesPool = [speciesPool]; + } + this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); + }); + if (specialtyTypes.length) { + this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); + this.setSpecialtyTypes(...specialtyTypes); + } + const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); + this.name = i18next.t(`trainerNames:${nameForCall}`); + this.setTitle(title); + this.setMoneyMultiplier(2.5); + this.setBoss(); + this.setStaticParty(); + this.setBattleBgm("battle_unova_gym"); // TODO: change + this.setVictoryBgm("victory_gym"); // TODO: change + + return this; + } + /** * Initializes the trainer configuration for a Gym Leader. * @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader. @@ -761,6 +813,34 @@ interface TrainerConfigs { [key: integer]: TrainerConfig } +/** + * The function to get variable strength grutns + * @param scene the singleton scene being passed in + * @returns the correct TrainerPartyTemplate + */ +function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate { + const waveIndex = scene.currentBattle?.waveIndex; + if (waveIndex < 40) { + return trainerPartyTemplates.TWO_AVG; + } else if (waveIndex < 80) { + switch (waveIndex) { + case 62: + return trainerPartyTemplates.THREE_AVG; + case 64: + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + case 65: + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger + } + } else { + switch (waveIndex) { + case 112: + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger + case 114: + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger + } + } +} + function getWavePartyTemplate(scene: BattleScene, ...templates: TrainerPartyTemplate[]) { return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)]; } @@ -1103,6 +1183,54 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesPools( [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP] ), + [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING], + [TrainerPoolTier.UNCOMMON]: [Species.GRIMER, Species.CUBONE, Species.ODDISH, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], + [TrainerPoolTier.RARE]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER], + [TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], + [TrainerPoolTier.ULTRA_RARE]: [Species.DRATINI, Species.LARVITAR] + }), + [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY], + [TrainerPoolTier.UNCOMMON]: [Species.PHANPY, Species.SWINUB, Species.GLIGAR, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], + [TrainerPoolTier.RARE]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA], + [TrainerPoolTier.SUPER_RARE]: [Species.TRAPINCH, Species.HEATMOR], + [TrainerPoolTier.ULTRA_RARE]: [Species.TURTONATOR, Species.CHARCADET] + }), + [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH], + [TrainerPoolTier.UNCOMMON]: [Species.SPHEAL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL ], + [TrainerPoolTier.RARE]: [Species.CLAMPERL, Species.REMORAID, Species.ARROKUDA], + [TrainerPoolTier.SUPER_RARE]: [Species.MANTINE, Species.BASCULEGION], + [TrainerPoolTier.ULTRA_RARE]: [Species.DONDOZO] + }), + [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE], + [TrainerPoolTier.UNCOMMON]: [Species.BRONZOR, Species.DRIFLOON, Species.BURMY], + [TrainerPoolTier.RARE]: [Species.CARNIVINE], + [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], + [TrainerPoolTier.ULTRA_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] + }), + [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE], + [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.SANDILE, Species.TRUBBISH, Species.GOLETT], + [TrainerPoolTier.RARE]: [Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS, Species.DRILBUR, Species.KLINK, Species.VULLABY], + [TrainerPoolTier.SUPER_RARE]: [Species.PAWNIARD, Species.VULLABY, Species.DRUDDIGON, Species.BOUFFALANT, Species.ZORUA], + [TrainerPoolTier.ULTRA_RARE]: [Species.AXEW, Species.DEINO, Species.DURANT] + }), + [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI], + [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN], + [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL], + [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN], + [TrainerPoolTier.ULTRA_RARE]: [] + }), [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"],true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"],false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"],true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1316,22 +1444,21 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); })), - - [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) + [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL], TrainerSlot.TRAINER, true)), - [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) + [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), - [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3) + [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3) .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540), - [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) + [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) @@ -1340,7 +1467,7 @@ export const trainerConfigs: TrainerConfigs = { const starter = party[0]; return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), - [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) + [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true, p => p.setBoss(true, 2))) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true)) @@ -1356,7 +1483,7 @@ export const trainerConfigs: TrainerConfigs = { const starter = party[0]; return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), - [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) + [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); @@ -1381,4 +1508,211 @@ export const trainerConfigs: TrainerConfigs = { const starter = party[0]; return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), + + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN , Species.ALOLA_PERSIAN])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NIDOKING , Species.NIDOQUEEN ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.MAROWAK , Species.ALOLA_MAROWAK])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR , Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.EXCADRILL ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GASTRODON])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEWTWO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIGHTYENA ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MAGMORTAR, Species.TORKOAL ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.FLYGON])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), + [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SHIFTRY, Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Chlorophyll + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // DROUGHT + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), + [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LINOONE ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.PELIPPER ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TENTACRUEL ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RELICANTH, Species.WAILORD ])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), + [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Swift Swim + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Swift Swim + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Drizzle + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), + [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.BASCULEGION ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.OVERQWIL ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })), + [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ELECTRODE, Species.HISUI_ELECTRODE ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.ROARING_MOON ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HISUI_ZOROARK ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })), + [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS, Species.RUNERIGUS ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BOUFFALANT ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SEISMITOAD, Species.CARRACOSTA ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.EELEKTROSS, Species.GALVANTULA ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.VOLCARONA ])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })), + [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SLITHER_WING, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DURANT ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DARMANITAN, Species.GALAR_DARMANITAN ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })), + [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK ])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), + [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SCREAM_TAIL, Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GHOLDENGO, Species.AEGISLASH ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; + })), }; diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 320b768e1e5..b86e7a9f2ca 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -12,7 +12,8 @@ import { achvs } from "./system/achv"; import { pokemonPrevolutions } from "./data/pokemon-evolutions"; import { EggTier } from "./data/enums/egg-type"; import PokemonInfoContainer from "./ui/pokemon-info-container"; -import EggsToHatchCountContainer from "./ui/eggs-to-hatch-count-container"; +import EggCounterContainer from "./ui/egg-counter-container"; +import { EggCountChangedEvent } from "./events/egg"; /** * Class that represents egg hatching @@ -24,7 +25,7 @@ export class EggHatchPhase extends Phase { /** The number of eggs that are hatching */ private eggsToHatchCount: integer; /** The container that lists how many eggs are hatching */ - private eggsToHatchCountContainer: EggsToHatchCountContainer; + private eggCounterContainer: EggCounterContainer; /** The scene handler for egg hatching */ private eggHatchHandler: EggHatchSceneHandler; @@ -110,10 +111,8 @@ export class EggHatchPhase extends Phase { this.eggContainer.add(this.eggLightraysOverlay); this.eggHatchContainer.add(this.eggContainer); - this.eggsToHatchCountContainer = new EggsToHatchCountContainer(this.scene, this.eggsToHatchCount); - this.eggsToHatchCountContainer.setup(); - - this.eggHatchContainer.add(this.eggsToHatchCountContainer); + this.eggCounterContainer = new EggCounterContainer(this.scene, this.eggsToHatchCount); + this.eggHatchContainer.add(this.eggCounterContainer); const getPokemonSprite = () => { const ret = this.scene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, "pkmn__sub"); @@ -308,13 +307,6 @@ export class EggHatchPhase extends Phase { * Function to do the logic and animation of completing a hatch and revealing the Pokemon */ doReveal(): void { - // Update/reduce count of hatching eggs when revealed if count is at least 1 - // If count is 0, hide eggsToHatchCountContainer instead - if (this.eggsToHatchCount > 1) { - this.eggsToHatchCount -= 1; - } else { - this.eggsToHatchCountContainer.setVisible(false); - } const isShiny = this.pokemon.isShiny(); if (this.pokemon.species.subLegendary) { this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY); @@ -336,10 +328,8 @@ export class EggHatchPhase extends Phase { this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); this.pokemonSprite.setVisible(true); this.scene.time.delayedCall(Utils.fixedInt(250), () => { - if (this.eggsToHatchCount < 10) { - this.eggsToHatchCountContainer.setWindowToDefaultSize(); - } - this.eggsToHatchCountContainer.eggCountText.setText(`${this.eggsToHatchCount}`); + this.eggsToHatchCount--; + this.eggHatchHandler.eventTarget.dispatchEvent(new EggCountChangedEvent(this.eggsToHatchCount)); this.pokemon.cry(); if (isShiny) { this.scene.time.delayedCall(Utils.fixedInt(500), () => { diff --git a/src/battle-scene-events.ts b/src/events/battle-scene.ts similarity index 95% rename from src/battle-scene-events.ts rename to src/events/battle-scene.ts index aaeb590f8ba..b2e4461f8d0 100644 --- a/src/battle-scene-events.ts +++ b/src/events/battle-scene.ts @@ -1,5 +1,5 @@ -import Move from "./data/move"; -import { BerryModifier } from "./modifier/modifier"; +import Move from "../data/move"; +import { BerryModifier } from "../modifier/modifier"; /** Alias for all {@linkcode BattleScene} events */ export enum BattleSceneEventType { @@ -7,7 +7,7 @@ export enum BattleSceneEventType { * Triggers when the corresponding setting is changed * @see {@linkcode CandyUpgradeNotificationChangedEvent} */ - CANDY_UPGRADE_NOTIFICATION_CHANGED = "onCandyUpgradeDisplayChanged", + CANDY_UPGRADE_NOTIFICATION_CHANGED = "onCandyUpgradeNotificationChanged", /** * Triggers when a move is successfully used diff --git a/src/events/egg.ts b/src/events/egg.ts new file mode 100644 index 00000000000..b30c37a25e8 --- /dev/null +++ b/src/events/egg.ts @@ -0,0 +1,21 @@ +export enum EggEventType { + /** + * Triggers when egg count is changed. + * @see {@linkcode MoveUsedEvent} + */ + EGG_COUNT_CHANGED = "onEggCountChanged" +} + +/** + * Container class for {@linkcode EggEventType.EGG_COUNT_CHANGED} events + * @extends Event +*/ +export class EggCountChangedEvent extends Event { + /** The updated egg count. */ + public eggCount: integer; + + constructor(eggCount: number) { + super(EggEventType.EGG_COUNT_CHANGED); + this.eggCount = eggCount; + } +} diff --git a/src/field/arena.ts b/src/field/arena.ts index d34cd2c9bea..0cdf27b7983 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -19,7 +19,7 @@ import { Terrain, TerrainType } from "../data/terrain"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import Pokemon from "./pokemon"; import * as Overrides from "../overrides"; -import { WeatherChangedEvent, TerrainChangedEvent, TagAddedEvent, TagRemovedEvent } from "./arena-events"; +import { WeatherChangedEvent, TerrainChangedEvent, TagAddedEvent, TagRemovedEvent } from "./events/arena"; export class Arena { public scene: BattleScene; diff --git a/src/field/arena-events.ts b/src/field/events/arena.ts similarity index 100% rename from src/field/arena-events.ts rename to src/field/events/arena.ts diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a0aa36cdb43..8fc346b46a8 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1070,6 +1070,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** + * Calculates the effectiveness of a move against the Pokémon. + * + * @param source - The Pokémon using the move. + * @param move - The move being used. * @returns The type damage multiplier or undefined if it's a status move */ getMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier | undefined { @@ -1077,19 +1081,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return undefined; } - return this.getAttackMoveEffectiveness(source, move); + return this.getAttackMoveEffectiveness(source, move, true); } - getAttackMoveEffectiveness(source: Pokemon, pokemonMove: PokemonMove): TypeDamageMultiplier { + /** + * Calculates the effectiveness of an attack move against the Pokémon. + * + * @param source - The attacking Pokémon. + * @param pokemonMove - The move being used by the attacking Pokémon. + * @param ignoreAbility - Whether to check for abilities that might affect type effectiveness or immunity. + * @returns The type damage multiplier, indicating the effectiveness of the move + */ + getAttackMoveEffectiveness(source: Pokemon, pokemonMove: PokemonMove, ignoreAbility: boolean = false): TypeDamageMultiplier { const move = pokemonMove.getMove(); const typeless = move.hasAttr(TypelessAttr); const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move.type, source)); const cancelled = new Utils.BooleanHolder(false); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (!typeless) { + if (!typeless && !ignoreAbility) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); } - if (!cancelled.value) { + if (!cancelled.value && !ignoreAbility) { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); } return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 5a86d5c4502..1646866189b 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -122,6 +122,14 @@ export default class Trainer extends Phaser.GameObjects.Container { // Determine the title to include based on the configuration and includeTitle flag. let title = includeTitle && this.config.title ? this.config.title : null; + if (this.name === "" && name.toLowerCase().includes("grunt")) { + // This is a evil team grunt so we localize it by only using the "name" as the title + title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); + console.log("Localized grunt name: " + title); + // Since grunts are not named we can just return the title + return title; + } + // If the trainer has a name (not null or undefined). if (this.name) { // If the title should be included. diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 3ef8fa24115..1f10197903c 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -1,7 +1,6 @@ import Phaser from "phaser"; import * as Utils from "./utils"; import {deepCopy} from "./utils"; -import {initTouchControls} from "./touch-controls"; import pad_generic from "./configs/inputs/pad_generic"; import pad_unlicensedSNES from "./configs/inputs/pad_unlicensedSNES"; import pad_xbox360 from "./configs/inputs/pad_xbox360"; @@ -21,6 +20,7 @@ import { import BattleScene from "./battle-scene"; import {SettingGamepad} from "#app/system/settings/settings-gamepad.js"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; +import TouchControl from "#app/touch-controls"; export interface DeviceMapping { [key: string]: number; @@ -48,7 +48,7 @@ export interface InterfaceConfig { custom?: MappingLayout; } -const repeatInputDelayMillis = 500; +const repeatInputDelayMillis = 250; // Phaser.Input.Gamepad.GamepadPlugin#refreshPads declare module "phaser" { @@ -92,7 +92,7 @@ export class InputsController { private scene: BattleScene; public events: Phaser.Events.EventEmitter; - private buttonLock: Button; + private buttonLock: Button[] = new Array(); private interactions: Map> = new Map(); private configs: Map = new Map(); @@ -101,10 +101,10 @@ export class InputsController { private disconnectedGamepads: Array = new Array(); - private pauseUpdate: boolean = false; public lastSource: string = "keyboard"; - private keys: Array = []; + private inputInterval: NodeJS.Timeout[] = new Array(); + private touchControls: TouchControl; /** * Initializes a new instance of the game control system, setting up initial state and configurations. @@ -181,7 +181,7 @@ export class InputsController { this.scene.input.keyboard.on("keydown", this.keyboardKeyDown, this); this.scene.input.keyboard.on("keyup", this.keyboardKeyUp, this); } - initTouchControls(this.events); + this.touchControls = new TouchControl(this.scene); } /** @@ -192,6 +192,7 @@ export class InputsController { */ loseFocus(): void { this.deactivatePressedKey(); + this.touchControls.deactivatePressedKey(); } /** @@ -232,47 +233,6 @@ export class InputsController { this.initChosenLayoutKeyboard(layoutKeyboard); } - /** - * Updates the interaction handling by processing input states. - * This method gives priority to certain buttons by reversing the order in which they are checked. - * This method loops through all button values, checks for valid and timely interactions, and conditionally processes - * or ignores them based on the current state of gamepad support and other criteria. - * - * It handles special conditions such as the absence of gamepad support or mismatches between the source of the input and - * the currently chosen gamepad. It also respects the paused state of updates to prevent unwanted input processing. - * - * If an interaction is valid and should be processed, it emits an 'input_down' event with details of the interaction. - */ - update(): void { - if (this.pauseUpdate) { - return; - } - for (const b of Utils.getEnumValues(Button).reverse()) { - if ( - this.interactions.hasOwnProperty(b) && - this.repeatInputDurationJustPassed(b as Button) && - this.interactions[b].isPressed - ) { - // Prevents repeating button interactions when gamepad support is disabled. - if ( - (!this.gamepadSupport && this.interactions[b].source === "gamepad") || - (this.interactions[b].source === "gamepad" && this.interactions[b].sourceName && this.interactions[b].sourceName !== this.selectedDevice[Device.GAMEPAD]) || - (this.interactions[b].source === "keyboard" && this.interactions[b].sourceName && this.interactions[b].sourceName !== this.selectedDevice[Device.KEYBOARD]) - ) { - // Deletes the last interaction for a button if gamepad is disabled. - this.delLastProcessedMovementTime(b as Button); - return; - } - // Emits an event for the button press. - this.events.emit("input_down", { - controller_type: this.interactions[b].source, - button: b, - }); - this.setLastProcessedMovementTime(b as Button, this.interactions[b].source, this.interactions[b].sourceName); - } - } - } - /** * Retrieves the identifiers of all connected gamepads, excluding any that are currently marked as disconnected. * @returns Array An array of strings representing the IDs of the connected gamepads. @@ -404,19 +364,24 @@ export class InputsController { */ keyboardKeyDown(event): void { this.lastSource = "keyboard"; - const keyDown = event.keyCode; this.ensureKeyboardIsInit(); - if (this.keys.includes(keyDown)) { - return; - } - this.keys.push(keyDown); - const buttonDown = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), keyDown); + const buttonDown = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), event.keyCode); if (buttonDown !== undefined) { + if (this.buttonLock.includes(buttonDown)) { + return; + } this.events.emit("input_down", { controller_type: "keyboard", button: buttonDown, }); - this.setLastProcessedMovementTime(buttonDown, "keyboard", this.selectedDevice[Device.KEYBOARD]); + clearInterval(this.inputInterval[buttonDown]); + this.inputInterval[buttonDown] = setInterval(() => { + this.events.emit("input_down", { + controller_type: "keyboard", + button: buttonDown, + }); + }, repeatInputDelayMillis); + this.buttonLock.push(buttonDown); } } @@ -427,16 +392,15 @@ export class InputsController { */ keyboardKeyUp(event): void { this.lastSource = "keyboard"; - const keyDown = event.keyCode; - this.keys = this.keys.filter(k => k !== keyDown); - this.ensureKeyboardIsInit(); - const buttonUp = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), keyDown); + const buttonUp = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), event.keyCode); if (buttonUp !== undefined) { this.events.emit("input_up", { controller_type: "keyboard", button: buttonUp, }); - this.delLastProcessedMovementTime(buttonUp); + const index = this.buttonLock.indexOf(buttonUp); + this.buttonLock.splice(index, 1); + clearInterval(this.inputInterval[buttonUp]); } } @@ -466,11 +430,25 @@ export class InputsController { const activeConfig = this.getActiveConfig(Device.GAMEPAD); const buttonDown = activeConfig && getButtonWithKeycode(activeConfig, button.index); if (buttonDown !== undefined) { + if (this.buttonLock.includes(buttonDown)) { + return; + } this.events.emit("input_down", { controller_type: "gamepad", button: buttonDown, }); - this.setLastProcessedMovementTime(buttonDown, "gamepad", pad.id); + clearInterval(this.inputInterval[buttonDown]); + this.inputInterval[buttonDown] = setInterval(() => { + if (!this.buttonLock.includes(buttonDown)) { + clearInterval(this.inputInterval[buttonDown]); + return; + } + this.events.emit("input_down", { + controller_type: "gamepad", + button: buttonDown, + }); + }, repeatInputDelayMillis); + this.buttonLock.push(buttonDown); } } @@ -497,7 +475,9 @@ export class InputsController { controller_type: "gamepad", button: buttonUp, }); - this.delLastProcessedMovementTime(buttonUp); + const index = this.buttonLock.indexOf(buttonUp); + this.buttonLock.splice(index, 1); + clearInterval(this.inputInterval[buttonUp]); } } @@ -540,144 +520,13 @@ export class InputsController { } /** - * repeatInputDurationJustPassed returns true if @param button has been held down long - * enough to fire a repeated input. A button must claim the buttonLock before - * firing a repeated input - this is to prevent multiple buttons from firing repeatedly. - */ - repeatInputDurationJustPassed(button: Button): boolean { - if (!this.isButtonLocked(button)) { - return false; - } - const duration = Date.now() - this.interactions[button].pressTime; - if (duration >= repeatInputDelayMillis) { - return true; - } - } - - /** - * This method updates the interaction state to reflect that the button is pressed. - * - * @param button - The button for which to set the interaction. - * @param source - The source of the input (defaults to 'keyboard'). This helps identify the origin of the input, especially useful in environments with multiple input devices. - * - * @remarks - * This method is responsible for updating the interaction state of a button within the `interactions` dictionary. If the button is not already registered, this method returns immediately. - * When invoked, it performs the following updates: - * - `pressTime`: Sets this to the current time, representing when the button was initially pressed. - * - `isPressed`: Marks the button as currently being pressed. - * - `source`: Identifies the source device of the input, which can vary across different hardware (e.g., keyboard, gamepad). - * - * Additionally, this method locks the button (by calling `setButtonLock`) to prevent it from being re-processed until it is released, ensuring that each press is handled distinctly. - */ - setLastProcessedMovementTime(button: Button, source: String = "keyboard", sourceName?: String): void { - if (!this.interactions.hasOwnProperty(button)) { - return; - } - this.setButtonLock(button); - this.interactions[button].pressTime = Date.now(); - this.interactions[button].isPressed = true; - this.interactions[button].source = source; - this.interactions[button].sourceName = sourceName.toLowerCase(); - } - - /** - * Clears the last interaction for a specified button. - * - * @param button - The button for which to clear the interaction. - * - * @remarks - * This method resets the interaction details of the button, allowing it to be processed as a new input when pressed again. - * If the button is not registered in the `interactions` dictionary, this method returns immediately, otherwise: - * - `pressTime` is cleared. This was previously storing the timestamp of when the button was initially pressed. - * - `isPressed` is set to false, indicating that the button is no longer being pressed. - * - `source` is set to null, which had been indicating the device from which the button input was originating. - * - * It releases the button lock, which prevents the button from being processed repeatedly until it's explicitly released. - */ - delLastProcessedMovementTime(button: Button): void { - if (!this.interactions.hasOwnProperty(button)) { - return; - } - this.releaseButtonLock(button); - this.interactions[button].pressTime = null; - this.interactions[button].isPressed = false; - this.interactions[button].source = null; - this.interactions[button].sourceName = null; - } - - /** - * Deactivates all currently pressed keys and resets their interaction states. - * - * @remarks - * This method is used to reset the state of all buttons within the `interactions` dictionary, - * effectively deactivating any currently pressed keys. It performs the following actions: - * - * - Releases button lock for predefined buttons, allowing them - * to be pressed again or properly re-initialized in future interactions. - * - Iterates over all possible button values obtained via `Utils.getEnumValues(Button)`, and for - * each button: - * - Checks if the button is currently registered in the `interactions` dictionary. - * - Resets `pressTime` to null, indicating that there is no ongoing interaction. - * - Sets `isPressed` to false, marking the button as not currently active. - * - Clears the `source` field, removing the record of which device the button press came from. - * - * This method is typically called when needing to ensure that all inputs are neutralized. + * Deactivates all currently pressed keys. */ deactivatePressedKey(): void { - this.pauseUpdate = true; - this.releaseButtonLock(this.buttonLock); - for (const b of Utils.getEnumValues(Button)) { - if (this.interactions.hasOwnProperty(b)) { - this.interactions[b].pressTime = null; - this.interactions[b].isPressed = false; - this.interactions[b].source = null; - this.interactions[b].sourceName = null; - } - } - this.pauseUpdate = false; - } - - /** - * Checks if a specific button is currently locked. - * - * @param button - The button to check for a lock status. - * @returns `true` if the button is locked, otherwise `false`. - * - * @remarks - * This method is used to determine if a given button is currently prevented from being processed due to a lock. - * It checks against two separate lock variables, allowing for up to two buttons to be locked simultaneously. - */ - isButtonLocked(button: Button): boolean { - return this.buttonLock === button; - } - - /** - * Sets a lock on a given button. - * - * @param button - The button to lock. - * - * @remarks - * This method ensures that a button is not processed multiple times inadvertently. - * It checks if the button is already locked. - */ - setButtonLock(button: Button): void { - this.buttonLock = button; - } - - /** - * Releases a lock on a specific button, allowing it to be processed again. - * - * @param button - The button whose lock is to be released. - * - * @remarks - * This method checks lock variable. - * If either lock matches the specified button, that lock is cleared. - * This action frees the button to be processed again, ensuring it can respond to new inputs. - */ - releaseButtonLock(button: Button): void { - if (this.buttonLock === button) { - this.buttonLock = null; + for (const key of Object.keys(this.inputInterval)) { + clearInterval(this.inputInterval[key]); } + this.buttonLock = []; } /** @@ -751,8 +600,7 @@ export class InputsController { * @param pressedButton The button that was pressed. */ assignBinding(config, settingName, pressedButton): boolean { - this.pauseUpdate = true; - setTimeout(() => this.pauseUpdate = false, 500); + this.deactivatePressedKey(); if (config.padType === "keyboard") { return assign(config, settingName, pressedButton); } else { diff --git a/src/locales/de/dialogue.ts b/src/locales/de/dialogue.ts index 6b0bdc7c16a..1bfff5aa000 100644 --- a/src/locales/de/dialogue.ts +++ b/src/locales/de/dialogue.ts @@ -367,6 +367,17 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Ich werde für das nächste Rennen tunen." }, }, + "rocket_grunt": { + "encounter": { + 1: `Jetzt gibt es Ärger!… + $und es kommt noch härter! + $Wir wollen über die Erde regieren… + $und naja du kennst den Rest…!` + }, + "victory": { + 1: "Das war mal wieder ein Schuss in den Ofen!" + }, + }, "firebreather": { "encounter": { 1: "Meine Flammen werden dich verschlingen!", @@ -391,6 +402,190 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Ich glaube, ich bin der der seekrank ist..." }, }, + "magma_grunt": { + "encounter": { + 1: "Keiner, der sich Team Magma in den Weg stellt, bekommt Gnade, nicht einmal Kinder!" + }, + "victory": { + 1: "Wie kann das sein? Ich bin Teil vom mächtigen Team Magma! Wir wollen doch nur die Welt verbessern…" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!", + }, + "victory": { + 1: "Vielleicht sollte ich wohl lieber selber über die Planke gehen…", + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Team Galaktik wird die Welt in eine bessere Welt verwandeln! Und du wirst uns nicht aufhalten!" + }, + "victory": { + 1: "Zyrus wird uns für diese Niederlage bestrafen…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pokémon sollten frei sein! Team Plasma wird sie befreien!" + }, + "victory": { + 1: "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten…" + }, + }, + "flare_grunt": { + "encounter": { + 1: `Ich bin ein Mitglied von Team Flare! Das sieht man mir doch an. Mein Stil ist unverkennbar! + $Du kannst definitiv ein Umstyling gebrauchen!` + }, + "victory": { + 1: "Stil ist wohl doch nicht alles…" + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: `Ich bin beeindruckt, du hast es bis hierher geschafft! + $Ich bin Giovanni, der Anführer von Team Rocket! + $Wir regieren den Untergrund von Kanto! + $Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!` + + }, + "victory": { + 1: "Ich ziehe mich zurück, aber ich werde zurückkehren! Team Rocket wird niemals besiegt werden!" + }, + "defeat": { + 1: `Merke dir meine Worte. Nicht in der Lage zu sein, + $deine eigene Stärke zu messen, zeigt, dass du immer noch ein Kind bist.` + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Du schon wieder… Wie hast du mich gefunden? Team Rocket wird dich endlich aus der Welt schaffen!" + }, + "victory": { + 1: "Wie ist das möglich...? Der kostbare Traum von Team Rocket ist nicht mehr als eine Illusion geworden..." + }, + "defeat": { + 1: "Team Rocket wird niemals besiegt werden! Ich werde zurückkehren!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: `Die Welt ist nicht perfekt. Ich werde sie verbessern, indem ich sie neu erschaffe! + $Wir brauchen mehr Landmassen um zu leben! Team Magma wird dieses Ziel mit aller Macht erreichen!` + }, + "victory": { + 1:"Ugh! Das entspricht nicht meinen Berechnungen! Wie konnte ich verlieren? Wir sehen uns wieder!" + }, + "defeat": { + 1: "Team Magma wird weiterhin die Welt verbessern!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: `Du bist das letzte Hindernis, das zwischen mir und meinen Zielen steht. + $Mach dich bereit durch die Macht von Team Magma besiegt zu werden!` + }, + "victory": { + 1: "Das... Das kann nicht sein...", + }, + "defeat": { + 1: "Und jetzt werde ich diesen Planeten terraformen, um ihn ideal für die Menschheit zu machen." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Ich bin Adrian, der Anführer von Team Aqua! Wir werden die Welt mit Wasser überfluten!" + }, + "victory": { + 1: "Lass uns mal wieder treffen. Ich werde mir sicher sein, dass ich dieses Gesicht wiedererkenne." + }, + "defeat": { + 1: "Brilliant! Mein Team wird jetzt nicht zurückhalten!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Ich habe lange auf diesen Tag gewartet. Das ist die wahre Macht von Team Aqua!" + }, + "victory": { + 1: "So habe ich mir das nicht vorgestellt..." + }, + "defeat": { + 1: "Ich werde alles in dieser Welt in seinen ursprünglichen, reinen Zustand zurückversetzen!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: `Du wurdest von leerer Gefühlsduselei hierher getrieben. + $Ich werde dich bereuen lassen, auf dein Herz gehört zu haben!` + }, + "victory": { + 1: "Interessant. Und ziemlich eigenartig." + }, + "defeat": { + 1: "Ich werde meine neue Welt erschaffen..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: `So sehen wir uns wieder. Es scheint, als wären unsere Schicksale miteinander verflochten. + $Aber hier und jetzt werde ich diese Verbindung brechen!` + }, + "victory": { + 1: "Wie? Wie? WIE?!" + }, + "defeat": { + 1: "Bis bald." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1:"Ich werde nicht zulassen, dass mich jemand aufhält! Egal wer es auch sein mag!" + }, + "victory": { + 1: "Wie kann das sein? Ich bin der Schöpfer von Team Plasma! Ich bin perfekt!" + }, + "defeat": { + 1: "Ich bin der perfekte Herrscher einer perfekten neuen Welt! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Komm schon! Ich will dein Gesicht sehen, in dem Moment, in dem du alle Hoffnung verlierst!" + }, + "victory": { + 1: "Meine Berechnungen... Nein! Meine sorgfältigen Pläne! Die Welt sollte mir gehören!" + }, + "defeat": { + 1: "Kyurem! Verwende Absorptionsfusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "DU willst mich aufhalten? Dann zeig mir deine Stärke in einem Kampf!" + }, + "victory": { + 1: `Du bist hier, um mich aufzuhalten. Aber ich bitte dich zu warten. + $Ich bin so kurz davor, meine Vision zu verwirklichen.` + }, + "defeat": { + 1: "Pokémon... Sollten nicht mehr existieren." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: `Die Zukunft, die du willst, oder die Zukunft, die ich will... + $Lass uns sehen, welche mehr zu existieren verdient, sollen wir?` + }, + "victory": { + 1: "Die Zukunft, die ich erschaffen wollte... Es ist vorbei..." + }, + "defeat": { + 1: "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen." + } + }, "brock": { "encounter": { 1: "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!", diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index d2cd6965ad3..175c426143b 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -389,5 +389,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "Flammenmodul", "CHILL_DRIVE": "Gefriermodul", "DOUSE_DRIVE": "Aquamodul", + + "FIST_PLATE": "Fausttafel", + "SKY_PLATE": "Wolkentafel", + "TOXIC_PLATE": "Gifttafel", + "EARTH_PLATE": "Erdtafel", + "STONE_PLATE": "Steintafel", + "INSECT_PLATE": "Käfertafel", + "SPOOKY_PLATE": "Spuktafel", + "IRON_PLATE": "Eisentafel", + "FLAME_PLATE": "Feuertafel", + "SPLASH_PLATE": "Wassertafel", + "MEADOW_PLATE": "Wiesentafel", + "ZAP_PLATE": "Blitztafel", + "MIND_PLATE": "Hirntafel", + "ICICLE_PLATE": "Frosttafel", + "DRACO_PLATE": "Dracotafel", + "DREAD_PLATE": "Furchttafel", + "PIXIE_PLATE": "Feentafel", + "BLANK_PLATE": "Neutraltafel", + "LEGEND_PLATE": "Legendentafel", + "FIGHTING_MEMORY": "Kampf-Disc", + "FLYING_MEMORY": "Flug-Disc", + "POISON_MEMORY": "Gift-Disc", + "GROUND_MEMORY": "Boden-Disc", + "ROCK_MEMORY": "Gesteins-Disc", + "BUG_MEMORY": "Käfer-Disc", + "GHOST_MEMORY": "Geister-Disc", + "STEEL_MEMORY": "Stahl-Disc", + "FIRE_MEMORY": "Feuer-Disc", + "WATER_MEMORY": "Wasser-Disc", + "GRASS_MEMORY": "Pflanzen-Disc", + "ELECTRIC_MEMORY": "Elektro-Disc", + "PSYCHIC_MEMORY": "Psycho-Disc", + "ICE_MEMORY": "Eis-Disc", + "DRAGON_MEMORY": "Drachen-Disc", + "DARK_MEMORY": "Unlicht-Disc", + "FAIRY_MEMORY": "Feen-Disc", + "BLANK_MEMORY": "Leere-Disc", }, } as const; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index bae094563cb..a448dcedad8 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Wähle die gewünschte Attacke.", "unlockPassive": "Passiv-Skill freischalten", "reduceCost": "Preis reduzieren", - "cycleShiny": "R: Schillernd Ja/Nein", - "cycleForm": "F: Form ändern", - "cycleGender": "G: Geschlecht ändern", - "cycleAbility": "E: Fähigkeit ändern", - "cycleNature": "N: Wesen Ändern", - "cycleVariant": "V: Seltenheit ändern", + "cycleShiny": ": Schillernd", + "cycleForm": ": Form", + "cycleGender": ": Geschlecht", + "cycleAbility": ": Fähigkeit", + "cycleNature": ": Wesen", + "cycleVariant": ": Seltenheit", "enablePassive": "Passiv-Skill aktivieren", "disablePassive": "Passiv-Skill deaktivieren", "locked": "Gesperrt", diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index b7d7ec01617..b473bb94094 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = { "rival": "Rivale", "professor": "Professor", "frontier_brain": "Kampfkoryphäen", + "rocket_boss": "Rocket-Boss", + "magma_boss": "Magma-Boss", + "aqua_boss": "Aqua-Boss", + "galactic_boss": "Galaktik-Boss", + "plasma_boss": "Weiser von Team Plasma", // This is on purpose, since "Ghetsis" is never mentioned as the boss of team plasma in the game but as "Weiser" + "flare_boss": "Flare-Boss", // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; @@ -118,7 +124,25 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Arbeiter", "worker_female": "Arbeiterin", "workers": "Arbeiter", - "youngster": "Knirps" + "youngster": "Knirps", + "rocket_grunt": "Rüpel von Team Rocket", + "rocket_grunt_female": "Rüpel von Team Rocket", + "rocket_grunts": "Rüpel von Team Rocket", + "magma_grunt": "Rüpel von Team Magma", + "magma_grunt_female": "Rüpel von Team Magma", + "magma_grunts": "Rüpel von Team Magma", + "aqua_grunt": "Rüpel von Team Aqua", + "aqua_grunt_female": "Rüpel von Team Aqua", + "aqua_grunts": "Rüpel von Team Aqua", + "galactic_grunt": "Rüpel von Team Galaktik", + "galactic_grunt_female": "Rüpel von Team Galaktik", + "galactic_grunts": "Rüpel von Team Galaktik", + "plasma_grunt": "Rüpel von Team Plasma", + "plasma_grunt_female": "Rüpel von Team Plasma", + "plasma_grunts": "Rüpel von Team Plasma", + "flare_grunt": "Rüpel von Team Flare", + "flare_grunt_female": "Rüpel von Team Flare", + "flare_grunts": "Rüpel von Team Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -247,6 +271,11 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Delion", "rival": "Finn", "rival_female": "Ivy", + "maxie": "Marc", + "archie": "Adrian", + "cyrus": "Zyrus", + "ghetsis": "G-Cis", + "lysandre": "Flordelis", // Double Names "blue_red_double": "Blau & Rot", diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index 86167da696c..abf95193bc9 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 2a6923d82cd..87d4a0ccf4f 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -388,5 +388,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "Burn Drive", "CHILL_DRIVE": "Chill Drive", "DOUSE_DRIVE": "Douse Drive", + + "FIST_PLATE": "Fist Plate", + "SKY_PLATE": "Sky Plate", + "TOXIC_PLATE": "Toxic Plate", + "EARTH_PLATE": "Earth Plate", + "STONE_PLATE": "Stone Plate", + "INSECT_PLATE": "Insect Plate", + "SPOOKY_PLATE": "Spooky Plate", + "IRON_PLATE": "Iron Plate", + "FLAME_PLATE": "Flame Plate", + "SPLASH_PLATE": "Splash Plate", + "MEADOW_PLATE": "Meadow Plate", + "ZAP_PLATE": "Zap Plate", + "MIND_PLATE": "Mind Plate", + "ICICLE_PLATE": "Icicle Plate", + "DRACO_PLATE": "Draco Plate", + "DREAD_PLATE": "Dread Plate", + "PIXIE_PLATE": "Pixie Plate", + "BLANK_PLATE": "Blank Plate", + "LEGEND_PLATE": "Legend Plate", + "FIGHTING_MEMORY": "Fighting Memory", + "FLYING_MEMORY": "Flying Memory", + "POISON_MEMORY": "Poison Memory", + "GROUND_MEMORY": "Ground Memory", + "ROCK_MEMORY": "Rock Memory", + "BUG_MEMORY": "Bug Memory", + "GHOST_MEMORY": "Ghost Memory", + "STEEL_MEMORY": "Steel Memory", + "FIRE_MEMORY": "Fire Memory", + "WATER_MEMORY": "Water Memory", + "GRASS_MEMORY": "Grass Memory", + "ELECTRIC_MEMORY": "Electric Memory", + "PSYCHIC_MEMORY": "Psychic Memory", + "ICE_MEMORY": "Ice Memory", + "DRAGON_MEMORY": "Dragon Memory", + "DARK_MEMORY": "Dark Memory", + "FAIRY_MEMORY": "Fairy Memory", + "BLANK_MEMORY": "Blank Memory", }, } as const; diff --git a/src/locales/en/pokemon-info-container.ts b/src/locales/en/pokemon-info-container.ts index 068c9ebb431..6b3ef954f58 100644 --- a/src/locales/en/pokemon-info-container.ts +++ b/src/locales/en/pokemon-info-container.ts @@ -7,5 +7,6 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "nature": "Nature:", "epic": "Epic", "rare": "Rare", - "common": "Common" + "common": "Common", + "form": "Form:" } as const; diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index f001c621cc4..fd2eb6c40df 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Select a move to swap with", "unlockPassive": "Unlock Passive", "reduceCost": "Reduce Cost", - "cycleShiny": ": Cycle Shiny", - "cycleForm": ": Cycle Form", - "cycleGender": ": Cycle Gender", - "cycleAbility": ": Cycle Ability", - "cycleNature": ": Cycle Nature", - "cycleVariant": ": Cycle Variant", + "cycleShiny": ": Shiny", + "cycleForm": ": Form", + "cycleGender": ": Gender", + "cycleAbility": ": Ability", + "cycleNature": ": Nature", + "cycleVariant": ": Variant", "enablePassive": "Enable Passive", "disablePassive": "Disable Passive", "locked": "Locked", diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 701980f8d37..39ca5f7512c 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = { "rival": "Rival", "professor": "Professor", "frontier_brain": "Frontier Brain", + "rocket_boss": "Team Rocket Boss", + "magma_boss": "Team Magma Boss", + "aqua_boss": "Team Aqua Boss", + "galactic_boss": "Team Galactic Boss", + "plasma_boss": "Team Plasma Boss", + "flare_boss": "Team Flare Boss", // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; @@ -118,7 +124,19 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Worker", "worker_female": "Worker", "workers": "Workers", - "youngster": "Youngster" + "youngster": "Youngster", + "rocket_grunt": "Rocket Grunt", + "rocket_grunt_female": "Rocket Grunt", + "magma_grunt": "Magma Grunt", + "magma_grunt_female": "Magma Grunt", + "aqua_grunt": "Aqua Grunt", + "aqua_grunt_female": "Aqua Grunt", + "galactic_grunt": "Galactic Grunt", + "galactic_grunt_female": "Galactic Grunt", + "plasma_grunt": "Plasma Grunt", + "plasma_grunt_female": "Plasma Grunt", + "flare_grunt": "Flare Grunt", + "flare_grunt_female": "Flare Grunt", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -247,6 +265,11 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Leon", "rival": "Finn", "rival_female": "Ivy", + "maxie": "Maxie", + "archie": "Archie", + "cyrus": "Cyrus", + "ghetsis": "Ghetsis", + "lysandre": "Lysandre", // Double Names "blue_red_double": "Blue & Red", diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index 3ede2cd9cf3..e6dde7ad79f 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -4,5 +4,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", "badDreams": "¡{{pokemonName}} está atormentado!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!" } as const; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index e00a55740a5..3c1925eaa67 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -388,5 +388,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "PiroROM", "CHILL_DRIVE": "CrioROM", "DOUSE_DRIVE": "HidroROM", + + "FIST_PLATE": "Tabla Fuerte", + "SKY_PLATE": "Tabla Cielo", + "TOXIC_PLATE": "Tabla Tóxica", + "EARTH_PLATE": "Tabla Terrax", + "STONE_PLATE": "Tabla Pétrea", + "INSECT_PLATE": "Tabla Bicho", + "SPOOKY_PLATE": "Tabla Terror", + "IRON_PLATE": "Tabla Acero", + "FLAME_PLATE": "Tabla Llama", + "SPLASH_PLATE": "Tabla Linfa", + "MEADOW_PLATE": "Tabla Pradal", + "ZAP_PLATE": "Tabla Trueno", + "MIND_PLATE": "Tabla Mental", + "ICICLE_PLATE": "Tabla Helada", + "DRACO_PLATE": "Tabla Draco", + "DREAD_PLATE": "Tabla Oscura", + "PIXIE_PLATE": "Tabla Duende", + "BLANK_PLATE": "Tabla Neutra", + "LEGEND_PLATE": "Tabla Legendaria", + "FIGHTING_MEMORY": "Disco Lucha", + "FLYING_MEMORY": "Disco Volador", + "POISON_MEMORY": "Disco Veneno", + "GROUND_MEMORY": "Disco Tierra", + "ROCK_MEMORY": "Disco Roca", + "BUG_MEMORY": "Disco Bicho", + "GHOST_MEMORY": "Disco Fantasma", + "STEEL_MEMORY": "Disco Acero", + "FIRE_MEMORY": "Disco Fuego", + "WATER_MEMORY": "Disco Agua", + "GRASS_MEMORY": "Disco Planta", + "ELECTRIC_MEMORY": "Disco Eléctrico", + "PSYCHIC_MEMORY": "Disco Psíquico", + "ICE_MEMORY": "Disco Hielo", + "DRAGON_MEMORY": "Disco Dragón", + "DARK_MEMORY": "Disco Siniestro", + "FAIRY_MEMORY": "Disco Hada", + "BLANK_MEMORY": "Disco Blanco", }, } as const; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index e41f151965a..4d025820260 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Elige el movimiento que sustituirá a", "unlockPassive": "Añadir Pasiva", "reduceCost": "Reducir Coste", - "cycleShiny": ": Cambiar Shiny", - "cycleForm": ": Cambiar Forma", - "cycleGender": ": Cambiar Género", - "cycleAbility": ": Cambiar Habilidad", - "cycleNature": ": Cambiar Naturaleza", - "cycleVariant": ": Cambiar Variante", + "cycleShiny": ": Shiny", + "cycleForm": ": Forma", + "cycleGender": ": Género", + "cycleAbility": ": Habilidad", + "cycleNature": ": Naturaleza", + "cycleVariant": ": Variante", "enablePassive": "Activar Pasiva", "disablePassive": "Desactivar Pasiva", "locked": "Bloqueado", diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 7accfbc849b..766629b88d8 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -388,5 +388,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "Module Pyro", "CHILL_DRIVE": "Module Cryo", "DOUSE_DRIVE": "Module Aqua", + + "FIST_PLATE": "Plaque Poing", + "SKY_PLATE": "Plaque Ciel", + "TOXIC_PLATE": "Plaque Toxicité", + "EARTH_PLATE": "Plaque Terre", + "STONE_PLATE": "Plaque Roc", + "INSECT_PLATE": "Plaque Insecte", + "SPOOKY_PLATE": "Plaque Fantôme", + "IRON_PLATE": "Plaque Fer", + "FLAME_PLATE": "Plaque Flamme", + "SPLASH_PLATE": "Plaque Hydro", + "MEADOW_PLATE": "Plaque Herbe", + "ZAP_PLATE": "Plaque Volt", + "MIND_PLATE": "Plaque Esprit", + "ICICLE_PLATE": "Plaque Glace", + "DRACO_PLATE": "Plaque Draco", + "DREAD_PLATE": "Plaque Ombre", + "PIXIE_PLATE": "Plaque Pixie", + "BLANK_PLATE": "Plaque Renouveau", + "LEGEND_PLATE": "Plaque Légende", + "FIGHTING_MEMORY": "ROM Combat", + "FLYING_MEMORY": "ROM Vol", + "POISON_MEMORY": "ROM Poison", + "GROUND_MEMORY": "ROM Sol", + "ROCK_MEMORY": "ROM Roche", + "BUG_MEMORY": "ROM Insecte", + "GHOST_MEMORY": "ROM Spectre", + "STEEL_MEMORY": "ROM Acier", + "FIRE_MEMORY": "ROM Feu", + "WATER_MEMORY": "ROM Eau", + "GRASS_MEMORY": "ROM Plante", + "ELECTRIC_MEMORY": "ROM Électrik", + "PSYCHIC_MEMORY": "ROM Psy", + "ICE_MEMORY": "ROM Glace", + "DRAGON_MEMORY": "ROM Dragon", + "DARK_MEMORY": "ROM Ténèbres", + "FAIRY_MEMORY": "ROM Fée", + "BLANK_MEMORY": "ROM Vierge", }, } as const; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 746f4a31eed..b16604200f8 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -388,5 +388,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "Piromodulo", "CHILL_DRIVE": "Gelomodulo", "DOUSE_DRIVE": "Idromodulo", + + "FIST_PLATE": "Lastrapugno", + "SKY_PLATE": "Lastracielo", + "TOXIC_PLATE": "Lastrafiele", + "EARTH_PLATE": "Lastrageo", + "STONE_PLATE": "Lastrapietra", + "INSECT_PLATE": "Lastrabaco", + "SPOOKY_PLATE": "Lastratetra", + "IRON_PLATE": "Lastraferro", + "FLAME_PLATE": "Lastrarogo", + "SPLASH_PLATE": "Lastraidro", + "MEADOW_PLATE": "Lastraprato", + "ZAP_PLATE": "Lastrasaetta", + "MIND_PLATE": "Lastramente", + "ICICLE_PLATE": "Lastragelo", + "DRACO_PLATE": "Lastradrakon", + "DREAD_PLATE": "Lastratimore", + "PIXIE_PLATE": "Lastraspiritello", + "BLANK_PLATE": "Lastraripristino", + "LEGEND_PLATE": "Lastraleggenda", + "FIGHTING_MEMORY": "ROM Lotta", + "FLYING_MEMORY": "ROM Volante", + "POISON_MEMORY": "ROM Veleno", + "GROUND_MEMORY": "ROM Terra", + "ROCK_MEMORY": "ROM Roccia", + "BUG_MEMORY": "ROM Coleottero", + "GHOST_MEMORY": "ROM Spettro", + "STEEL_MEMORY": "ROM Acciaio", + "FIRE_MEMORY": "ROM Fuoco", + "WATER_MEMORY": "ROM Acqua", + "GRASS_MEMORY": "ROM Erba", + "ELECTRIC_MEMORY": "ROM Elettro", + "PSYCHIC_MEMORY": "ROM Psico", + "ICE_MEMORY": "ROM Ghiaccio", + "DRAGON_MEMORY": "ROM Drago", + "DARK_MEMORY": "ROM Buio", + "FAIRY_MEMORY": "ROM Folletto", + "BLANK_MEMORY": "ROM Vuota", }, } as const; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index ae406183a90..16061766f30 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Seleziona una mossa da scambiare con", "unlockPassive": "Sblocca Passiva", "reduceCost": "Riduci Costo", - "cycleShiny": ": Alterna Shiny", - "cycleForm": ": Alterna Forma", - "cycleGender": ": Alterna Sesso", - "cycleAbility": ": Alterna Abilità", - "cycleNature": ": Alterna Natura", - "cycleVariant": ": Alterna Variante", + "cycleShiny": ": Shiny", + "cycleForm": ": Forma", + "cycleGender": ": Sesso", + "cycleAbility": ": Abilità", + "cycleNature": ": Natura", + "cycleVariant": ": Variante", "enablePassive": "Attiva Passiva", "disablePassive": "Disattiva Passiva", "locked": "Bloccato", diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts index e1e9ae74ece..295c4cf72a1 100644 --- a/src/locales/ko/achv.ts +++ b/src/locales/ko/achv.ts @@ -171,98 +171,98 @@ export const PGMachv: AchievementTranslationEntries = { }, "MONO_GEN_ONE": { - name: "The Original Rival", - description: "Complete the generation one only challenge.", + name: "근본 라이벌", + description: "1세대 챌린지 모드 클리어.", }, "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Complete the generation two only challenge.", + name: "이거 1.5세대죠?", + description: "2세대 챌린지 모드 클리어.", }, "MONO_GEN_THREE": { name: "Too much water?", - description: "Complete the generation three only challenge.", + description: "3세대 챌린지 모드 클리어.", }, "MONO_GEN_FOUR": { - name: "Is she really the hardest?", - description: "Complete the generation four only challenge.", + name: "난천이 진짜 최강인가요?", + description: "4세대 챌린지 모드 클리어.", }, "MONO_GEN_FIVE": { - name: "All Original", - description: "Complete the generation five only challenge.", + name: "100% 오리지널!", + description: "5세대 챌린지 모드 클리어.", }, "MONO_GEN_SIX": { - name: "Almost Royalty", - description: "Complete the generation six only challenge.", + name: "크루아상 안에 뭐 들었나요?", + description: "6세대 챌린지 모드 클리어.", }, "MONO_GEN_SEVEN": { - name: "Only Technically", - description: "Complete the generation seven only challenge.", + name: "기술적으로는…", + description: "7세대 챌린지 모드 클리어.", }, "MONO_GEN_EIGHT": { - name: "A Champion Time!", - description: "Complete the generation eight only challenge.", + name: "챔피언 타임!", + description: "8세대 챌린지 모드 클리어.", }, "MONO_GEN_NINE": { - name: "She was going easy on you", - description: "Complete the generation nine only challenge.", + name: "걔, 봐 준 거야", + description: "9세대 챌린지 모드 클리어.", }, "MonoType": { - description: "Complete the {{type}} monotype challenge.", + description: "{{type}} 타입 챌린지 모드 클리어.", }, "MONO_NORMAL": { - name: "Mono NORMAL", + name: "심플한 것이 가장 강한 것", }, "MONO_FIGHTING": { - name: "I Know Kung Fu", + name: "태권도 할 줄 알아요", }, "MONO_FLYING": { - name: "Mono FLYING", + name: "추락하는 것은 날개가 있다", }, "MONO_POISON": { - name: "Kanto's Favourite", + name: "관동 지방 최애 타입", }, "MONO_GROUND": { - name: "Mono GROUND", + name: "전기 안 통해요", }, "MONO_ROCK": { - name: "Brock Hard", + name: "웅골참", }, "MONO_BUG": { - name: "Sting Like A Beedrill", + name: "독침붕처럼 쏴라", }, "MONO_GHOST": { - name: "Who you gonna call?", + name: "누굴 부를 거야?", }, "MONO_STEEL": { - name: "Mono STEEL", + name: "강철 심장", }, "MONO_FIRE": { - name: "Mono FIRE", + name: "불타오르네", }, "MONO_WATER": { - name: "When It Rains, It Pours", + name: "물 들어올 때 노 젓기", }, "MONO_GRASS": { - name: "Mono GRASS", + name: "초록은 동색", }, "MONO_ELECTRIC": { - name: "Mono ELECTRIC", + name: "찌릿찌릿", }, "MONO_PSYCHIC": { - name: "Mono PSYCHIC", + name: "1세대 최강", }, "MONO_ICE": { - name: "Mono ICE", + name: "얼음땡", }, "MONO_DRAGON": { - name: "Mono DRAGON", + name: "용용 죽겠지", }, "MONO_DARK": { - name: "It's just a phase", + name: "어둠의 다크", }, "MONO_FAIRY": { - name: "Mono FAIRY", + name: "설마 자시안으로?", }, } as const; diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index cc91141718c..1f88a895c7c 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -58,5 +58,7 @@ export const battle: SimpleTranslationEntries = { "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", "wildPokemonWithAffix": "야생 {{pokemonName}}", "foePokemonWithAffix": "상대 {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!" + "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", + "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", + "regainHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!" } as const; diff --git a/src/locales/ko/challenges.ts b/src/locales/ko/challenges.ts index 7c7f6199b1d..3dad36fd8d1 100644 --- a/src/locales/ko/challenges.ts +++ b/src/locales/ko/challenges.ts @@ -14,7 +14,7 @@ export const challenges: SimpleTranslationEntries = { "singleGeneration.value.3": "3세대", "singleGeneration.desc.3": "3세대의 포켓몬만 사용할 수 있습니다.", "singleGeneration.value.4": "4세대", - "singleGeneration.desc.4": "4세대의 포켓몬만 사용할 수 있습니다r", + "singleGeneration.desc.4": "4세대의 포켓몬만 사용할 수 있습니다.", "singleGeneration.value.5": "5세대", "singleGeneration.desc.5": "5세대의 포켓몬만 사용할 수 있습니다.", "singleGeneration.value.6": "6세대", diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index 73c9a7facba..8dd0fea4f98 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -223,7 +223,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "살아있는 산같은… 큰 체격을 부모님이 물려주셨죠…", }, "victory": { - 1: "적어도 BMI에 대하서는 질 수 없습니다!", + 1: "적어도 BMI에 대해서는 질 수 없습니다!", 2: "부족해… 절대로 충분하지 않아. 저의 콜레스테롤이 부족합니다…" }, }, @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "내가 뱃멀미가 나는 것 같군…" }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "내 전문인 바위 타입 포켓몬으로 널 쓰러뜨려줄게! 덤벼!", diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index da8d0cb983a..a4786f86176 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -425,5 +425,6 @@ export const modifierType: ModifierTypeTranslationEntries = { "DRAGON_MEMORY": "드래곤메모리", "DARK_MEMORY": "다크메모리", "FAIRY_MEMORY": "페어리메모리", + "BLANK_MEMORY": "빈메모리", }, } as const; diff --git a/src/locales/ko/pokemon-info-container.ts b/src/locales/ko/pokemon-info-container.ts index 5882561bdd8..c1477ffc08b 100644 --- a/src/locales/ko/pokemon-info-container.ts +++ b/src/locales/ko/pokemon-info-container.ts @@ -7,5 +7,6 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "nature": "성격:", "epic": "에픽", "rare": "레어", - "common": "커먼" + "common": "커먼", + "form": "폼:" } as const; diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index 41001488458..587baa3abc4 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -31,11 +31,11 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", "cycleShiny": ": 특별한 색", - "cycleForm": ": 폼 체인지", - "cycleGender": ": 암수 전환", - "cycleAbility": ": 특성 전환", - "cycleNature": ": 성격 전환", - "cycleVariant": ": 색상 전환", + "cycleForm": ": 폼", + "cycleGender": ": 암수", + "cycleAbility": ": 특성", + "cycleNature": ": 성격", + "cycleVariant": ": 색상", "enablePassive": "패시브 활성화", "disablePassive": "패시브 비활성화", "locked": "잠김", diff --git a/src/locales/ko/trainers.ts b/src/locales/ko/trainers.ts index 0bc99640333..2a61627c5a7 100644 --- a/src/locales/ko/trainers.ts +++ b/src/locales/ko/trainers.ts @@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = { "rival": "라이벌", "professor": "박사", "frontier_brain": "프런티어 브레인", + "rocket_boss": "로켓단 보스", + "magma_boss": "마그마단 보스", + "aqua_boss": "아쿠아단 보스", + "galactic_boss": "갤럭시단 보스", + "plasma_boss": "플라스마단 보스", + "flare_boss": "플레어단 보스", // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; @@ -48,7 +54,7 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "역무원", "doctor": "의사", "doctor_female": "간호사", // doctor_f.png 파일이 간호사 - "firebreather": "Firebreather", + "firebreather": "불놀이꾼", "fisherman": "낚시꾼", "fisherman_female": "낚시꾼", "gentleman": "신사", @@ -118,7 +124,19 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "작업원", "worker_female": "작업원", "workers": "작업원", - "youngster": "반바지 꼬마" + "youngster": "반바지 꼬마", + "rocket_grunt": "로켓단 조무래기", + "rocket_grunt_female": "로켓단 조무래기", + "magma_grunt": "마그마단 조무래기", + "magma_grunt_female": "마그마단 조무래기", + "aqua_grunt": "아쿠아단 조무래기", + "aqua_grunt_female": "아쿠아단 조무래기", + "galactic_grunt": "갤럭시단 조무래기", + "galactic_grunt_female": "갤럭시단 조무래기", + "plasma_grunt": "플라스마단 조무래기", + "plasma_grunt_female": "플라스마단 조무래기", + "flare_grunt": "플레어단 조무래기", + "flare_grunt_female": "플레어단 조무래기", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -247,6 +265,11 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "단델", "rival": "핀", "rival_female": "아이비", + "maxie": "마적", + "archie": "아강", + "cyrus": "태홍", + "ghetsis": "게치스", + "lysandre": "플라드리", // Double Names "blue_red_double": "그린 & 레드", diff --git a/src/locales/ko/tutorial.ts b/src/locales/ko/tutorial.ts index 70702aa1698..1e0f8af3ce1 100644 --- a/src/locales/ko/tutorial.ts +++ b/src/locales/ko/tutorial.ts @@ -23,7 +23,8 @@ export const tutorial: SimpleTranslationEntries = { statChange: `포켓몬은 교체하지 않으면 다음 전투에서도 능력치 변화가 유지됩니다. $대신 트레이너 배틀이나 새로운 바이옴 입장 직전에 자동으로 들여보내지게 됩니다. $C 또는 Shift를 꾹 눌러 현재 포켓몬의 능력치 변화를 볼 수도 있습니다. - $V를 눌러 상대방이 사용했던 기술도 확인하여 전투를 유리하게 이끌어봅시다.`, + $V를 눌러 상대방이 사용했던 기술도 확인할 수 있습니다. + $단, 이번 배틀에서 상대 포켓몬이 이미 사용한 기술만 나타납니다.`, selectItem: `전투가 끝날때마다 무작위 아이템 3개 중 하나를 선택하여 얻습니다. $종류는 소모품, 포켓몬의 지닌 도구, 영구적 패시브 아이템에 이르기까지 다양합니다. diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index 41e2b84725b..b0df31d5f65 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -388,5 +388,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "IgneDisco", "CHILL_DRIVE": "CrioDisco", "DOUSE_DRIVE": "HidroDisco", + + "FIST_PLATE": "Placa de Punho", + "SKY_PLATE": "Placa do Céu", + "TOXIC_PLATE": "Placa Tóxica", + "EARTH_PLATE": "Placa Terrestre", + "STONE_PLATE": "Placa de Pedra", + "INSECT_PLATE": "Placa de Insetos", + "SPOOKY_PLATE": "Placa Assustadora", + "IRON_PLATE": "Placa de Ferro", + "FLAME_PLATE": "Placa da Chama", + "SPLASH_PLATE": "Placa de Respingo", + "MEADOW_PLATE": "Placa de Prado", + "ZAP_PLATE": "Placa Elétrica", + "MIND_PLATE": "Placa Mental", + "ICICLE_PLATE": "Placa de Gelo", + "DRACO_PLATE": "Placa de Draco", + "DREAD_PLATE": "Placa do Pavor", + "PIXIE_PLATE": "Placa Duende", + "BLANK_PLATE": "Placa em Branco", + "LEGEND_PLATE": "Placa de Legenda", + "FIGHTING_MEMORY": "Memória de Lutador", + "FLYING_MEMORY": "Memória Voadora", + "POISON_MEMORY": "Memória Venenosa", + "GROUND_MEMORY": "Memória Terrestre", + "ROCK_MEMORY": "Memória da Rocha", + "BUG_MEMORY": "Memória de Insetos", + "GHOST_MEMORY": "Memória Fantasma", + "STEEL_MEMORY": "Memória de Aço", + "FIRE_MEMORY": "Memória de Fogo", + "WATER_MEMORY": "Memória da Água", + "GRASS_MEMORY": "Memória de Planta", + "ELECTRIC_MEMORY": "Memória Elétrica", + "PSYCHIC_MEMORY": "Memória Psíquica", + "ICE_MEMORY": "Memória de Gelo", + "DRAGON_MEMORY": "Memória do Dragão", + "DARK_MEMORY": "Memória Negra", + "FAIRY_MEMORY": "Memória de Fada", + "BLANK_MEMORY": "Memória Vazia", }, } as const; diff --git a/src/locales/zh_CN/achv.ts b/src/locales/zh_CN/achv.ts index bf1bfc295e8..d9a8cbee1b3 100644 --- a/src/locales/zh_CN/achv.ts +++ b/src/locales/zh_CN/achv.ts @@ -3,266 +3,266 @@ import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { "Achievements": { - name: "Achievements", + name: "成就", }, "Locked": { - name: "Locked", + name: "锁定", }, "MoneyAchv": { - description: "Accumulate a total of ₽{{moneyAmount}}", + description: "累计获得 ₽{{moneyAmount}}", }, "10K_MONEY": { - name: "Money Haver", + name: "小有积蓄", }, "100K_MONEY": { - name: "Rich", + name: "富裕", }, "1M_MONEY": { - name: "Millionaire", + name: "百万富翁", }, "10M_MONEY": { - name: "One Percenter", + name: "百分之一", }, "DamageAchv": { - description: "Inflict {{damageAmount}} damage in one hit", + description: "在单次攻击中造成 {{damageAmount}} 点伤害", }, "250_DMG": { - name: "Hard Hitter", + name: "强力攻击者", }, "1000_DMG": { - name: "Harder Hitter", + name: "更强力攻击者", }, "2500_DMG": { - name: "That's a Lotta Damage!", + name: "伤害真高!", }, "10000_DMG": { - name: "One Punch Man", + name: "一拳超人", }, "HealAchv": { - description: "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item", + description: "通过技能、能力或携带的道具一次性治疗 {{healAmount}} {{HP}}点", }, "250_HEAL": { - name: "Novice Healer", + name: "新手治疗师", }, "1000_HEAL": { - name: "Big Healer", + name: "高阶治疗师", }, "2500_HEAL": { - name: "Cleric", + name: "牧师", }, "10000_HEAL": { - name: "Recovery Master", + name: "恢复大师", }, "LevelAchv": { - description: "Level up a Pokémon to Lv{{level}}", + description: "将一只宝可梦提升到 Lv{{level}}", }, "LV_100": { - name: "But Wait, There's More!", + name: "不止于此, 还有更多!", }, "LV_250": { - name: "Elite", + name: "精英", }, "LV_1000": { - name: "To Go Even Further Beyond", + name: "超越极限", }, "RibbonAchv": { - description: "Accumulate a total of {{ribbonAmount}} Ribbons", + description: "累计获得 {{ribbonAmount}} 个勋章", }, "10_RIBBONS": { - name: "Pokémon League Champion", + name: "宝可梦联赛冠军", }, "25_RIBBONS": { - name: "Great League Champion", + name: "超级联赛冠军", }, "50_RIBBONS": { - name: "Ultra League Champion", + name: "至尊联赛冠军", }, "75_RIBBONS": { - name: "Rogue League Champion", + name: "肉鸽联赛冠军", }, "100_RIBBONS": { - name: "Master League Champion", + name: "大师联赛冠军", }, "TRANSFER_MAX_BATTLE_STAT": { - name: "Teamwork", + name: "团队协作", description: "Baton pass to another party member with at least one stat maxed out", }, "MAX_FRIENDSHIP": { - name: "Friendmaxxing", - description: "Reach max friendship on a Pokémon", + name: "亲密度最大化", + description: "使一只宝可梦的亲密度达到最大值", }, "MEGA_EVOLVE": { - name: "Megamorph", - description: "Mega evolve a Pokémon", + name: "Mega进化", + description: "Mega进化一只宝可梦", }, "GIGANTAMAX": { - name: "Absolute Unit", - description: "Gigantamax a Pokémon", + name: "极巨化", + description: "极巨化一只宝可梦", }, "TERASTALLIZE": { - name: "STAB Enthusiast", - description: "Terastallize a Pokémon", + name: "太晶狂热者", + description: "太晶化一只宝可梦", }, "STELLAR_TERASTALLIZE": { - name: "The Hidden Type", - description: "Stellar Terastallize a Pokémon", + name: "隐藏属性", + description: "星晶化一只宝可梦", }, "SPLICE": { - name: "Infinite Fusion", - description: "Splice two Pokémon together with DNA Splicers", + name: "无限融合", + description: "使用基因之楔将两只宝可梦融合在一起", }, "MINI_BLACK_HOLE": { - name: "A Hole Lot of Items", - description: "Acquire a Mini Black Hole", + name: "巨量道具", + description: "获得一个迷你黑洞", }, "CATCH_MYTHICAL": { - name: "Mythical", - description: "Catch a mythical Pokémon", + name: "幻之宝可梦", + description: "捕捉一只幻之宝可梦", }, "CATCH_SUB_LEGENDARY": { - name: "(Sub-)Legendary", - description: "Catch a sub-legendary Pokémon", + name: "准-传说宝可梦", + description: "捕捉一只准传说宝可梦", }, "CATCH_LEGENDARY": { - name: "Legendary", - description: "Catch a legendary Pokémon", + name: "传说宝可梦", + description: "捕捉一只传说宝可梦", }, "SEE_SHINY": { - name: "Shiny", - description: "Find a shiny Pokémon in the wild", + name: "异色宝可梦", + description: "在野外找到一只异色宝可梦", }, "SHINY_PARTY": { - name: "That's Dedication", - description: "Have a full party of shiny Pokémon", + name: "全队异色", + description: "拥有一支由异色宝可梦组成的满员队伍", }, "HATCH_MYTHICAL": { - name: "Mythical Egg", - description: "Hatch a mythical Pokémon from an egg", + name: "幻之蛋", + description: "从蛋中孵化出一只幻之宝可梦", }, "HATCH_SUB_LEGENDARY": { - name: "Sub-Legendary Egg", - description: "Hatch a sub-legendary Pokémon from an egg", + name: "准-传说蛋", + description: "从蛋中孵化出一只准传说宝可梦", }, "HATCH_LEGENDARY": { - name: "Legendary Egg", - description: "Hatch a legendary Pokémon from an egg", + name: "传说蛋", + description: "从蛋中孵化出一只准-传说宝可梦", }, "HATCH_SHINY": { - name: "Shiny Egg", - description: "Hatch a shiny Pokémon from an egg", + name: "异色蛋", + description: "从蛋中孵化出一只异色宝可梦", }, "HIDDEN_ABILITY": { - name: "Hidden Potential", - description: "Catch a Pokémon with a hidden ability", + name: "隐藏潜力", + description: "捕捉一只拥有隐藏特性的宝可梦", }, "PERFECT_IVS": { - name: "Certificate of Authenticity", - description: "Get perfect IVs on a Pokémon", + name: "完美个体", + description: "获得一只拥有完美个体值的宝可梦", }, "CLASSIC_VICTORY": { - name: "Undefeated", - description: "Beat the game in classic mode", + name: "经典无敌", + description: "在经典模式中通关游戏", }, "MONO_GEN_ONE": { - name: "The Original Rival", - description: "Complete the generation one only challenge.", + name: "初代劲敌", + description: "完成仅限第一世代的挑战.", }, "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Complete the generation two only challenge.", + name: "1.5世代", + description: "完成仅限第二世代的挑战.", }, "MONO_GEN_THREE": { - name: "Too much water?", - description: "Complete the generation three only challenge.", + name: "水太多了?", + description: "完成仅限第三世代的挑战.", }, "MONO_GEN_FOUR": { - name: "Is she really the hardest?", - description: "Complete the generation four only challenge.", + name: "她真的是最难的吗?", + description: "完成仅限第四世代的挑战.", }, "MONO_GEN_FIVE": { - name: "All Original", - description: "Complete the generation five only challenge.", + name: "全为原创", + description: "完成仅限第五世代的挑战.", }, "MONO_GEN_SIX": { - name: "Almost Royalty", - description: "Complete the generation six only challenge.", + name: "近乎贵族", + description: "完成仅限第六世代的挑战.", }, "MONO_GEN_SEVEN": { - name: "Only Technically", - description: "Complete the generation seven only challenge.", + name: "仅技术上(可行)", + description: "完成仅限第七世代的挑战.", }, "MONO_GEN_EIGHT": { - name: "A Champion Time!", - description: "Complete the generation eight only challenge.", + name: "冠军时刻!", + description: "完成仅限第八世代的挑战.", }, "MONO_GEN_NINE": { - name: "She was going easy on you", - description: "Complete the generation nine only challenge.", + name: "她对你手下留情了", + description: "完成仅限第九世代的挑战.", }, "MonoType": { - description: "Complete the {{type}} monotype challenge.", + description: "完成 {{type}} 单属性挑战.", }, "MONO_NORMAL": { - name: "Mono NORMAL", + name: "Mono 一般", }, "MONO_FIGHTING": { - name: "I Know Kung Fu", + name: "功夫高手", }, "MONO_FLYING": { - name: "Mono FLYING", + name: "Mono 飞行", }, "MONO_POISON": { - name: "Kanto's Favourite", + name: "关东的最爱", }, "MONO_GROUND": { - name: "Mono GROUND", + name: "Mono 地面", }, "MONO_ROCK": { - name: "Brock Hard", + name: "坚如磐石", }, "MONO_BUG": { - name: "Sting Like A Beedrill", + name: "如大针蜂般刺痛", }, "MONO_GHOST": { - name: "Who you gonna call?", + name: "你将要召唤谁?", }, "MONO_STEEL": { - name: "Mono STEEL", + name: "Mono 钢", }, "MONO_FIRE": { - name: "Mono FIRE", + name: "Mono 火", }, "MONO_WATER": { - name: "When It Rains, It Pours", + name: "当雨来临,倾盆而下", }, "MONO_GRASS": { - name: "Mono GRASS", + name: "Mono 草", }, "MONO_ELECTRIC": { - name: "Mono ELECTRIC", + name: "Mono 电", }, "MONO_PSYCHIC": { - name: "Mono PSYCHIC", + name: "Mono 超能力", }, "MONO_ICE": { - name: "Mono ICE", + name: "Mono 冰", }, "MONO_DRAGON": { - name: "Mono DRAGON", + name: "Mono 龙", }, "MONO_DARK": { - name: "It's just a phase", + name: "这只是一个阶段", }, "MONO_FAIRY": { - name: "Mono FAIRY", + name: "Mono 妖精", }, } as const; diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index 0810b6f1eeb..8793f5177d7 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -23,7 +23,7 @@ export const challenges: SimpleTranslationEntries = { "singleGeneration.desc.7": "你只能使用第七世代的宝可梦", "singleGeneration.value.8": "第八世代", "singleGeneration.desc.8": "你只能使用第八世代的宝可梦", - "singleGeneration.value.9": "第久世代", + "singleGeneration.value.9": "第九世代", "singleGeneration.desc.9": "你只能使用第九世代的宝可梦", "singleType.name": "单属性", "singleType.value.0": "关闭", @@ -39,7 +39,7 @@ export const challenges: SimpleTranslationEntries = { "singleType.value.5": "地面", "singleType.desc.5": "你只能使用地面属性的宝可梦", "singleType.value.6": "岩石", - "singleType.desc.6": "你只能使用所选属性的宝可梦", + "singleType.desc.6": "你只能使用岩石属性的宝可梦", "singleType.value.7": "虫", "singleType.desc.7": "你只能使用虫属性的宝可梦", "singleType.value.8": "幽灵", diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 597d10c9337..65696098ad7 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -388,5 +388,43 @@ export const modifierType: ModifierTypeTranslationEntries = { "BURN_DRIVE": "火焰卡带", "CHILL_DRIVE": "冰冻卡带", "DOUSE_DRIVE": "水流卡带", + + "FIST_PLATE": "拳头石板", + "SKY_PLATE": "蓝天石板", + "TOXIC_PLATE": "剧毒石板", + "EARTH_PLATE": "大地石板", + "STONE_PLATE": "岩石石板", + "INSECT_PLATE": "玉虫石板", + "SPOOKY_PLATE": "妖怪石板", + "IRON_PLATE": "钢铁石板", + "FLAME_PLATE": "火球石板", + "SPLASH_PLATE": "水滴石板", + "MEADOW_PLATE": "碧绿石板", + "ZAP_PLATE": "雷电石板", + "MIND_PLATE": "神奇石板", + "ICICLE_PLATE": "冰柱石板", + "DRACO_PLATE": "龙之石板", + "DREAD_PLATE": "恶顏石板", + "PIXIE_PLATE": "妖精石板", + "BLANK_PLATE": "淨空石板", + "LEGEND_PLATE": "传说石板", + "FIGHTING_MEMORY": "战斗存储碟", + "FLYING_MEMORY": "飞翔存储碟", + "POISON_MEMORY": "毒存储碟", + "GROUND_MEMORY": "大地存储碟", + "ROCK_MEMORY": "岩石存储碟", + "BUG_MEMORY": "虫子存储碟", + "GHOST_MEMORY": "幽灵存储碟", + "STEEL_MEMORY": "钢铁存储碟", + "FIRE_MEMORY": "火焰存储碟", + "WATER_MEMORY": "清水存储碟", + "GRASS_MEMORY": "青草存储碟", + "ELECTRIC_MEMORY": "电子存储碟", + "PSYCHIC_MEMORY": "精神存储碟", + "ICE_MEMORY": "冰雪存储碟", + "DRAGON_MEMORY": "龙存储碟", + "DARK_MEMORY": "黑暗存储碟", + "FAIRY_MEMORY": "妖精存储碟", + "BLANK_MEMORY": "空白存储碟", }, } as const; diff --git a/src/locales/zh_CN/party-ui-handler.ts b/src/locales/zh_CN/party-ui-handler.ts index 9d3c7baa9ae..6f4f4f4c88a 100644 --- a/src/locales/zh_CN/party-ui-handler.ts +++ b/src/locales/zh_CN/party-ui-handler.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" + "SEND_OUT": "上场", + "SUMMARY": "概要", + "CANCEL": "取消", + "RELEASE": "放生", + "APPLY": "应用", + "TEACH": "教授" } as const; diff --git a/src/locales/zh_CN/save-slot-select-ui-handler.ts b/src/locales/zh_CN/save-slot-select-ui-handler.ts index 98b7764aee2..0d657235e49 100644 --- a/src/locales/zh_CN/save-slot-select-ui-handler.ts +++ b/src/locales/zh_CN/save-slot-select-ui-handler.ts @@ -2,7 +2,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Overwrite the data in the selected slot?", - "loading": "Loading...", + "loading": "正在加载中...", "wave": "Wave", "lv": "Lv", "empty": "空", diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index a05c7348ab5..803e64e0439 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "选择要替换成的招式", "unlockPassive": "解锁被动", "reduceCost": "降低花费", - "cycleShiny": ": 切换闪光", - "cycleForm": ": 切换形态", - "cycleGender": ": 切换性别", - "cycleAbility": ": 切换特性", - "cycleNature": ": 切换性格", - "cycleVariant": ": 切换变种", + "cycleShiny": ": 闪光", + "cycleForm": ": 形态", + "cycleGender": ": 性别", + "cycleAbility": ": 特性", + "cycleNature": ": 性格", + "cycleVariant": ": 变种", "enablePassive": "启用被动", "disablePassive": "禁用被动", "locked": "未解锁", diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index 51e3e6a2bcc..c5fcd34bef5 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -442,5 +442,43 @@ export const modifierType: ModifierTypeTranslationEntries = { BURN_DRIVE: "火焰卡帶", CHILL_DRIVE: "冰凍卡帶", DOUSE_DRIVE: "水流卡帶", + + "FIST_PLATE": "拳頭石板", + "SKY_PLATE": "藍天石板", + "TOXIC_PLATE": "劇毒石板", + "EARTH_PLATE": "大地石板", + "STONE_PLATE": "岩石石板", + "INSECT_PLATE": "玉蟲石板", + "SPOOKY_PLATE": "妖怪石板", + "IRON_PLATE": "鋼鐵石板", + "FLAME_PLATE": "火球石板", + "SPLASH_PLATE": "水滴石板", + "MEADOW_PLATE": "碧綠石板", + "ZAP_PLATE": "雷電石板", + "MIND_PLATE": "神奇石板", + "ICICLE_PLATE": "冰柱石板", + "DRACO_PLATE": "龍之石板", + "DREAD_PLATE": "惡顏石板", + "PIXIE_PLATE": "妖精石板", + "BLANK_PLATE": "淨空石板", + "LEGEND_PLATE": "傳說石板", + "FIGHTING_MEMORY": "戰鬥記憶碟", + "FLYING_MEMORY": "飛翔記憶碟", + "POISON_MEMORY": "毒記憶碟", + "GROUND_MEMORY": "大地記憶碟", + "ROCK_MEMORY": "岩石記憶碟", + "BUG_MEMORY": "蟲子記憶碟", + "GHOST_MEMORY": "幽靈記憶碟", + "STEEL_MEMORY": "鋼鐵記憶碟", + "FIRE_MEMORY": "火焰記憶碟", + "WATER_MEMORY": "清水記憶碟", + "GRASS_MEMORY": "青草記憶碟", + "ELECTRIC_MEMORY": "電子記憶碟", + "PSYCHIC_MEMORY": "精神記憶碟", + "ICE_MEMORY": "冰雪記憶碟", + "DRAGON_MEMORY": "龍記憶碟", + "DARK_MEMORY": "黑暗記憶碟", + "FAIRY_MEMORY": "妖精記憶碟", + "BLANK_MEMORY": "空白記憶碟", }, } as const; diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index 89642588ee4..c28cb39b94b 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "選擇想要替換成的招式", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", - "cycleShiny": ": 切換閃光", - "cycleForm": ": 切換形態", - "cycleGender": ": 切換性別", - "cycleAbility": ": 切換特性", - "cycleNature": ": 切換性格", - "cycleVariant": ": 切換變種", + "cycleShiny": ": 閃光", + "cycleForm": ": 形態", + "cycleGender": ": 性別", + "cycleAbility": ": 特性", + "cycleNature": ": 性格", + "cycleVariant": ": 變種", "enablePassive": "啟用被動", "disablePassive": "禁用被動", "locked": "未解鎖", diff --git a/src/main.ts b/src/main.ts index 41cd68afc1e..e750335ddd4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -150,6 +150,7 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); +document.fonts.load("12px unifont"); let game; diff --git a/src/phases.ts b/src/phases.ts index 55d4908cec9..d59f1aaaf82 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -62,7 +62,7 @@ import { Abilities } from "./data/enums/abilities"; import * as Overrides from "./overrides"; import { TextStyle, addTextObject } from "./ui/text"; import { Type } from "./data/type"; -import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events"; +import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./events/battle-scene"; import { ExpNotification } from "./enums/exp-notification"; @@ -661,7 +661,14 @@ export abstract class FieldPhase extends BattlePhase { const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[]; // We shuffle the list before sorting so speed ties produce random results - let orderedTargets: Pokemon[] = Utils.randSeedShuffle(playerField.concat(enemyField)).sort((a: Pokemon, b: Pokemon) => { + let orderedTargets: Pokemon[] = playerField.concat(enemyField); + // We seed it with the current turn to prevent an inconsistency where it + // was varying based on how long since you last reloaded + this.scene.executeWithSeedOffset(() => { + orderedTargets = Utils.randSeedShuffle(orderedTargets); + }, this.scene.currentBattle.turn, this.scene.waveSeed); + + orderedTargets.sort((a: Pokemon, b: Pokemon) => { const aSpeed = a?.getBattleStat(Stat.SPD) || 0; const bSpeed = b?.getBattleStat(Stat.SPD) || 0; @@ -1079,6 +1086,10 @@ export class NextEncounterPhase extends EncounterPhase { super(scene); } + start() { + super.start(); + } + doEncounter(): void { this.scene.playBgm(undefined, true); @@ -1158,6 +1169,9 @@ export class PostSummonPhase extends PokemonPhase { const pokemon = this.getPokemon(); + if (pokemon.status?.effect === StatusEffect.TOXIC) { + pokemon.status.turnCount = 0; + } this.scene.arena.applyTags(ArenaTrapTag, pokemon); applyPostSummonAbAttrs(PostSummonAbAttr, pokemon).then(() => this.end()); } @@ -1497,6 +1511,10 @@ export class SwitchSummonPhase extends SummonPhase { this.batonPass = batonPass; } + start(): void { + super.start(); + } + preSummon(): void { if (!this.player) { if (this.slotIndex === -1) { @@ -5165,15 +5183,15 @@ export class EggLapsePhase extends Phase { return Overrides.IMMEDIATE_HATCH_EGGS_OVERRIDE ? true : --egg.hatchWaves < 1; }); - let eggsToHatchCount: integer = eggsToHatch.length; + let eggCount: integer = eggsToHatch.length; - if (eggsToHatchCount) { + if (eggCount) { this.scene.queueMessage(i18next.t("battle:eggHatching")); for (const egg of eggsToHatch) { - this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg, eggsToHatchCount)); - if (eggsToHatchCount > 0) { - eggsToHatchCount--; + this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg, eggCount)); + if (eggCount > 0) { + eggCount--; } } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 7910a1d1239..5a6353d5f2c 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -88,50 +88,25 @@ export interface Localizable { localize(): void; } -const alternativeFonts = { - "ko": [ - new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)"), - ], -}; +const fonts = [ + new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)"), + new FontFace("emerald", "url(./fonts/pokemon-emerald-pro.ttf"), +]; -function loadFont(language: string) { - if (!alternativeFonts[language]) { - language = language.split(/[-_/]/)[0]; - } - if (alternativeFonts[language]) { - alternativeFonts[language].forEach((fontFace: FontFace) => { - document.fonts.add(fontFace); - }); - - const altFontLanguages = Object.keys(alternativeFonts); - altFontLanguages.splice(altFontLanguages.indexOf(language), 0); - } - - (Object.values(alternativeFonts)).forEach(fontFaces => { - fontFaces.forEach(fontFace => { - if (fontFace && fontFace.status === "loaded") { - document.fonts.delete(fontFace); - } - }); +function initFonts() { + fonts.forEach((fontFace: FontFace) => { + fontFace.load().then(f => document.fonts.add(f)).catch(e => console.error(e)); }); } -export function initI18n(): void { +export async function initI18n(): Promise { // Prevent reinitialization if (isInitialized) { return; } isInitialized = true; - let lang = ""; - if (localStorage.getItem("prLang")) { - lang = localStorage.getItem("prLang"); - } - - loadFont(lang); - i18next.on("languageChanged", lng=> { - loadFont(lng); - }); + initFonts(); /** * i18next is a localization library for maintaining and using translation resources. @@ -149,11 +124,16 @@ export function initI18n(): void { * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. */ - i18next.use(LanguageDetector).use(processor).use(new KoreanPostpositionProcessor()).init({ - lng: lang, + i18next.use(LanguageDetector); + i18next.use(processor); + i18next.use(new KoreanPostpositionProcessor()); + await i18next.init({ nonExplicitSupportedLngs: true, fallbackLng: "en", supportedLngs: ["en", "es", "fr", "it", "de", "zh", "pt", "ko"], + detection: { + lookupLocalStorage: "prLang" + }, debug: true, interpolation: { escapeValue: false, diff --git a/src/system/game-data.ts b/src/system/game-data.ts index a6070c6330f..e9b67da2525 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -32,7 +32,7 @@ import { OutdatedPhase, ReloadSessionPhase } from "#app/phases"; import { Variant, variantData } from "#app/data/variant"; import {setSettingGamepad, SettingGamepad, settingGamepadDefaults} from "./settings/settings-gamepad"; import {setSettingKeyboard, SettingKeyboard} from "#app/system/settings/settings-keyboard"; -import { TerrainChangedEvent, WeatherChangedEvent } from "#app/field/arena-events.js"; +import { TerrainChangedEvent, WeatherChangedEvent } from "#app/field/events/arena"; import { Device } from "#app/enums/devices.js"; import { EnemyAttackStatusEffectChanceModifier } from "../modifier/modifier"; import { StatusEffect } from "#app/data/status-effect.js"; diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index eb2b016b61e..fb446e1e081 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -4,7 +4,7 @@ import BattleScene from "../../battle-scene"; import { hasTouchscreen } from "../../touch-controls"; import { updateWindowType } from "../../ui/ui-theme"; import { PlayerGender } from "#app/data/enums/player-gender"; -import { CandyUpgradeNotificationChangedEvent } from "#app/battle-scene-events.js"; +import { CandyUpgradeNotificationChangedEvent } from "../../events/battle-scene"; import { MoneyFormat } from "../../enums/money-format"; import SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; import { EaseType } from "#app/ui/enums/ease-type.js"; diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts new file mode 100644 index 00000000000..76bc3231f8a --- /dev/null +++ b/src/test/abilities/zen_mode.test.ts @@ -0,0 +1,142 @@ +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 "#app/data/enums/abilities"; +import {Species} from "#app/data/enums/species"; +import { + CommandPhase, + DamagePhase, + EnemyCommandPhase, + MessagePhase, + PostSummonPhase, + SwitchPhase, + SwitchSummonPhase, + TurnEndPhase, TurnInitPhase, + TurnStartPhase, +} from "#app/phases"; +import {Mode} from "#app/ui/ui"; +import {Stat} from "#app/data/pokemon-stat"; +import {Moves} from "#app/data/enums/moves"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import {Command} from "#app/ui/command-ui-handler"; +import {QuietFormChangePhase} from "#app/form-change-phase"; + + +describe("Abilities - Zen mode", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const moveToUse = Moves.SPLASH; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + it("ZEN MODE - not enough damage to change form", async() => { + const moveToUse = Moves.SPLASH; + await game.startBattle([ + Species.DARMANITAN, + ]); + game.scene.getParty()[0].stats[Stat.SPD] = 1; + game.scene.getParty()[0].stats[Stat.HP] = 100; + game.scene.getParty()[0].hp = 100; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(DamagePhase, false); + // await game.phaseInterceptor.runFrom(DamagePhase).to(DamagePhase, false); + const damagePhase = game.scene.getCurrentPhase() as DamagePhase; + damagePhase.updateAmount(40); + await game.phaseInterceptor.runFrom(DamagePhase).to(TurnEndPhase, false); + expect(game.scene.getParty()[0].hp).toBeLessThan(100); + expect(game.scene.getParty()[0].formIndex).toBe(0); + }, 20000); + + it("ZEN MODE - enough damage to change form", async() => { + const moveToUse = Moves.SPLASH; + await game.startBattle([ + Species.DARMANITAN, + ]); + game.scene.getParty()[0].stats[Stat.SPD] = 1; + game.scene.getParty()[0].stats[Stat.HP] = 1000; + game.scene.getParty()[0].hp = 100; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(QuietFormChangePhase); + await game.phaseInterceptor.to(TurnInitPhase, false); + expect(game.scene.getParty()[0].hp).not.toBe(100); + expect(game.scene.getParty()[0].formIndex).not.toBe(0); + }, 20000); + + it("ZEN MODE - kill pokemon while on zen mode", async() => { + const moveToUse = Moves.SPLASH; + await game.startBattle([ + Species.DARMANITAN, + Species.CHARIZARD, + ]); + game.scene.getParty()[0].stats[Stat.SPD] = 1; + game.scene.getParty()[0].stats[Stat.HP] = 1000; + game.scene.getParty()[0].hp = 100; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(DamagePhase, false); + // await game.phaseInterceptor.runFrom(DamagePhase).to(DamagePhase, false); + const damagePhase = game.scene.getCurrentPhase() as DamagePhase; + damagePhase.updateAmount(80); + await game.phaseInterceptor.runFrom(DamagePhase).to(QuietFormChangePhase); + expect(game.scene.getParty()[0].hp).not.toBe(100); + expect(game.scene.getParty()[0].formIndex).not.toBe(0); + await game.killPokemon(game.scene.getParty()[0]); + expect(game.scene.getParty()[0].isFainted()).toBe(true); + await game.phaseInterceptor.run(MessagePhase); + await game.phaseInterceptor.run(EnemyCommandPhase); + await game.phaseInterceptor.run(TurnStartPhase); + game.onNextPrompt("SwitchPhase", Mode.PARTY, () => { + game.scene.unshiftPhase(new SwitchSummonPhase(game.scene, 0, 1, false, false)); + game.scene.ui.setMode(Mode.MESSAGE); + }); + game.onNextPrompt("SwitchPhase", Mode.MESSAGE, () => { + game.endPhase(); + }); + await game.phaseInterceptor.run(SwitchPhase); + await game.phaseInterceptor.to(PostSummonPhase); + expect(game.scene.getParty()[1].formIndex).toBe(1); + }, 20000); +}); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 28f98d936ce..9077cf00076 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -6,7 +6,7 @@ import {Species} from "#app/data/enums/species"; import * as overrides from "../../overrides"; import {Command} from "#app/ui/command-ui-handler"; import { - CommandPhase, + CommandPhase, DamagePhase, EncounterPhase, EnemyCommandPhase, LoginPhase, @@ -15,7 +15,7 @@ import { SelectStarterPhase, SummonPhase, TitlePhase, - TurnInitPhase, + TurnInitPhase, VictoryPhase, } from "#app/phases"; import {Moves} from "#app/data/enums/moves"; import GameManager from "#app/test/utils/gameManager"; @@ -106,9 +106,7 @@ describe("Test Battle Phase", () => { const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); }); - await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(SelectModifierPhase); - expect(game.scene.ui?.getMode()).toBe(Mode.MODIFIER_SELECT); - expect(game.scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(SelectModifierPhase, false); }, 20000); it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async() => { @@ -128,7 +126,7 @@ describe("Test Battle Phase", () => { const movePosition = getMovePosition(game.scene, 0, Moves.TACKLE); (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); }); - await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase); + await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase, false); }, 20000); it("load 100% data file", async() => { @@ -259,5 +257,71 @@ describe("Test Battle Phase", () => { expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); }, 20000); + + it("kill opponent pokemon", async() => { + const moveToUse = Moves.SPLASH; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + await game.startBattle([ + Species.DARMANITAN, + Species.CHARIZARD, + ]); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + await game.phaseInterceptor.to(DamagePhase, false); + await game.killPokemon(game.scene.currentBattle.enemyParty[0]); + expect(game.scene.currentBattle.enemyParty[0].isFainted()).toBe(true); + await game.phaseInterceptor.to(VictoryPhase, false); + }, 200000); + + it("to next turn", async() => { + const moveToUse = Moves.SPLASH; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + await game.startBattle(); + const turn = game.scene.currentBattle.turn; + game.doAttack(0); + await game.toNextTurn(); + expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); + }, 20000); + + it("to next wave with pokemon killed, single", async() => { + const moveToUse = Moves.SPLASH; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + await game.startBattle(); + const waveIndex = game.scene.currentBattle.waveIndex; + game.doAttack(0); + await game.doKillOpponents(); + await game.toNextWave(); + expect(game.scene.currentBattle.waveIndex).toBeGreaterThan(waveIndex); + }, 20000); }); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 2cb29aab1e7..8b94c108bc1 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -1,4 +1,4 @@ -import {afterEach, beforeAll, beforeEach, describe, it, vi} from "vitest"; +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import * as overrides from "#app/overrides"; @@ -22,18 +22,24 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); - }); - - it("should start phase", async() => { + const moveToUse = Moves.SPLASH; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + it.skip("to next turn", async() => { await game.startBattle(); - }, 100000); + const turn = game.scene.currentBattle.turn; + game.doAttack(0); + await game.toNextTurn(); + expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); + }, 20000); }); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts new file mode 100644 index 00000000000..5a95d57afea --- /dev/null +++ b/src/test/battle/special_battle.test.ts @@ -0,0 +1,137 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import {Mode} from "#app/ui/ui"; +import {Species} from "#app/data/enums/species"; +import * as overrides from "../../overrides"; +import { + CommandPhase, +} from "#app/phases"; +import {Moves} from "#app/data/enums/moves"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import {Abilities} from "#app/data/enums/abilities"; + +describe("Test Battle Phase", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + }); + + it("startBattle 2vs1 boss", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 2vs2 boss", async() => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 2vs2 trainer", async() => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 2vs1 trainer", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 2vs1 rival", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 2vs2 rival", async() => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 1vs1 trainer", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([ + Species.BLASTOISE, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 2vs2 trainer", async() => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); + + it("startBattle 4vs2 trainer", async() => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([ + Species.BLASTOISE, + Species.CHARIZARD, + Species.DARKRAI, + Species.GABITE, + ]); + expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); + expect(game.scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + }, 20000); +}); + diff --git a/src/test/inputs/inputs.test.ts b/src/test/inputs/inputs.test.ts index 4924ade0fc4..e753e167b6b 100644 --- a/src/test/inputs/inputs.test.ts +++ b/src/test/inputs/inputs.test.ts @@ -52,11 +52,6 @@ describe("Inputs", () => { expect(game.inputsHandler.log.length).toBe(4); }); - it("keyboard - test input holding for 1ms - 1 input", async() => { - await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 1); - expect(game.inputsHandler.log.length).toBe(1); - }); - it("keyboard - test input holding for 200ms - 1 input", async() => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 200); expect(game.inputsHandler.log.length).toBe(1); @@ -87,6 +82,11 @@ describe("Inputs", () => { expect(game.inputsHandler.log.length).toBe(1); }); + it("gamepad - test input holding for 249ms - 1 input", async() => { + await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 249); + expect(game.inputsHandler.log.length).toBe(1); + }); + it("gamepad - test input holding for 300ms - 2 input", async() => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 300); expect(game.inputsHandler.log.length).toBe(2); diff --git a/src/test/utils/TextInterceptor.ts b/src/test/utils/TextInterceptor.ts index d3048f23f74..e767953f4af 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/src/test/utils/TextInterceptor.ts @@ -11,6 +11,6 @@ export default class TextInterceptor { } getLatestMessage(): string { - return this.logs[this.logs.length - 1]; + return this.logs.pop(); } } diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index dc1991d5659..faf44e4bd2b 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -4,18 +4,18 @@ import {generateStarter, waitUntil} from "#app/test/utils/gameManagerUtils"; import { CommandPhase, EncounterPhase, - LoginPhase, - PostSummonPhase, + FaintPhase, + LoginPhase, NewBattlePhase, SelectGenderPhase, SelectStarterPhase, - TitlePhase, + TitlePhase, TurnInitPhase, } from "#app/phases"; import BattleScene from "#app/battle-scene.js"; import PhaseInterceptor from "#app/test/utils/phaseInterceptor"; import TextInterceptor from "#app/test/utils/TextInterceptor"; import {GameModes, getGameMode} from "#app/game-mode"; import fs from "fs"; -import { AES, enc } from "crypto-js"; +import {AES, enc} from "crypto-js"; import {updateUserInfo} from "#app/account"; import {Species} from "#app/data/enums/species"; import {PlayerGender} from "#app/data/enums/player-gender"; @@ -23,6 +23,11 @@ import {GameDataType} from "#app/data/enums/game-data-type"; import InputsHandler from "#app/test/utils/inputsHandler"; import {ExpNotification} from "#app/enums/exp-notification"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import {EnemyPokemon, PlayerPokemon} from "#app/field/pokemon"; +import {MockClock} from "#app/test/utils/mocks/mockClock"; +import {Command} from "#app/ui/command-ui-handler"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import {Button} from "#app/enums/buttons"; /** * Class to manage the game state and transitions between phases. @@ -84,31 +89,31 @@ export default class GameManager { * @param callback - The callback to execute. * @param expireFn - Optional function to determine if the prompt has expired. */ - onNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void) { - this.phaseInterceptor.addToNextPrompt(phaseTarget, mode, callback, expireFn); + onNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void, awaitingActionInput: boolean = false) { + this.phaseInterceptor.addToNextPrompt(phaseTarget, mode, callback, expireFn, awaitingActionInput); } /** * Runs the game to the title phase. * @returns A promise that resolves when the title phase is reached. */ - runToTitle(): Promise { - return new Promise(async(resolve, reject) => { - await this.phaseInterceptor.run(LoginPhase).catch((e) => reject(e)); - this.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - this.scene.gameData.gender = PlayerGender.MALE; - this.endPhase(); - }, () => this.isCurrentPhase(TitlePhase)); - await this.phaseInterceptor.run(SelectGenderPhase, () => this.isCurrentPhase(TitlePhase)).catch((e) => reject(e)); - await this.phaseInterceptor.run(TitlePhase).catch((e) => reject(e)); - this.scene.gameSpeed = 5; - this.scene.moveAnimations = false; - this.scene.showLevelUpStats = false; - this.scene.expGainsSpeed = 3; - this.scene.expParty = ExpNotification.SKIP; - this.scene.hpBarSpeed = 3; - resolve(); - }); + async runToTitle(): Promise { + await this.phaseInterceptor.run(LoginPhase); + + this.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { + this.scene.gameData.gender = PlayerGender.MALE; + this.endPhase(); + }, () => this.isCurrentPhase(TitlePhase)); + + await this.phaseInterceptor.run(SelectGenderPhase, () => this.isCurrentPhase(TitlePhase)); + await this.phaseInterceptor.run(TitlePhase); + + this.scene.gameSpeed = 5; + this.scene.moveAnimations = false; + this.scene.showLevelUpStats = false; + this.scene.expGainsSpeed = 3; + this.scene.expParty = ExpNotification.SKIP; + this.scene.hpBarSpeed = 3; } /** @@ -116,41 +121,91 @@ export default class GameManager { * @param species - Optional array of species to summon. * @returns A promise that resolves when the summon phase is reached. */ - runToSummon(species?: Species[]): Promise { - return new Promise(async(resolve, reject) => { - await this.runToTitle().catch((e) => reject(e)); - this.onNextPrompt("TitlePhase", Mode.TITLE, () => { - this.scene.gameMode = getGameMode(GameModes.CLASSIC); - const starters = generateStarter(this.scene, species); - const selectStarterPhase = new SelectStarterPhase(this.scene); - this.scene.pushPhase(new EncounterPhase(this.scene, false)); - selectStarterPhase.initBattle(starters); - }); - await this.phaseInterceptor.run(EncounterPhase).catch((e) => reject(e)); - resolve(); + async runToSummon(species?: Species[]) { + await this.runToTitle(); + + this.onNextPrompt("TitlePhase", Mode.TITLE, () => { + this.scene.gameMode = getGameMode(GameModes.CLASSIC); + const starters = generateStarter(this.scene, species); + const selectStarterPhase = new SelectStarterPhase(this.scene); + this.scene.pushPhase(new EncounterPhase(this.scene, false)); + selectStarterPhase.initBattle(starters); }); + + await this.phaseInterceptor.run(EncounterPhase); } /** - * Starts a battle. + * Transitions to the start of a battle. * @param species - Optional array of species to start the battle with. * @returns A promise that resolves when the battle is started. */ - startBattle(species?: Species[]): Promise { - return new Promise(async(resolve, reject) => { - await this.runToSummon(species).catch((e) => reject(e)); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase)); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase)); - await this.phaseInterceptor.runFrom(PostSummonPhase).to(CommandPhase).catch((e) => reject(e)); - console.log("==================[New Turn]=================="); - return resolve(); + async startBattle(species?: Species[]) { + await this.runToSummon(species); + + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + + await this.phaseInterceptor.to(CommandPhase); + console.log("==================[New Turn]=================="); + } + + /** + * Emulate a player attack + * @param movePosition the index of the move in the pokemon's moveset array + */ + doAttack(movePosition: integer) { + this.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + this.scene.ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); }); + this.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + } + + /** Faint all opponents currently on the field */ + async doKillOpponents() { + await this.killPokemon(this.scene.currentBattle.enemyParty[0]); + if (this.scene.currentBattle.double) { + await this.killPokemon(this.scene.currentBattle.enemyParty[1]); + } + } + + /** Emulate selecting a modifier (item) */ + doSelectModifier() { + this.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { + const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.processInput(Button.CANCEL); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase), true); + + this.onNextPrompt("SelectModifierPhase", Mode.CONFIRM, () => { + const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.processInput(Button.ACTION); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase)); + } + + /** Transition to the next upcoming {@linkcode CommandPhase} */ + async toNextTurn() { + await this.phaseInterceptor.to(CommandPhase); + } + + /** Emulate selecting a modifier (item) and transition to the next upcoming {@linkcode CommandPhase} */ + async toNextWave() { + this.doSelectModifier(); + + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(TurnInitPhase)); + + await this.toNextTurn(); } /** @@ -213,4 +268,15 @@ export default class GameManager { } return updateUserInfo(); } + + async killPokemon(pokemon: PlayerPokemon | EnemyPokemon) { + (this.scene.time as MockClock).overrideDelay = 0.01; + return new Promise(async(resolve, reject) => { + pokemon.hp = 0; + this.scene.pushPhase(new FaintPhase(this.scene, pokemon.getBattlerIndex(), true)); + await this.phaseInterceptor.to(FaintPhase).catch((e) => reject(e)); + (this.scene.time as MockClock).overrideDelay = undefined; + resolve(); + }); + } } diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index 7d0e4110351..da54471a7e3 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -120,7 +120,7 @@ export default class GameWrapper { pause: () => null, setRate: () => null, add: () => this.scene.sound, - get: () => this.scene.sound, + get: () => ({...this.scene.sound, totalDuration: 0}), getAllPlaying: () => [], manager: { game: this.game, @@ -131,6 +131,13 @@ export default class GameWrapper { key: "", }; + this.scene.cameras = { + main: { + setPostPipeline: () => null, + removePostPipeline: () => null, + }, + } + this.scene.tweens = { add: (data) => { if (data.onComplete) { diff --git a/src/test/utils/inputsHandler.ts b/src/test/utils/inputsHandler.ts index fd961ed3ef6..043dcffbdb9 100644 --- a/src/test/utils/inputsHandler.ts +++ b/src/test/utils/inputsHandler.ts @@ -3,7 +3,7 @@ import Phaser from "phaser"; import {InputsController} from "#app/inputs-controller"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import {holdOn} from "#app/test/utils/gameManagerUtils"; -import {initTouchControls} from "#app/touch-controls"; +import TouchControl from "#app/touch-controls"; import { JSDOM } from "jsdom"; import fs from "fs"; @@ -54,10 +54,8 @@ export default class InputsHandler { } init(): void { - setInterval(() => { - this.inputController.update(); - }); - initTouchControls(this.inputController.events); + const touchControl = new TouchControl(this.scene); + touchControl.deactivatePressedKey(); //test purpose this.events = this.inputController.events; this.scene.input.gamepad.emit("connected", this.fakePad); this.listenInputs(); diff --git a/src/test/utils/mocks/mockClock.ts b/src/test/utils/mocks/mockClock.ts index 0d5ea68ed59..ba12dc002cc 100644 --- a/src/test/utils/mocks/mockClock.ts +++ b/src/test/utils/mocks/mockClock.ts @@ -2,8 +2,10 @@ import Clock = Phaser.Time.Clock; export class MockClock extends Clock { + public overrideDelay: number; constructor(scene) { super(scene); + this.overrideDelay = undefined; setInterval(() => { /* To simulate frame update @@ -14,4 +16,9 @@ export class MockClock extends Clock { this.update(this.systems.game.loop.time, 100); }, 100); } + + addEvent(config: Phaser.Time.TimerEvent | Phaser.Types.Time.TimerEventConfig): Phaser.Time.TimerEvent { + const cfg = { ...config, delay: this.overrideDelay || config.delay}; + return super.addEvent(cfg); + } } diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 30effe185ad..699dea31ad5 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -143,6 +143,7 @@ export default class MockSprite { play() { // return this.phaserSprite.play(); + return this; } setPipelineData(key, value) { diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index bfff146465e..1dd440fde7c 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -8,6 +8,7 @@ export default class MockText { private textureManager; public list = []; public style; + constructor(textureManager, x, y, content, styleOptions) { this.scene = textureManager.scene; this.textureManager = textureManager; @@ -138,6 +139,15 @@ export default class MockText { // return this.phaserText.setX(x); } + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number) { } + setText(text) { // Sets the text this Game Object will display. // return this.phaserText.setText(text); diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 49e67e8448c..9e7745c8a37 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -1,17 +1,43 @@ import { BattleEndPhase, BerryPhase, - CheckSwitchPhase, CommandPhase, DamagePhase, EggLapsePhase, - EncounterPhase, EnemyCommandPhase, FaintPhase, - LoginPhase, MessagePhase, MoveEffectPhase, MoveEndPhase, MovePhase, NewBattlePhase, NextEncounterPhase, + CheckSwitchPhase, + CommandPhase, + DamagePhase, + EggLapsePhase, + EncounterPhase, + EnemyCommandPhase, + FaintPhase, + LoginPhase, + MessagePhase, + MoveEffectPhase, + MoveEndPhase, + MovePhase, + NewBattlePhase, + NextEncounterPhase, PostSummonPhase, - SelectGenderPhase, SelectModifierPhase, - SelectStarterPhase, SelectTargetPhase, ShinySparklePhase, ShowAbilityPhase, StatChangePhase, SummonPhase, - TitlePhase, ToggleDoublePositionPhase, TurnEndPhase, TurnInitPhase, TurnStartPhase, UnavailablePhase, VictoryPhase + SelectGenderPhase, + SelectModifierPhase, + SelectStarterPhase, + SelectTargetPhase, + ShinySparklePhase, + ShowAbilityPhase, + StatChangePhase, + SummonPhase, + SwitchPhase, + SwitchSummonPhase, + TitlePhase, + ToggleDoublePositionPhase, + TurnEndPhase, + TurnInitPhase, + TurnStartPhase, + UnavailablePhase, + VictoryPhase } from "#app/phases"; import UI, {Mode} from "#app/ui/ui"; import {Phase} from "#app/phase"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import {QuietFormChangePhase} from "#app/form-change-phase"; export default class PhaseInterceptor { public scene; @@ -63,10 +89,13 @@ export default class PhaseInterceptor { [ShinySparklePhase, this.startPhase], [SelectTargetPhase, this.startPhase], [UnavailablePhase, this.startPhase], + [QuietFormChangePhase, this.startPhase], + [SwitchPhase, this.startPhase], + [SwitchSummonPhase, this.startPhase], ]; private endBySetMode = [ - TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase + TitlePhase, SelectGenderPhase, CommandPhase ]; /** @@ -78,8 +107,8 @@ export default class PhaseInterceptor { this.log = []; this.onHold = []; this.prompts = []; + this.startPromptHandler(); this.initPhases(); - this.startPromptHander(); } rejectAll(error) { @@ -109,8 +138,10 @@ export default class PhaseInterceptor { async to(phaseTo, runTarget: boolean = true): Promise { return new Promise(async (resolve, reject) => { ErrorInterceptor.getInstance().add(this); - await this.run(this.phaseFrom).catch((e) => reject(e)); - this.phaseFrom = null; + if (this.phaseFrom) { + await this.run(this.phaseFrom).catch((e) => reject(e)); + this.phaseFrom = null; + } const targetName = typeof phaseTo === "string" ? phaseTo : phaseTo.name; this.intervalRun = setInterval(async() => { const currentPhase = this.onHold?.length && this.onHold[0]; @@ -238,7 +269,6 @@ export default class PhaseInterceptor { */ superEndPhase() { const instance = this.scene.getCurrentPhase(); - console.log(`%c INTERCEPTED Super End Phase ${instance.constructor.name}`, "color:red;"); this.originalSuperEnd.apply(instance); this.inProgress?.callback(); this.inProgress = undefined; @@ -253,6 +283,9 @@ export default class PhaseInterceptor { const instance = this.scene.ui; console.log("setMode", mode, args); const ret = this.originalSetMode.apply(instance, [mode, ...args]); + if (!this.phases[currentPhase.constructor.name]) { + throw new Error(`missing ${currentPhase.constructor.name} in phaseInterceptior PHASES list`); + } if (this.phases[currentPhase.constructor.name].endBySetMode) { this.inProgress?.callback(); this.inProgress = undefined; @@ -263,16 +296,17 @@ export default class PhaseInterceptor { /** * Method to start the prompt handler. */ - startPromptHander() { + startPromptHandler() { this.promptInterval = setInterval(() => { if (this.prompts.length) { const actionForNextPrompt = this.prompts[0]; const expireFn = actionForNextPrompt.expireFn && actionForNextPrompt.expireFn(); const currentMode = this.scene.ui.getMode(); const currentPhase = this.scene.getCurrentPhase().constructor.name; + const currentHandler = this.scene.ui.getHandler(); if (expireFn) { this.prompts.shift(); - } else if (currentMode === actionForNextPrompt.mode && currentPhase === actionForNextPrompt.phaseTarget) { + } else if (currentMode === actionForNextPrompt.mode && currentPhase === actionForNextPrompt.phaseTarget && currentHandler.active && (!actionForNextPrompt.awaitingActionInput || (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput))) { this.prompts.shift().callback(); } } @@ -286,12 +320,13 @@ export default class PhaseInterceptor { * @param callback - The callback function to execute. * @param expireFn - The function to determine if the prompt has expired. */ - addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn: () => void) { + addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn: () => void, awaitingActionInput: boolean = false) { this.prompts.push({ phaseTarget, mode, callback, - expireFn + expireFn, + awaitingActionInput }); } diff --git a/src/touch-controls.ts b/src/touch-controls.ts index 401ae7c6b93..d5a3197f833 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -1,25 +1,164 @@ import {Button} from "./enums/buttons"; import EventEmitter = Phaser.Events.EventEmitter; +import BattleScene from "./battle-scene"; -// Create a map to store key bindings -export const keys = new Map(); -// Create a map to store keys that are currently pressed -export const keysDown = new Map(); -// Variable to store the ID of the last touched element -let lastTouchedId: string; +const repeatInputDelayMillis = 250; -/** - * Initialize touch controls by binding keys to buttons. - * - * @param events - The event emitter for handling input events. - */ -export function initTouchControls(events: EventEmitter): void { - preventElementZoom(document.querySelector("#dpad")); - preventElementZoom(document.querySelector("#apad")); - // Select all elements with the 'data-key' attribute and bind keys to them - for (const button of document.querySelectorAll("[data-key]")) { - // @ts-ignore - Bind the key to the button using the dataset key - bindKey(button, button.dataset.key, events); +export default class TouchControl { + events: EventEmitter; + private buttonLock: string[] = new Array(); + private inputInterval: NodeJS.Timeout[] = new Array(); + + constructor(scene: BattleScene) { + this.events = scene.game.events; + this.init(); + } + + /** + * Initialize touch controls by binding keys to buttons. + */ + init() { + this.preventElementZoom(document.querySelector("#dpad")); + this.preventElementZoom(document.querySelector("#apad")); + // Select all elements with the 'data-key' attribute and bind keys to them + for (const button of document.querySelectorAll("[data-key]")) { + // @ts-ignore - Bind the key to the button using the dataset key + this.bindKey(button, button.dataset.key); + } + } + + /** + * Binds a node to a specific key to simulate keyboard events on touch. + * + * @param node - The DOM element to bind the key to. + * @param key - The key to simulate. + * @param events - The event emitter for handling input events. + * + * @remarks + * This function binds touch events to a node to simulate 'keydown' and 'keyup' keyboard events. + * It adds the key to the keys map and tracks the keydown state. When a touch starts, it simulates + * a 'keydown' event and adds an 'active' class to the node. When the touch ends, it simulates a 'keyup' + * event, removes the keydown state, and removes the 'active' class from the node and the last touched element. + */ + bindKey(node: HTMLElement, key: string) { + node.addEventListener("touchstart", event => { + event.preventDefault(); + this.touchButtonDown(node, key); + }); + + node.addEventListener("touchend", event => { + event.preventDefault(); + this.touchButtonUp(node, key, event.target["id"]); + }); + } + + touchButtonDown(node: HTMLElement, key: string) { + if (this.buttonLock.includes(key)) { + return; + } + this.simulateKeyboardEvent("keydown", key); + clearInterval(this.inputInterval[key]); + this.inputInterval[key] = setInterval(() => { + this.simulateKeyboardEvent("keydown", key); + }, repeatInputDelayMillis); + this.buttonLock.push(key); + node.classList.add("active"); + + } + + touchButtonUp(node: HTMLElement, key: string, id: string) { + if (!this.buttonLock.includes(key)) { + return; + } + this.simulateKeyboardEvent("keyup", key); + + node.classList.remove("active"); + + document.getElementById(id)?.classList.remove("active"); + const index = this.buttonLock.indexOf(key); + this.buttonLock.splice(index, 1); + clearInterval(this.inputInterval[key]); + } + + /** + * Simulates a keyboard event on the canvas. + * + * @param eventType - The type of the keyboard event ('keydown' or 'keyup'). + * @param key - The key to simulate. + * + * @remarks + * This function checks if the key exists in the Button enum. If it does, it retrieves the corresponding button + * and emits the appropriate event ('input_down' or 'input_up') based on the event type. + */ + simulateKeyboardEvent(eventType: string, key: string) { + if (!Button.hasOwnProperty(key)) { + return; + } + const button = Button[key]; + + switch (eventType) { + case "keydown": + this.events.emit("input_down", { + controller_type: "keyboard", + button: button, + isTouch: true + }); + break; + case "keyup": + this.events.emit("input_up", { + controller_type: "keyboard", + button: button, + isTouch: true + }); + break; + } + } + + /** + * {@link https://stackoverflow.com/a/39778831/4622620|Source} + * + * Prevent zoom on specified element + * @param {HTMLElement} element + */ + preventElementZoom(element: HTMLElement): void { + if (!element) { + return; + } + element.addEventListener("touchstart", (event: TouchEvent) => { + + if (!(event.currentTarget instanceof HTMLElement)) { + return; + } + + const currentTouchTimeStamp = event.timeStamp; + const previousTouchTimeStamp = Number(event.currentTarget.dataset.lastTouchTimeStamp) || currentTouchTimeStamp; + const timeStampDifference = currentTouchTimeStamp - previousTouchTimeStamp; + const fingers = event.touches.length; + event.currentTarget.dataset.lastTouchTimeStamp = String(currentTouchTimeStamp); + + if (!timeStampDifference || timeStampDifference > 500 || fingers > 1) { + return; + } // not double-tap + + event.preventDefault(); + + if (event.target instanceof HTMLElement) { + event.target.click(); + } + }); + } + + /** + * Deactivates all currently pressed keys. + */ + deactivatePressedKey(): void { + for (const key of Object.keys(this.inputInterval)) { + clearInterval(this.inputInterval[key]); + } + for (const button of document.querySelectorAll("[data-key]")) { + button.classList.remove("active"); + } + this.buttonLock = []; } } @@ -47,113 +186,3 @@ export function isMobile(): boolean { })(navigator.userAgent || navigator.vendor || window["opera"]); return ret; } - -/** - * Simulates a keyboard event on the canvas. - * - * @param eventType - The type of the keyboard event ('keydown' or 'keyup'). - * @param key - The key to simulate. - * @param events - The event emitter for handling input events. - * - * @remarks - * This function checks if the key exists in the Button enum. If it does, it retrieves the corresponding button - * and emits the appropriate event ('input_down' or 'input_up') based on the event type. - */ -function simulateKeyboardEvent(eventType: string, key: string, events: EventEmitter) { - if (!Button.hasOwnProperty(key)) { - return; - } - const button = Button[key]; - - switch (eventType) { - case "keydown": - events.emit("input_down", { - controller_type: "keyboard", - button: button, - isTouch: true - }); - break; - case "keyup": - events.emit("input_up", { - controller_type: "keyboard", - button: button, - isTouch: true - }); - break; - } -} - -/** - * Binds a node to a specific key to simulate keyboard events on touch. - * - * @param node - The DOM element to bind the key to. - * @param key - The key to simulate. - * @param events - The event emitter for handling input events. - * - * @remarks - * This function binds touch events to a node to simulate 'keydown' and 'keyup' keyboard events. - * It adds the key to the keys map and tracks the keydown state. When a touch starts, it simulates - * a 'keydown' event and adds an 'active' class to the node. When the touch ends, it simulates a 'keyup' - * event, removes the keydown state, and removes the 'active' class from the node and the last touched element. - */ -function bindKey(node: HTMLElement, key: string, events) { - keys.set(node.id, key); - - node.addEventListener("touchstart", event => { - event.preventDefault(); - simulateKeyboardEvent("keydown", key, events); - keysDown.set(event.target["id"], node.id); - node.classList.add("active"); - }); - - node.addEventListener("touchend", event => { - event.preventDefault(); - - const pressedKey = keysDown.get(event.target["id"]); - if (pressedKey && keys.has(pressedKey)) { - const key = keys.get(pressedKey); - simulateKeyboardEvent("keyup", key, events); - } - - keysDown.delete(event.target["id"]); - node.classList.remove("active"); - - if (lastTouchedId) { - document.getElementById(lastTouchedId).classList.remove("active"); - } - }); -} - -/** - * {@link https://stackoverflow.com/a/39778831/4622620|Source} - * - * Prevent zoom on specified element - * @param {HTMLElement} element - */ -function preventElementZoom(element: HTMLElement): void { - if (!element) { - return; - } - element.addEventListener("touchstart", (event: TouchEvent) => { - - if (!(event.currentTarget instanceof HTMLElement)) { - return; - } - - const currentTouchTimeStamp = event.timeStamp; - const previousTouchTimeStamp = Number(event.currentTarget.dataset.lastTouchTimeStamp) || currentTouchTimeStamp; - const timeStampDifference = currentTouchTimeStamp - previousTouchTimeStamp; - const fingers = event.touches.length; - event.currentTarget.dataset.lastTouchTimeStamp = String(currentTouchTimeStamp); - - if (!timeStampDifference || timeStampDifference > 500 || fingers > 1) { - return; - } // not double-tap - - event.preventDefault(); - - if (event.target instanceof HTMLElement) { - event.target.click(); - } - }); -} diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 3523cdc9f1e..21d0d0841e6 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -162,20 +162,13 @@ export class UiInputs { } case Mode.TITLE: case Mode.COMMAND: - case Mode.FIGHT: - case Mode.BALL: - case Mode.TARGET_SELECT: - case Mode.SAVE_SLOT: - case Mode.PARTY: - case Mode.SUMMARY: - case Mode.STARTER_SELECT: - case Mode.OPTION_SELECT: + case Mode.MODIFIER_SELECT: this.scene.ui.setOverlayMode(Mode.MENU); break; - case Mode.CONFIRM: + case Mode.STARTER_SELECT: + this.buttonTouch(); + break; case Mode.MENU: - case Mode.SETTINGS: - case Mode.ACHIEVEMENTS: this.scene.ui.revertMode(); this.scene.playSound("select"); break; diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index e854de2006b..5793582d6c4 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -4,8 +4,8 @@ import { ArenaTagSide } from "#app/data/arena-tag.js"; import { WeatherType } from "#app/data/weather.js"; import { TerrainType } from "#app/data/terrain.js"; import { addWindow, WindowVariant } from "./ui-theme"; -import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/field/arena-events.js"; -import { BattleSceneEventType, TurnEndEvent } from "#app/battle-scene-events.js"; +import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/field/events/arena"; +import { BattleSceneEventType, TurnEndEvent } from "../events/battle-scene"; import { ArenaTagType } from "#app/data/enums/arena-tag-type.js"; import TimeOfDayWidget from "./time-of-day-widget"; import * as Utils from "../utils"; diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 956ea65fd83..812969a988d 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -4,7 +4,7 @@ import * as Utils from "../utils"; import BattleScene from "#app/battle-scene.js"; import { UiTheme } from "#app/enums/ui-theme.js"; import Move from "#app/data/move.js"; -import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "#app/battle-scene-events.js"; +import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene"; import { BerryType } from "#app/data/enums/berry-type.js"; import { Moves } from "#app/data/enums/moves.js"; diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts new file mode 100644 index 00000000000..1c5779ef777 --- /dev/null +++ b/src/ui/egg-counter-container.ts @@ -0,0 +1,88 @@ +import BattleScene from "#app/battle-scene.js"; +import { addWindow } from "./ui-theme"; +import { addTextObject, TextStyle } from "./text"; +import { EggCountChangedEvent, EggEventType } from "#app/events/egg.js"; +import EggHatchSceneHandler from "./egg-hatch-scene-handler"; + +/** + * A container that displays the count of hatching eggs. + * Extends Phaser.GameObjects.Container. + */ +export default class EggCounterContainer extends Phaser.GameObjects.Container { + private readonly WINDOW_DEFAULT_WIDTH = 37; + private readonly WINDOW_MEDIUM_WIDTH = 42; + private readonly WINDOW_HEIGHT = 26; + private readonly onEggCountChangedEvent = (event: Event) => this.onEggCountChanged(event); + + private battleScene: BattleScene; + private eggCount: integer; + private eggCountWindow: Phaser.GameObjects.NineSlice; + private eggCountText: Phaser.GameObjects.Text; + + /** + * @param {BattleScene} scene - The scene to which this container belongs. + * @param {number} eggCount - The number of eggs to hatch. + */ + constructor(scene: BattleScene, eggCount: integer) { + super(scene, 0, 0); + this.eggCount = eggCount; + this.battleScene = scene; + + const uiHandler = this.battleScene.ui.getHandler() as EggHatchSceneHandler; + + uiHandler.eventTarget.addEventListener(EggEventType.EGG_COUNT_CHANGED, this.onEggCountChangedEvent); + this.setup(); + } + + /** + * Sets up the container, creating the window, egg sprite, and egg count text. + */ + private setup(): void { + const windowWidth = this.eggCount > 9 ? this.WINDOW_MEDIUM_WIDTH : this.WINDOW_DEFAULT_WIDTH; + + this.eggCountWindow = addWindow(this.battleScene, 5, 5, windowWidth, this.WINDOW_HEIGHT); + this.setVisible(this.eggCount > 1); + + this.add(this.eggCountWindow); + + const eggSprite = this.battleScene.add.sprite(19, 18, "egg", "egg_0"); + eggSprite.setScale(0.32); + + this.eggCountText = addTextObject(this.battleScene, 28, 13, `${this.eggCount}`, TextStyle.MESSAGE, { fontSize: "66px" }); + + this.add(eggSprite); + this.add(this.eggCountText); + } + + /** + * Resets the window size to the default width and height. + */ + private setWindowToDefaultSize(): void { + this.eggCountWindow.setSize(this.WINDOW_DEFAULT_WIDTH, this.WINDOW_HEIGHT); + } + + /** + * Handles window size, the egg count to show, and whether it should be displayed. + * + * @param event {@linkcode Event} being sent + * @returns void + */ + private onEggCountChanged(event: Event): void { + const eggCountChangedEvent = event as EggCountChangedEvent; + if (!eggCountChangedEvent) { + return; + } + + const eggCount = eggCountChangedEvent.eggCount; + + if (eggCount < 10) { + this.setWindowToDefaultSize(); + } + + if (eggCount > 0) { + this.eggCountText.setText(eggCount.toString()); + } else { + this.eggCountText.setVisible(false); + } + } +} diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index f0e55e04801..96874f439ff 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -156,15 +156,27 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaOptionSelectBg.setOrigin(1, 1); this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg); + const multiplierOne = "x1"; + const multiplierTen = "x10"; const pullOptions = [ - { multiplier: "x1", description: `1 ${i18next.t("egg:pull")}` }, - { multiplier: "x10", description: `10 ${i18next.t("egg:pulls")}` }, - { multiplier: "x1", description: `5 ${i18next.t("egg:pulls")}` }, - { multiplier: "x1", description: `10 ${i18next.t("egg:pulls")}` }, - { multiplier: "x1", description: `25 ${i18next.t("egg:pulls")}` } + { multiplier: multiplierOne, description: `1 ${i18next.t("egg:pull")}`, icon: getVoucherTypeIcon(VoucherType.REGULAR) }, + { multiplier: multiplierTen, description: `10 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.REGULAR) }, + { multiplier: multiplierOne, description: `5 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.PLUS) }, + { multiplier: multiplierOne, description: `10 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.PREMIUM) }, + { multiplier: multiplierOne, description: `25 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.GOLDEN) } ]; - const pullOptionsText = pullOptions.map(option => ` ${option.multiplier.padEnd(4)} ${option.description}`).join("\n"); + const { resolvedLanguage } = i18next; + const pullOptionsText = pullOptions.map(option =>{ + const desc = option.description.split(" "); + if (desc[0].length < 2) { + desc[0] += ["zh", "ko"].includes(resolvedLanguage.substring(0,2)) ? " " : " "; + } + if (option.multiplier === multiplierOne) { + desc[0] = " " + desc[0]; + } + return ` ${option.multiplier.padEnd(5)}${desc.join(" ")}`; + }).join("\n"); const optionText = addTextObject( this.scene, @@ -181,9 +193,8 @@ export default class EggGachaUiHandler extends MessageUiHandler { optionText.setPositionRelative(this.eggGachaOptionSelectBg, 16, 9); - new Array(5).fill(null).map((_, i) => { - const voucherType = i < 2 ? VoucherType.REGULAR : i === 2 ? VoucherType.PLUS : i === 3 ? VoucherType.PREMIUM : VoucherType.GOLDEN; - const icon = this.scene.add.sprite(0, 0, "items", getVoucherTypeIcon(voucherType)); + pullOptions.forEach((option, i) => { + const icon = this.scene.add.sprite(0, 0, "items", option.icon); icon.setScale(0.5); icon.setPositionRelative(this.eggGachaOptionSelectBg, 20, 17 + i * 16); this.eggGachaOptionsContainer.add(icon); @@ -396,7 +407,8 @@ export default class EggGachaUiHandler extends MessageUiHandler { const timestamp = new Date().getTime(); for (const tier of tiers) { - const egg = new Egg(Utils.randInt(EGG_SEED, EGG_SEED * tier), this.gachaCursor, getEggTierDefaultHatchWaves(tier), timestamp); + const eggId = Utils.randInt(EGG_SEED, EGG_SEED * tier); + const egg = new Egg(eggId, this.gachaCursor, getEggTierDefaultHatchWaves(tier), timestamp); if (egg.isManaphyEgg()) { this.scene.gameData.gameStats.manaphyEggsPulled++; egg.hatchWaves = getEggTierDefaultHatchWaves(EggTier.ULTRA); diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 5a4c984234c..94affc2e751 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -7,6 +7,14 @@ import {Button} from "../enums/buttons"; export default class EggHatchSceneHandler extends UiHandler { public eggHatchContainer: Phaser.GameObjects.Container; + /** + * Allows subscribers to listen for events + * + * Current Events: + * - {@linkcode EggEventType.EGG_COUNT_CHANGED} {@linkcode EggCountChangedEvent} + */ + public readonly eventTarget: EventTarget = new EventTarget(); + constructor(scene: BattleScene) { super(scene, Mode.EGG_HATCH_SCENE); } diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 92c7faf5477..653789d4a20 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -98,13 +98,6 @@ export default class EggListUiHandler extends MessageUiHandler { let e = 0; - /*this.scene.gameData.eggs = [ - new Egg(1, 1, 5, new Date().getTime()), - new Egg(1 + EGG_SEED, 1, 15, new Date().getTime()), - new Egg(1 + EGG_SEED * 2, 1, 50, new Date().getTime()), - new Egg(1 + EGG_SEED * 3, GachaType.LEGENDARY, 100, new Date().getTime()) - ];*/ - for (const egg of this.scene.gameData.eggs) { const x = (e % 11) * 18; const y = Math.floor(e / 11) * 18; diff --git a/src/ui/eggs-to-hatch-count-container.ts b/src/ui/eggs-to-hatch-count-container.ts deleted file mode 100644 index 693e4666220..00000000000 --- a/src/ui/eggs-to-hatch-count-container.ts +++ /dev/null @@ -1,54 +0,0 @@ -import BattleScene from "#app/battle-scene.js"; -import { addWindow } from "./ui-theme"; -import { addTextObject, TextStyle } from "./text"; - -/** - * A container that displays the count of hatching eggs. - * Extends Phaser.GameObjects.Container. - */ -export default class EggsToHatchCountContainer extends Phaser.GameObjects.Container { - private readonly WINDOW_DEFAULT_WIDTH = 37; - private readonly WINDOW_MEDIUM_WIDTH = 42; - private readonly WINDOW_HEIGHT = 26; - - private eggsToHatchCount: integer; - private eggsToHatchCountWindow: Phaser.GameObjects.NineSlice; - - public eggCountText: Phaser.GameObjects.Text; - - /** - * @param {BattleScene} scene - The scene to which this container belongs. - * @param {number} eggsToHatchCount - The number of eggs to hatch. - */ - constructor(scene: BattleScene, eggsToHatchCount: integer) { - super(scene, 0, 0); - this.eggsToHatchCount = eggsToHatchCount; - } - - /** - * Sets up the container, creating the window, egg sprite, and egg count text. - */ - setup(): void { - const windowWidth = this.eggsToHatchCount > 9 ? this.WINDOW_MEDIUM_WIDTH : this.WINDOW_DEFAULT_WIDTH; - - this.eggsToHatchCountWindow = addWindow(this.scene as BattleScene, 5, 5, windowWidth, this.WINDOW_HEIGHT); - this.setVisible(this.eggsToHatchCount > 1); - - this.add(this.eggsToHatchCountWindow); - - const eggSprite = this.scene.add.sprite(19, 18, "egg", "egg_0"); - eggSprite.setScale(0.32); - - this.eggCountText = addTextObject(this.scene, 28, 13, `${this.eggsToHatchCount}`, TextStyle.MESSAGE, { fontSize: "66px" }); - - this.add(eggSprite); - this.add(this.eggCountText); - } - - /** - * Resets the window size to the default width and height. - */ - setWindowToDefaultSize(): void { - this.eggsToHatchCountWindow.setSize(this.WINDOW_DEFAULT_WIDTH, this.WINDOW_HEIGHT); - } -} diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 0ed3671ad18..657c8b7e311 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -179,21 +179,25 @@ export default class FightUiHandler extends UiHandler { const pp = maxPP - pokemonMove.ppUsed; this.ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); - const ppPercentLeft = pp / maxPP; - let ppColor = "white"; - if (ppPercentLeft <= 0.5) { - ppColor = "yellow"; - } - if (ppPercentLeft <= 0.25) { - ppColor = "orange"; - } - if (pp === 0) { - ppColor = "red"; - } - this.ppText.setColor(ppColor); this.powerText.setText(`${power >= 0 ? power : "---"}`); this.accuracyText.setText(`${accuracy >= 0 ? accuracy : "---"}`); + const ppPercentLeft = pp / maxPP; + + //** Determines TextStyle according to percentage of PP remaining */ + let ppColorStyle = TextStyle.MOVE_PP_FULL; + if (ppPercentLeft > 0.25 && ppPercentLeft <= 0.5) { + ppColorStyle = TextStyle.MOVE_PP_HALF_FULL; + } else if (ppPercentLeft > 0 && ppPercentLeft <= 0.25) { + ppColorStyle = TextStyle.MOVE_PP_NEAR_EMPTY; + } else if (ppPercentLeft === 0) { + ppColorStyle = TextStyle.MOVE_PP_EMPTY; + } + + //** Changes the text color and shadow according to the determined TextStyle */ + this.ppText.setColor(this.getTextColor(ppColorStyle, false)); + this.ppText.setShadowColor(this.getTextColor(ppColorStyle, true)); + pokemon.getOpponents().forEach((opponent) => { opponent.updateEffectiveness(this.getEffectivenessText(pokemon, opponent, pokemonMove)); }); diff --git a/src/ui/loading-modal-ui-handler.ts b/src/ui/loading-modal-ui-handler.ts index c0d0ff9067b..c335b59de9f 100644 --- a/src/ui/loading-modal-ui-handler.ts +++ b/src/ui/loading-modal-ui-handler.ts @@ -1,3 +1,4 @@ +import i18next from "i18next"; import BattleScene from "../battle-scene"; import { ModalUiHandler } from "./modal-ui-handler"; import { addTextObject, TextStyle } from "./text"; @@ -31,7 +32,7 @@ export default class LoadingModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Loading…", TextStyle.WINDOW); + const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, i18next.t("menu:loading"), TextStyle.WINDOW); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 1ffa32d2394..40607b9d95c 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -6,6 +6,7 @@ import { getNatureName } from "../data/nature"; import { Type } from "../data/type"; import Pokemon from "../field/pokemon"; import i18next from "../plugins/i18n"; +import { DexAttr } from "../system/game-data"; import * as Utils from "../utils"; import ConfirmUiHandler from "./confirm-ui-handler"; import { StatsContainer } from "./stats-container"; @@ -39,7 +40,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { }, "pt": { infoContainerTextSize: "60px", - infoContainerLabelXPos: -16, + infoContainerLabelXPos: -15, infoContainerTextXPos: -12, }, }; @@ -47,19 +48,24 @@ const languageSettings: { [key: string]: LanguageSetting } = { export default class PokemonInfoContainer extends Phaser.GameObjects.Container { private readonly infoWindowWidth = 104; - private pokemonGenderLabelText: Phaser.GameObjects.Text; + private pokemonFormLabelText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; private pokemonGenderText: Phaser.GameObjects.Text; + private pokemonGenderNewText: Phaser.GameObjects.Text; private pokemonAbilityLabelText: Phaser.GameObjects.Text; private pokemonAbilityText: Phaser.GameObjects.Text; private pokemonNatureLabelText: Phaser.GameObjects.Text; private pokemonNatureText: BBCodeText; private pokemonShinyIcon: Phaser.GameObjects.Image; + private pokemonShinyNewIcon: Phaser.GameObjects.Text; private pokemonFusionShinyIcon: Phaser.GameObjects.Image; private pokemonMovesContainer: Phaser.GameObjects.Container; private pokemonMovesContainers: Phaser.GameObjects.Container[]; private pokemonMoveBgs: Phaser.GameObjects.NineSlice[]; private pokemonMoveLabels: Phaser.GameObjects.Text[]; + private numCharsBeforeCutoff = 16; + private initialX: number; private movesContainerInitialX: number; @@ -137,34 +143,44 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { // The font size should be set by language const infoContainerTextSize = textSettings?.infoContainerTextSize || "64px"; - this.pokemonGenderLabelText = addTextObject(this.scene, infoContainerLabelXPos, 18, i18next.t("pokemonInfoContainer:gender"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); - this.pokemonGenderLabelText.setOrigin(1, 0); - this.pokemonGenderLabelText.setVisible(false); - this.pokemonGenderLabelText.setName("text-pkmn-gender-label"); - this.add(this.pokemonGenderLabelText); + this.pokemonFormLabelText = addTextObject(this.scene, infoContainerLabelXPos, 19, i18next.t("pokemonInfoContainer:form"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormLabelText.setOrigin(1, 0); + this.pokemonFormLabelText.setVisible(false); + this.add(this.pokemonFormLabelText); - this.pokemonGenderText = addTextObject(this.scene, infoContainerTextXPos, 18, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormText = addTextObject(this.scene, infoContainerTextXPos, 19, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormText.setOrigin(0, 0); + this.pokemonFormText.setVisible(false); + this.add(this.pokemonFormText); + + this.pokemonGenderText = addTextObject(this.scene, -42, -61, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); this.pokemonGenderText.setOrigin(0, 0); this.pokemonGenderText.setVisible(false); this.pokemonGenderText.setName("text-pkmn-gender"); this.add(this.pokemonGenderText); - this.pokemonAbilityLabelText = addTextObject(this.scene, infoContainerLabelXPos, 28, i18next.t("pokemonInfoContainer:ability"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonGenderNewText = addTextObject(this.scene, -36, -61, "", TextStyle.WINDOW, { fontSize: "64px" }); + this.pokemonGenderNewText.setOrigin(0, 0); + this.pokemonGenderNewText.setVisible(false); + this.pokemonGenderNewText.setName("text-pkmn-new-gender"); + this.add(this.pokemonGenderNewText); + + this.pokemonAbilityLabelText = addTextObject(this.scene, infoContainerLabelXPos, 29, i18next.t("pokemonInfoContainer:ability"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); this.pokemonAbilityLabelText.setOrigin(1, 0); this.pokemonAbilityLabelText.setName("text-pkmn-ability-label"); this.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(this.scene, infoContainerTextXPos, 28, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonAbilityText = addTextObject(this.scene, infoContainerTextXPos, 29, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); this.pokemonAbilityText.setOrigin(0, 0); this.pokemonAbilityText.setName("text-pkmn-ability"); this.add(this.pokemonAbilityText); - this.pokemonNatureLabelText = addTextObject(this.scene, infoContainerLabelXPos, 38, i18next.t("pokemonInfoContainer:nature"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonNatureLabelText = addTextObject(this.scene, infoContainerLabelXPos, 39, i18next.t("pokemonInfoContainer:nature"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); this.pokemonNatureLabelText.setOrigin(1, 0); this.pokemonNatureLabelText.setName("text-pkmn-nature-label"); this.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(this.scene, infoContainerTextXPos, 38, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize, lineSpacing: 3, maxLines: 2 }); + this.pokemonNatureText = addBBCodeTextObject(this.scene, infoContainerTextXPos, 39, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize, lineSpacing: 3, maxLines: 2 }); this.pokemonNatureText.setOrigin(0, 0); this.pokemonNatureText.setName("text-pkmn-nature"); this.add(this.pokemonNatureText); @@ -176,6 +192,12 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.setName("img-pkmn-shiny-icon"); this.add(this.pokemonShinyIcon); + this.pokemonShinyNewIcon = addTextObject(this.scene, this.pokemonShinyIcon.x + 12, this.pokemonShinyIcon.y, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonShinyNewIcon.setOrigin(0, 0); + this.pokemonShinyNewIcon.setName("text-pkmn-shiny-new-icon"); + this.add(this.pokemonShinyNewIcon); + this.pokemonShinyNewIcon.setVisible(false); + this.pokemonFusionShinyIcon = this.scene.add.image(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y, "shiny_star_2"); this.pokemonFusionShinyIcon.setOrigin(0, 0); this.pokemonFusionShinyIcon.setScale(0.75); @@ -187,23 +209,87 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { show(pokemon: Pokemon, showMoves: boolean = false, speedMultiplier: number = 1): Promise { return new Promise(resolve => { + const caughtAttr = BigInt(pokemon.scene.gameData.dexData[pokemon.species.speciesId].caughtAttr); if (pokemon.gender > Gender.GENDERLESS) { this.pokemonGenderText.setText(getGenderSymbol(pokemon.gender)); this.pokemonGenderText.setColor(getGenderColor(pokemon.gender)); this.pokemonGenderText.setShadowColor(getGenderColor(pokemon.gender, true)); - this.pokemonGenderLabelText.setVisible(true); this.pokemonGenderText.setVisible(true); + + const newGender = BigInt(Math.pow(2, pokemon.gender)) * DexAttr.MALE; + this.pokemonGenderNewText.setText("(+)"); + this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); + this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + this.pokemonGenderNewText.setVisible((newGender & caughtAttr) === BigInt(0)); } else { this.pokemonGenderText.setVisible(false); } + if (pokemon.species.forms?.[pokemon.formIndex]?.formName) { + this.pokemonFormLabelText.setVisible(true); + this.pokemonFormText.setVisible(true); + const newForm = BigInt(Math.pow(2, pokemon.formIndex)) * DexAttr.DEFAULT_FORM; + + if ((newForm & caughtAttr) === BigInt(0)) { + this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); + this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + } else { + this.pokemonFormLabelText.setColor(getTextColor(TextStyle.WINDOW, false, this.scene.uiTheme)); + this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme)); + } + + const formName = pokemon.species.forms?.[pokemon.formIndex]?.formName; + this.pokemonFormText.setText(formName.length > this.numCharsBeforeCutoff ? formName.substring(0, this.numCharsBeforeCutoff - 3) + "..." : formName); + if (formName.length > this.numCharsBeforeCutoff) { + this.pokemonFormText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), Phaser.Geom.Rectangle.Contains); + this.pokemonFormText.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, pokemon.species.forms?.[pokemon.formIndex]?.formName, true)); + this.pokemonFormText.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + } else { + this.pokemonFormText.disableInteractive(); + } + } else { + this.pokemonFormLabelText.setVisible(false); + this.pokemonFormText.setVisible(false); + this.pokemonFormText.disableInteractive(); + } + const abilityTextStyle = pokemon.abilityIndex === (pokemon.species.ability2 ? 2 : 1) ? TextStyle.MONEY : TextStyle.WINDOW; this.pokemonAbilityText.setText(pokemon.getAbility(true).name); this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, this.scene.uiTheme)); this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, this.scene.uiTheme)); + /** + * If the opposing Pokemon only has 1 normal ability and is using the hidden ability it should have the same behavior + * if it had 2 normal abilities. This code checks if that is the case and uses the correct opponent Pokemon abilityIndex (2) + * for calculations so it aligns with where the hidden ability is stored in the starter data's abilityAttr (4) + */ + const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2); + const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex; + const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex); + + const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr; + + if (!rootFormHasHiddenAbility) { + this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); + this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + } else { + this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.WINDOW, false, this.scene.uiTheme)); + this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme)); + } + this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, this.scene.uiTheme)); + const dexNatures = pokemon.scene.gameData.dexData[pokemon.species.speciesId].natureAttr; + const newNature = Math.pow(2, pokemon.nature + 1); + + if (!(dexNatures & newNature)) { + this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); + this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + } else { + this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.WINDOW, false, this.scene.uiTheme)); + this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme)); + } + const isFusion = pokemon.isFusion(); const doubleShiny = isFusion && pokemon.shiny && pokemon.fusionShiny; const baseVariant = !doubleShiny ? pokemon.getVariant() : pokemon.variant; @@ -217,6 +303,15 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { : ""; this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); this.pokemonShinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + + const newShiny = BigInt(Math.pow(2, (pokemon.shiny ? 1 : 0))); + const newVariant = BigInt(Math.pow(2, pokemon.variant + 4)); + + this.pokemonShinyNewIcon.setText("(+)"); + this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); + this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); + this.pokemonShinyNewIcon.setVisible(!!newShinyOrVariant); } this.pokemonFusionShinyIcon.setPosition(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index e6be659ce7d..58d053ac14e 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "#app/battle-scene-events.js"; +import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "../events/battle-scene"; import { pokemonPrevolutions } from "#app/data/pokemon-evolutions"; import { Variant, getVariantTint } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; @@ -193,8 +193,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private genOptionsText: Phaser.GameObjects.Text; + private instructionsContainer: Phaser.GameObjects.Container; - private instructionsText: Phaser.GameObjects.Text; + private shinyIconElement: Phaser.GameObjects.Sprite; + private formIconElement: Phaser.GameObjects.Sprite; + private abilityIconElement: Phaser.GameObjects.Sprite; + private genderIconElement: Phaser.GameObjects.Sprite; + private natureIconElement: Phaser.GameObjects.Sprite; + private variantIconElement: Phaser.GameObjects.Sprite; + private shinyLabel: Phaser.GameObjects.Text; + private formLabel: Phaser.GameObjects.Text; + private genderLabel: Phaser.GameObjects.Text; + private abilityLabel: Phaser.GameObjects.Text; + private natureLabel: Phaser.GameObjects.Text; + private variantLabel: Phaser.GameObjects.Text; + private starterSelectMessageBox: Phaser.GameObjects.NineSlice; private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; private statsContainer: StatsContainer; @@ -656,10 +669,45 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.pokemonEggMovesContainer); // The font size should be set per language + const instructionTextSize = textSettings.instructionTextSize; + this.instructionsContainer = this.scene.add.container(4, 156); this.instructionsContainer.setVisible(true); this.starterSelectContainer.add(this.instructionsContainer); + // instruction rows that will be pushed into the container dynamically based on need + this.shinyIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + this.shinyIconElement.setScale(0.675); + this.shinyIconElement.setOrigin(0.0, 0.0); + this.shinyLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + + this.formIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement.setScale(0.675); + this.formIconElement.setOrigin(0.0, 0.0); + this.formLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + + this.genderIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement.setScale(0.675); + this.genderIconElement.setOrigin(0.0, 0.0); + this.genderLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + + this.abilityIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement.setScale(0.675); + this.abilityIconElement.setOrigin(0.0, 0.0); + this.abilityLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.PARTY, { fontSize: instructionTextSize }); + + this.natureIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement.setScale(0.675); + this.natureIconElement.setOrigin(0.0, 0.0); + this.natureLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); + + this.variantIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement.setScale(0.675); + this.variantIconElement.setOrigin(0.0, 0.0); + this.variantLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); + + this.hideInstructions(); + this.starterSelectMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); this.starterSelectMessageBoxContainer.setVisible(false); this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); @@ -1494,7 +1542,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false); } - createButtonFromIconText(iconSetting, gamepadType, translatedText, instructionTextSize): void { + updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { let iconPath; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls @@ -1525,10 +1573,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } else { iconPath = this.scene.inputController?.getIconForLatestInputRecorded(iconSetting); } - const iconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, gamepadType, iconPath); - iconElement.setScale(0.675); - iconElement.setOrigin(0.0, 0.0); - const controlLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, translatedText, TextStyle.PARTY, { fontSize: instructionTextSize }); + iconElement.setTexture(gamepadType, iconPath); + iconElement.setPosition(this.instructionRowX, this.instructionRowY); + controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); + iconElement.setVisible(true); + controlLabel.setVisible(true); this.instructionsContainer.add([iconElement, controlLabel]); this.instructionRowY += 8; if (this.instructionRowY >= 24) { @@ -1538,12 +1587,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } updateInstructions(): void { - const currentLanguage = i18next.resolvedLanguage; - const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)); - const textSettings = languageSettings[langSettingKey]; - const instructionTextSize = textSettings.instructionTextSize; this.instructionRowX = 0; this.instructionRowY = 0; + this.hideInstructions(); this.instructionsContainer.removeAll(); let gamepadType; if (this.scene.inputMethod === "gamepad") { @@ -1554,22 +1600,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.speciesStarterDexEntry?.caughtAttr) { if (this.canCycleShiny) { - this.createButtonFromIconText(SettingKeyboard.Button_Cycle_Shiny, gamepadType, i18next.t("starterSelectUiHandler:cycleShiny"), instructionTextSize); + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); } if (this.canCycleForm) { - this.createButtonFromIconText(SettingKeyboard.Button_Cycle_Form, gamepadType, i18next.t("starterSelectUiHandler:cycleForm"), instructionTextSize); + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); } if (this.canCycleGender) { - this.createButtonFromIconText(SettingKeyboard.Button_Cycle_Gender, gamepadType, i18next.t("starterSelectUiHandler:cycleGender"), instructionTextSize); + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); } if (this.canCycleAbility) { - this.createButtonFromIconText(SettingKeyboard.Button_Cycle_Ability, gamepadType, i18next.t("starterSelectUiHandler:cycleAbility"), instructionTextSize); + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Ability, gamepadType, this.abilityIconElement, this.abilityLabel); } if (this.canCycleNature) { - this.createButtonFromIconText(SettingKeyboard.Button_Cycle_Nature, gamepadType, i18next.t("starterSelectUiHandler:cycleNature"), instructionTextSize); + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Nature, gamepadType, this.natureIconElement, this.natureLabel); } if (this.canCycleVariant) { - this.createButtonFromIconText(SettingKeyboard.Button_Cycle_Variant, gamepadType, i18next.t("starterSelectUiHandler:cycleVariant"), instructionTextSize); + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Variant, gamepadType, this.variantIconElement, this.variantLabel); } } } @@ -2341,9 +2387,25 @@ export default class StarterSelectUiHandler extends MessageUiHandler { super.clearText(); } + hideInstructions(): void { + this.shinyIconElement.setVisible(false); + this.shinyLabel.setVisible(false); + this.formIconElement.setVisible(false); + this.formLabel.setVisible(false); + this.genderIconElement.setVisible(false); + this.genderLabel.setVisible(false); + this.abilityIconElement.setVisible(false); + this.abilityLabel.setVisible(false); + this.natureIconElement.setVisible(false); + this.natureLabel.setVisible(false); + this.variantIconElement.setVisible(false); + this.variantLabel.setVisible(false); + } + clear(): void { super.clear(); this.cursor = -1; + this.hideInstructions(); this.starterSelectContainer.setVisible(false); this.blockInput = false; diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 6dccba18fa8..5414508ef70 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -4,7 +4,10 @@ import { Stat, getStatName } from "../data/pokemon-stat"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; const ivChartSize = 24; -const ivChartStatCoordMultipliers = [ [ 0, -1 ], [ 0.825, -0.5 ], [ 0.825, 0.5 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ], [ 0, 1 ] ]; +const ivChartStatCoordMultipliers = [[0, -1], [0.825, -0.5], [0.825, 0.5], [-0.825, -0.5], [-0.825, 0.5], [0, 1]]; +const speedLabelOffset = -3; +const sideLabelOffset = 1; +const ivLabelOffset = [0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset]; const ivChartStatIndexes = [0,1,2,5,4,3]; // swap special attack and speed const defaultIvChartData = new Array(12).fill(null).map(() => 0); @@ -51,7 +54,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { this.ivStatValueTexts = []; new Array(6).fill(null).map((_, i: integer) => { - const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[i][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[i][1] * 1.325 - 4, getStatName(i as Stat), TextStyle.TOOLTIP_CONTENT); + const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[i][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[i][1] * 1.325 - 4 + ivLabelOffset[i], getStatName(i as Stat), TextStyle.TOOLTIP_CONTENT); statLabel.setOrigin(0.5); this.ivStatValueTexts[i] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); diff --git a/src/ui/text.ts b/src/ui/text.ts index 56e1b492dfa..715e4f02430 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -1,10 +1,11 @@ -import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; import BattleScene from "../battle-scene"; import { EggTier } from "../data/enums/egg-type"; import { UiTheme } from "../enums/ui-theme"; import { ModifierTier } from "../modifier/modifier-tier"; +import Phaser from "phaser"; +import i18next from "i18next"; export enum TextStyle { MESSAGE, @@ -29,33 +30,18 @@ export enum TextStyle { SETTINGS_LOCKED, TOOLTIP_TITLE, TOOLTIP_CONTENT, - MOVE_INFO_CONTENT + MOVE_INFO_CONTENT, + MOVE_PP_FULL, + MOVE_PP_HALF_FULL, + MOVE_PP_NEAR_EMPTY, + MOVE_PP_EMPTY } -interface LanguageSetting { - summaryFontSize?: string, - battleInfoFontSize?: string, - partyFontSize?: string, - tooltipContentFontSize?: string, - moveInfoFontSize?: string, - textScale?: number -} - -const languageSettings: { [key: string]: LanguageSetting } = { - "en":{}, - "de":{}, - "es":{}, - "fr":{}, - "it":{}, - "pt_BR":{}, - "zh_CN":{}, -}; - export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text { - const [ styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); const ret = scene.add.text(x, y, content, styleOptions); - ret.setScale(0.1666666667); + ret.setScale(scale); ret.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { ret.setLineSpacing(5); @@ -65,8 +51,8 @@ export function addTextObject(scene: Phaser.Scene, x: number, y: number, content } export function setTextStyle(obj: Phaser.GameObjects.Text, scene: Phaser.Scene, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle) { - const [ styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); - obj.setScale(0.1666666667); + const [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + obj.setScale(scale); obj.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { obj.setLineSpacing(5); @@ -74,11 +60,11 @@ export function setTextStyle(obj: Phaser.GameObjects.Text, scene: Phaser.Scene, } export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): BBCodeText { - const [ styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); const ret = new BBCodeText(scene, x, y, content, styleOptions as BBCodeText.TextStyle); scene.add.existing(ret); - ret.setScale(0.1666666667); + ret.setScale(scale); ret.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as BBCodeText.TextStyle).lineSpacing) { ret.setLineSpacing(10); @@ -88,23 +74,25 @@ export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, c } export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, width: number, height: number, style: TextStyle, extraStyleOptions?: InputText.IConfig): InputText { - const [ styleOptions ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); + const [ scale, styleOptions ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); const ret = new InputText(scene, x, y, width, height, styleOptions as InputText.IConfig); scene.add.existing(ret); - ret.setScale(0.1666666667); + ret.setScale(scale); return ret; } -function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): [ Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, number, number ] { - const lang = i18next.resolvedLanguage; +function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): [ number, Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, number, number ] { + const {resolvedLanguage} = i18next; let shadowXpos = 4; let shadowYpos = 5; + const scale = 0.1666666667; + const defaultFontSize = 96; let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { - fontFamily: "emerald", - fontSize: "96px", + fontFamily: "emerald, unifont", + fontSize: 96, color: getTextColor(style, false, uiTheme), padding: { bottom: 6 @@ -122,65 +110,45 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio case TextStyle.SUMMARY_GREEN: case TextStyle.WINDOW: case TextStyle.WINDOW_ALT: + case TextStyle.STATS_VALUE: shadowXpos = 3; shadowYpos = 3; break; case TextStyle.STATS_LABEL: - let fontSizeLabel = "96px"; - switch (lang) { - case "de": - fontSizeLabel = "80px"; - break; - default: - fontSizeLabel = "96px"; - break; - } - styleOptions.fontSize = fontSizeLabel; - break; - case TextStyle.STATS_VALUE: - shadowXpos = 3; - shadowYpos = 3; - let fontSizeValue = "96px"; - switch (lang) { - case "de": - fontSizeValue = "80px"; - break; - default: - fontSizeValue = "96px"; - break; - } - styleOptions.fontSize = fontSizeValue; - break; case TextStyle.MESSAGE: case TextStyle.SETTINGS_LABEL: case TextStyle.SETTINGS_LOCKED: case TextStyle.SETTINGS_SELECTED: - styleOptions.fontSize = languageSettings[lang]?.summaryFontSize || "96px"; break; case TextStyle.BATTLE_INFO: case TextStyle.MONEY: case TextStyle.TOOLTIP_TITLE: - styleOptions.fontSize = languageSettings[lang]?.battleInfoFontSize || "72px"; + styleOptions.fontSize = defaultFontSize - 24; shadowXpos = 3.5; shadowYpos = 3.5; break; case TextStyle.PARTY: case TextStyle.PARTY_RED: - styleOptions.fontSize = languageSettings[lang]?.partyFontSize || "66px"; + styleOptions.fontSize = defaultFontSize - 30; styleOptions.fontFamily = "pkmnems"; break; case TextStyle.TOOLTIP_CONTENT: - styleOptions.fontSize = languageSettings[lang]?.tooltipContentFontSize || "64px"; + styleOptions.fontSize = defaultFontSize - 32; shadowXpos = 3; shadowYpos = 3; break; case TextStyle.MOVE_INFO_CONTENT: - styleOptions.fontSize = languageSettings[lang]?.moveInfoFontSize || "56px"; + styleOptions.fontSize = defaultFontSize - 40; shadowXpos = 3; shadowYpos = 3; break; } + if (["zh"].includes(resolvedLanguage.substring(0,2))) { + shadowXpos = 0; + shadowYpos = 0; + } + const shadowColor = getTextColor(style, true, uiTheme); if (extraStyleOptions) { @@ -191,7 +159,7 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio styleOptions = Object.assign(styleOptions, extraStyleOptions); } - return [ styleOptions, shadowColor, shadowXpos, shadowYpos ]; + return [ scale, styleOptions, shadowColor, shadowXpos, shadowYpos ]; } export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { @@ -204,11 +172,27 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui return !shadow ? "#f8f8f8" : "#6b5a73"; case TextStyle.WINDOW: case TextStyle.MOVE_INFO_CONTENT: + case TextStyle.MOVE_PP_FULL: case TextStyle.TOOLTIP_CONTENT: if (uiTheme) { return !shadow ? "#484848" : "#d0d0c8"; } return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.MOVE_PP_HALF_FULL: + if (uiTheme) { + return !shadow ? "#a68e17" : "#ebd773"; + } + return !shadow ? "#ccbe00" : "#6e672c"; + case TextStyle.MOVE_PP_NEAR_EMPTY: + if (uiTheme) { + return !shadow ? "#d64b00" : "#f7b18b"; + } + return !shadow ? "#d64b00" : "#69402a"; + case TextStyle.MOVE_PP_EMPTY: + if (uiTheme) { + return !shadow ? "#e13d3d" : "#fca2a2"; + } + return !shadow ? "#e13d3d" : "#632929"; case TextStyle.WINDOW_ALT: return !shadow ? "#484848" : "#d0d0c8"; case TextStyle.BATTLE_INFO: diff --git a/src/ui/time-of-day-widget.ts b/src/ui/time-of-day-widget.ts index fd5a8b0b15e..da3503fb573 100644 --- a/src/ui/time-of-day-widget.ts +++ b/src/ui/time-of-day-widget.ts @@ -1,7 +1,7 @@ import * as Utils from "../utils"; import BattleScene from "#app/battle-scene.js"; import { TimeOfDay } from "#app/data/enums/time-of-day.js"; -import { BattleSceneEventType } from "#app/battle-scene-events.js"; +import { BattleSceneEventType } from "../events/battle-scene"; import { EaseType } from "./enums/ease-type"; /** A small self contained UI element that displays the time of day as an icon */