diff --git a/index.html b/index.html index a86f7832fc7..3722bdd3422 100644 --- a/index.html +++ b/index.html @@ -31,11 +31,6 @@ font-family: 'emerald'; src: url('./fonts/pokemon-emerald-pro.ttf') format('truetype'); } - @font-face { - font-family: 'unifont'; - src: url('./fonts/unifont-15.1.05.otf') format('opentype'); - size-adjust: 70%; - } @font-face { font-family: 'pkmnems'; diff --git a/package-lock.json b/package-lock.json index 45ce400ca2e..638a173d7e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8365,9 +8365,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/public/audio/bgm/battle_aqua_magma_boss.mp3 b/public/audio/bgm/battle_aqua_magma_boss.mp3 new file mode 100644 index 00000000000..b3f3375b16c Binary files /dev/null and b/public/audio/bgm/battle_aqua_magma_boss.mp3 differ diff --git a/public/audio/bgm/battle_aqua_magma_grunt.mp3 b/public/audio/bgm/battle_aqua_magma_grunt.mp3 new file mode 100644 index 00000000000..8dafa05dac5 Binary files /dev/null and b/public/audio/bgm/battle_aqua_magma_grunt.mp3 differ diff --git a/public/audio/bgm/battle_flare_boss.mp3 b/public/audio/bgm/battle_flare_boss.mp3 new file mode 100644 index 00000000000..0c46d364e68 Binary files /dev/null and b/public/audio/bgm/battle_flare_boss.mp3 differ diff --git a/public/audio/bgm/battle_flare_grunt.mp3 b/public/audio/bgm/battle_flare_grunt.mp3 new file mode 100644 index 00000000000..be9d5895259 Binary files /dev/null and b/public/audio/bgm/battle_flare_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galactic_boss.mp3 b/public/audio/bgm/battle_galactic_boss.mp3 new file mode 100644 index 00000000000..1d4b3ad7c7c Binary files /dev/null and b/public/audio/bgm/battle_galactic_boss.mp3 differ diff --git a/public/audio/bgm/battle_galactic_grunt.mp3 b/public/audio/bgm/battle_galactic_grunt.mp3 new file mode 100644 index 00000000000..098d14dab68 Binary files /dev/null and b/public/audio/bgm/battle_galactic_grunt.mp3 differ diff --git a/public/audio/bgm/battle_plasma_boss.mp3 b/public/audio/bgm/battle_plasma_boss.mp3 new file mode 100644 index 00000000000..5bfd024e09d Binary files /dev/null and b/public/audio/bgm/battle_plasma_boss.mp3 differ diff --git a/public/audio/bgm/battle_rocket_boss.mp3 b/public/audio/bgm/battle_rocket_boss.mp3 new file mode 100644 index 00000000000..2a966e20fb7 Binary files /dev/null and b/public/audio/bgm/battle_rocket_boss.mp3 differ diff --git a/public/audio/bgm/battle_rocket_grunt.mp3 b/public/audio/bgm/battle_rocket_grunt.mp3 new file mode 100644 index 00000000000..178141a13df Binary files /dev/null and b/public/audio/bgm/battle_rocket_grunt.mp3 differ diff --git a/public/audio/bgm/bw/victory_team_plasma.mp3 b/public/audio/bgm/bw/victory_team_plasma.mp3 new file mode 100644 index 00000000000..ee498b8bb91 Binary files /dev/null and b/public/audio/bgm/bw/victory_team_plasma.mp3 differ diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 852815800eb..5ba36aee4e3 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -29,8 +29,8 @@ "15-mega", "150-mega", "150-mega", - "150-mega", - "150-mega", + "150-mega-x", + "150-mega-y", "18-mega", "18-mega", "181-mega", @@ -185,8 +185,8 @@ "531-mega", "6-mega", "6-mega", - "6-mega", - "6-mega", + "6-mega-x", + "6-mega-y", "6058", "6058", "6059", @@ -1161,8 +1161,8 @@ "15b-mega", "150b-mega", "150b-mega", - "150b-mega", - "150b-mega", + "150b-mega-x", + "150b-mega-y", "18b-mega", "18b-mega", "181b-mega", @@ -1317,8 +1317,8 @@ "531b-mega", "6b-mega", "6b-mega", - "6b-mega", - "6b-mega", + "6b-mega-x", + "6b-mega-y", "6058b", "6058b", "6059b", @@ -2295,8 +2295,8 @@ "15sb-mega", "150sb-mega", "150sb-mega", - "150sb-mega", - "150sb-mega", + "150sb-mega-x", + "150sb-mega-y", "18sb-mega", "18sb-mega", "181sb-mega", @@ -2451,8 +2451,8 @@ "531sb-mega", "6sb-mega", "6sb-mega", - "6sb-mega", - "6sb-mega", + "6sb-mega-x", + "6sb-mega-y", "6058sb", "6058sb", "6059sb", @@ -3432,8 +3432,8 @@ "15s-mega", "150s-mega", "150s-mega", - "150s-mega", - "150s-mega", + "150s-mega-x", + "150s-mega-y", "18s-mega", "18s-mega", "181s-mega", @@ -3588,8 +3588,8 @@ "531s-mega", "6s-mega", "6s-mega", - "6s-mega", - "6s-mega", + "6s-mega-x", + "6s-mega-y", "6058s", "6058s", "6059s", diff --git a/public/images/items.json b/public/images/items.json index 6af2029efd9..7a6069240ab 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -72,6 +72,27 @@ "h": 15 } }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 55, + "y": 0, + "w": 15, + "h": 15 + } + }, { "filename": "prism_scale", "rotated": false, @@ -87,7 +108,7 @@ "h": 15 }, "frame": { - "x": 55, + "x": 70, "y": 0, "w": 15, "h": 15 @@ -108,7 +129,7 @@ "h": 15 }, "frame": { - "x": 70, + "x": 85, "y": 0, "w": 24, "h": 15 @@ -129,7 +150,7 @@ "h": 16 }, "frame": { - "x": 94, + "x": 109, "y": 0, "w": 16, "h": 16 @@ -150,7 +171,7 @@ "h": 16 }, "frame": { - "x": 110, + "x": 125, "y": 0, "w": 16, "h": 16 @@ -171,7 +192,7 @@ "h": 16 }, "frame": { - "x": 126, + "x": 141, "y": 0, "w": 16, "h": 16 @@ -192,7 +213,7 @@ "h": 16 }, "frame": { - "x": 142, + "x": 157, "y": 0, "w": 16, "h": 16 @@ -213,7 +234,7 @@ "h": 16 }, "frame": { - "x": 158, + "x": 173, "y": 0, "w": 16, "h": 16 @@ -234,7 +255,7 @@ "h": 16 }, "frame": { - "x": 174, + "x": 189, "y": 0, "w": 16, "h": 16 @@ -255,7 +276,7 @@ "h": 16 }, "frame": { - "x": 190, + "x": 205, "y": 0, "w": 16, "h": 16 @@ -276,7 +297,7 @@ "h": 16 }, "frame": { - "x": 206, + "x": 221, "y": 0, "w": 16, "h": 16 @@ -297,7 +318,7 @@ "h": 16 }, "frame": { - "x": 222, + "x": 237, "y": 0, "w": 16, "h": 16 @@ -318,7 +339,7 @@ "h": 16 }, "frame": { - "x": 238, + "x": 253, "y": 0, "w": 16, "h": 16 @@ -339,7 +360,7 @@ "h": 16 }, "frame": { - "x": 254, + "x": 269, "y": 0, "w": 16, "h": 16 @@ -360,7 +381,7 @@ "h": 16 }, "frame": { - "x": 270, + "x": 285, "y": 0, "w": 16, "h": 16 @@ -381,7 +402,7 @@ "h": 16 }, "frame": { - "x": 286, + "x": 301, "y": 0, "w": 16, "h": 16 @@ -402,7 +423,7 @@ "h": 16 }, "frame": { - "x": 302, + "x": 317, "y": 0, "w": 16, "h": 16 @@ -423,7 +444,7 @@ "h": 16 }, "frame": { - "x": 318, + "x": 333, "y": 0, "w": 16, "h": 16 @@ -444,7 +465,7 @@ "h": 16 }, "frame": { - "x": 334, + "x": 349, "y": 0, "w": 16, "h": 16 @@ -465,7 +486,7 @@ "h": 16 }, "frame": { - "x": 350, + "x": 365, "y": 0, "w": 16, "h": 16 @@ -486,7 +507,7 @@ "h": 16 }, "frame": { - "x": 366, + "x": 381, "y": 0, "w": 16, "h": 16 @@ -507,28 +528,7 @@ "h": 16 }, "frame": { - "x": 382, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "gengarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 398, + "x": 397, "y": 0, "w": 16, "h": 16 @@ -556,7 +556,7 @@ } }, { - "filename": "glalitite", + "filename": "gengarite", "rotated": false, "trimmed": true, "sourceSize": { @@ -577,7 +577,7 @@ } }, { - "filename": "gyaradosite", + "filename": "glalitite", "rotated": false, "trimmed": true, "sourceSize": { @@ -598,7 +598,7 @@ } }, { - "filename": "heracronite", + "filename": "gyaradosite", "rotated": false, "trimmed": true, "sourceSize": { @@ -619,7 +619,7 @@ } }, { - "filename": "houndoominite", + "filename": "heracronite", "rotated": false, "trimmed": true, "sourceSize": { @@ -640,7 +640,7 @@ } }, { - "filename": "kangaskhanite", + "filename": "houndoominite", "rotated": false, "trimmed": true, "sourceSize": { @@ -661,7 +661,7 @@ } }, { - "filename": "latiasite", + "filename": "kangaskhanite", "rotated": false, "trimmed": true, "sourceSize": { @@ -676,13 +676,13 @@ }, "frame": { "x": 92, - "y": 16, + "y": 15, "w": 16, "h": 16 } }, { - "filename": "latiosite", + "filename": "latiasite", "rotated": false, "trimmed": true, "sourceSize": { @@ -703,7 +703,7 @@ } }, { - "filename": "lopunnite", + "filename": "latiosite", "rotated": false, "trimmed": true, "sourceSize": { @@ -724,7 +724,7 @@ } }, { - "filename": "lucarionite", + "filename": "lopunnite", "rotated": false, "trimmed": true, "sourceSize": { @@ -745,7 +745,7 @@ } }, { - "filename": "manectite", + "filename": "lucarionite", "rotated": false, "trimmed": true, "sourceSize": { @@ -766,7 +766,7 @@ } }, { - "filename": "mawilite", + "filename": "manectite", "rotated": false, "trimmed": true, "sourceSize": { @@ -787,7 +787,7 @@ } }, { - "filename": "medichamite", + "filename": "mawilite", "rotated": false, "trimmed": true, "sourceSize": { @@ -807,6 +807,27 @@ "h": 16 } }, + { + "filename": "medichamite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 204, + "y": 16, + "w": 16, + "h": 16 + } + }, { "filename": "mega_bracelet", "rotated": false, @@ -822,7 +843,7 @@ "h": 16 }, "frame": { - "x": 204, + "x": 220, "y": 16, "w": 20, "h": 16 @@ -843,7 +864,7 @@ "h": 16 }, "frame": { - "x": 224, + "x": 240, "y": 16, "w": 16, "h": 16 @@ -864,7 +885,7 @@ "h": 16 }, "frame": { - "x": 240, + "x": 256, "y": 16, "w": 16, "h": 16 @@ -885,7 +906,7 @@ "h": 16 }, "frame": { - "x": 256, + "x": 272, "y": 16, "w": 16, "h": 16 @@ -906,7 +927,7 @@ "h": 16 }, "frame": { - "x": 272, + "x": 288, "y": 16, "w": 16, "h": 16 @@ -927,7 +948,7 @@ "h": 16 }, "frame": { - "x": 288, + "x": 304, "y": 16, "w": 16, "h": 16 @@ -948,7 +969,7 @@ "h": 16 }, "frame": { - "x": 304, + "x": 320, "y": 16, "w": 16, "h": 16 @@ -969,7 +990,7 @@ "h": 16 }, "frame": { - "x": 320, + "x": 336, "y": 16, "w": 16, "h": 16 @@ -990,7 +1011,7 @@ "h": 16 }, "frame": { - "x": 336, + "x": 352, "y": 16, "w": 17, "h": 16 @@ -1011,7 +1032,7 @@ "h": 16 }, "frame": { - "x": 353, + "x": 369, "y": 16, "w": 16, "h": 16 @@ -1032,7 +1053,7 @@ "h": 16 }, "frame": { - "x": 369, + "x": 385, "y": 16, "w": 16, "h": 16 @@ -1052,27 +1073,6 @@ "w": 16, "h": 16 }, - "frame": { - "x": 385, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "scizorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, "frame": { "x": 0, "y": 30, @@ -1081,7 +1081,7 @@ } }, { - "filename": "sharpedonite", + "filename": "scizorite", "rotated": false, "trimmed": true, "sourceSize": { @@ -1102,7 +1102,7 @@ } }, { - "filename": "slowbronite", + "filename": "sharpedonite", "rotated": false, "trimmed": true, "sourceSize": { @@ -1123,7 +1123,7 @@ } }, { - "filename": "soul_dew", + "filename": "slowbronite", "rotated": false, "trimmed": true, "sourceSize": { @@ -1144,7 +1144,7 @@ } }, { - "filename": "steelixite", + "filename": "soul_dew", "rotated": false, "trimmed": true, "sourceSize": { @@ -1164,6 +1164,27 @@ "h": 16 } }, + { + "filename": "steelixite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 80, + "y": 31, + "w": 16, + "h": 16 + } + }, { "filename": "strawberry_sweet", "rotated": false, @@ -1179,7 +1200,7 @@ "h": 16 }, "frame": { - "x": 80, + "x": 96, "y": 32, "w": 16, "h": 16 @@ -1200,7 +1221,7 @@ "h": 16 }, "frame": { - "x": 96, + "x": 112, "y": 32, "w": 16, "h": 16 @@ -1221,7 +1242,7 @@ "h": 16 }, "frame": { - "x": 112, + "x": 128, "y": 32, "w": 16, "h": 16 @@ -1242,7 +1263,7 @@ "h": 16 }, "frame": { - "x": 128, + "x": 144, "y": 32, "w": 16, "h": 16 @@ -1263,7 +1284,7 @@ "h": 17 }, "frame": { - "x": 144, + "x": 160, "y": 32, "w": 23, "h": 17 @@ -1284,7 +1305,7 @@ "h": 17 }, "frame": { - "x": 167, + "x": 183, "y": 32, "w": 23, "h": 17 @@ -1305,7 +1326,7 @@ "h": 17 }, "frame": { - "x": 190, + "x": 206, "y": 32, "w": 23, "h": 17 @@ -1326,7 +1347,7 @@ "h": 17 }, "frame": { - "x": 213, + "x": 229, "y": 32, "w": 23, "h": 17 @@ -1347,7 +1368,7 @@ "h": 17 }, "frame": { - "x": 236, + "x": 252, "y": 32, "w": 20, "h": 17 @@ -1368,7 +1389,7 @@ "h": 17 }, "frame": { - "x": 256, + "x": 272, "y": 32, "w": 23, "h": 17 @@ -1389,7 +1410,7 @@ "h": 17 }, "frame": { - "x": 279, + "x": 295, "y": 32, "w": 23, "h": 17 @@ -1410,7 +1431,7 @@ "h": 18 }, "frame": { - "x": 302, + "x": 318, "y": 32, "w": 18, "h": 18 @@ -1431,7 +1452,7 @@ "h": 18 }, "frame": { - "x": 320, + "x": 336, "y": 32, "w": 24, "h": 18 @@ -1452,7 +1473,7 @@ "h": 18 }, "frame": { - "x": 344, + "x": 360, "y": 32, "w": 18, "h": 18 @@ -1473,33 +1494,12 @@ "h": 18 }, "frame": { - "x": 362, + "x": 378, "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, @@ -1522,7 +1522,7 @@ } }, { - "filename": "light_stone", + "filename": "flame_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -1542,6 +1542,27 @@ "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": 34, + "y": 47, + "w": 18, + "h": 18 + } + }, { "filename": "masterpiece_teacup", "rotated": false, @@ -1557,7 +1578,7 @@ "h": 18 }, "frame": { - "x": 34, + "x": 52, "y": 47, "w": 21, "h": 18 @@ -1578,7 +1599,7 @@ "h": 18 }, "frame": { - "x": 55, + "x": 73, "y": 47, "w": 23, "h": 18 @@ -1599,7 +1620,7 @@ "h": 18 }, "frame": { - "x": 78, + "x": 96, "y": 48, "w": 21, "h": 18 @@ -1620,7 +1641,7 @@ "h": 18 }, "frame": { - "x": 99, + "x": 117, "y": 48, "w": 18, "h": 18 @@ -1641,7 +1662,7 @@ "h": 18 }, "frame": { - "x": 117, + "x": 135, "y": 48, "w": 21, "h": 18 @@ -1662,7 +1683,7 @@ "h": 18 }, "frame": { - "x": 138, + "x": 156, "y": 49, "w": 20, "h": 18 @@ -1683,7 +1704,7 @@ "h": 18 }, "frame": { - "x": 158, + "x": 176, "y": 49, "w": 20, "h": 18 @@ -1704,7 +1725,7 @@ "h": 18 }, "frame": { - "x": 178, + "x": 196, "y": 49, "w": 20, "h": 18 @@ -1725,7 +1746,7 @@ "h": 18 }, "frame": { - "x": 198, + "x": 216, "y": 49, "w": 20, "h": 18 @@ -1746,7 +1767,7 @@ "h": 18 }, "frame": { - "x": 218, + "x": 236, "y": 49, "w": 20, "h": 18 @@ -1767,7 +1788,7 @@ "h": 18 }, "frame": { - "x": 238, + "x": 256, "y": 49, "w": 20, "h": 18 @@ -1788,7 +1809,7 @@ "h": 18 }, "frame": { - "x": 258, + "x": 276, "y": 49, "w": 20, "h": 18 @@ -1809,7 +1830,7 @@ "h": 18 }, "frame": { - "x": 278, + "x": 296, "y": 49, "w": 20, "h": 18 @@ -1830,7 +1851,7 @@ "h": 18 }, "frame": { - "x": 298, + "x": 316, "y": 50, "w": 20, "h": 18 @@ -1851,7 +1872,7 @@ "h": 18 }, "frame": { - "x": 318, + "x": 336, "y": 50, "w": 20, "h": 18 @@ -1872,7 +1893,7 @@ "h": 18 }, "frame": { - "x": 338, + "x": 356, "y": 50, "w": 20, "h": 18 @@ -1893,12 +1914,33 @@ "h": 18 }, "frame": { - "x": 358, + "x": 376, "y": 50, "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": 396, + "y": 50, + "w": 18, + "h": 19 + } + }, { "filename": "wl_ice_heal", "rotated": false, @@ -1913,48 +1955,6 @@ "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, @@ -1963,7 +1963,7 @@ } }, { - "filename": "wl_item_urge", + "filename": "wl_item_drop", "rotated": false, "trimmed": true, "sourceSize": { @@ -1984,7 +1984,7 @@ } }, { - "filename": "wl_max_elixir", + "filename": "wl_item_urge", "rotated": false, "trimmed": true, "sourceSize": { @@ -2005,7 +2005,7 @@ } }, { - "filename": "oval_stone", + "filename": "wl_max_elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -2013,16 +2013,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 + "x": 6, + "y": 8, + "w": 20, + "h": 18 }, "frame": { "x": 60, "y": 65, - "w": 18, - "h": 19 + "w": 20, + "h": 18 } }, { @@ -2040,7 +2040,7 @@ "h": 18 }, "frame": { - "x": 78, + "x": 80, "y": 66, "w": 20, "h": 18 @@ -2061,7 +2061,7 @@ "h": 18 }, "frame": { - "x": 98, + "x": 100, "y": 66, "w": 20, "h": 18 @@ -2082,7 +2082,7 @@ "h": 18 }, "frame": { - "x": 118, + "x": 120, "y": 66, "w": 20, "h": 18 @@ -2103,7 +2103,7 @@ "h": 18 }, "frame": { - "x": 138, + "x": 140, "y": 67, "w": 20, "h": 18 @@ -2124,7 +2124,7 @@ "h": 18 }, "frame": { - "x": 158, + "x": 160, "y": 67, "w": 20, "h": 18 @@ -2145,7 +2145,7 @@ "h": 18 }, "frame": { - "x": 178, + "x": 180, "y": 67, "w": 20, "h": 18 @@ -2166,7 +2166,7 @@ "h": 18 }, "frame": { - "x": 198, + "x": 200, "y": 67, "w": 20, "h": 18 @@ -2187,7 +2187,7 @@ "h": 18 }, "frame": { - "x": 218, + "x": 220, "y": 67, "w": 20, "h": 18 @@ -2208,7 +2208,7 @@ "h": 19 }, "frame": { - "x": 238, + "x": 240, "y": 67, "w": 19, "h": 19 @@ -2229,33 +2229,12 @@ "h": 19 }, "frame": { - "x": 257, + "x": 259, "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, @@ -2271,8 +2250,8 @@ "h": 19 }, "frame": { - "x": 298, - "y": 68, + "x": 281, + "y": 67, "w": 23, "h": 19 } @@ -2292,7 +2271,7 @@ "h": 19 }, "frame": { - "x": 321, + "x": 304, "y": 68, "w": 22, "h": 19 @@ -2313,7 +2292,7 @@ "h": 19 }, "frame": { - "x": 343, + "x": 326, "y": 68, "w": 23, "h": 19 @@ -2334,7 +2313,7 @@ "h": 19 }, "frame": { - "x": 366, + "x": 349, "y": 68, "w": 20, "h": 19 @@ -2355,12 +2334,33 @@ "h": 19 }, "frame": { - "x": 386, - "y": 72, + "x": 369, + "y": 68, "w": 21, "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": 390, + "y": 69, + "w": 19, + "h": 19 + } + }, { "filename": "mystic_ticket", "rotated": false, @@ -2419,7 +2419,7 @@ }, "frame": { "x": 46, - "y": 84, + "y": 83, "w": 20, "h": 19 } @@ -2634,27 +2634,6 @@ "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, @@ -2670,12 +2649,33 @@ "h": 20 }, "frame": { - "x": 305, - "y": 87, + "x": 285, + "y": 86, "w": 17, "h": 20 } }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 302, + "y": 87, + "w": 20, + "h": 20 + } + }, { "filename": "hard_stone", "rotated": false, @@ -2718,27 +2718,6 @@ "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, @@ -2754,12 +2733,33 @@ "h": 20 }, "frame": { - "x": 382, - "y": 91, + "x": 365, + "y": 87, "w": 25, "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": 390, + "y": 88, + "w": 17, + "h": 20 + } + }, { "filename": "magnet", "rotated": false, @@ -2818,7 +2818,7 @@ }, "frame": { "x": 42, - "y": 103, + "y": 102, "w": 20, "h": 20 } @@ -3049,7 +3049,7 @@ }, "frame": { "x": 278, - "y": 107, + "y": 106, "w": 24, "h": 20 } @@ -3117,27 +3117,6 @@ "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, @@ -3153,8 +3132,8 @@ "h": 21 }, "frame": { - "x": 382, - "y": 111, + "x": 364, + "y": 107, "w": 23, "h": 21 } @@ -3174,33 +3153,12 @@ "h": 21 }, "frame": { - "x": 0, - "y": 122, + "x": 387, + "y": 108, "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, @@ -3216,8 +3174,8 @@ "h": 21 }, "frame": { - "x": 42, - "y": 123, + "x": 0, + "y": 122, "w": 23, "h": 21 } @@ -3237,12 +3195,54 @@ "h": 21 }, "frame": { - "x": 65, - "y": 124, + "x": 23, + "y": 122, "w": 20, "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": 43, + "y": 122, + "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": 62, + "y": 123, + "w": 19, + "h": 21 + } + }, { "filename": "deep_sea_tooth", "rotated": false, @@ -3258,7 +3258,7 @@ "h": 21 }, "frame": { - "x": 85, + "x": 81, "y": 124, "w": 22, "h": 21 @@ -3279,7 +3279,7 @@ "h": 21 }, "frame": { - "x": 107, + "x": 103, "y": 125, "w": 21, "h": 21 @@ -3300,7 +3300,7 @@ "h": 21 }, "frame": { - "x": 128, + "x": 124, "y": 125, "w": 22, "h": 21 @@ -3321,7 +3321,7 @@ "h": 21 }, "frame": { - "x": 150, + "x": 146, "y": 125, "w": 28, "h": 21 @@ -3342,7 +3342,7 @@ "h": 21 }, "frame": { - "x": 178, + "x": 174, "y": 125, "w": 28, "h": 21 @@ -3363,7 +3363,7 @@ "h": 21 }, "frame": { - "x": 206, + "x": 202, "y": 125, "w": 28, "h": 21 @@ -3384,7 +3384,7 @@ "h": 21 }, "frame": { - "x": 234, + "x": 230, "y": 126, "w": 28, "h": 21 @@ -3405,12 +3405,33 @@ "h": 21 }, "frame": { - "x": 262, - "y": 127, + "x": 258, + "y": 126, "w": 28, "h": 21 } }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 286, + "y": 126, + "w": 15, + "h": 22 + } + }, { "filename": "mint_spdef", "rotated": false, @@ -3426,7 +3447,7 @@ "h": 21 }, "frame": { - "x": 290, + "x": 301, "y": 127, "w": 28, "h": 21 @@ -3447,7 +3468,7 @@ "h": 21 }, "frame": { - "x": 318, + "x": 329, "y": 127, "w": 23, "h": 21 @@ -3468,33 +3489,12 @@ "h": 21 }, "frame": { - "x": 341, - "y": 127, + "x": 352, + "y": 128, "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, @@ -3510,12 +3510,33 @@ "h": 21 }, "frame": { - "x": 381, - "y": 132, + "x": 375, + "y": 129, "w": 23, "h": 21 } }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 398, + "y": 129, + "w": 15, + "h": 23 + } + }, { "filename": "poison_barb", "rotated": false, @@ -3559,7 +3580,7 @@ } }, { - "filename": "spell_tag", + "filename": "berry_pot", "rotated": false, "trimmed": true, "sourceSize": { @@ -3568,14 +3589,35 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, - "w": 19, - "h": 21 + "y": 5, + "w": 18, + "h": 22 }, "frame": { "x": 42, + "y": 143, + "w": 18, + "h": 22 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 60, "y": 144, - "w": 19, + "w": 21, "h": 21 } }, @@ -3594,7 +3636,7 @@ "h": 21 }, "frame": { - "x": 61, + "x": 81, "y": 145, "w": 22, "h": 21 @@ -3615,8 +3657,8 @@ "h": 21 }, "frame": { - "x": 83, - "y": 145, + "x": 103, + "y": 146, "w": 22, "h": 21 } @@ -3636,7 +3678,7 @@ "h": 21 }, "frame": { - "x": 105, + "x": 125, "y": 146, "w": 22, "h": 21 @@ -3657,33 +3699,12 @@ "h": 21 }, "frame": { - "x": 127, + "x": 147, "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, @@ -3699,7 +3720,7 @@ "h": 22 }, "frame": { - "x": 171, + "x": 170, "y": 146, "w": 22, "h": 22 @@ -3720,33 +3741,12 @@ "h": 22 }, "frame": { - "x": 193, + "x": 192, "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, @@ -3762,7 +3762,7 @@ "h": 22 }, "frame": { - "x": 234, + "x": 214, "y": 147, "w": 22, "h": 22 @@ -3783,8 +3783,8 @@ "h": 22 }, "frame": { - "x": 256, - "y": 148, + "x": 236, + "y": 147, "w": 22, "h": 22 } @@ -3804,8 +3804,8 @@ "h": 22 }, "frame": { - "x": 278, - "y": 148, + "x": 258, + "y": 147, "w": 22, "h": 22 } @@ -3825,7 +3825,7 @@ "h": 22 }, "frame": { - "x": 300, + "x": 280, "y": 148, "w": 22, "h": 22 @@ -3846,54 +3846,12 @@ "h": 22 }, "frame": { - "x": 322, + "x": 302, "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, @@ -3909,8 +3867,8 @@ "h": 22 }, "frame": { - "x": 381, - "y": 153, + "x": 324, + "y": 148, "w": 22, "h": 22 } @@ -3930,54 +3888,12 @@ "h": 22 }, "frame": { - "x": 0, - "y": 164, + "x": 346, + "y": 149, "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, @@ -3993,29 +3909,8 @@ "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, + "x": 368, + "y": 150, "w": 22, "h": 22 } @@ -4035,8 +3930,8 @@ "h": 22 }, "frame": { - "x": 105, - "y": 167, + "x": 390, + "y": 152, "w": 24, "h": 22 } @@ -4056,12 +3951,75 @@ "h": 22 }, "frame": { - "x": 129, - "y": 167, + "x": 0, + "y": 164, "w": 24, "h": 22 } }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 24, + "y": 164, + "w": 17, + "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": 41, + "y": 165, + "w": 22, + "h": 22 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 63, + "y": 165, + "w": 17, + "h": 22 + } + }, { "filename": "fighting_memory", "rotated": false, @@ -4077,8 +4035,8 @@ "h": 22 }, "frame": { - "x": 153, - "y": 168, + "x": 80, + "y": 166, "w": 22, "h": 22 } @@ -4098,8 +4056,8 @@ "h": 22 }, "frame": { - "x": 175, - "y": 168, + "x": 102, + "y": 167, "w": 22, "h": 22 } @@ -4119,14 +4077,14 @@ "h": 22 }, "frame": { - "x": 197, - "y": 168, + "x": 124, + "y": 167, "w": 22, "h": 22 } }, { - "filename": "full_heal", + "filename": "ganlon_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -4134,20 +4092,83 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 219, - "y": 168, - "w": 15, - "h": 23 + "x": 146, + "y": 167, + "w": 22, + "h": 22 } }, { - "filename": "ganlon_berry", + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 168, + "y": 168, + "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": 190, + "y": 168, + "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": 212, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "guard_spec", "rotated": false, "trimmed": true, "sourceSize": { @@ -4168,7 +4189,7 @@ } }, { - "filename": "ghost_memory", + "filename": "hard_meteorite", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,121 +4197,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 7, "y": 5, - "w": 22, + "w": 20, "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, + "y": 169, "w": 20, - "h": 23 - }, - "frame": { - "x": 361, - "y": 173, - "w": 20, - "h": 23 + "h": 22 } }, { @@ -4308,8 +4224,8 @@ "h": 22 }, "frame": { - "x": 381, - "y": 175, + "x": 276, + "y": 170, "w": 23, "h": 22 } @@ -4329,8 +4245,8 @@ "h": 22 }, "frame": { - "x": 0, - "y": 186, + "x": 299, + "y": 170, "w": 22, "h": 22 } @@ -4350,12 +4266,33 @@ "h": 22 }, "frame": { - "x": 22, - "y": 187, + "x": 321, + "y": 170, "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": 343, + "y": 171, + "w": 19, + "h": 22 + } + }, { "filename": "magmarizer", "rotated": false, @@ -4371,8 +4308,8 @@ "h": 22 }, "frame": { - "x": 44, - "y": 188, + "x": 362, + "y": 172, "w": 22, "h": 22 } @@ -4392,12 +4329,33 @@ "h": 22 }, "frame": { - "x": 66, - "y": 188, + "x": 384, + "y": 174, "w": 27, "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": 0, + "y": 186, + "w": 19, + "h": 22 + } + }, { "filename": "mini_black_hole", "rotated": false, @@ -4413,8 +4371,8 @@ "h": 22 }, "frame": { - "x": 93, - "y": 189, + "x": 19, + "y": 186, "w": 22, "h": 22 } @@ -4434,8 +4392,8 @@ "h": 22 }, "frame": { - "x": 115, - "y": 189, + "x": 41, + "y": 187, "w": 24, "h": 22 } @@ -4455,8 +4413,8 @@ "h": 22 }, "frame": { - "x": 139, - "y": 190, + "x": 65, + "y": 188, "w": 22, "h": 22 } @@ -4476,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 161, - "y": 190, + "x": 87, + "y": 189, "w": 22, "h": 22 } @@ -4497,8 +4455,8 @@ "h": 22 }, "frame": { - "x": 183, - "y": 190, + "x": 109, + "y": 189, "w": 22, "h": 22 } @@ -4518,8 +4476,8 @@ "h": 22 }, "frame": { - "x": 205, - "y": 191, + "x": 131, + "y": 189, "w": 22, "h": 22 } @@ -4539,8 +4497,8 @@ "h": 22 }, "frame": { - "x": 227, - "y": 191, + "x": 153, + "y": 190, "w": 23, "h": 22 } @@ -4560,8 +4518,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 192, + "x": 176, + "y": 190, "w": 22, "h": 22 } @@ -4581,8 +4539,8 @@ "h": 22 }, "frame": { - "x": 272, - "y": 192, + "x": 198, + "y": 191, "w": 22, "h": 22 } @@ -4602,12 +4560,33 @@ "h": 22 }, "frame": { - "x": 294, - "y": 192, + "x": 220, + "y": 191, "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": 242, + "y": 191, + "w": 20, + "h": 22 + } + }, { "filename": "starf_berry", "rotated": false, @@ -4623,7 +4602,7 @@ "h": 22 }, "frame": { - "x": 316, + "x": 262, "y": 192, "w": 22, "h": 22 @@ -4644,33 +4623,12 @@ "h": 22 }, "frame": { - "x": 338, - "y": 193, + "x": 284, + "y": 192, "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, @@ -4686,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 381, - "y": 197, + "x": 306, + "y": 192, "w": 22, "h": 22 } @@ -4706,6 +4664,90 @@ "w": 22, "h": 22 }, + "frame": { + "x": 328, + "y": 193, + "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": 350, + "y": 194, + "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": 372, + "y": 196, + "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": 394, + "y": 196, + "w": 17, + "h": 23 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, "frame": { "x": 0, "y": 208, @@ -4714,7 +4756,7 @@ } }, { - "filename": "tm_dark", + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -4722,58 +4764,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, "y": 5, - "w": 22, - "h": 22 + "w": 17, + "h": 23 }, "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 + "y": 208, + "w": 17, + "h": 23 } }, { @@ -4791,8 +4791,8 @@ "h": 22 }, "frame": { - "x": 88, - "y": 211, + "x": 39, + "y": 209, "w": 22, "h": 22 } @@ -4812,8 +4812,8 @@ "h": 22 }, "frame": { - "x": 110, - "y": 211, + "x": 61, + "y": 210, "w": 22, "h": 22 } @@ -4833,8 +4833,8 @@ "h": 22 }, "frame": { - "x": 132, - "y": 212, + "x": 83, + "y": 211, "w": 22, "h": 22 } @@ -4854,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 154, - "y": 212, + "x": 105, + "y": 211, "w": 22, "h": 22 } @@ -4875,8 +4875,8 @@ "h": 22 }, "frame": { - "x": 176, - "y": 212, + "x": 127, + "y": 211, "w": 22, "h": 22 } @@ -4896,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 198, - "y": 213, + "x": 149, + "y": 212, "w": 22, "h": 22 } @@ -4917,8 +4917,8 @@ "h": 22 }, "frame": { - "x": 220, - "y": 213, + "x": 171, + "y": 212, "w": 22, "h": 22 } @@ -4938,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 242, - "y": 214, + "x": 193, + "y": 213, "w": 22, "h": 22 } @@ -4959,8 +4959,8 @@ "h": 22 }, "frame": { - "x": 264, - "y": 214, + "x": 215, + "y": 213, "w": 22, "h": 22 } @@ -4980,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 286, - "y": 214, + "x": 237, + "y": 213, "w": 22, "h": 22 } @@ -5001,7 +5001,7 @@ "h": 22 }, "frame": { - "x": 308, + "x": 259, "y": 214, "w": 22, "h": 22 @@ -5022,8 +5022,8 @@ "h": 22 }, "frame": { - "x": 330, - "y": 215, + "x": 281, + "y": 214, "w": 22, "h": 22 } @@ -5043,8 +5043,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 219, + "x": 303, + "y": 214, "w": 22, "h": 22 } @@ -5064,14 +5064,14 @@ "h": 22 }, "frame": { - "x": 374, - "y": 219, + "x": 325, + "y": 215, "w": 22, "h": 22 } }, { - "filename": "potion", + "filename": "water_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,20 +5079,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 5, "y": 5, - "w": 17, - "h": 23 + "w": 22, + "h": 22 }, "frame": { - "x": 396, - "y": 219, - "w": 17, - "h": 23 + "x": 347, + "y": 216, + "w": 22, + "h": 22 } }, { - "filename": "water_memory", + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 369, + "y": 218, + "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": 391, + "y": 219, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_attack", "rotated": false, "trimmed": true, "sourceSize": { @@ -5113,7 +5155,7 @@ } }, { - "filename": "water_stone", + "filename": "x_defense", "rotated": false, "trimmed": true, "sourceSize": { @@ -5134,7 +5176,7 @@ } }, { - "filename": "x_accuracy", + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5142,58 +5184,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, "y": 5, - "w": 22, - "h": 22 + "w": 17, + "h": 23 }, "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 + "y": 231, + "w": 17, + "h": 23 } }, { @@ -5211,8 +5211,8 @@ "h": 22 }, "frame": { - "x": 110, - "y": 233, + "x": 61, + "y": 232, "w": 22, "h": 22 } @@ -5232,8 +5232,8 @@ "h": 22 }, "frame": { - "x": 132, - "y": 234, + "x": 83, + "y": 233, "w": 22, "h": 22 } @@ -5253,8 +5253,8 @@ "h": 22 }, "frame": { - "x": 154, - "y": 234, + "x": 105, + "y": 233, "w": 22, "h": 22 } @@ -5274,8 +5274,8 @@ "h": 23 }, "frame": { - "x": 176, - "y": 234, + "x": 127, + "y": 233, "w": 22, "h": 23 } @@ -5295,14 +5295,14 @@ "h": 23 }, "frame": { - "x": 198, - "y": 235, + "x": 149, + "y": 234, "w": 23, "h": 23 } }, { - "filename": "lansat_berry", + "filename": "dragon_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -5311,13 +5311,13 @@ }, "spriteSourceSize": { "x": 5, - "y": 4, + "y": 5, "w": 21, "h": 23 }, "frame": { - "x": 221, - "y": 235, + "x": 172, + "y": 234, "w": 21, "h": 23 } @@ -5337,8 +5337,8 @@ "h": 23 }, "frame": { - "x": 242, - "y": 236, + "x": 193, + "y": 235, "w": 22, "h": 23 } @@ -5358,12 +5358,33 @@ "h": 23 }, "frame": { - "x": 264, - "y": 236, + "x": 215, + "y": 235, "w": 24, "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": 239, + "y": 235, + "w": 20, + "h": 23 + } + }, { "filename": "coin_case", "rotated": false, @@ -5379,33 +5400,12 @@ "h": 23 }, "frame": { - "x": 288, + "x": 259, "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, @@ -5421,12 +5421,33 @@ "h": 23 }, "frame": { - "x": 330, - "y": 237, + "x": 283, + "y": 236, "w": 22, "h": 23 } }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 305, + "y": 236, + "w": 18, + "h": 23 + } + }, { "filename": "dragon_tera_shard", "rotated": false, @@ -5442,12 +5463,33 @@ "h": 23 }, "frame": { - "x": 352, - "y": 241, + "x": 323, + "y": 237, "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": 345, + "y": 238, + "w": 23, + "h": 23 + } + }, { "filename": "electric_tera_shard", "rotated": false, @@ -5463,14 +5505,14 @@ "h": 23 }, "frame": { - "x": 374, - "y": 241, + "x": 368, + "y": 240, "w": 22, "h": 23 } }, { - "filename": "super_potion", + "filename": "expert_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -5478,15 +5520,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, + "x": 4, + "y": 4, + "w": 24, "h": 23 }, "frame": { - "x": 396, - "y": 242, - "w": 17, + "x": 390, + "y": 241, + "w": 24, "h": 23 } }, @@ -5533,28 +5575,7 @@ } }, { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 44, - "y": 254, - "w": 23, - "h": 23 - } - }, - { - "filename": "leaf_stone", + "filename": "fire_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5564,34 +5585,13 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 21, + "w": 22, "h": 23 }, "frame": { - "x": 67, + "x": 44, "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, + "w": 22, "h": 23 } }, @@ -5610,33 +5610,12 @@ "h": 24 }, "frame": { - "x": 112, - "y": 255, + "x": 66, + "y": 254, "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, @@ -5652,8 +5631,8 @@ "h": 23 }, "frame": { - "x": 150, - "y": 256, + "x": 82, + "y": 255, "w": 22, "h": 23 } @@ -5673,8 +5652,8 @@ "h": 23 }, "frame": { - "x": 172, - "y": 257, + "x": 104, + "y": 255, "w": 22, "h": 23 } @@ -5694,8 +5673,8 @@ "h": 23 }, "frame": { - "x": 194, - "y": 258, + "x": 126, + "y": 256, "w": 22, "h": 23 } @@ -5715,8 +5694,8 @@ "h": 23 }, "frame": { - "x": 216, - "y": 258, + "x": 148, + "y": 257, "w": 22, "h": 23 } @@ -5736,8 +5715,8 @@ "h": 23 }, "frame": { - "x": 238, - "y": 259, + "x": 170, + "y": 257, "w": 22, "h": 23 } @@ -5757,8 +5736,8 @@ "h": 23 }, "frame": { - "x": 260, - "y": 259, + "x": 192, + "y": 258, "w": 23, "h": 23 } @@ -5778,8 +5757,29 @@ "h": 23 }, "frame": { - "x": 283, - "y": 259, + "x": 215, + "y": 258, + "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": 237, + "y": 258, "w": 22, "h": 23 } @@ -5799,56 +5799,14 @@ "h": 23 }, "frame": { - "x": 305, + "x": 259, "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", + "filename": "lansat_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5857,13 +5815,13 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, + "y": 4, "w": 21, "h": 23 }, "frame": { - "x": 375, - "y": 264, + "x": 283, + "y": 259, "w": 21, "h": 23 } @@ -5883,12 +5841,54 @@ "h": 24 }, "frame": { - "x": 396, - "y": 265, + "x": 304, + "y": 259, "w": 16, "h": 24 } }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 320, + "y": 260, + "w": 21, + "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": 341, + "y": 261, + "w": 24, + "h": 23 + } + }, { "filename": "never_melt_ice", "rotated": false, @@ -5903,6 +5903,48 @@ "w": 22, "h": 23 }, + "frame": { + "x": 365, + "y": 263, + "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": 387, + "y": 264, + "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": 0, "y": 275, @@ -5911,7 +5953,7 @@ } }, { - "filename": "normal_tera_shard", + "filename": "poison_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -5931,48 +5973,6 @@ "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, @@ -5988,8 +5988,8 @@ "h": 23 }, "frame": { - "x": 88, - "y": 278, + "x": 44, + "y": 277, "w": 22, "h": 23 } @@ -6009,8 +6009,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 279, + "x": 66, + "y": 278, "w": 23, "h": 23 } @@ -6030,33 +6030,12 @@ "h": 23 }, "frame": { - "x": 133, - "y": 279, + "x": 89, + "y": 278, "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, @@ -6072,8 +6051,8 @@ "h": 23 }, "frame": { - "x": 172, - "y": 280, + "x": 112, + "y": 279, "w": 22, "h": 23 } @@ -6093,29 +6072,8 @@ "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, + "x": 134, + "y": 280, "w": 22, "h": 23 } @@ -6135,12 +6093,54 @@ "h": 23 }, "frame": { - "x": 238, - "y": 282, + "x": 156, + "y": 280, "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": 180, + "y": 281, + "w": 21, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 201, + "y": 281, + "w": 22, + "h": 23 + } + }, { "filename": "stellar_tera_shard", "rotated": false, @@ -6156,8 +6156,8 @@ "h": 23 }, "frame": { - "x": 262, - "y": 282, + "x": 223, + "y": 281, "w": 22, "h": 23 } @@ -6177,12 +6177,33 @@ "h": 23 }, "frame": { - "x": 284, + "x": 245, "y": 282, "w": 23, "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": 268, + "y": 282, + "w": 24, + "h": 23 + } + }, { "filename": "water_tera_shard", "rotated": false, @@ -6198,8 +6219,8 @@ "h": 23 }, "frame": { - "x": 307, - "y": 282, + "x": 292, + "y": 283, "w": 22, "h": 23 } @@ -6219,33 +6240,12 @@ "h": 23 }, "frame": { - "x": 329, + "x": 314, "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, @@ -6261,14 +6261,14 @@ "h": 23 }, "frame": { - "x": 374, - "y": 287, + "x": 335, + "y": 284, "w": 22, "h": 23 } }, { - "filename": "elixir", + "filename": "big_root", "rotated": false, "trimmed": true, "sourceSize": { @@ -6276,15 +6276,36 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 4, "y": 4, - "w": 18, + "w": 23, "h": 24 }, "frame": { - "x": 396, - "y": 289, - "w": 18, + "x": 357, + "y": 286, + "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": 380, + "y": 287, + "w": 24, "h": 24 } }, @@ -6310,49 +6331,7 @@ } }, { - "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", + "filename": "elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -6366,8 +6345,8 @@ "h": 24 }, "frame": { - "x": 68, - "y": 300, + "x": 21, + "y": 299, "w": 18, "h": 24 } @@ -6387,8 +6366,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 301, + "x": 39, + "y": 300, "w": 24, "h": 24 } @@ -6408,33 +6387,12 @@ "h": 24 }, "frame": { - "x": 110, - "y": 302, + "x": 63, + "y": 301, "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, @@ -6450,14 +6408,14 @@ "h": 24 }, "frame": { - "x": 152, - "y": 303, + "x": 87, + "y": 301, "w": 24, "h": 24 } }, { - "filename": "iron", + "filename": "ether", "rotated": false, "trimmed": true, "sourceSize": { @@ -6465,15 +6423,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 7, "y": 4, - "w": 16, + "w": 18, "h": 24 }, "frame": { - "x": 176, - "y": 303, - "w": 16, + "x": 111, + "y": 302, + "w": 18, "h": 24 } }, @@ -6492,33 +6450,12 @@ "h": 24 }, "frame": { - "x": 192, - "y": 304, + "x": 129, + "y": 303, "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, @@ -6534,8 +6471,8 @@ "h": 24 }, "frame": { - "x": 233, - "y": 305, + "x": 153, + "y": 303, "w": 24, "h": 24 } @@ -6555,8 +6492,8 @@ "h": 24 }, "frame": { - "x": 257, - "y": 305, + "x": 177, + "y": 304, "w": 24, "h": 24 } @@ -6576,12 +6513,33 @@ "h": 24 }, "frame": { - "x": 281, - "y": 305, + "x": 201, + "y": 304, "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": 225, + "y": 304, + "w": 18, + "h": 24 + } + }, { "filename": "golden_punch", "rotated": false, @@ -6597,33 +6555,12 @@ "h": 24 }, "frame": { - "x": 305, + "x": 243, "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, @@ -6639,8 +6576,8 @@ "h": 24 }, "frame": { - "x": 347, - "y": 310, + "x": 267, + "y": 305, "w": 24, "h": 24 } @@ -6660,35 +6597,14 @@ "h": 24 }, "frame": { - "x": 371, - "y": 310, + "x": 291, + "y": 306, "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", + "filename": "hp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -6698,13 +6614,13 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 17, + "w": 16, "h": 24 }, "frame": { - "x": 0, - "y": 322, - "w": 17, + "x": 315, + "y": 306, + "w": 16, "h": 24 } }, @@ -6723,8 +6639,8 @@ "h": 24 }, "frame": { - "x": 17, - "y": 323, + "x": 331, + "y": 307, "w": 24, "h": 24 } @@ -6744,14 +6660,56 @@ "h": 24 }, "frame": { - "x": 41, - "y": 324, + "x": 355, + "y": 310, "w": 24, "h": 24 } }, { - "filename": "max_potion", + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 379, + "y": 311, + "w": 16, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 395, + "y": 311, + "w": 17, + "h": 24 + } + }, + { + "filename": "max_elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -6765,8 +6723,29 @@ "h": 24 }, "frame": { - "x": 65, - "y": 324, + "x": 0, + "y": 322, + "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": 18, + "y": 323, "w": 18, "h": 24 } @@ -6785,6 +6764,48 @@ "w": 24, "h": 24 }, + "frame": { + "x": 36, + "y": 324, + "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": 60, + "y": 325, + "w": 23, + "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": 83, "y": 325, @@ -6793,28 +6814,7 @@ } }, { - "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", + "filename": "max_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -6824,55 +6824,13 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 16, + "w": 17, "h": 24 }, "frame": { - "x": 130, + "x": 107, "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, + "w": 17, "h": 24 } }, @@ -6891,33 +6849,12 @@ "h": 24 }, "frame": { - "x": 192, - "y": 328, + "x": 124, + "y": 327, "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, @@ -6933,8 +6870,8 @@ "h": 24 }, "frame": { - "x": 232, - "y": 329, + "x": 148, + "y": 327, "w": 24, "h": 24 } @@ -6954,8 +6891,8 @@ "h": 24 }, "frame": { - "x": 256, - "y": 329, + "x": 172, + "y": 328, "w": 24, "h": 24 } @@ -6975,12 +6912,75 @@ "h": 24 }, "frame": { - "x": 280, - "y": 329, + "x": 196, + "y": 328, "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": 220, + "y": 328, + "w": 18, + "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": 238, + "y": 329, + "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": 254, + "y": 329, + "w": 22, + "h": 24 + } + }, { "filename": "meadow_plate", "rotated": false, @@ -6996,30 +6996,9 @@ "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, + "x": 276, "y": 330, - "w": 16, + "w": 24, "h": 24 } }, @@ -7038,8 +7017,8 @@ "h": 24 }, "frame": { - "x": 344, - "y": 334, + "x": 300, + "y": 330, "w": 24, "h": 24 } @@ -7059,8 +7038,8 @@ "h": 24 }, "frame": { - "x": 368, - "y": 334, + "x": 324, + "y": 331, "w": 24, "h": 24 } @@ -7080,14 +7059,56 @@ "h": 24 }, "frame": { - "x": 392, - "y": 337, + "x": 348, + "y": 334, "w": 21, "h": 24 } }, { - "filename": "protein", + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 369, + "y": 335, + "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": 393, + "y": 335, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -7108,7 +7129,7 @@ } }, { - "filename": "pixie_plate", + "filename": "protein", "rotated": false, "trimmed": true, "sourceSize": { @@ -7116,15 +7137,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, "y": 4, - "w": 24, + "w": 16, "h": 24 }, "frame": { "x": 16, "y": 347, - "w": 24, + "w": 16, "h": 24 } }, @@ -7143,7 +7164,7 @@ "h": 24 }, "frame": { - "x": 40, + "x": 32, "y": 348, "w": 20, "h": 24 @@ -7164,8 +7185,8 @@ "h": 24 }, "frame": { - "x": 60, - "y": 348, + "x": 52, + "y": 349, "w": 16, "h": 24 } @@ -7185,117 +7206,12 @@ "h": 24 }, "frame": { - "x": 76, + "x": 68, "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, @@ -7311,113 +7227,8 @@ "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, + "x": 91, + "y": 349, "w": 16, "h": 24 } @@ -7437,14 +7248,14 @@ "h": 24 }, "frame": { - "x": 344, - "y": 358, + "x": 107, + "y": 350, "w": 17, "h": 24 } }, { - "filename": "toxic_plate", + "filename": "salac_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -7458,14 +7269,14 @@ "h": 24 }, "frame": { - "x": 361, - "y": 358, + "x": 124, + "y": 351, "w": 24, "h": 24 } }, { - "filename": "zap_plate", + "filename": "scanner", "rotated": false, "trimmed": true, "sourceSize": { @@ -7479,8 +7290,92 @@ "h": 24 }, "frame": { - "x": 385, - "y": 361, + "x": 148, + "y": 351, + "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": 172, + "y": 352, + "w": 21, + "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": 193, + "y": 352, + "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": 217, + "y": 352, + "w": 16, + "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": 233, + "y": 353, "w": 24, "h": 24 } @@ -7500,12 +7395,159 @@ "h": 24 }, "frame": { - "x": 0, - "y": 370, + "x": 257, + "y": 353, "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": 273, + "y": 354, + "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": 297, + "y": 354, + "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": 321, + "y": 355, + "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": 345, + "y": 358, + "w": 24, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 369, + "y": 359, + "w": 24, + "h": 24 + } + }, + { + "filename": "prison_bottle", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 30 + }, + "frame": { + "x": 393, + "y": 359, + "w": 17, + "h": 30 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 0, + "y": 371, + "w": 24, + "h": 24 + } + }, { "filename": "black_augurite", "rotated": false, @@ -7521,8 +7563,8 @@ "h": 25 }, "frame": { - "x": 16, - "y": 371, + "x": 24, + "y": 372, "w": 22, "h": 25 } @@ -7542,8 +7584,8 @@ "h": 26 }, "frame": { - "x": 38, - "y": 372, + "x": 46, + "y": 373, "w": 23, "h": 26 } @@ -7563,7 +7605,7 @@ "h": 26 }, "frame": { - "x": 61, + "x": 69, "y": 373, "w": 24, "h": 26 @@ -7584,7 +7626,7 @@ "h": 26 }, "frame": { - "x": 85, + "x": 93, "y": 374, "w": 27, "h": 26 @@ -7605,8 +7647,8 @@ "h": 27 }, "frame": { - "x": 112, - "y": 374, + "x": 120, + "y": 375, "w": 32, "h": 27 } @@ -7626,33 +7668,12 @@ "h": 28 }, "frame": { - "x": 144, - "y": 375, + "x": 152, + "y": 376, "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, @@ -7668,7 +7689,7 @@ "h": 30 }, "frame": { - "x": 190, + "x": 181, "y": 376, "w": 29, "h": 30 @@ -7689,8 +7710,8 @@ "h": 31 }, "frame": { - "x": 219, - "y": 377, + "x": 210, + "y": 376, "w": 22, "h": 31 } @@ -7710,7 +7731,7 @@ "h": 31 }, "frame": { - "x": 241, + "x": 232, "y": 377, "w": 17, "h": 31 @@ -7731,7 +7752,7 @@ "h": 31 }, "frame": { - "x": 258, + "x": 249, "y": 377, "w": 17, "h": 31 @@ -7752,8 +7773,8 @@ "h": 31 }, "frame": { - "x": 275, - "y": 377, + "x": 266, + "y": 378, "w": 22, "h": 31 } @@ -7773,8 +7794,8 @@ "h": 31 }, "frame": { - "x": 297, - "y": 377, + "x": 288, + "y": 378, "w": 22, "h": 31 } @@ -7794,8 +7815,8 @@ "h": 31 }, "frame": { - "x": 319, - "y": 378, + "x": 310, + "y": 379, "w": 22, "h": 31 } @@ -7815,7 +7836,7 @@ "h": 31 }, "frame": { - "x": 341, + "x": 332, "y": 382, "w": 17, "h": 31 @@ -7836,8 +7857,8 @@ "h": 31 }, "frame": { - "x": 358, - "y": 382, + "x": 349, + "y": 383, "w": 22, "h": 31 } @@ -7848,6 +7869,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b516eabbda93be0375a8d45471c54e6c:5bf73f118de19726fc5d5a538ddc6f22:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:077d4cf8bc7743c80fe2829518c5c3cc:a57a58205d62e190c1abfe922add9b68:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 51d692b1c73..8b2b0debd3d 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/eviolite.png b/public/images/items/eviolite.png new file mode 100644 index 00000000000..8eb195ece2a Binary files /dev/null and b/public/images/items/eviolite.png differ diff --git a/public/images/pokemon/431.json b/public/images/pokemon/431.json index 532fee12a28..53197576127 100644 --- a/public/images/pokemon/431.json +++ b/public/images/pokemon/431.json @@ -4,1206 +4,51 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 417, + "h": 417 }, "scale": 1, "frames": [ { - "filename": "0011.png", + "filename": "0072.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 54, - "h": 48 + "y": 10, + "w": 72, + "h": 57 }, "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 + "w": 72, + "h": 57 } }, { - "filename": "0049.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { @@ -1212,229 +57,229 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { - "filename": "0028.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0072.png", + "filename": "0074.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0039.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0102.png", + "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0040.png", + "filename": "0087.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 2, + "w": 58, + "h": 65 + }, + "frame": { + "x": 1, + "y": 256, + "w": 58, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 1, + "y": 323, + "w": 55, + "h": 65 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 62, + "h": 61 + }, + "frame": { + "x": 75, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 62, + "h": 61 } }, { - "filename": "0084.png", + "filename": "0085.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 5, + "w": 57, + "h": 62 + }, + "frame": { + "x": 139, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 57, + "h": 62 } }, { - "filename": "0107.png", + "filename": "0086.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 57, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 139, + "y": 1, + "w": 57, + "h": 62 } }, { - "filename": "0108.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 54, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 198, + "y": 1, + "w": 54, + "h": 62 } }, { @@ -1443,19 +288,1006 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 8, "w": 56, - "h": 55 + "h": 59 }, "frame": { - "x": 267, - "y": 208, + "x": 254, + "y": 1, "w": 56, - "h": 55 + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 15, + "w": 46, + "h": 52 + }, + "frame": { + "x": 370, + "y": 1, + "w": 46, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 298, + "y": 62, + "w": 56, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 51, + "h": 58 + }, + "frame": { + "x": 356, + "y": 122, + "w": 51, + "h": 58 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 52, + "h": 58 + }, + "frame": { + "x": 61, + "y": 187, + "w": 52, + "h": 58 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 } }, { @@ -1464,101 +1296,248 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 53, + "h": 56 + }, + "frame": { + "x": 231, + "y": 188, + "w": 53, + "h": 56 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0022.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0023.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0043.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0044.png", + "filename": "0094.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } @@ -1569,502 +1548,124 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0065.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0066.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0067.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0087.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0088.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 + "x": 111, + "y": 362, + "w": 55, + "h": 53 } }, { @@ -2073,711 +1674,438 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 111, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 280, - "y": 263, + "x": 286, + "y": 188, "w": 56, "h": 55 } }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 286, + "y": 188, + "w": 56, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, { "filename": "0042.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, + "y": 360, + "w": 48, "h": 55 } }, { - "filename": "0085.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, - "h": 55 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, + "y": 360, + "w": 48, "h": 55 } } @@ -2787,6 +2115,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a9e29c91fa37ffaea686ff7357e6ad1e:1cbeeb823df6c103f770105557067022:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:d8465d4aec9ba28092cd923067d60408:7d16f4c01fa5addbf3868ea484affc7a:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/431.png b/public/images/pokemon/431.png index 45fca814c3f..e56ee99b0a2 100644 Binary files a/public/images/pokemon/431.png and b/public/images/pokemon/431.png differ diff --git a/public/images/pokemon/678ms.json b/public/images/pokemon/678ms.json deleted file mode 100644 index 0fac19c59c4..00000000000 --- a/public/images/pokemon/678ms.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "678ms.png", - "format": "RGBA8888", - "size": { - "w": 56, - "h": 56 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 56 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 56 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 56 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:935ddcd2ff1f413e94967151e2f4cc6d:bdb048fb547d7ebb9a83d391e8f1c9ba:81f219fee9493a3658266d8c5e858b9e$" - } -} diff --git a/public/images/pokemon/678ms.png b/public/images/pokemon/678ms.png deleted file mode 100644 index d2b6f348a0b..00000000000 Binary files a/public/images/pokemon/678ms.png and /dev/null differ diff --git a/public/images/pokemon/678msb.json b/public/images/pokemon/678msb.json deleted file mode 100644 index 78125f1c5ee..00000000000 --- a/public/images/pokemon/678msb.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "678msb.png", - "format": "RGBA8888", - "size": { - "w": 55, - "h": 55 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 46, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:979291307687f1a4af47bc4d29542ccf:f61247ececc23f282bb95c5bfe49e179:bbcc2663448733722c64bc1ebafbf9c6$" - } -} diff --git a/public/images/pokemon/678msb.png b/public/images/pokemon/678msb.png deleted file mode 100644 index c32e3064451..00000000000 Binary files a/public/images/pokemon/678msb.png and /dev/null differ diff --git a/public/images/pokemon/back/431.json b/public/images/pokemon/back/431.json index 41b5acaa48c..298dfa78b58 100644 --- a/public/images/pokemon/back/431.json +++ b/public/images/pokemon/back/431.json @@ -4,954 +4,114 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 442, + "h": 442 }, "scale": 1, "frames": [ { - "filename": "0103.png", + "filename": "0079.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 71, + "y": 11, + "w": 70, "h": 53 }, "frame": { - "x": 0, - "y": 0, - "w": 71, + "x": 1, + "y": 1, + "w": 70, "h": 53 } }, { - "filename": "0104.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 71, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 53 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, + "x": 1, + "y": 11, "w": 69, "h": 53 }, "frame": { - "x": 0, - "y": 53, + "x": 1, + "y": 56, "w": 69, "h": 53 } }, { - "filename": "0106.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 69, - "h": 53 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 10, + "w": 65, + "h": 54 + }, + "frame": { + "x": 1, + "y": 111, + "w": 65, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, "w": 66, "h": 52 }, "frame": { - "x": 71, - "y": 0, + "x": 73, + "y": 1, "w": 66, "h": 52 } }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 66, - "h": 52 - }, - "frame": { - "x": 71, - "y": 0, - "w": 66, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, { "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 + "x": 6, + "y": 11, + "w": 64, + "h": 53 }, "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 + "x": 1, + "y": 167, + "w": 64, + "h": 53 } }, { @@ -960,522 +120,18 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, + "x": 7, + "y": 11, + "w": 63, "h": 53 }, "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, + "x": 1, + "y": 222, + "w": 63, "h": 53 } }, @@ -1485,166 +141,292 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, + "x": 9, + "y": 10, + "w": 61, "h": 54 }, "frame": { - "x": 119, - "y": 320, - "w": 52, + "x": 1, + "y": 277, + "w": 61, "h": 54 } }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, { "filename": "0092.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, - "h": 54 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 119, - "y": 320, - "w": 52, - "h": 54 + "x": 1, + "y": 333, + "w": 59, + "h": 55 } }, { - "filename": "0113.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0051.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0008.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 9, + "y": 11, + "w": 61, "h": 53 }, "frame": { - "x": 123, - "y": 160, - "w": 58, + "x": 141, + "y": 1, + "w": 61, "h": 53 } }, { - "filename": "0052.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, - "h": 53 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 123, - "y": 160, - "w": 58, - "h": 53 + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 } }, { @@ -1653,81 +435,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0062.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0015.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 249, - "y": 54, - "w": 58, - "h": 53 + "x": 60, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0059.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 60, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 2, + "w": 52, + "h": 62 + }, + "frame": { + "x": 387, + "y": 1, + "w": 52, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 249, - "y": 54, - "w": 58, + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, "h": 53 } }, @@ -1737,145 +708,145 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0060.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0009.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0053.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0010.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0054.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0013.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { @@ -1884,40 +855,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { - "filename": "0014.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { @@ -1926,40 +897,103 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { - "filename": "0027.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 } }, { @@ -1968,334 +1002,19 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 295, - "y": 211, - "w": 57, - "h": 52 + "x": 255, + "y": 113, + "w": 59, + "h": 55 } }, { @@ -2304,18 +1023,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 316, + "y": 115, + "w": 59, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 295, - "y": 211, - "w": 57, + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, "h": 52 } }, @@ -2325,375 +1296,39 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, { - "filename": "0100.png", + "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, - "h": 52 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, @@ -2703,19 +1338,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 56, - "h": 50 + "x": 12, + "y": 12, + "w": 58, + "h": 52 }, "frame": { - "x": 365, - "y": 366, - "w": 56, - "h": 50 + "x": 67, + "y": 220, + "w": 58, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 67, + "y": 220, + "w": 58, + "h": 52 } }, { @@ -2724,62 +1380,566 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 66, + "y": 274, + "w": 57, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 125, + "y": 275, + "w": 57, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 }, "spriteSourceSize": { "x": 14, - "y": 9, + "y": 6, + "w": 56, + "h": 58 + }, + "frame": { + "x": 184, + "y": 277, + "w": 56, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 52, + "h": 61 + }, + "frame": { + "x": 242, + "y": 278, + "w": 52, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 365, - "y": 366, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0034.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0078.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 19, + "y": 6, + "w": 51, + "h": 58 + }, + "frame": { + "x": 296, + "y": 278, + "w": 51, + "h": 58 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 362, + "y": 229, "w": 56, "h": 50 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 56, + "h": 50 + }, + "frame": { + "x": 362, + "y": 229, + "w": 56, + "h": 50 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 48, + "h": 59 + }, + "frame": { + "x": 349, + "y": 281, + "w": 48, + "h": 59 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 47, + "h": 64 + }, + "frame": { + "x": 296, + "y": 338, + "w": 47, + "h": 64 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 5, + "w": 47, + "h": 59 + }, + "frame": { + "x": 345, + "y": 342, + "w": 47, + "h": 59 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 27, + "y": 7, + "w": 45, + "h": 57 + }, + "frame": { + "x": 394, + "y": 342, + "w": 45, + "h": 57 + } } ] } @@ -2787,6 +1947,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d859178994686d479f3197554b49a5d0:4865cb1c68e23bfe2c333b4936466c12:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:58e51c630d2f71df7e68c399b2be62b4:05493809e98cbba93f8bf51723c495a4:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/back/431.png b/public/images/pokemon/back/431.png index b727d199975..f67604890f0 100644 Binary files a/public/images/pokemon/back/431.png and b/public/images/pokemon/back/431.png differ diff --git a/public/images/pokemon/back/shiny/431.json b/public/images/pokemon/back/shiny/431.json index 93318f104cd..dc406e42b59 100644 --- a/public/images/pokemon/back/shiny/431.json +++ b/public/images/pokemon/back/shiny/431.json @@ -4,954 +4,114 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 442, + "h": 442 }, "scale": 1, "frames": [ { - "filename": "0103.png", + "filename": "0079.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 71, + "y": 11, + "w": 70, "h": 53 }, "frame": { - "x": 0, - "y": 0, - "w": 71, + "x": 1, + "y": 1, + "w": 70, "h": 53 } }, { - "filename": "0104.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 71, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 53 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, + "x": 1, + "y": 11, "w": 69, "h": 53 }, "frame": { - "x": 0, - "y": 53, + "x": 1, + "y": 56, "w": 69, "h": 53 } }, { - "filename": "0106.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 69, - "h": 53 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 10, + "w": 65, + "h": 54 + }, + "frame": { + "x": 1, + "y": 111, + "w": 65, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, "w": 66, "h": 52 }, "frame": { - "x": 71, - "y": 0, + "x": 73, + "y": 1, "w": 66, "h": 52 } }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 66, - "h": 52 - }, - "frame": { - "x": 71, - "y": 0, - "w": 66, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, { "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 + "x": 6, + "y": 11, + "w": 64, + "h": 53 }, "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 + "x": 1, + "y": 167, + "w": 64, + "h": 53 } }, { @@ -960,522 +120,18 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, + "x": 7, + "y": 11, + "w": 63, "h": 53 }, "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, + "x": 1, + "y": 222, + "w": 63, "h": 53 } }, @@ -1485,166 +141,292 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, + "x": 9, + "y": 10, + "w": 61, "h": 54 }, "frame": { - "x": 119, - "y": 320, - "w": 52, + "x": 1, + "y": 277, + "w": 61, "h": 54 } }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, { "filename": "0092.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, - "h": 54 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 119, - "y": 320, - "w": 52, - "h": 54 + "x": 1, + "y": 333, + "w": 59, + "h": 55 } }, { - "filename": "0113.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0051.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0008.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 9, + "y": 11, + "w": 61, "h": 53 }, "frame": { - "x": 123, - "y": 160, - "w": 58, + "x": 141, + "y": 1, + "w": 61, "h": 53 } }, { - "filename": "0052.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, - "h": 53 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 123, - "y": 160, - "w": 58, - "h": 53 + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 } }, { @@ -1653,81 +435,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0062.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0015.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 249, - "y": 54, - "w": 58, - "h": 53 + "x": 60, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0059.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 60, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 2, + "w": 52, + "h": 62 + }, + "frame": { + "x": 387, + "y": 1, + "w": 52, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 249, - "y": 54, - "w": 58, + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, "h": 53 } }, @@ -1737,145 +708,145 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0060.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0009.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0053.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0010.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0054.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0013.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { @@ -1884,40 +855,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { - "filename": "0014.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { @@ -1926,40 +897,103 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { - "filename": "0027.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 } }, { @@ -1968,334 +1002,19 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 295, - "y": 211, - "w": 57, - "h": 52 + "x": 255, + "y": 113, + "w": 59, + "h": 55 } }, { @@ -2304,18 +1023,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 316, + "y": 115, + "w": 59, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 295, - "y": 211, - "w": 57, + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, "h": 52 } }, @@ -2325,375 +1296,39 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, { - "filename": "0100.png", + "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, - "h": 52 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, @@ -2703,19 +1338,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 56, - "h": 50 + "x": 12, + "y": 12, + "w": 58, + "h": 52 }, "frame": { - "x": 365, - "y": 366, - "w": 56, - "h": 50 + "x": 67, + "y": 220, + "w": 58, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 67, + "y": 220, + "w": 58, + "h": 52 } }, { @@ -2724,62 +1380,566 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 66, + "y": 274, + "w": 57, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 125, + "y": 275, + "w": 57, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 }, "spriteSourceSize": { "x": 14, - "y": 9, + "y": 6, + "w": 56, + "h": 58 + }, + "frame": { + "x": 184, + "y": 277, + "w": 56, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 52, + "h": 61 + }, + "frame": { + "x": 242, + "y": 278, + "w": 52, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 365, - "y": 366, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0034.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0078.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 19, + "y": 6, + "w": 51, + "h": 58 + }, + "frame": { + "x": 296, + "y": 278, + "w": 51, + "h": 58 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 362, + "y": 229, "w": 56, "h": 50 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 56, + "h": 50 + }, + "frame": { + "x": 362, + "y": 229, + "w": 56, + "h": 50 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 48, + "h": 59 + }, + "frame": { + "x": 349, + "y": 281, + "w": 48, + "h": 59 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 47, + "h": 64 + }, + "frame": { + "x": 296, + "y": 338, + "w": 47, + "h": 64 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 5, + "w": 47, + "h": 59 + }, + "frame": { + "x": 345, + "y": 342, + "w": 47, + "h": 59 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 27, + "y": 7, + "w": 45, + "h": 57 + }, + "frame": { + "x": 394, + "y": 342, + "w": 45, + "h": 57 + } } ] } @@ -2787,6 +1947,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9ebc8034f2bcafe3ce6ab17b95a0f671:79e5c7024ab4d617b896435d49ee6160:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:e3e0553fc99b75c9f0a499716eabc86f:42d213ec7c63d2c551ed86c1abf4ffa6:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/back/shiny/431.png b/public/images/pokemon/back/shiny/431.png index e44ada40ef6..26248938782 100644 Binary files a/public/images/pokemon/back/shiny/431.png and b/public/images/pokemon/back/shiny/431.png differ diff --git a/public/images/pokemon/shiny/431.json b/public/images/pokemon/shiny/431.json index cd49a96600d..027f15263b8 100644 --- a/public/images/pokemon/shiny/431.json +++ b/public/images/pokemon/shiny/431.json @@ -4,1206 +4,51 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 417, + "h": 417 }, "scale": 1, "frames": [ { - "filename": "0011.png", + "filename": "0072.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 54, - "h": 48 + "y": 10, + "w": 72, + "h": 57 }, "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 + "w": 72, + "h": 57 } }, { - "filename": "0049.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { @@ -1212,229 +57,229 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { - "filename": "0028.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0072.png", + "filename": "0074.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0039.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0102.png", + "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0040.png", + "filename": "0087.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 2, + "w": 58, + "h": 65 + }, + "frame": { + "x": 1, + "y": 256, + "w": 58, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 1, + "y": 323, + "w": 55, + "h": 65 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 62, + "h": 61 + }, + "frame": { + "x": 75, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 62, + "h": 61 } }, { - "filename": "0084.png", + "filename": "0085.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 5, + "w": 57, + "h": 62 + }, + "frame": { + "x": 139, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 57, + "h": 62 } }, { - "filename": "0107.png", + "filename": "0086.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 57, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 139, + "y": 1, + "w": 57, + "h": 62 } }, { - "filename": "0108.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 54, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 198, + "y": 1, + "w": 54, + "h": 62 } }, { @@ -1443,19 +288,1006 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 8, "w": 56, - "h": 55 + "h": 59 }, "frame": { - "x": 267, - "y": 208, + "x": 254, + "y": 1, "w": 56, - "h": 55 + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 15, + "w": 46, + "h": 52 + }, + "frame": { + "x": 370, + "y": 1, + "w": 46, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 298, + "y": 62, + "w": 56, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 51, + "h": 58 + }, + "frame": { + "x": 356, + "y": 122, + "w": 51, + "h": 58 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 52, + "h": 58 + }, + "frame": { + "x": 61, + "y": 187, + "w": 52, + "h": 58 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 } }, { @@ -1464,101 +1296,248 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 53, + "h": 56 + }, + "frame": { + "x": 231, + "y": 188, + "w": 53, + "h": 56 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0022.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0023.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0043.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0044.png", + "filename": "0094.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } @@ -1569,502 +1548,124 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0065.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0066.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0067.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0087.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0088.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 + "x": 111, + "y": 362, + "w": 55, + "h": 53 } }, { @@ -2073,711 +1674,438 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 111, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 280, - "y": 263, + "x": 286, + "y": 188, "w": 56, "h": 55 } }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 286, + "y": 188, + "w": 56, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, { "filename": "0042.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, + "y": 360, + "w": 48, "h": 55 } }, { - "filename": "0085.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, - "h": 55 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, + "y": 360, + "w": 48, "h": 55 } } @@ -2787,6 +2115,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9d1aec9d42e64e77286a76abe5dbf02d:e582b0881efa16424743e0ecc7e8a9e9:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:6ae8e0153c224f59d2b8e14aafe30b2d:75902c7192d93b439a34817a7b78859e:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/shiny/431.png b/public/images/pokemon/shiny/431.png index 6eae96da2f2..9ada8fdb6f1 100644 Binary files a/public/images/pokemon/shiny/431.png and b/public/images/pokemon/shiny/431.png differ diff --git a/public/images/types_pt_BR.json b/public/images/types_pt-BR.json similarity index 99% rename from public/images/types_pt_BR.json rename to public/images/types_pt-BR.json index 932d316fd30..e89bdcba87f 100644 --- a/public/images/types_pt_BR.json +++ b/public/images/types_pt-BR.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_pt_BR.png", + "image": "types_pt-BR.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_pt_BR.png b/public/images/types_pt-BR.png similarity index 100% rename from public/images/types_pt_BR.png rename to public/images/types_pt-BR.png diff --git a/public/images/types_zh_CN.json b/public/images/types_zh-CN.json similarity index 99% rename from public/images/types_zh_CN.json rename to public/images/types_zh-CN.json index 4cd0135a677..e82d3c56468 100644 --- a/public/images/types_zh_CN.json +++ b/public/images/types_zh-CN.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_zh_CN.png", + "image": "types_zh-CN.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_zh_CN.png b/public/images/types_zh-CN.png similarity index 100% rename from public/images/types_zh_CN.png rename to public/images/types_zh-CN.png diff --git a/public/images/types_zh_TW.json b/public/images/types_zh-TW.json similarity index 99% rename from public/images/types_zh_TW.json rename to public/images/types_zh-TW.json index e3923b00f02..18c51ab61f4 100644 --- a/public/images/types_zh_TW.json +++ b/public/images/types_zh-TW.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_zh_TW.png", + "image": "types_zh-TW.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_zh_TW.png b/public/images/types_zh-TW.png similarity index 100% rename from public/images/types_zh_TW.png rename to public/images/types_zh-TW.png diff --git a/public/images/ui/command_fight_labels.png b/public/images/ui/command_fight_labels.png deleted file mode 100644 index c9d6d60c47f..00000000000 Binary files a/public/images/ui/command_fight_labels.png and /dev/null differ diff --git a/public/images/ui/legacy/command_fight_labels.png b/public/images/ui/legacy/command_fight_labels.png deleted file mode 100644 index 257d0e5d93f..00000000000 Binary files a/public/images/ui/legacy/command_fight_labels.png and /dev/null differ diff --git a/public/images/ui/legacy/summary_moves_effect_pt_BR.png b/public/images/ui/legacy/summary_moves_effect_pt-BR.png similarity index 100% rename from public/images/ui/legacy/summary_moves_effect_pt_BR.png rename to public/images/ui/legacy/summary_moves_effect_pt-BR.png diff --git a/public/images/ui/legacy/summary_moves_effect_zh_CN.png b/public/images/ui/legacy/summary_moves_effect_zh-CN.png similarity index 100% rename from public/images/ui/legacy/summary_moves_effect_zh_CN.png rename to public/images/ui/legacy/summary_moves_effect_zh-CN.png diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts index c4a867b9d73..f3a63d6f4ec 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,55 +1,9 @@ -import { AbilityTranslationEntries, SimpleTranslationEntries, AchievementTranslationEntries, BerryTranslationEntries, DialogueTranslationEntries, ModifierTypeTranslationEntries, MoveTranslationEntries, PokemonInfoTranslationEntries, TranslationEntries } from "#app/interfaces/locales"; +import { enConfig } from "#app/locales/en/config.js"; // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { interface CustomTypeOptions { defaultNS: "menu", // needed here as well for typedoc - resources: { - ability: AbilityTranslationEntries; - abilityTriggers: SimpleTranslationEntries; - achv: AchievementTranslationEntries; - battle: SimpleTranslationEntries; - battleMessageUiHandler: SimpleTranslationEntries; - berry: BerryTranslationEntries; - biome: SimpleTranslationEntries; - challenges: SimpleTranslationEntries; - commandUiHandler: SimpleTranslationEntries; - common: TranslationEntries; - PGMachv: AchievementTranslationEntries; - PGFachv: AchievementTranslationEntries; - PGMdialogue: DialogueTranslationEntries; - PGFdialogue: DialogueTranslationEntries; - PGMbattleSpecDialogue: SimpleTranslationEntries; - PGFbattleSpecDialogue: SimpleTranslationEntries; - PGMmiscDialogue: SimpleTranslationEntries; - PGFmiscDialogue: SimpleTranslationEntries; - PGMdoubleBattleDialogue: DialogueTranslationEntries; - PGFdoubleBattleDialogue: DialogueTranslationEntries; - egg: SimpleTranslationEntries; - fightUiHandler: SimpleTranslationEntries; - gameMode: SimpleTranslationEntries; - gameStatsUiHandler: SimpleTranslationEntries; - growth: SimpleTranslationEntries; - menu: SimpleTranslationEntries; - menuUiHandler: SimpleTranslationEntries; - modifierType: ModifierTypeTranslationEntries; - move: MoveTranslationEntries; - nature: SimpleTranslationEntries; - partyUiHandler: SimpleTranslationEntries; - pokeball: SimpleTranslationEntries; - pokemon: SimpleTranslationEntries; - pokemonInfo: PokemonInfoTranslationEntries; - pokemonInfoContainer: SimpleTranslationEntries; - saveSlotSelectUiHandler: SimpleTranslationEntries; - settings: SimpleTranslationEntries; - splashMessages: SimpleTranslationEntries; - starterSelectUiHandler: SimpleTranslationEntries; - titles: SimpleTranslationEntries; - trainerClasses: SimpleTranslationEntries; - trainerNames: SimpleTranslationEntries; - tutorial: SimpleTranslationEntries; - voucher: SimpleTranslationEntries; - weather: SimpleTranslationEntries; - }; + resources: typeof enConfig } } diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 43224ab074b..a41c3427e1f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -37,7 +37,7 @@ import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "./ui/ui-theme"; import PokemonData from "./system/pokemon-data"; import { Nature } from "./data/nature"; -import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; +import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase"; import { getTypeRgb } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; @@ -157,6 +157,8 @@ export default class BattleScene extends SceneBase { public fusionPaletteSwaps: boolean = true; public enableTouchControls: boolean = false; public enableVibration: boolean = false; + public showBgmBar: boolean = true; + /** * Determines the selected battle style. * - 0 = 'Switch' @@ -219,6 +221,7 @@ export default class BattleScene extends SceneBase { public arenaFlyout: ArenaFlyout; private fieldOverlay: Phaser.GameObjects.Rectangle; + private shopOverlay: Phaser.GameObjects.Rectangle; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; public uiContainer: Phaser.GameObjects.Container; @@ -332,7 +335,9 @@ export default class BattleScene extends SceneBase { launchBattle() { this.arenaBg = this.add.sprite(0, 0, "plains_bg"); + this.arenaBg.setName("sprite-arena-bg"); this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); + this.arenaBgTransition.setName("sprite-arena-bg-transition"); [ this.arenaBgTransition, this.arenaBg ].forEach(a => { a.setPipeline(this.fieldSpritePipeline); @@ -342,13 +347,13 @@ export default class BattleScene extends SceneBase { }); const field = this.add.container(0, 0); + field.setName("field"); field.setScale(6); - field.setName("container-field"); this.field = field; const fieldUI = this.add.container(0, this.game.canvas.height); - fieldUI.setName("container-field-ui"); + fieldUI.setName("field-ui"); fieldUI.setDepth(1); fieldUI.setScale(6); @@ -372,7 +377,7 @@ export default class BattleScene extends SceneBase { this.add.existing(transition); const uiContainer = this.add.container(0, 0); - uiContainer.setName("container-ui"); + uiContainer.setName("ui"); uiContainer.setDepth(2); uiContainer.setScale(6); @@ -386,16 +391,22 @@ export default class BattleScene extends SceneBase { this.fieldOverlay.setAlpha(0); this.fieldUI.add(this.fieldOverlay); + this.shopOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x070707); + this.shopOverlay.setName("rect-shop-overlay"); + this.shopOverlay.setOrigin(0, 0); + this.shopOverlay.setAlpha(0); + this.fieldUI.add(this.shopOverlay); + this.modifiers = []; this.enemyModifiers = []; this.modifierBar = new ModifierBar(this); - this.modifierBar.setName("container-modifier-bar"); + this.modifierBar.setName("modifier-bar"); this.add.existing(this.modifierBar); uiContainer.add(this.modifierBar); this.enemyModifierBar = new ModifierBar(this, true); - this.enemyModifierBar.setName("container-enemy-modifier-bar"); + this.enemyModifierBar.setName("enemy-modifier-bar"); this.add.existing(this.enemyModifierBar); uiContainer.add(this.enemyModifierBar); @@ -406,28 +417,28 @@ export default class BattleScene extends SceneBase { this.fieldUI.add(this.charSprite); this.pbTray = new PokeballTray(this, true); - this.pbTray.setName("container-pb-tray"); + this.pbTray.setName("pb-tray"); this.pbTray.setup(); this.pbTrayEnemy = new PokeballTray(this, false); - this.pbTrayEnemy.setName("container-enemy-pb-tray"); + this.pbTrayEnemy.setName("enemy-pb-tray"); this.pbTrayEnemy.setup(); this.fieldUI.add(this.pbTray); this.fieldUI.add(this.pbTrayEnemy); this.abilityBar = new AbilityBar(this); - this.abilityBar.setName("container-ability-bar"); + this.abilityBar.setName("ability-bar"); this.abilityBar.setup(); this.fieldUI.add(this.abilityBar); this.partyExpBar = new PartyExpBar(this); - this.partyExpBar.setName("container-party-exp-bar"); + this.partyExpBar.setName("party-exp-bar"); this.partyExpBar.setup(); this.fieldUI.add(this.partyExpBar); this.candyBar = new CandyBar(this); - this.candyBar.setName("container-candy-bar"); + this.candyBar.setName("candy-bar"); this.candyBar.setup(); this.fieldUI.add(this.candyBar); @@ -479,13 +490,13 @@ export default class BattleScene extends SceneBase { const loadPokemonAssets = []; this.arenaPlayer = new ArenaBase(this, true); - this.arenaPlayer.setName("container-arena-player"); + this.arenaPlayer.setName("arena-player"); this.arenaPlayerTransition = new ArenaBase(this, true); - this.arenaPlayerTransition.setName("container-arena-player-transition"); + this.arenaPlayerTransition.setName("arena-player-transition"); this.arenaEnemy = new ArenaBase(this, false); - this.arenaEnemy.setName("container-arena-enemy"); + this.arenaEnemy.setName("arena-enemy"); this.arenaNextEnemy = new ArenaBase(this, false); - this.arenaNextEnemy.setName("container-arena-next-enemy"); + this.arenaNextEnemy.setName("arena-next-enemy"); this.arenaBgTransition.setVisible(false); this.arenaPlayerTransition.setVisible(false); @@ -737,6 +748,14 @@ export default class BattleScene extends SceneBase { : ret; } + /** + * Returns the ModifierBar of this scene, which is declared private and therefore not accessible elsewhere + * @returns {ModifierBar} + */ + getModifierBar(): ModifierBar { + return this.modifierBar; + } + // store info toggles to be accessible by the ui addInfoToggle(infoToggle: InfoToggle): void { this.infoToggles.push(infoToggle); @@ -798,8 +817,10 @@ export default class BattleScene extends SceneBase { addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { const container = this.add.container(x, y); + container.setName(`${pokemon.name}-icon`); const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); + icon.setName(`sprite-${pokemon.name}-icon`); icon.setFrame(pokemon.getIconId(true)); // Temporary fix to show pokemon's default icon if variant icon doesn't exist if (icon.frame.name !== pokemon.getIconId(true)) { @@ -816,6 +837,7 @@ export default class BattleScene extends SceneBase { if (pokemon.isFusion()) { const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); + fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pokemon.getFusionIconId(true)); @@ -1100,8 +1122,10 @@ export default class BattleScene extends SceneBase { playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); for (const pokemon of this.getParty()) { - if (pokemon.hasAbility(Abilities.ICE_FACE)) { - pokemon.formIndex = 0; + // Only trigger form change when Eiscue is in Noice form + // Hardcoded Eiscue for now in case it is fused with another pokemon + if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); } pokemon.resetBattleData(); @@ -1397,6 +1421,30 @@ export default class BattleScene extends SceneBase { }); } + showShopOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.shopOverlay, + alpha: 0.8, + ease: "Sine.easeOut", + duration: duration, + onComplete: () => resolve() + }); + }); + } + + hideShopOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.shopOverlay, + alpha: 0, + duration: duration, + ease: "Cubic.easeIn", + onComplete: () => resolve() + }); + }); + } + showEnemyModifierBar(): void { this.enemyModifierBar.setVisible(true); } @@ -1408,6 +1456,7 @@ export default class BattleScene extends SceneBase { updateBiomeWaveText(): void { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); + this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); @@ -1592,6 +1641,7 @@ export default class BattleScene extends SceneBase { : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { + this.ui.bgmBar.setBgmToBgmBar(bgmName); if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { this.bgm.play({ volume: this.masterVolume * this.bgmVolume @@ -1847,8 +1897,26 @@ export default class BattleScene extends SceneBase { return 13.940; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; + case "battle_rocket_grunt": //HGSS Team Rocket Battle + return 12.707; + case "battle_aqua_magma_grunt": //ORAS Team Aqua & Magma Battle + return 12.062; + case "battle_galactic_grunt": //BDSP Team Galactic Battle + return 13.043; case "battle_plasma_grunt": //BW Team Plasma Battle return 12.974; + case "battle_flare_grunt": //XY Team Flare Battle + return 4.228; + case "battle_rocket_boss": //USUM Giovanni Battle + return 9.115; + case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle + return 14.847; + case "battle_galactic_boss": //BDSP Cyrus Battle + return 106.962; + case "battle_plasma_boss": //B2W2 Ghetsis Battle + return 25.624; + case "battle_flare_boss": //XY Lysandre Battle + return 8.085; } return 0; diff --git a/src/battle.ts b/src/battle.ts index 97fd8dd064c..349d8cc4618 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -7,6 +7,7 @@ import { GameMode } from "./game-mode"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; import {trainerConfigs} from "#app/data/trainer-config"; +import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleSpec } from "#enums/battle-spec"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; @@ -166,6 +167,10 @@ export default class Battle { const moneyAmount = new Utils.IntegerHolder(scene.currentBattle.moneyScattered); scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + if (scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + scene.addMoney(moneyAmount.value); scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString("en-US")}!`, null, true); @@ -426,8 +431,8 @@ export interface FixedBattleConfigs { /** * Youngster/Lass on 5 * Rival on 8, 55, 95, 145, 195 - * Evil team grunts on 35, 62, 64, 65, 112, 114 (Not currently spawning) - * Evil leader on 115, 165 (Not currently spawning) + * Evil team grunts on 35, 62, 64, 66, 112, 114 + * Evil leader on 115, 165 * E4 on 182, 184, 186, 188 * Champion on 190 */ @@ -438,28 +443,28 @@ export const classicFixedBattles: FixedBattleConfigs = { .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [65]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), + [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), + [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) diff --git a/src/data/ability.ts b/src/data/ability.ts index 9cb4cae9db9..3da4abf16f9 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6,7 +6,7 @@ import { BattleStat, getBattleStatName } from "./battle-stat"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import { Weather, WeatherType } from "./weather"; -import { BattlerTag } from "./battler-tags"; +import { BattlerTag, GroundedTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr } from "./move"; @@ -1702,7 +1702,18 @@ export class PostIntimidateStatChangeAbAttr extends AbAttr { } } +/** + * Base class for defining all {@linkcode Ability} Attributes post summon + * @see {@linkcode applyPostSummon()} + */ export class PostSummonAbAttr extends AbAttr { + /** + * Applies ability post summon (after switching in) + * @param pokemon {@linkcode Pokemon} with this ability + * @param passive Whether this ability is a passive + * @param args Set of unique arguments needed by this attribute + * @returns true if application of the ability succeeds + */ applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { return false; } @@ -1974,7 +1985,11 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { } } -export class TraceAbAttr extends PostSummonAbAttr { +/** Attempts to copy a pokemon's ability */ +export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { + private target: Pokemon; + private targetAbilityName: string; + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (!targets.length) { @@ -1988,18 +2003,57 @@ export class TraceAbAttr extends PostSummonAbAttr { target = targets[0]; } - // Wonder Guard is normally uncopiable so has the attribute, but trace specifically can copy it - if (target.getAbility().hasAttr(UncopiableAbilityAbAttr) && target.getAbility().id !== Abilities.WONDER_GUARD) { + if ( + target.getAbility().hasAttr(UncopiableAbilityAbAttr) && + // Wonder Guard is normally uncopiable so has the attribute, but Trace specifically can copy it + !(pokemon.hasAbility(Abilities.TRACE) && target.getAbility().id === Abilities.WONDER_GUARD) + ) { return false; } + this.target = target; + this.targetAbilityName = allAbilities[target.getAbility().id].name; pokemon.summonData.ability = target.getAbility().id; - - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` traced ${target.name}'s\n${allAbilities[target.getAbility().id].name}!`)); setAbilityRevealed(target); + pokemon.updateInfo(); return true; } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:trace", { + pokemonName: getPokemonNameWithAffix(pokemon), + targetName: getPokemonNameWithAffix(this.target), + abilityName: this.targetAbilityName, + }); + } +} + + +/** Attempt to copy the stat changes on an ally pokemon */ +export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + if (!pokemon.scene.currentBattle.double) { + return false; + } + + const ally = pokemon.getAlly(); + if (!ally || ally.summonData.battleStats.every((change) => change === 0)) { + return false; + } + + pokemon.summonData.battleStats = ally.summonData.battleStats; + pokemon.updateInfo(); + + return true; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:costar", { + pokemonName: getPokemonNameWithAffix(pokemon), + allyName: getPokemonNameWithAffix(pokemon.getAlly()), + }); + } } export class PostSummonTransformAbAttr extends PostSummonAbAttr { @@ -2350,7 +2404,7 @@ export class BlockNonDirectDamageAbAttr extends AbAttr { /** * This attribute will block any status damage that you put in the parameter. */ -export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { +export class BlockStatusDamageAbAttr extends AbAttr { private effects: StatusEffect[]; /** @@ -2370,7 +2424,7 @@ export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { * @returns Returns true if status damage is blocked */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.effects.includes(pokemon.status.effect)) { + if (this.effects.includes(pokemon.status?.effect)) { cancelled.value = true; return true; } @@ -3732,6 +3786,54 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt } } +/** + * If a Pokémon with this Ability selects a damaging move, it has a 30% chance of going first in its priority bracket. If the Ability activates, this is announced at the start of the turn (after move selection). + * + * @extends AbAttr + */ +export class BypassSpeedChanceAbAttr extends AbAttr { + public chance: integer; + + /** + * @param {integer} chance probability of ability being active. + */ + constructor(chance: integer) { + super(true); + this.chance = chance; + } + + /** + * bypass move order in their priority bracket when pokemon choose damaging move + * @param {Pokemon} pokemon {@linkcode Pokemon} the Pokemon applying this ability + * @param {boolean} passive N/A + * @param {Utils.BooleanHolder} cancelled N/A + * @param {any[]} args [0] {@linkcode Utils.BooleanHolder} set to true when the ability activated + * @returns {boolean} - whether the ability was activated. + */ + apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + const bypassSpeed = args[0] as Utils.BooleanHolder; + + if (!bypassSpeed.value && pokemon.randSeedInt(100) < this.chance) { + const turnCommand = + pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = allMoves[turnCommand.move?.move]; + const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; + + if (isCommandFight && isDamageMove) { + bypassSpeed.value = true; + return true; + } + } + + return false; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:quickDraw", {pokemonName: getPokemonNameWithAffix(pokemon)}); + } +} + function applyAbAttrsInternal(attrType: Constructor, pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { return new Promise(resolve => { @@ -4056,7 +4158,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED)) + .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), @@ -4086,7 +4188,7 @@ export function initAbilities() { .attr(DoubleBattleChanceAbAttr) .ignorable(), new Ability(Abilities.TRACE, 3) - .attr(TraceAbAttr) + .attr(PostSummonCopyAbilityAbAttr) .attr(UncopiableAbilityAbAttr), new Ability(Abilities.HUGE_POWER, 3) .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 2), @@ -4489,8 +4591,8 @@ export function initAbilities() { .attr(HealFromBerryUseAbAttr, 1/3) .partial(), // Healing not blocked by Heal Block new Ability(Abilities.PROTEAN, 6) - .attr(PokemonTypeChangeAbAttr) - .condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), + .attr(PokemonTypeChangeAbAttr), + //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation new Ability(Abilities.FUR_COAT, 6) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, 0.5) .ignorable(), @@ -4542,7 +4644,8 @@ export function initAbilities() { .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .unimplemented(), + .conditionalAttr(target => target.hasAbility(Abilities.DARK_AURA), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) + .conditionalAttr(target => target.hasAbility(Abilities.FAIRY_AURA), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16), new Ability(Abilities.PRIMORDIAL_SEA, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) @@ -4732,8 +4835,8 @@ export function initAbilities() { .attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true) .condition(getOncePerBattleCondition(Abilities.DAUNTLESS_SHIELD)), new Ability(Abilities.LIBERO, 8) - .attr(PokemonTypeChangeAbAttr) - .condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), + .attr(PokemonTypeChangeAbAttr), + //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), //Gen 9 Implementation new Ability(Abilities.BALL_FETCH, 8) .attr(FetchBallAbAttr) .condition(getOncePerBattleCondition(Abilities.BALL_FETCH)), @@ -4815,7 +4918,7 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .condition((pokemon) => !pokemon.isTerastallized()), new Ability(Abilities.QUICK_DRAW, 8) - .unimplemented(), + .attr(BypassSpeedChanceAbAttr, 30), new Ability(Abilities.UNSEEN_FIST, 8) .attr(IgnoreProtectOnContactAbAttr), new Ability(Abilities.CURIOUS_MEDICINE, 8) @@ -4941,7 +5044,7 @@ export function initAbilities() { .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5)) .partial(), new Ability(Abilities.COSTAR, 9) - .unimplemented(), + .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) .attr(PostDefendApplyArenaTrapTagAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, ArenaTagType.TOXIC_SPIKES) .bypassFaint(), diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 81ba4b17005..28d38daffb4 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -4,7 +4,7 @@ import * as Utils from "../utils"; import { MoveCategory, allMoves, MoveTarget } from "./move"; import { getPokemonMessage } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; -import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase} from "../phases"; +import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; import { BattlerIndex } from "../battle"; import { BlockNonDirectDamageAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; @@ -63,6 +63,10 @@ export abstract class ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mist_(move) Mist}. + * Prevents Pokémon on the opposing side from lowering the stats of the Pokémon in the Mist. + */ export class MistTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side); @@ -86,37 +90,57 @@ export class MistTag extends ArenaTag { } } +/** + * Reduces the damage of specific move categories in the arena. + * @extends ArenaTag + */ export class WeakenMoveScreenTag extends ArenaTag { - constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide) { + protected weakenedCategories: MoveCategory[]; + + /** + * Creates a new instance of the WeakenMoveScreenTag class. + * + * @param tagType - The type of the arena tag. + * @param turnCount - The number of turns the tag is active. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + * @param side - The side (player or enemy) the tag affects. + * @param weakenedCategories - The categories of moves that are weakened by this tag. + */ + constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, weakenedCategories: MoveCategory[]) { super(tagType, turnCount, sourceMove, sourceId, side); + + this.weakenedCategories = weakenedCategories; } + /** + * Applies the weakening effect to the move. + * + * @param arena - The arena where the move is applied. + * @param args - The arguments for the move application. + * @param args[0] - The category of the move. + * @param args[1] - A boolean indicating whether it is a double battle. + * @param args[2] - An object of type `Utils.NumberHolder` that holds the damage multiplier + * + * @returns True if the move was weakened, otherwise false. + */ apply(arena: Arena, args: any[]): boolean { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } - return true; - } -} - -class ReflectTag extends WeakenMoveScreenTag { - constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side); - } - - apply(arena: Arena, args: any[]): boolean { - if ((args[0] as MoveCategory) === MoveCategory.PHYSICAL) { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } + if (this.weakenedCategories.includes((args[0] as MoveCategory))) { + (args[2] as Utils.NumberHolder).value = (args[1] as boolean) ? 2732/4096 : 0.5; return true; } return false; } +} + +/** + * Reduces the damage of physical moves. + * Used by {@linkcode Moves.REFLECT} + */ +class ReflectTag extends WeakenMoveScreenTag { + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]); + } onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { @@ -125,21 +149,13 @@ class ReflectTag extends WeakenMoveScreenTag { } } +/** + * Reduces the damage of special moves. + * Used by {@linkcode Moves.LIGHT_SCREEN} + */ class LightScreenTag extends WeakenMoveScreenTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side); - } - - apply(arena: Arena, args: any[]): boolean { - if ((args[0] as MoveCategory) === MoveCategory.SPECIAL) { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } - return true; - } - return false; + super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]); } onAdd(arena: Arena, quiet: boolean = false): void { @@ -149,9 +165,13 @@ class LightScreenTag extends WeakenMoveScreenTag { } } +/** + * Reduces the damage of physical and special moves. + * Used by {@linkcode Moves.AURORA_VEIL} + */ class AuroraVeilTag extends WeakenMoveScreenTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side); + super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL]); } onAdd(arena: Arena, quiet: boolean = false): void { @@ -283,6 +303,10 @@ class CraftyShieldTag extends ConditionalProtectTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wish_(move) Wish}. + * Heals the Pokémon in the user's position the turn after Wish is used. + */ class WishTag extends ArenaTag { private battlerIndex: BattlerIndex; private triggerMessage: string; @@ -308,9 +332,21 @@ class WishTag extends ArenaTag { } } +/** + * Abstract class to implement weakened moves of a specific type. + */ export class WeakenMoveTypeTag extends ArenaTag { private weakenedType: Type; + /** + * Creates a new instance of the WeakenMoveTypeTag class. + * + * @param tagType - The type of the arena tag. + * @param turnCount - The number of turns the tag is active. + * @param type - The type being weakened from this tag. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + */ constructor(tagType: ArenaTagType, turnCount: integer, type: Type, sourceMove: Moves, sourceId: integer) { super(tagType, turnCount, sourceMove, sourceId); @@ -327,6 +363,10 @@ export class WeakenMoveTypeTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mud_Sport_(move) Mud Sport}. + * Weakens Electric type moves for a set amount of turns, usually 5. + */ class MudSportTag extends WeakenMoveTypeTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId); @@ -341,6 +381,10 @@ class MudSportTag extends WeakenMoveTypeTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Water_Sport_(move) Water Sport}. + * Weakens Fire type moves for a set amount of turns, usually 5. + */ class WaterSportTag extends WeakenMoveTypeTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId); @@ -355,10 +399,22 @@ class WaterSportTag extends WeakenMoveTypeTag { } } +/** + * Abstract class to implement arena traps. + */ export class ArenaTrapTag extends ArenaTag { public layers: integer; public maxLayers: integer; + /** + * Creates a new instance of the ArenaTrapTag class. + * + * @param tagType - The type of the arena tag. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + * @param side - The side (player or enemy) the tag affects. + * @param maxLayers - The maximum amount of layers this tag can have. + */ constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, maxLayers: integer) { super(tagType, 0, sourceMove, sourceId, side); @@ -392,6 +448,11 @@ export class ArenaTrapTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Spikes_(move) Spikes}. + * Applies up to 3 layers of Spikes, dealing 1/8th, 1/6th, or 1/4th of the the Pokémon's HP + * in damage for 1, 2, or 3 layers of Spikes respectively if they are summoned into this trap. + */ class SpikesTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3); @@ -428,6 +489,12 @@ class SpikesTag extends ArenaTrapTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Spikes_(move) Toxic Spikes}. + * Applies up to 2 layers of Toxic Spikes, poisoning or badly poisoning any Pokémon who is + * summoned into this trap if 1 or 2 layers of Toxic Spikes respectively are up. Poison-type + * Pokémon summoned into this trap remove it entirely. + */ class ToxicSpikesTag extends ArenaTrapTag { private neutralized: boolean; @@ -481,6 +548,11 @@ class ToxicSpikesTag extends ArenaTrapTag { } } +/** + * Arena Tag class for delayed attacks, such as {@linkcode Moves.FUTURE_SIGHT} or {@linkcode Moves.DOOM_DESIRE}. + * Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used), + * and deals damage after the turn count is reached. + */ class DelayedAttackTag extends ArenaTag { public targetIndex: BattlerIndex; @@ -503,6 +575,11 @@ class DelayedAttackTag extends ArenaTag { onRemove(arena: Arena): void { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Stealth_Rock_(move) Stealth Rock}. + * Applies up to 1 layer of Stealth Rocks, dealing percentage-based damage to any Pokémon + * who is summoned into the trap, based on the Rock type's type effectiveness. + */ class StealthRockTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1); @@ -574,6 +651,11 @@ class StealthRockTag extends ArenaTrapTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Web_(move) Sticky Web}. + * Applies up to 1 layer of Sticky Web, which lowers the Speed by one stage + * to any Pokémon who is summoned into this trap. + */ class StickyWebTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1); @@ -606,6 +688,11 @@ class StickyWebTag extends ArenaTrapTag { } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Trick_Room_(move) Trick Room}. + * Reverses the Speed stats for all Pokémon on the field as long as this arena tag is up, + * also reversing the turn order for all Pokémon on the field as well. + */ export class TrickRoomTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.TRICK_ROOM, turnCount, Moves.TRICK_ROOM, sourceId); @@ -626,6 +713,11 @@ export class TrickRoomTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) Gravity}. + * Grounds all Pokémon on the field, including Flying-types and those with + * {@linkcode Abilities.LEVITATE} for the duration of the arena tag, usually 5 turns. + */ export class GravityTag extends ArenaTag { constructor(turnCount: integer) { super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY); @@ -645,6 +737,11 @@ export class GravityTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Tailwind_(move) Tailwind}. + * Doubles the Speed of the Pokémon who created this arena tag, as well as all allied Pokémon. + * Applies this arena tag for 4 turns (including the turn the move was used). + */ class TailwindTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side); @@ -679,6 +776,24 @@ class TailwindTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Happy_Hour_(move) Happy Hour}. + * Doubles the prize money from trainers and money moves like {@linkcode Moves.PAY_DAY} and {@linkcode Moves.MAKE_IT_RAIN}. + */ +class HappyHourTag extends ArenaTag { + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side); + } + + onAdd(arena: Arena): void { + arena.scene.queueMessage("Everyone is caught up in the happy atmosphere!"); + } + + onRemove(arena: Arena): void { + arena.scene.queueMessage("The atmosphere returned to normal."); + } +} + export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag { switch (tagType) { case ArenaTagType.MIST: @@ -720,5 +835,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new AuroraVeilTag(turnCount, sourceId, side); case ArenaTagType.TAILWIND: return new TailwindTag(turnCount, sourceId, side); + case ArenaTagType.HAPPY_HOUR: + return new HappyHourTag(turnCount, sourceId, side); } } diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 86764f9973a..7dccd4f8a7c 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -32,34 +32,38 @@ export function getBattleStatName(stat: BattleStat) { } } -export function getBattleStatLevelChangeDescription(levels: integer, up: boolean) { - if (up) { - switch (levels) { - case 1: - return i18next.t("battle:statRose"); - case 2: - return i18next.t("battle:statSharplyRose"); - case 3: - case 4: - case 5: - case 6: - return i18next.t("battle:statRoseDrastically"); - default: - return i18next.t("battle:statWontGoAnyHigher"); +export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean) { + const stringKey = (() => { + if (up) { + switch (levels) { + case 1: + return "battle:statRose"; + case 2: + return "battle:statSharplyRose"; + case 3: + case 4: + case 5: + case 6: + return "battle:statRoseDrastically"; + default: + return "battle:statWontGoAnyHigher"; + } + } else { + switch (levels) { + case 1: + return "battle:statFell"; + case 2: + return "battle:statHarshlyFell"; + case 3: + case 4: + case 5: + case 6: + return "battle:statSeverelyFell"; + default: + return "battle:statWontGoAnyLower"; + } } - } else { - switch (levels) { - case 1: - return i18next.t("battle:statFell"); - case 2: - return i18next.t("battle:statHarshlyFell"); - case 3: - case 4: - case 5: - case 6: - return i18next.t("battle:statSeverelyFell"); - default: - return i18next.t("battle:statWontGoAnyLower"); - } - } + })(); + + return i18next.t(stringKey, { pokemonNameWithAffix, stats }); } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 4e2a4e06d3c..1a4a590e2a7 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1258,7 +1258,7 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } } -export class HideSpriteTag extends BattlerTag { +export class SemiInvulnerableTag extends BattlerTag { constructor(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves) { super(tagType, BattlerTagLapseType.MOVE_EFFECT, turnCount, sourceMove); } @@ -1467,6 +1467,17 @@ export class CursedTag extends BattlerTag { } } +/** + * Battler tag for effects that ground the source, allowing Ground-type moves to hit them. Encompasses two tag types: + * @item IGNORE_FLYING: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) + * @item ROOSTED: One-turn grounding effects (i.e. from Roost) + */ +export class GroundedTag extends BattlerTag { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: Moves) { + super(tagType, lapseType, 1, sourceMove); + } +} + /** * Provides the Ice Face ability's effects. */ @@ -1604,7 +1615,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.UNDERGROUND: case BattlerTagType.UNDERWATER: case BattlerTagType.HIDDEN: - return new HideSpriteTag(tagType, turnCount, sourceMove); + return new SemiInvulnerableTag(tagType, turnCount, sourceMove); case BattlerTagType.FIRE_BOOST: return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); case BattlerTagType.CRIT_BOOST: @@ -1618,9 +1629,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.BYPASS_SLEEP: return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); - case BattlerTagType.GROUNDED: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount - 1, sourceMove); + return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); + case BattlerTagType.ROOSTED: + return new GroundedTag(tagType, BattlerTagLapseType.TURN_END, sourceMove); case BattlerTagType.SALT_CURED: return new SaltCuredTag(sourceId); case BattlerTagType.CURSED: diff --git a/src/data/egg.ts b/src/data/egg.ts index ec82143e727..3bfd39382b5 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,97 +1,525 @@ import BattleScene from "../battle-scene"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; +import { VariantTier } from "../enums/variant-tiers"; +import * as Utils from "../utils"; +import * as Overrides from "../overrides"; +import { pokemonPrevolutions } from "./pokemon-evolutions"; +import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export const EGG_SEED = 1073741824; -export enum GachaType { - MOVE, - LEGENDARY, - SHINY +// Rates for specific random properties in 1/x +const DEFAULT_SHINY_RATE = 128; +const GACHA_SHINY_UP_SHINY_RATE = 64; +const SAME_SPECIES_EGG_SHINY_RATE = 32; +const SAME_SPECIES_EGG_HA_RATE = 16; +const MANAPHY_EGG_MANAPHY_RATE = 8; + +// 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs +const DEFAULT_RARE_EGGMOVE_RATE = 6; +const SAME_SPECIES_EGG_RARE_EGGMOVE_RATE = 3; +const GACHA_MOVE_UP_RARE_EGGMOVE_RATE = 3; + +/** Egg options to override egg properties */ +export interface IEggOptions { + /** Id. Used to check if egg type will be manaphy (id % 204 === 0) */ + id?: number; + /** Timestamp when this egg got created */ + timestamp?: number; + /** Defines if the egg got pulled from a gacha or not. If true, egg pity and pull statistics will be applyed. + * Egg will be automaticly added to the game data. + * NEEDS scene eggOption to work. + */ + pulled?: boolean; + /** Defines where the egg comes from. Applies specific modifiers. + * Will also define the text displayed in the egg list. + */ + sourceType?: EggSourceType; + /** Needs to be defined if eggOption pulled is defined or if no species or isShiny is degined since this will be needed to generate them. */ + scene?: BattleScene; + /** Sets the tier of the egg. Only species of this tier can be hatched from this egg. + * Tier will be overriden if species eggOption is set. + */ + tier?: EggTier; + /** Sets how many waves it will take till this egg hatches. */ + hatchWaves?: number; + /** Sets the exact species that will hatch from this egg. + * Needs scene eggOption if not provided. + */ + species?: Species; + /** Defines if the hatched pokemon will be a shiny. */ + isShiny?: boolean; + /** Defines the variant of the pokemon that will hatch from this egg. If no variantTier is given the normal variant rates will apply. */ + variantTier?: VariantTier; + /** Defines which egg move will be unlocked. 3 = rare egg move. */ + eggMoveIndex?: number; + /** Defines if the egg will hatch with the hidden ability of this species. + * If no hidden ability exist, a random one will get choosen. + */ + overrideHiddenAbility?: boolean } export class Egg { - public id: integer; - public tier: EggTier; - public gachaType: GachaType; - public hatchWaves: integer; - public timestamp: integer; - constructor(id: integer, gachaType: GachaType, hatchWaves: integer, timestamp: integer) { - this.id = id; - this.tier = Math.floor(id / EGG_SEED); - this.gachaType = gachaType; - this.hatchWaves = hatchWaves; - this.timestamp = timestamp; + //// + // #region Privat properties + //// + + private _id: number; + private _tier: EggTier; + private _sourceType: EggSourceType | undefined; + private _hatchWaves: number; + private _timestamp: number; + + private _species: Species; + private _isShiny: boolean; + private _variantTier: VariantTier; + private _eggMoveIndex: number; + + private _overrideHiddenAbility: boolean; + + //// + // #endregion + //// + + //// + // #region Public facing properties + //// + get id(): number { + return this._id; } - isManaphyEgg(): boolean { - return this.tier === EggTier.COMMON && !(this.id % 204); + get tier(): EggTier { + return this._tier; } - getKey(): string { + get sourceType(): EggSourceType | undefined { + return this._sourceType; + } + + get hatchWaves(): number { + return this._hatchWaves; + } + + set hatchWaves(value: number) { + this._hatchWaves = value; + } + + get timestamp(): number { + return this._timestamp; + } + + get species(): Species { + return this._species; + } + + get isShiny(): boolean { + return this._isShiny; + } + + get variantTier(): VariantTier { + return this._variantTier; + } + + get eggMoveIndex(): number { + return this._eggMoveIndex; + } + + get overrideHiddenAbility(): boolean { + return this._overrideHiddenAbility; + } + + //// + // #endregion + //// + + constructor(eggOptions?: IEggOptions) { + //if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.") + + this._tier = eggOptions.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); + this._sourceType = eggOptions.sourceType ?? undefined; + // If egg was pulled, check if egg pity needs to override the egg tier + if (eggOptions.pulled) { + // Needs this._tier and this._sourceType to work + this.checkForPityTierOverrides(eggOptions.scene); + } + + this._id = eggOptions.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier); + + this._sourceType = eggOptions.sourceType ?? undefined; + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + this._timestamp = eggOptions.timestamp ?? new Date().getTime(); + + // First roll shiny and variant so we can filter if species with an variant exist + this._isShiny = eggOptions.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); + this._variantTier = eggOptions.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant()); + this._species = eggOptions.species ?? this.rollSpecies(eggOptions.scene); + + this._overrideHiddenAbility = eggOptions.overrideHiddenAbility ?? false; + + // Override egg tier and hatchwaves if species was given + if (eggOptions.species) { + this._tier = this.getEggTierFromSpeciesStarterValue(); + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + // If species has no variant, set variantTier to common. This needs to + // be done because species with no variants get filtered at rollSpecies but since the + // species is set the check never happens + if (!getPokemonSpecies(this.species).hasVariants()) { + this._variantTier = VariantTier.COMMON; + } + } + // Needs this._tier so it needs to be generated afer the tier override if bought from same species + this._eggMoveIndex = eggOptions.eggMoveIndex ?? this.rollEggMoveIndex(); + if (eggOptions.pulled) { + this.increasePullStatistic(eggOptions.scene); + this.addEggToGameData(eggOptions.scene); + } + } + + //// + // #region Public methodes + //// + + public isManaphyEgg(): boolean { + return (this._species === Species.PHIONE || this._species === Species.MANAPHY) || + this._tier === EggTier.COMMON && !(this._id % 204) && !this._species; + } + + public getKey(): string { if (this.isManaphyEgg()) { return "manaphy"; } - return this.tier.toString(); + return this._tier.toString(); } + + // Generates a PlayerPokemon from an egg + public generatePlayerPokemon(scene: BattleScene): PlayerPokemon { + // Legacy egg wants to hatch. Generate missing properties + if (!this._species) { + this._isShiny = this.rollShiny(); + this._species = this.rollSpecies(scene); + } + + const pokemonSpecies = getPokemonSpecies(this._species); + + // Sets the hidden ability if a hidden ability exists and the override is set + // or if the same species egg hits the chance + let abilityIndex = undefined; + if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility + || (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)))) { + abilityIndex = pokemonSpecies.ability2 ? 2 : 1; + } + + // This function has way to many optional parameters + const ret: PlayerPokemon = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false); + ret.shiny = this._isShiny; + ret.variant = this._variantTier; + + const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); + + for (let s = 0; s < ret.ivs.length; s++) { + ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); + } + + return ret; + } + + // Doesn't need to be called if the egg got pulled by a gacha machiene + public addEggToGameData(scene: BattleScene): void { + scene.gameData.eggs.push(this); + } + + public getEggDescriptor(): string { + if (this.isManaphyEgg()) { + return "Manaphy"; + } + switch (this.tier) { + case EggTier.GREAT: + return i18next.t("egg:greatTier"); + case EggTier.ULTRA: + return i18next.t("egg:ultraTier"); + case EggTier.MASTER: + return i18next.t("egg:masterTier"); + default: + return i18next.t("egg:defaultTier"); + } + } + + public getEggHatchWavesMessage(): string { + if (this.hatchWaves <= 5) { + return i18next.t("egg:hatchWavesMessageSoon"); + } + if (this.hatchWaves <= 15) { + return i18next.t("egg:hatchWavesMessageClose"); + } + if (this.hatchWaves <= 50) { + return i18next.t("egg:hatchWavesMessageNotClose"); + } + return i18next.t("egg:hatchWavesMessageLongTime"); + } + + public getEggTypeDescriptor(scene: BattleScene): string { + switch (this.sourceType) { + case EggSourceType.SAME_SPECIES_EGG: + return i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName()}); + case EggSourceType.GACHA_LEGENDARY: + return `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp)).getName()})`; + case EggSourceType.GACHA_SHINY: + return i18next.t("egg:gachaTypeShiny"); + case EggSourceType.GACHA_MOVE: + return i18next.t("egg:gachaTypeMove"); + } + } + + //// + // #endregion + //// + + //// + // #region Private methodes + //// + + private rollEggMoveIndex() { + let baseChance = DEFAULT_RARE_EGGMOVE_RATE; + switch (this._sourceType) { + case EggSourceType.SAME_SPECIES_EGG: + baseChance = SAME_SPECIES_EGG_RARE_EGGMOVE_RATE; + break; + case EggSourceType.GACHA_MOVE: + baseChance = GACHA_MOVE_UP_RARE_EGGMOVE_RATE; + break; + default: + break; + } + + return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier)) ? Utils.randSeedInt(3) : 3; + } + + private getEggTierDefaultHatchWaves(eggTier?: EggTier): number { + if (this._species === Species.PHIONE || this._species === Species.MANAPHY) { + return 50; + } + + switch (eggTier ?? this._tier) { + case EggTier.COMMON: + return 10; + case EggTier.GREAT: + return 25; + case EggTier.ULTRA: + return 50; + } + return 100; + } + + private rollEggTier(): EggTier { + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + const tierValue = Utils.randInt(256); + return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; + } + + private rollSpecies(scene: BattleScene): Species { + if (!scene) { + return undefined; + } + /** + * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione + * Legendary eggs pulled from the legendary gacha have a 50% of being converted into + * the species that was the legendary focus at the time + */ + if (this.isManaphyEgg()) { + const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE); + return rand ? Species.PHIONE : Species.MANAPHY; + } else if (this.tier === EggTier.MASTER + && this._sourceType === EggSourceType.GACHA_LEGENDARY) { + if (!Utils.randSeedInt(2)) { + return getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp); + } + } + + let minStarterValue: integer; + let maxStarterValue: integer; + + switch (this.tier) { + case EggTier.GREAT: + minStarterValue = 4; + maxStarterValue = 5; + break; + case EggTier.ULTRA: + minStarterValue = 6; + maxStarterValue = 7; + break; + case EggTier.MASTER: + minStarterValue = 8; + maxStarterValue = 9; + break; + default: + minStarterValue = 1; + maxStarterValue = 3; + break; + } + + const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS]; + + let speciesPool = Object.keys(speciesStarters) + .filter(s => speciesStarters[s] >= minStarterValue && speciesStarters[s] <= maxStarterValue) + .map(s => parseInt(s) as Species) + .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); + + // If this is the 10th egg without unlocking something new, attempt to force it. + if (scene.gameData.unlockPity[this.tier] >= 9) { + const lockedPool = speciesPool.filter(s => !scene.gameData.dexData[s].caughtAttr); + if (lockedPool.length) { // Skip this if everything is unlocked + speciesPool = lockedPool; + } + } + + // If egg variant is set to RARE or EPIC, filter species pool to only include ones with variants. + if (this.variantTier && (this.variantTier === VariantTier.RARE || this.variantTier === VariantTier.EPIC)) { + speciesPool = speciesPool.filter(s => getPokemonSpecies(s).hasVariants()); + } + + /** + * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty + * 1 cost mons get 2x + * 2 cost mons get 1.5x + * 4, 6, 8 cost mons get 1.75x + * 3, 5, 7, 9 cost mons get 1x + * Alolan, Galarian, and Paldean mons get 0.5x + * Hisui mons get 0.125x + * + * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once + * and being the same each time + */ + let totalWeight = 0; + const speciesWeights = []; + for (const speciesId of speciesPool) { + let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); + const species = getPokemonSpecies(speciesId); + if (species.isRegional()) { + weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); + } + speciesWeights.push(totalWeight + weight); + totalWeight += weight; + } + + let species: Species; + + const rand = Utils.randSeedInt(totalWeight); + for (let s = 0; s < speciesWeights.length; s++) { + if (rand < speciesWeights[s]) { + species = speciesPool[s]; + break; + } + } + + if (!!scene.gameData.dexData[species].caughtAttr) { + scene.gameData.unlockPity[this.tier] = Math.min(scene.gameData.unlockPity[this.tier] + 1, 10); + } else { + scene.gameData.unlockPity[this.tier] = 0; + } + + return species; + } + + /** + * Rolls whether the egg is shiny or not. + * @returns True if the egg is shiny + **/ + private rollShiny(): boolean { + let shinyChance = DEFAULT_SHINY_RATE; + switch (this._sourceType) { + case EggSourceType.GACHA_SHINY: + shinyChance = GACHA_SHINY_UP_SHINY_RATE; + break; + case EggSourceType.SAME_SPECIES_EGG: + shinyChance = SAME_SPECIES_EGG_SHINY_RATE; + break; + default: + break; + } + + return !Utils.randSeedInt(shinyChance); + } + + // Uses the same logic as pokemon.generateVariant(). I would like to only have this logic in one + // place but I don't want to touch the pokemon class. + private rollVariant(): VariantTier { + if (!this.isShiny) { + return VariantTier.COMMON; + } + + const rand = Utils.randSeedInt(10); + if (rand >= 4) { + return VariantTier.COMMON; // 6/10 + } else if (rand >= 1) { + return VariantTier.RARE; // 3/10 + } else { + return VariantTier.EPIC; // 1/10 + } + } + + private checkForPityTierOverrides(scene: BattleScene): void { + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + scene.gameData.eggPity[EggTier.GREAT] += 1; + scene.gameData.eggPity[EggTier.ULTRA] += 1; + scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; + // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. + if (scene.gameData.eggPity[EggTier.MASTER] >= 412 && this._tier === EggTier.COMMON) { + this._tier = EggTier.MASTER; + } else if (scene.gameData.eggPity[EggTier.ULTRA] >= 59 && this._tier === EggTier.COMMON) { + this._tier = EggTier.ULTRA; + } else if (scene.gameData.eggPity[EggTier.GREAT] >= 9 && this._tier === EggTier.COMMON) { + this._tier = EggTier.GREAT; + } + scene.gameData.eggPity[this._tier] = 0; + } + + private increasePullStatistic(scene: BattleScene): void { + scene.gameData.gameStats.eggsPulled++; + if (this.isManaphyEgg()) { + scene.gameData.gameStats.manaphyEggsPulled++; + this._hatchWaves = this.getEggTierDefaultHatchWaves(EggTier.ULTRA); + return; + } + switch (this.tier) { + case EggTier.GREAT: + scene.gameData.gameStats.rareEggsPulled++; + break; + case EggTier.ULTRA: + scene.gameData.gameStats.epicEggsPulled++; + break; + case EggTier.MASTER: + scene.gameData.gameStats.legendaryEggsPulled++; + break; + } + } + + private getEggTierFromSpeciesStarterValue(): EggTier { + const speciesStartValue = speciesStarters[this.species]; + if (speciesStartValue >= 1 && speciesStartValue <= 3) { + return EggTier.COMMON; + } + if (speciesStartValue >= 4 && speciesStartValue <= 5) { + return EggTier.GREAT; + } + if (speciesStartValue >= 6 && speciesStartValue <= 7) { + return EggTier.ULTRA; + } + if (speciesStartValue >= 8) { + return EggTier.MASTER; + } + } + + //// + // #endregion + //// } -export function getEggTierDefaultHatchWaves(tier: EggTier): integer { - switch (tier) { - case EggTier.COMMON: - return 10; - case EggTier.GREAT: - return 25; - case EggTier.ULTRA: - return 50; - } - return 100; -} - -export function getEggDescriptor(egg: Egg): string { - if (egg.isManaphyEgg()) { - return "Manaphy"; - } - switch (egg.tier) { - case EggTier.GREAT: - return i18next.t("egg:greatTier"); - case EggTier.ULTRA: - return i18next.t("egg:ultraTier"); - case EggTier.MASTER: - return i18next.t("egg:masterTier"); - default: - return i18next.t("egg:defaultTier"); - } -} - -export function getEggHatchWavesMessage(hatchWaves: integer): string { - if (hatchWaves <= 5) { - return i18next.t("egg:hatchWavesMessageSoon"); - } - if (hatchWaves <= 15) { - return i18next.t("egg:hatchWavesMessageClose"); - } - if (hatchWaves <= 50) { - return i18next.t("egg:hatchWavesMessageNotClose"); - } - return i18next.t("egg:hatchWavesMessageLongTime"); -} - -export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string { - switch (egg.gachaType) { - case GachaType.LEGENDARY: - return `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`; - case GachaType.MOVE: - return i18next.t("egg:gachaTypeMove"); - case GachaType.SHINY: - return i18next.t("egg:gachaTypeShiny"); - } -} - -export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: integer): Species { +export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { const legendarySpecies = Object.entries(speciesStarters) .filter(s => s[1] >= 8 && s[1] <= 9) .map(s => parseInt(s[0])) diff --git a/src/data/move.ts b/src/data/move.ts index dec52b04c57..6a48e588827 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,7 +1,7 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; -import { EncoreTag } from "./battler-tags"; +import { EncoreTag, SemiInvulnerableTag } from "./battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; @@ -3662,10 +3662,9 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; //When a flying type is hit, the first hit is always 1x multiplier. Levitating pokemon are instantly affected by typing - if (target.isOfType(Type.FLYING)) { + if (target.isOfType(Type.FLYING) || target.hasAbility(Abilities.LEVITATE)) { multiplier.value = 1; } - target.addTag(BattlerTagType.IGNORE_FLYING, 20, move.id, user.id); //TODO: Grounded effect should not have turn limit return true; } @@ -3964,6 +3963,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return -3; case BattlerTagType.ENCORE: return -2; + case BattlerTagType.MINIMIZED: + return 0; case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: @@ -3990,7 +3991,7 @@ export class CurseAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { if (user.getTypes(true).includes(Type.GHOST)) { if (target.getTag(BattlerTagType.CURSED)) { - user.scene.queueMessage("But it failed!"); + user.scene.queueMessage(i18next.t("battle:attackFailed")); return false; } const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); @@ -4447,7 +4448,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } resolve(true); } else { - user.scene.queueMessage("But it failed!"); + user.scene.queueMessage(i18next.t("battle:attackFailed")); resolve(false); } }); @@ -5290,7 +5291,16 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { } } +/** + * Attribute used for moves that suppress abilities like {@linkcode Moves.GASTRO_ACID}. + * A suppressed ability cannot be activated. + * + * @extends MoveEffectAttr + * @see {@linkcode apply} + * @see {@linkcode getCondition} + */ export class SuppressAbilitiesAttr extends MoveEffectAttr { + /** Sets ability suppression for the target pokemon and displays a message. */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; @@ -5303,8 +5313,9 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { return true; } + /** Causes the effect to fail when the target's ability is unsupressable or already suppressed. */ getCondition(): MoveConditionFunc { - return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr); + return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !target.summonData.abilitySuppressed; } } @@ -5319,7 +5330,7 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { * abillity cannot be suppressed. This is a secondary effect and has no bearing on the success or failure of the move. * * @returns True if the move occurred, otherwise false. Note that true will be returned even if the target has not - * yet moved or if the target's abiilty is un-suppressable. + * yet moved or if the suppression failed to apply. */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { @@ -6595,7 +6606,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) - .attr(AddBattlerTagAttr, BattlerTagType.GROUNDED, true, false, 1) + .attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false) .triageMove(), new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) @@ -6936,7 +6947,7 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES) .unimplemented(), new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) - .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 5) + .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .attr(HitsTagAttr, BattlerTagType.FLYING, false) @@ -7227,7 +7238,7 @@ export function initMoves() { .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true), new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .unimplemented(), + .attr(StatChangeAttr, BattleStat.DEF, 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)), new StatusMove(Moves.GRASSY_TERRAIN, Type.GRASS, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.GRASSY) .target(MoveTarget.BOTH_SIDES), @@ -7293,8 +7304,8 @@ export function initMoves() { .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))), new StatusMove(Moves.HAPPY_HOUR, Type.NORMAL, -1, 30, -1, 0, 6) // No animation - .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.HAPPY_HOUR, null, true) + .target(MoveTarget.USER_SIDE), new StatusMove(Moves.ELECTRIC_TERRAIN, Type.ELECTRIC, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.ELECTRIC) .target(MoveTarget.BOTH_SIDES), @@ -7320,6 +7331,7 @@ export function initMoves() { .triageMove(), new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) + .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false) .attr(HitsTagAttr, BattlerTagType.FLYING, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) @@ -8003,6 +8015,7 @@ export function initMoves() { new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) .attr(RecoilAttr, true, 0.5), new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) + .makesContact(false) .attr(FlinchAttr), new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPD ], 1, true) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index eddcf3c97b7..e2a430260f0 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -819,6 +819,10 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return super.isObtainable(); } + hasVariants() { + return variantData.hasOwnProperty(this.speciesId); + } + getFormSpriteKey(formIndex?: integer) { if (this.forms.length && formIndex >= this.forms.length) { console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); diff --git a/src/data/tms.ts b/src/data/tms.ts index b98c11da223..4616c177eb6 100644 --- a/src/data/tms.ts +++ b/src/data/tms.ts @@ -4258,6 +4258,8 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PANPOUR, + Species.DRILBUR, + Species.EXCADRILL, Species.TYMPOLE, Species.PALPITOAD, Species.SEISMITOAD, @@ -11023,12 +11025,222 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -11048,7 +11260,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.CONFUSE_RAY]: [ Species.VULPIX, @@ -27226,6 +27475,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -27245,6 +27710,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.FRUSTRATION]: [ Species.BULBASAUR, @@ -28038,6 +28541,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -28057,6 +28776,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.SAFEGUARD]: [ Species.BULBASAUR, @@ -30147,6 +30904,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -30166,6 +31139,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.RAIN_DANCE]: [ Species.SQUIRTLE, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 2479f1a189f..8a25406fc5a 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -531,13 +531,18 @@ export class TrainerConfig { * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader. * @param {Type[]} specialtyTypes - The specialty types for the evil team Leader. + * @param boolean whether or not this is the rematch fight * @returns {TrainerConfig} - The updated TrainerConfig instance. * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig { if (!getIsInitialized()) { initI18n(); } - this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + if (rematch) { + this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); + } else { + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + } signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { speciesPool = [speciesPool]; @@ -551,11 +556,11 @@ export class TrainerConfig { const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setTitle(title); - this.setMoneyMultiplier(2.5); + this.setMoneyMultiplier(2.25); this.setBoss(); this.setStaticParty(); - this.setBattleBgm("battle_unova_gym"); // TODO: change - this.setVictoryBgm("victory_gym"); // TODO: change + this.setBattleBgm("battle_plasma_boss"); + this.setVictoryBgm("victory_team_plasma"); return this; } @@ -814,7 +819,7 @@ interface TrainerConfigs { } /** - * The function to get variable strength grutns + * The function to get variable strength grunts * @param scene the singleton scene being passed in * @returns the correct TrainerPartyTemplate */ @@ -822,22 +827,14 @@ function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate { const waveIndex = scene.currentBattle?.waveIndex; if (waveIndex < 40) { return trainerPartyTemplates.TWO_AVG; - } else if (waveIndex < 80) { - switch (waveIndex) { - case 62: - return trainerPartyTemplates.THREE_AVG; - case 64: - return trainerPartyTemplates.TWO_AVG_ONE_STRONG; - case 65: - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - } + } else if (waveIndex < 63) { + return trainerPartyTemplates.THREE_AVG; + } else if (waveIndex < 65) { + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + } else if (waveIndex < 112) { + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger } else { - switch (waveIndex) { - case 112: - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - case 114: - return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger - } + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } } @@ -1183,53 +1180,47 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesPools( [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP] ), - [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING], - [TrainerPoolTier.UNCOMMON]: [Species.GRIMER, Species.CUBONE, Species.ODDISH, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], - [TrainerPoolTier.RARE]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER], - [TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], - [TrainerPoolTier.ULTRA_RARE]: [Species.DRATINI, Species.LARVITAR] + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH], + [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], + [TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], + [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR] }), - [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY], - [TrainerPoolTier.UNCOMMON]: [Species.PHANPY, Species.SWINUB, Species.GLIGAR, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], - [TrainerPoolTier.RARE]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA], - [TrainerPoolTier.SUPER_RARE]: [Species.TRAPINCH, Species.HEATMOR], - [TrainerPoolTier.ULTRA_RARE]: [Species.TURTONATOR, Species.CHARCADET] + [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], + [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], + [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] }), - [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH], - [TrainerPoolTier.UNCOMMON]: [Species.SPHEAL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL ], - [TrainerPoolTier.RARE]: [Species.CLAMPERL, Species.REMORAID, Species.ARROKUDA], - [TrainerPoolTier.SUPER_RARE]: [Species.MANTINE, Species.BASCULEGION], - [TrainerPoolTier.ULTRA_RARE]: [Species.DONDOZO] + [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL ], + [TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH ], + [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA], + [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO] }), - [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE], - [TrainerPoolTier.UNCOMMON]: [Species.BRONZOR, Species.DRIFLOON, Species.BURMY], - [TrainerPoolTier.RARE]: [Species.CARNIVINE], - [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], - [TrainerPoolTier.ULTRA_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] + [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY], + [TrainerPoolTier.UNCOMMON]: [ Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL ], + [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], + [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] }), - [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.SANDILE, Species.TRUBBISH, Species.GOLETT], - [TrainerPoolTier.RARE]: [Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS, Species.DRILBUR, Species.KLINK, Species.VULLABY], - [TrainerPoolTier.SUPER_RARE]: [Species.PAWNIARD, Species.VULLABY, Species.DRUDDIGON, Species.BOUFFALANT, Species.ZORUA], - [TrainerPoolTier.ULTRA_RARE]: [Species.AXEW, Species.DEINO, Species.DURANT] + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH], + [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS], + [TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK], + [TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT] }), - [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI], - [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN], - [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL], - [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN], - [TrainerPoolTier.ULTRA_RARE]: [] + [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK], + [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG], + [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], + [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON] }), [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"],true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"],false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1509,7 +1500,7 @@ export const trainerConfigs: TrainerConfigs = { return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), - [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]) + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN , Species.ALOLA_PERSIAN])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NIDOKING , Species.NIDOQUEEN ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) @@ -1521,14 +1512,14 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []) + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR , Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.EXCADRILL ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.EXCADRILL ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1541,7 +1532,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) + [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIGHTYENA ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ])) @@ -1553,33 +1544,33 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { + [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.TYPHLOSION ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // DROUGHT + })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SHIFTRY, Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 0; // Chlorophyll })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // DROUGHT - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LINOONE ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.PELIPPER ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ])) @@ -1591,36 +1582,36 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Swift Swim - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Swift Swim - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Drizzle })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.abilityIndex = 2; // Swift Swim })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Swift Swim + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.BASCULEGION ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.OVERQWIL ])) @@ -1635,25 +1626,29 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })), - [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ELECTRODE, Species.HISUI_ELECTRODE ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.ROARING_MOON ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HISUI_ZOROARK ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS, Species.RUNERIGUS ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BOUFFALANT ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SEISMITOAD, Species.CARRACOSTA ])) @@ -1664,7 +1659,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })), - [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SLITHER_WING, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1673,17 +1668,17 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DURANT ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DARMANITAN, Species.GALAR_DARMANITAN ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) @@ -1695,7 +1690,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SCREAM_TAIL, Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1704,15 +1699,15 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GHOLDENGO, Species.AEGISLASH ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), }; diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 6e44b832181..44b72fb3d05 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -1,19 +1,16 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import i18next from "i18next"; import { Phase } from "./phase"; import BattleScene, { AnySound } from "./battle-scene"; import * as Utils from "./utils"; import { Mode } from "./ui/ui"; -import { EGG_SEED, Egg, GachaType, getLegendaryGachaSpeciesForTimestamp } from "./data/egg"; +import { EGG_SEED, Egg } from "./data/egg"; import EggHatchSceneHandler from "./ui/egg-hatch-scene-handler"; import { PlayerPokemon } from "./field/pokemon"; -import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import { achvs } from "./system/achv"; -import { pokemonPrevolutions } from "./data/pokemon-evolutions"; import PokemonInfoContainer from "./ui/pokemon-info-container"; import EggCounterContainer from "./ui/egg-counter-container"; import { EggCountChangedEvent } from "./events/egg"; -import { EggTier } from "#enums/egg-type"; -import { Species } from "#enums/species"; /** * Class that represents egg hatching @@ -345,7 +342,7 @@ export class EggHatchPhase extends Phase { this.scene.playSoundWithoutBgm("evolution_fanfare"); - this.scene.ui.showText(`${this.pokemon.name} hatched from the egg!`, null, () => { + this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.name }), null, () => { this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); this.scene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then(() => { @@ -442,135 +439,10 @@ export class EggHatchPhase extends Phase { */ generatePokemon(): PlayerPokemon { let ret: PlayerPokemon; - let speciesOverride: Species; // SpeciesOverride should probably be a passed in parameter for future species-eggs this.scene.executeWithSeedOffset(() => { - - /** - * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione - * Legendary eggs pulled from the legendary gacha have a 50% of being converted into - * the species that was the legendary focus at the time - */ - if (this.egg.isManaphyEgg()) { - const rand = Utils.randSeedInt(8); - - speciesOverride = rand ? Species.PHIONE : Species.MANAPHY; - } else if (this.egg.tier === EggTier.MASTER - && this.egg.gachaType === GachaType.LEGENDARY) { - if (!Utils.randSeedInt(2)) { - speciesOverride = getLegendaryGachaSpeciesForTimestamp(this.scene, this.egg.timestamp); - } - } - - if (speciesOverride) { - const pokemonSpecies = getPokemonSpecies(speciesOverride); - ret = this.scene.addPlayerPokemon(pokemonSpecies, 1, undefined, undefined, undefined, false); - } else { - let minStarterValue: integer; - let maxStarterValue: integer; - - switch (this.egg.tier) { - case EggTier.GREAT: - minStarterValue = 4; - maxStarterValue = 5; - break; - case EggTier.ULTRA: - minStarterValue = 6; - maxStarterValue = 7; - break; - case EggTier.MASTER: - minStarterValue = 8; - maxStarterValue = 9; - break; - default: - minStarterValue = 1; - maxStarterValue = 3; - break; - } - - const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; - - let speciesPool = Object.keys(speciesStarters) - .filter(s => speciesStarters[s] >= minStarterValue && speciesStarters[s] <= maxStarterValue) - .map(s => parseInt(s) as Species) - .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); - - // If this is the 10th egg without unlocking something new, attempt to force it. - if (this.scene.gameData.unlockPity[this.egg.tier] >= 9) { - const lockedPool = speciesPool.filter(s => !this.scene.gameData.dexData[s].caughtAttr); - if (lockedPool.length) { // Skip this if everything is unlocked - speciesPool = lockedPool; - } - } - - /** - * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty - * 1 cost mons get 2x - * 2 cost mons get 1.5x - * 4, 6, 8 cost mons get 1.75x - * 3, 5, 7, 9 cost mons get 1x - * Alolan, Galarian, and Paldean mons get 0.5x - * Hisui mons get 0.125x - * - * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once - * and being the same each time - */ - let totalWeight = 0; - const speciesWeights = []; - for (const speciesId of speciesPool) { - let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); - const species = getPokemonSpecies(speciesId); - if (species.isRegional()) { - weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); - } - speciesWeights.push(totalWeight + weight); - totalWeight += weight; - } - - let species: Species; - - const rand = Utils.randSeedInt(totalWeight); - for (let s = 0; s < speciesWeights.length; s++) { - if (rand < speciesWeights[s]) { - species = speciesPool[s]; - break; - } - } - - if (!!this.scene.gameData.dexData[species].caughtAttr) { - this.scene.gameData.unlockPity[this.egg.tier] = Math.min(this.scene.gameData.unlockPity[this.egg.tier] + 1, 10); - } else { - this.scene.gameData.unlockPity[this.egg.tier] = 0; - } - - const pokemonSpecies = getPokemonSpecies(species); - - ret = this.scene.addPlayerPokemon(pokemonSpecies, 1, undefined, undefined, undefined, false); - } - - /** - * Non Shiny gacha Pokemon have a 1/128 chance of being shiny - * Shiny gacha Pokemon have a 1/64 chance of being shiny - * IVs are rolled twice and the higher of each stat's IV is taken - * The egg move gacha doubles the rate of rare egg moves but the base rates are - * Common: 1/48 - * Rare: 1/24 - * Epic: 1/12 - * Legendary: 1/6 - */ - ret.trySetShiny(this.egg.gachaType === GachaType.SHINY ? 1024 : 512); - ret.variant = ret.shiny ? ret.generateVariant() : 0; - - const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); - - for (let s = 0; s < ret.ivs.length; s++) { - ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); - } - - const baseChance = this.egg.gachaType === GachaType.MOVE ? 3 : 6; - this.eggMoveIndex = Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.egg.tier)) - ? Utils.randSeedInt(3) - : 3; + ret = this.egg.generatePlayerPokemon(this.scene); + this.eggMoveIndex = this.egg.eggMoveIndex; }, this.egg.id, EGG_SEED.toString()); diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 90f45f481ba..722096c42cd 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -20,5 +20,6 @@ export enum ArenaTagType { WIDE_GUARD = "WIDE_GUARD", MAT_BLOCK = "MAT_BLOCK", CRAFTY_SHIELD = "CRAFTY_SHIELD", - TAILWIND = "TAILWIND" + TAILWIND = "TAILWIND", + HAPPY_HOUR = "HAPPY_HOUR" } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 4d212a2da12..5cdabfe78c2 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -54,7 +54,7 @@ export enum BattlerTagType { SALT_CURED = "SALT_CURED", CURSED = "CURSED", CHARGED = "CHARGED", - GROUNDED = "GROUNDED", + ROOSTED = "ROOSTED", MAGNET_RISEN = "MAGNET_RISEN", MINIMIZED = "MINIMIZED", DESTINY_BOND = "DESTINY_BOND", diff --git a/src/enums/egg-source-types.ts b/src/enums/egg-source-types.ts new file mode 100644 index 00000000000..a670d86704b --- /dev/null +++ b/src/enums/egg-source-types.ts @@ -0,0 +1,7 @@ +export enum EggSourceType { + GACHA_MOVE, + GACHA_LEGENDARY, + GACHA_SHINY, + SAME_SPECIES_EGG, + EVENT +} diff --git a/src/enums/gacha-types.ts b/src/enums/gacha-types.ts new file mode 100644 index 00000000000..c8beff5cad2 --- /dev/null +++ b/src/enums/gacha-types.ts @@ -0,0 +1,5 @@ +export enum GachaType { + MOVE, + LEGENDARY, + SHINY +} diff --git a/src/enums/variant-tiers.ts b/src/enums/variant-tiers.ts new file mode 100644 index 00000000000..20a0e8ec4e4 --- /dev/null +++ b/src/enums/variant-tiers.ts @@ -0,0 +1,5 @@ +export enum VariantTier { + COMMON, + RARE, + EPIC +} diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index cebde7c3ae9..4af219a60b9 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -20,6 +20,7 @@ export default class DamageNumberHandler { const battlerIndex = target.getBattlerIndex(); const baseScale = target.getSpriteScale() / 6; const damageNumber = addTextObject(scene, target.x, -(scene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, Utils.formatStat(amount, true), TextStyle.SUMMARY); + damageNumber.setName("text-damage-number"); damageNumber.setOrigin(0.5, 1); damageNumber.setScale(baseScale); diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 9b55133bb50..5312dd18727 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -39,6 +39,7 @@ export default class PokemonSpriteSparkleHandler { const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height]; const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), "tera_sparkle"); sparkle.pipelineData["ignoreTimeTint"] = s.pipelineData["ignoreTimeTint"]; + sparkle.setName("sprite-tera-sparkle"); sparkle.play("tera_sparkle"); parent.add(sparkle); s.scene.time.delayedCall(Utils.fixedInt(Math.floor((1000 / 12) * 13)), () => sparkle.destroy()); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 5b37365bec1..7dfee23aa63 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,14 +3,14 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat } from "../data/pokemon-stat"; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; +import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, EvolutionStatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; @@ -19,7 +19,7 @@ import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEv import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; import { DamagePhase, FaintPhase, LearnMovePhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; import { BattleStat } from "../data/battle-stat"; -import { BattlerTag, BattlerTagLapseType, EncoreTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; +import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "../data/arena-tag"; @@ -657,6 +657,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel); } const statValue = new Utils.NumberHolder(this.getStat(stat)); + this.scene.applyModifiers(EvolutionStatBoosterModifier, this.isPlayer(), this, stat, statValue); + const fieldApplied = new Utils.BooleanHolder(false); for (const pokemon of this.scene.getField(true)) { applyFieldBattleStatMultiplierAbAttrs(FieldMultiplyBattleStatAbAttr, pokemon, stat, statValue, this, fieldApplied); @@ -851,6 +853,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.getLevelMoves(1, true).map(lm => lm[1]).filter(lm => !this.moveset.filter(m => m.moveId === lm).length).filter((move: Moves, i: integer, array: Moves[]) => array.indexOf(move) === i); } + /** + * Gets the types of a pokemon + * @param includeTeraType boolean to include tera-formed type, default false + * @param forDefend boolean if the pokemon is defending from an attack + * @param ignoreOverride boolean if true, ignore ability changing effects + * @returns array of {@linkcode Type} + */ getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride?: boolean): Type[] { const types = []; @@ -884,7 +893,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (forDefend && (this.getTag(BattlerTagType.IGNORE_FLYING) || this.scene.arena.getTag(ArenaTagType.GRAVITY) || this.getTag(BattlerTagType.GROUNDED))) { + // this.scene potentially can be undefined for a fainted pokemon in doubles + // use optional chaining to avoid runtime errors + if (forDefend && (this.getTag(GroundedTag) || this.scene?.arena.getTag(ArenaTagType.GRAVITY))) { const flyingIndex = types.indexOf(Type.FLYING); if (flyingIndex > -1) { types.splice(flyingIndex, 1); @@ -1061,7 +1072,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * in effect, and both passive and non-passive. This is one of the two primary ways to check * whether a pokemon has a particular ability. * @param {AbAttr} attrType The ability attribute to check for - * @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active + * @param {boolean} canApply If false, it doesn't check whether the ability is currently active * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether an ability with that attribute is present and active */ @@ -1082,13 +1093,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return weight.value; } + /** + * Gets the tera-formed type of the pokemon, or UNKNOWN if not present + * @returns the {@linkcode Type} + */ getTeraType(): Type { - const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier - && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; - if (teraModifier) { - return teraModifier.teraType; + // this.scene can be undefined for a fainted mon in doubles + if (this.scene !== undefined) { + const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier + && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; + // return teraType + if (teraModifier) { + return teraModifier.teraType; + } } - + // if scene is undefined, or if teraModifier is considered false, then return unknown type return Type.UNKNOWN; } @@ -1097,7 +1116,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isGrounded(): boolean { - return !this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN); + return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN)); } /** @@ -1769,12 +1788,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { aura.applyPreAttack(null, null, null, move, [power]); } - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, power); - power.value *= typeChangeMovePowerMultiplier.value; if (!typeless) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); + applyMoveAttrs(NeutralDamageAgainstFlyingTypeMultiplierAttr, source, this, move, typeMultiplier); } if (!cancelled.value) { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier); @@ -1796,7 +1814,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && move.type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { power.value /= 2; } + applyMoveAttrs(VariablePowerAttr, source, this, move, power); + this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); if (!typeless) { this.scene.arena.applyTags(WeakenMoveTypeTag, move.type, power); @@ -1934,6 +1954,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, power); if (power.value === 0) { damage.value = 0; @@ -3505,6 +3526,10 @@ export class EnemyPokemon extends Pokemon { const target = this.scene.getField()[mt]; let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); + if (Number.isNaN(targetScore)) { + console.error(`Move ${move.name} returned score of NaN`); + targetScore = 0; + } if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)) { targetScore = -20; } else if (move instanceof AttackMove) { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index a582ab4b096..3e78afeae83 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -432,20 +432,24 @@ export default class Trainer extends Phaser.GameObjects.Container { } const party = this.scene.getEnemyParty(); - const nonFaintedPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => !p.isFainted()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); - const partyMemberScores = nonFaintedPartyMembers.map(p => { - const playerField = this.scene.getPlayerField(); + const nonFaintedLegalPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => p.isAllowedInBattle()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); + const partyMemberScores = nonFaintedLegalPartyMembers.map(p => { + const playerField = this.scene.getPlayerField().filter(p => p.isAllowedInBattle()); let score = 0; - for (const playerPokemon of playerField) { - score += p.getMatchupScore(playerPokemon); - if (playerPokemon.species.legendary) { - score /= 2; + + if (playerField.length > 0) { + for (const playerPokemon of playerField) { + score += p.getMatchupScore(playerPokemon); + if (playerPokemon.species.legendary) { + score /= 2; + } + } + score /= playerField.length; + if (forSwitch && !p.isOnField()) { + this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); } } - score /= playerField.length; - if (forSwitch && !p.isOnField()) { - this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); - } + return [party.indexOf(p), score]; }) as [integer, integer][]; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index f6ca88192da..92b9f952551 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -1,4 +1,4 @@ -import { GachaType } from "./data/egg"; +import { GachaType } from "./enums/gacha-types"; import { trainerConfigs } from "./data/trainer-config"; import { getBiomeHasProps } from "./field/arena"; import CacheBustedLoaderPlugin from "./plugins/cache-busted-loader-plugin"; @@ -43,7 +43,6 @@ export class LoadingScene extends SceneBase { // Load menu images this.loadAtlas("bg", "ui"); - this.loadImage("command_fight_labels", "ui"); this.loadAtlas("prompt", "ui"); this.loadImage("candy", "ui"); this.loadImage("candy_overlay", "ui"); @@ -321,6 +320,7 @@ export class LoadingScene extends SceneBase { this.loadBgm("minor_fanfare", "bw/minor_fanfare.mp3"); this.loadBgm("heal", "bw/heal.mp3"); this.loadBgm("victory_trainer", "bw/victory_trainer.mp3"); + this.loadBgm("victory_team_plasma", "bw/victory_team_plasma.mp3"); this.loadBgm("victory_gym", "bw/victory_gym.mp3"); this.loadBgm("victory_champion", "bw/victory_champion.mp3"); this.loadBgm("evolution", "bw/evolution.mp3"); diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 895f2f55c64..d6c48555d51 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -1,8 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!", + "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", + "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", + "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", - "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden\nmit {{abilityName}} ab!", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 760f17c0c9a..f3f1261d799 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "{{trainerName}}\nwurde besiegt!", "moneyWon": "Du gewinnst\n{{moneyAmount}} ₽!", "pokemonCaught": "{{pokemonName}} wurde gefangen!", + "addedAsAStarter": "{{pokemonName}} wurde als Starterpokémon hinzugefügt!", "partyFull": "Dein Team ist voll.\nMöchtest du ein Pokémon durch {{pokemonName}} ersetzen?", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", @@ -54,6 +55,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "eggHatching": "Oh?", "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?", "wildPokemonWithAffix": "{{pokemonName}} (wild)", @@ -62,14 +65,14 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} wurde Energie abgesaugt", "regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!", "fainted": "{{pokemonNameWithAffix}} wurde besiegt!", - "statRose": "steigt", - "statSharplyRose": "steigt stark", - "statRoseDrastically": "steigt drastisch", - "statWontGoAnyHigher": "kann nicht weiter erhöht werden", - "statFell": "sinkt", - "statHarshlyFell": "sinkt stark", - "statSeverelyFell": "sinkt drastisch", - "statWontGoAnyLower": "kann nicht weiter sinken", + "statRose": "{{stats}} von {{pokemonNameWithAffix}} steigt!", + "statSharplyRose": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", + "statRoseDrastically": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", + "statWontGoAnyHigher": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", + "statFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", + "statHarshlyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", + "statSeverelyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", + "statWontGoAnyLower": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!", diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts new file mode 100644 index 00000000000..30a3c5fae32 --- /dev/null +++ b/src/locales/de/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Musik", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "S2W2 Vs. Kanto Champion", + "battle_johto_champion": "S2W2 Vs. Johto Champion", + "battle_hoenn_champion": "S2W2 Vs. Hoenn Champion", + "battle_sinnoh_champion": "S2W2 Vs. Champion Cynthia", + "battle_champion_alder": "SW Vs. Champion Lauro", + "battle_champion_iris": "S2W2 Vs. Champion Lilia", + "battle_kalos_champion": "XY Vs. Champion Diantha", + "battle_alola_champion": "USUM Vs. Alola Champion", + "battle_galar_champion": "SWSH Vs. Champion Delion", + "battle_champion_geeta": "KAPU Vs. Champion Sagaria", + "battle_champion_nemona": "KAPU Vs. Champion Nemila", + "battle_champion_kieran": "KAPU Vs. Jo", + "battle_hoenn_elite": "ORAS Vs. Hoenn Top Vier", + "battle_unova_elite": "SW Vs. Einall Top Vier", + "battle_kalos_elite": "XY Vs. Kalos Top Vier", + "battle_alola_elite": "SM Vs. Alola Top Vier", + "battle_galar_elite": "SWSH Galar Champ-Cup", + "battle_paldea_elite": "KAPU Vs. Paldea Top Vier", + "battle_bb_elite": "KAPU Vs. Blaubeer-Top-Vier", + "battle_final_encounter": "PMDDX Rayquazas Domäne", + "battle_final": "SW Vs. G-Cis", + "battle_kanto_gym": "S2W2 Vs. Kanto Arenaleiter", + "battle_johto_gym": "S2W2 Vs. Johto Arenaleiter", + "battle_hoenn_gym": "S2W2 Vs. Hoenn Arenaleiter", + "battle_sinnoh_gym": "S2W2 Vs. Sinnoh Arenaleiter", + "battle_unova_gym": "SW Vs. Einall Arenaleiter", + "battle_kalos_gym": "XY Vs. Kalos Arenaleiter", + "battle_galar_gym": "SWSH Vs. Galar Arenaleiter", + "battle_paldea_gym": "KAPU Vs. Paldea Arenaleiter", + "battle_legendary_kanto": "XY Vs. Legendäres Kanto Pokémon", + "battle_legendary_raikou": "HGSS Vs. Raikou", + "battle_legendary_entei": "HGSS Vs. Entei", + "battle_legendary_suicune": "HGSS Vs. Suicune", + "battle_legendary_lugia": "HGSS Vs. Lugia", + "battle_legendary_ho_oh": "HGSS Vs. Ho-oh", + "battle_legendary_regis_g5": "S2W2 Vs. Legendäre Giganten", + "battle_legendary_regis_g6": "ORAS Vs. Legendäre Giganten", + "battle_legendary_gro_kyo": "ORAS Vs. Groudon & Kyogre", + "battle_legendary_rayquaza": "ORAS Vs. Rayquaza", + "battle_legendary_deoxys": "ORAS Vs. Deoxys", + "battle_legendary_lake_trio": "ORAS Vs. Seen-Trio", + "battle_legendary_sinnoh": "ORAS Vs. Legendäres Sinnoh Pokémon", + "battle_legendary_dia_pal": "ORAS Vs. Dialga & Palkia", + "battle_legendary_giratina": "ORAS Vs. Giratina", + "battle_legendary_arceus": "HGSS Vs. Arceus", + "battle_legendary_unova": "SW Vs. Legendäres Einall Pokémon", + "battle_legendary_kyurem": "SW Vs. Kyurem", + "battle_legendary_res_zek": "SW Vs. Reshiram & Zekrom", + "battle_legendary_xern_yvel": "XY Vs. Xerneas & Yveltal", + "battle_legendary_tapu": "SM Vs. Kapu", + "battle_legendary_sol_lun": "SM Vs. Solgaleo & Lunala", + "battle_legendary_ub": "SM Vs. Ultrabestie", + "battle_legendary_dusk_dawn": "USUM Vs. Abendmähne- & Morgenschwingen-Necrozma", + "battle_legendary_ultra_nec": "USUM Vs. Ultra-Necrozma", + "battle_legendary_zac_zam": "SWSH Vs. Zacian & Zamazenta", + "battle_legendary_glas_spec": "SWSH Vs. Polaross & Phantoross", + "battle_legendary_calyrex": "SWSH Vs. Coronospa", + "battle_legendary_birds_galar": "SWSH Vs. Legendäre Galar-Vögel", + "battle_legendary_ruinous": "KAPU Vs. Schätze des Unheils", + "battle_legendary_loyal_three": "KAPU Drei Gefährten", + "battle_legendary_ogerpon": "KAPU Vs. Ogerpon", + "battle_legendary_terapagos": "KAPU Vs. Terapagos", + "battle_legendary_pecharunt": "KAPU Vs. Infamomo", + "battle_rival": "SW Vs. Rivale", + "battle_rival_2": "SW Vs. N", + "battle_rival_3": "SW Vs. N (Finale)", + "battle_trainer": "SW Vs. Trainer", + "battle_wild": "SW Vs. Wilde Pokémon", + "battle_wild_strong": "SW Vs. Starke Wilde Pokémon", + "end_summit": "PMDDX Gipfel des Himmelturms", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", + "badlands": "PMD Erkundungsteam Himmel Kargtal", + "beach": "PMD Erkundungsteam Himmel Feuchtklippe", + "cave": "PMD Erkundungsteam Himmel Himmelsgipfel-Höhle", + "construction_site": "PMD Erkundungsteam Himmel Geröllbruch", + "desert": "PMD Erkundungsteam Himmel Nordwüste", + "dojo": "PMD Erkundungsteam Himmel Knogga-Dojo", + "end": "PMD Retterteam DX Himmelsturm", + "factory": "PMD Erkundungsteam Himmel Verborgene Ruinen", + "fairy_cave": "PMD Erkundungsteam Himmel Sternenhöhle", + "forest": "PMD Erkundungsteam Himmel Düsterwald", + "grass": "PMD Erkundungsteam Himmel Apfelwald", + "graveyard": "PMD Erkundungsteam Himmel Verwirrwald", + "ice_cave": "PMD Erkundungsteam Himmel Rieseneisberg", + "island": "PMD Erkundungsteam Himmel Schroffküste", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PMD Erkundungsteam Himmel Kristallhöhle", + "meadow": "PMD Erkundungsteam Himmel Himmelsgipfel-Wald", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PMD Erkundungsteam Himmel Hornberg", + "plains": "PMD Erkundungsteam Himmel Himmelsgipfel-Prärie", + "power_plant": "PMD Erkundungsteam Himmel Weite Ampere-Ebene", + "ruins": "PMD Erkundungsteam Himmel Tiefes Ruinenverlies", + "sea": "PMD Erkundungsteam Himmel Salzwasserhöhle", + "seabed": "PMD Erkundungsteam Himmel Untere Salzwasserhöhle", + "slum": "PMD Erkundungsteam Himmel Himmelsgipfel-Küste", + "snowy_forest": "PMD Erkundungsteam Himmel Himmelsgipfel-Schneefeld", + "space": "PMD Erkundungsteam Himmel Schicksalsschlucht", + "swamp": "PMD Erkundungsteam Himmel Ringmeer", + "tall_grass": "PMD Erkundungsteam Himmel Nebelwald", + "temple": "PMD Erkundungsteam Himmel Ägishöhle", + "town": "PMD Erkundungsteam Himmel Zufälliges Dungeon-Theme 3", + "volcano": "PMD Erkundungsteam Himmel Dunsthöhle", + "wasteland": "PMD Erkundungsteam Himmel Verborgenes Hochland", + + // Encounter + "encounter_ace_trainer": "SW Trainerblicke treffen sich (Ass-Trainer)", + "encounter_backpacker": "SW Trainerblicke treffen sich (Backpacker)", + "encounter_clerk": "SW Trainerblicke treffen sich (Angestellter)", + "encounter_cyclist": "SW Trainerblicke treffen sich (Biker)", + "encounter_lass": "SW Trainerblicke treffen sich (Göre)", + "encounter_parasol_lady": "SW Trainerblicke treffen sich (Schirmdame)", + "encounter_pokefan": "SW Trainerblicke treffen sich (Pokéfan)", + "encounter_psychic": "SW Trainerblicke treffen sich (Seher)", + "encounter_rich": "SW Trainerblicke treffen sich (Gentleman)", + "encounter_rival": "SW Vs. Cheren", + "encounter_roughneck": "SW Trainerblicke treffen sich (Raufbold)", + "encounter_scientist": "SW Trainerblicke treffen sich (Forscher)", + "encounter_twins": "SW Trainerblicke treffen sich (Zwillinge)", + "encounter_youngster": "SW Trainerblicke treffen sich (Knirps)", + + // Other + "heal": "SW Pokémon-Heilung", + "menu": "PMD Erkundungsteam Himmel Willkommen in der Welt der Pokémon!", + "title": "PMD Erkundungsteam Himmel Top-Menü-Thema", +} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 5f1bd541ad2..b7bb827d8d3 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const deConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/de/egg.ts b/src/locales/de/egg.ts index e4a66f9ba87..61a2f627aa4 100644 --- a/src/locales/de/egg.ts +++ b/src/locales/de/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Du hast nicht genug Ei-Gutscheine!", "tooManyEggs": "Du hast schon zu viele Eier!", "pull": "Pull", - "pulls": "Pulls" + "pulls": "Pulls", + "sameSpeciesEgg": "{{species}} wird aus dem Ei schlüpfen!", + "hatchFromTheEgg": "Ein {{pokemonName}} ist aus dem Ei geschlüpft!", + "eggMoveUnlock": "Ei-Attacke freigeschaltet: {{moveName}}", + "rareEggMoveUnlock": "Seltene Ei-Attacke freigeschaltet: {{moveName}}", } as const; diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index 62c53be4c62..3b0764bf261 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Daten importieren", "exportData": "Daten exportieren", "cancel": "Abbrechen", - "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?" + "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index beb46ff16aa..8f8beffc2cb 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -47,10 +47,11 @@ export const menu: SimpleTranslationEntries = { "score": "Punkte", "wave": "Welle", "loading": "Lade…", - "loadingAsset": "Loading asset: {{assetName}}", + "loadingAsset": "Lade Asset: {{assetName}}", "playersOnline": "Spieler Online", "yes":"Ja", "no":"Nein", - "disclaimer": "DISCLAIMER", + "disclaimer": "HAFTUNGSAUSSCHLUSS", "disclaimerDescription": "Dieses Spiel ist ein unfertiges Produkt. Es kann spielbeinträchtigende Fehler (bis hin zum Verlust des Speicherstandes)\n aufweisen, sich ohne Vorankündigung ändern und es gibt keine Garantie dass es weiterentwickelt oder fertiggestellt wird.", + "choosePokemon": "Choose a Pokémon.", } as const; diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index f5536e2c6d7..171587d6ead 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Sanftglocke" }, + "EVIOLITE": { name: "Evolith", description: "Ein mysteriöser Klumpen, der die Vert. u. Spez.-Vert. von Pokémon erhöht, die sich noch entwickeln können." }, + "SOUL_DEW": { name: "Seelentau", description: "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)." }, "NUGGET": { name: "Nugget" }, diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts index f7b8a1b0877..85f8645d69f 100644 --- a/src/locales/de/settings.ts +++ b/src/locales/de/settings.ts @@ -95,4 +95,5 @@ export const settings: SimpleTranslationEntries = { "mute": "Stumm", "controller": "Controller", "gamepadSupport": "Controllerunterstützung", + "showBgmBar": "Musiknamen anzeigen", } as const; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index 2f5a98bb051..92ead61ebe7 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Wähle die gewünschte Attacke.", "unlockPassive": "Passiv-Skill freischalten", "reduceCost": "Preis reduzieren", + "sameSpeciesEgg": "Ein Ei kaufen", "cycleShiny": ": Schillernd", "cycleForm": ": Form", "cycleGender": ": Geschlecht", diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 7be3c019903..1390bf410ae 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -93,12 +93,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon-Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Angestellte", - "rich": "Rich", - "rich_female": "Rich", + "rich": "Gentleman", + "rich_female": "Reiche Dame", "rich_boy": "Schnösel", "rich_couple": "Reiches Paar", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", + "rich_kid": "Schnösel", + "rich_kid_female": "Schnöselin", "rich_kids": "Schnösel", "roughneck": "Raufbold", "sailor": "Matrose", diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index 00370d82874..b516bc8dde0 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -1,10 +1,13 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", + "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", "badDreams": "{{pokemonName}} is tormented!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 304766a228f..23a1ff3cee0 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "You defeated\n{{trainerName}}!", "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "pokemonCaught": "{{pokemonName}} was caught!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Go! {{pokemonName}}!", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "switching", "escapeVerbFlee": "fleeing", "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Are you sure you want to skip taking an item?", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", @@ -62,18 +65,18 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} had its\nenergy drained!", "regainHealth": "{{pokemonName}} regained\nhealth!", "fainted": "{{pokemonNameWithAffix}} fainted!", - "statRose": "rose", - "statSharplyRose": "sharply rose", - "statRoseDrastically": "rose drastically", - "statWontGoAnyHigher": "won't go any higher", - "statFell": "fell", - "statHarshlyFell": "harshly fell", - "statSeverelyFell": "severely fell", - "statWontGoAnyLower": "won't go any lower", + "statRose": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts new file mode 100644 index 00000000000..1e35a2a095b --- /dev/null +++ b/src/locales/en/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowa Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "PMD EoS Lower Brine Cave", + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "PMD EoS Fortune Ravine", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index f37b707479a..fbbae3df329 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -6,6 +6,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const enConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index fb45d82765b..119bcaed559 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -477,7 +477,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "aqua_boss_archie_1": { "encounter": { - 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + 1: "I'm the leader of Team Aqua, so I'm afraid it's the rope's end for you." }, "victory": { 1: "Let's meet again somewhere. I'll be sure to remember that face." diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.ts index 7009dc91b59..b6e13d26213 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "You don't have enough vouchers!", "tooManyEggs": "You have too many eggs!", "pull": "Pull", - "pulls": "Pulls" + "pulls": "Pulls", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "{{pokemonName}} hatched from the egg!", + "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", + "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", } as const; diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.ts index f34a87bb778..97d6e38a099 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Import Data", "exportData": "Export Data", "cancel": "Cancel", - "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?" + "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index c7bade07a47..9be87724ea8 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -53,4 +53,5 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "choosePokemon": "Choose a Pokémon.", } as const; diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index f8073400358..001d50c4e21 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Soothe Bell" }, + "EVIOLITE": { name: "Eviolite", description: "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." }, + "SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." }, "NUGGET": { name: "Nugget" }, diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.ts index 20624defd92..f68a649269f 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index ae8443d8a20..ac59785bab7 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Select a move to swap with", "unlockPassive": "Unlock Passive", "reduceCost": "Reduce Cost", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Form", "cycleGender": ": Gender", diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index 0b0dcbd067b..5c09c3832c0 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -3,6 +3,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", "badDreams": "¡{{pokemonName}} está atormentado!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", - "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!" + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index 7ba401b524d..16cddaceb83 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "¡Has derrotado a\n{{trainerName}}!", "moneyWon": "¡Has ganado\n₽{{moneyAmount}} por vencer!", "pokemonCaught": "¡{{pokemonName}} atrapado!", + "addedAsAStarter": "{{pokemonName}} ha sido añadido\na tus iniciales!", "partyFull": "Tu equipo esta completo.\n¿Quieres liberar un Pokémon para meter a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "¡Adelante, {{pokemonName}}!", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiar", "escapeVerbFlee": "huir", "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "eggHatching": "¿Y esto?", "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", @@ -62,18 +65,18 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "¡{{pokemonName}} tuvo su\nenergía absorbida!", "regainHealth": "¡{{pokemonName}} recuperó\nPS!", "fainted": "¡{{pokemonNameWithAffix}} se debilitó!", - "statRose": "rose", - "statSharplyRose": "sharply rose", - "statRoseDrastically": "rose drastically", - "statWontGoAnyHigher": "won't go any higher", - "statFell": "fell", - "statHarshlyFell": "harshly fell", - "statSeverelyFell": "severely fell", - "statWontGoAnyLower": "won't go any lower", + "statRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", + "statSharplyRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", + "statRoseDrastically": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", + "statWontGoAnyHigher": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", + "statFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", + "statHarshlyFell": "¡El {{stats}} de {{pokemonNameWithAffix}}} ha bajado mucho!", + "statSeverelyFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", + "statWontGoAnyLower": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", diff --git a/src/locales/es/bgm-name.ts b/src/locales/es/bgm-name.ts new file mode 100644 index 00000000000..2433c66bf98 --- /dev/null +++ b/src/locales/es/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Música", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", + "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", + "battle_hoenn_champion": "B2W2 - ¡Vs Campeón de Hoenn!", + "battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!", + "battle_champion_alder": "BW - ¡Vs Campeón de Teselia!", + "battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!", + "battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!", + "battle_alola_champion": "USUM - ¡Vs Campeón de Alola!", + "battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!", + "battle_champion_geeta": "SV - ¡Vs Campeona Ságita!", + "battle_champion_nemona": "SV - ¡Vs Campeona Mencía!", + "battle_champion_kieran": "SV - ¡Vs Campeón Cass!", + "battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!", + "battle_unova_elite": "BW - ¡Vs Alto Mando!", + "battle_kalos_elite": "XY - ¡Vs Alto Mando!", + "battle_alola_elite": "SM - ¡Vs Alto Mando!", + "battle_galar_elite": "SWSH - Torneo de Finalistas", + "battle_paldea_elite": "SV - ¡Vs Alto Mando!", + "battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!", + "battle_final_encounter": "PMD RTDX - Dominio de Rayquaza", + "battle_final": "BW - ¡Vs Ghechis!", + "battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!", + "battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!", + "battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!", + "battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!", + "battle_unova_gym": "BW - ¡Vs Líder de Teselia!", + "battle_kalos_gym": "XY - ¡Vs Líder de Kalos!", + "battle_galar_gym": "SWSH - ¡Vs Líder de Galar!", + "battle_paldea_gym": "SV - ¡Vs Líder de Paldea!", + "battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!", + "battle_legendary_raikou": "HGSS - ¡Vs Raikou!", + "battle_legendary_entei": "HGSS - ¡Vs Entei!", + "battle_legendary_suicune": "HGSS - ¡Vs Suicune!", + "battle_legendary_lugia": "HGSS - ¡Vs Lugia!", + "battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!", + "battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!", + "battle_legendary_regis_g6": "ORAS - ¡Vs Regis!", + "battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!", + "battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!", + "battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!", + "battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!", + "battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!", + "battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!", + "battle_legendary_giratina": "ORAS - ¡Vs Giratina!", + "battle_legendary_arceus": "HGSS - ¡Vs Arceus!", + "battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!", + "battle_legendary_kyurem": "BW - ¡Vs Kyurem!", + "battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!", + "battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!", + "battle_legendary_tapu": "SM - ¡Vs Tapus!", + "battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!", + "battle_legendary_ub": "SM - ¡Vs Ultraentes!", + "battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!", + "battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!", + "battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!", + "battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!", + "battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!", + "battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!", + "battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!", + "battle_legendary_loyal_three": "SV - ¡Vs Compatrones!", + "battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!", + "battle_legendary_terapagos": "SV - ¡Vs Terapagos!", + "battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!", + "battle_rival": "BW - ¡Vs Rival!", + "battle_rival_2": "BW - ¡Vs N!", + "battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!", + "battle_trainer": "BW - ¡Vs Entrenador!", + "battle_wild": "BW - ¡Vs Pokémon Salvaje!", + "battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!", + "end_summit": "PMD RTDX - Techo del Cielo", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS - Cráter Oscuro", + "badlands": "PMD EoS - Valle Desolado", + "beach": "PMD EoS - Risco Calado", + "cave": "PMD EoS - Cueva de la Cumbre del Cielo", + "construction_site": "PMD EoS - Roquedal", + "desert": "PMD EoS - Desierto Norte", + "dojo": "PMD EoS - Dojo Marowak", + "end": "PMD RTDX - Torre del Cielo", + "factory": "PMD EoS - Ruinas Camufladas", + "fairy_cave": "PMD EoS - Cueva Estrella", + "forest": "PMD EoS - Bosque Sombrío", + "grass": "PMD EoS - Manzanar", + "graveyard": "PMD EoS - Bosque Misterio", + "ice_cave": "PMD EoS - Gran Iceberg", + "island": "PMD EoS - Costa Escarpada", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PMD EoS - Cueva Cristal", + "meadow": "PMD EoS - Bosque de la Cumbre del Cielo", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS - Monte Cuerno", + "plains": "PMD EoS - Pradera de la Cumbre del Cielo", + "power_plant": "PMD EoS - Pradera Destello", + "ruins": "PMD EoS - Sima Hermética", + "sea": "PMD EoS - Cueva Aguamar", + "seabed": "PMD EoS - Fosa Aguamar", + "slum": "PMD EoS - Costa de la Cumbre del Cielo", + "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", + "space": "PMD EoS - Risco Fortuna", + "swamp": "PMD EoS - Mar Circundante", + "tall_grass": "PMD EoS - Bosque Niebla", + "temple": "PMD EoS - Cueva Regia", + "town": "PMD EoS - Tema del territorio aleatorio 3", + "volcano": "PMD EoS - Cueva Vapor", + "wasteland": "PMD EoS - Corazón Tierra Oculta", + + // Encounter + "encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)", + "encounter_backpacker": "BW - Desafío Combate (Mochilero)", + "encounter_clerk": "BW - Desafío Combate (Empresario)", + "encounter_cyclist": "BW - Desafío Combate (Ciclista)", + "encounter_lass": "BW - Desafío Combate (Chica)", + "encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)", + "encounter_pokefan": "BW - Desafío Combate (Pokéfan)", + "encounter_psychic": "BW - Desafío Combate (Médium)", + "encounter_rich": "BW - Desafío Combate (Aristócrata)", + "encounter_rival": "BW - Desafío Combate (Cheren)", + "encounter_roughneck": "BW - Desafío Combate (Calvo)", + "encounter_scientist": "BW - Desafío Combate (Científico)", + "encounter_twins": "BW - Desafío Combate (Gemelas)", + "encounter_youngster": "BW - Desafío Combate (Joven)", + + // Other + "heal": "BW - Cura Pokémon", + "menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!", + "title": "PMD EoS - Tema del menú principal", +} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index f3747b6c619..e09224ce85e 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const esConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/es/dialogue.ts b/src/locales/es/dialogue.ts index 5fed9019b29..c1b23b57fe0 100644 --- a/src/locales/es/dialogue.ts +++ b/src/locales/es/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Creo que soy yo quien está mareado..." }, }, + "rocket_grunt": { + "encounter": { + 1: "¡Ríndete ahora, o prepárate para luchar!" + }, + "victory": { + 1: "¡El Team Rocket despega de nuevo!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "¡No esperes piedad si te interpones al Team Magma!" + }, + "victory": { + 1: "¿Eh? ¿He perdido?" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "El Team Aqua no muestra piedad, ¡ni siquiera a los niños!" + }, + "victory": { + 1: "¡Bromeas! ¡No me lo creo!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "¡No desafíes al Equipo Galaxia, te arrepentirás!" + }, + "victory": { + 1: "Me callaste la boca..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "¡El Equipo Plasma no tolerará otros ideales!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "¡La moda es lo más importante para nosotros!" + }, + "victory": { + 1: "Me temo que se me avecina un futuro oscuro..." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "He de decir... estoy impresionado de que hayas llegado tan lejos." + }, + "victory": { + 1: "¿¡QUÉ?! ¡No puede ser!" + }, + "defeat": { + 1: "Recuerda mis palabras: Que no seas capaz de medir\n tu propia fuerza demuestra que todavía eres un niño" + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mis antiguos socios me necesitan... ¿te atreves a imponerte en mi camino?" + }, + "victory": { + 1: "¿Cómo es esto posible?\nEl sueño del Team Rocket, ahora tan solo una mera ilusión..." + }, + "defeat": { + 1: "El Team Rocket renacerá... ¡y gobernaré el mundo!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Está bien, tendré que cavar yo mismo tu propia tumba. Siéntete orgulloso." + }, + "victory": { + 1: "Ugh! Eres... muy capaz...\nFue por poco, estuve a esto de ganarte..." + }, + "defeat": { + 1: "¡El Equipo Magma prevalecerá!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "Eres el obstáculo final entre mi y mis propósitos.\n¡Aquí va mi mejor golpe! ¡MUAJAJAJA!" + }, + "victory": { + 1: "No... no es posib... nnngh..." + }, + "defeat": { + 1: "Y ahora... transformaré este planeta en una tierra ideal para la humanidad." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Soy el líder del Equipo Aqua, así que me temo que aquí se acaba tu bromita." + }, + "victory": { + 1: "Volvamos a vernos más tarde. Recordaré tu cara." + }, + "defeat": { + 1: "¡Excelente! ¡Nadie se puede oponer a mi equipo!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Llevo esperando mucho que llegara este día.\n¡Contempla el poder de mi equipo!" + }, + "victory": { + 1: "Quién me lo iba a decir..." + }, + "defeat": { + 1: "Devolveré todo en este planeta a su estado original.\nSe avecina un nuevo mundo, ¡más puro!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu fútil sentimentalidad te hizo interferir.\n¡Haré que te arrepientas de escuchar a tu corazón!" + }, + "victory": { + 1: "Interesante. Muy... curioso." + }, + "defeat": { + 1: "Crearé un nuevo mundo..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nos vemos de nuevo... se ve que nuestros destinos están entrelazados.\nPero, aquí y ahora, ¡sesgaré ese vínculo!" + }, + "victory": { + 1: "¿Cómo? ¿¡Cómo!? ¿¡¡CÓMO!!?" + }, + "defeat": { + 1: "Hasta nunca." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "¡No permitiré que nadie me detenga!" + }, + "victory": { + 1: "¿Cómo puede ser esto? ¡yo creé al Equipo Plasma!\n¡Soy PERFECTO!" + }, + "defeat": { + 1: "Soy el perfecto gobernante para un perfecto nuevo mundo. ¡Muajajajaja!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "¡Adelante! ¡Quiero ver tu cara cuando la desesperación se apoderede de ti!" + }, + "victory": { + 1: "Mis planes... ¡no! ¡El mundo debería pertenecerme!" + }, + "defeat": { + 1: "¡Kyurem, Absorfusión... ahora!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "¿Acaso quieres detenerme? Demuéstramelo." + }, + "victory": { + 1: "Estás aquí para detenerme. Pero tendrás que esperar. " + }, + "defeat": { + 1: "Los Pokémon... su fin ha llegado." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "El futuro que quieres tú, o el futuro que quiero yo.\nVeamos cuál de los dos se merece existir..." + }, + "victory": { + 1: "¡AARGH!" + }, + "defeat": { + 1: "Los idiotas sin ningún tipo de visión continuarán asediando este mundo." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/es/egg.ts b/src/locales/es/egg.ts index d04f74ed8ef..dea466066f1 100644 --- a/src/locales/es/egg.ts +++ b/src/locales/es/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "¡No tienes suficientes vales!", "tooManyEggs": "¡No tienes suficiente espacio!", "pull": "Tirada", - "pulls": "Tiradas" + "pulls": "Tiradas", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "¡Ha salido un {{pokemonName}} del Huevo!", + "eggMoveUnlock": "Mov. Huevo desbloqueado:\n{{moveName}}", + "rareEggMoveUnlock": "Mov. Huevo Raro desbloqueado:\n{{moveName}}", } as const; diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.ts index ff0e38f110a..bf71c2b390b 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importar Datos", "exportData": "Exportar Datos", "cancel": "Cancelar", - "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?" + "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index c47406a0e95..d5030c8d98c 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -53,4 +53,5 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "AVISO", "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado),cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", + "choosePokemon": "Choose a Pokémon.", } as const; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index 8bdb6f13f41..6998e616488 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Camp. Alivio" }, + "EVIOLITE": { name: "Mineral Evolutivo", description: "Roca misteriosa. El Pokémon portador aumentará su Defensa y su Defensa Especial si aún puede evolucionar." }, + "SOUL_DEW": { name: "Rocío bondad", description: "Aumenta la influencia de la naturaleza de un Pokémon en sus estadísticas en un 10% (aditivo)." }, "NUGGET": { name: "Pepita" }, diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts index bf4c22707a9..dfd6f097242 100644 --- a/src/locales/es/settings.ts +++ b/src/locales/es/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index a6ff2c921c3..14c22e22097 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Elige el movimiento que sustituirá a", "unlockPassive": "Añadir Pasiva", "reduceCost": "Reducir Coste", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Forma", "cycleGender": ": Género", diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index 90a2a9ac109..f99ff15c26f 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -3,8 +3,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", "badDreams": "{{pokemonName}} a le sommeil agité !", - "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", + "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", + "iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !", "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", - "iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !" + "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", + "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index e86e00029c6..94eab760857 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "Vous avez battu\n{{trainerName}} !", "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", + "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}} ! Go !", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "le changement", "escapeVerbFlee": "la fuite", "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", + "turnEndHpRestore": "{{pokemonName}} récupère des PV !", + "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", "eggHatching": "Hein ?", "ivScannerUseQuestion": "Utiliser le Scanner d’IV sur {{pokemonName}} ?", @@ -62,15 +65,15 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "L’énergie de {{pokemonName}}\nest drainée !", "regainHealth": "{{pokemonName}} récupère\ndes PV !", "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", - "statRose": "augmente", - "statSharplyRose": "augmente beaucoup", - "statRoseDrastically": "augmente énormément", - "statWontGoAnyHigher": "ne peut plus augmenter", - "statFell": "baisse", - "statHarshlyFell": "baisse beaucoup", - "statSeverelyFell": "baisse énormément", - "statWontGoAnyLower": "ne peut plus baisser", - "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} sont réduits de {{reduction}} !", + "statRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", "battlerTagsRechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus s’échapper !", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !", diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts new file mode 100644 index 00000000000..3a563df631a --- /dev/null +++ b/src/locales/fr/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Musique ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "N2B2 - Vs. Maitre de Kanto", + "battle_johto_champion": "N2B2 - Vs. Maitre de Johto", + "battle_hoenn_champion": "N2B2 - Vs. Maitre de Hoenn", + "battle_sinnoh_champion": "N2B2 - Vs. Maitresse de Sinnoh", + "battle_champion_alder": "NB - Vs. Maitre d’Unys", + "battle_champion_iris": "N2B2 - Vs. Maitresse d’Unys", + "battle_kalos_champion": "XY - Maitresse de Kalos", + "battle_alola_champion": "USUL - Maitre d’Alola", + "battle_galar_champion": "ÉB - Maitre de Galar", + "battle_champion_geeta": "ÉV - Vs. Alisma la Maitresse", + "battle_champion_nemona": "ÉV - Vs. Menzi la Maitresse", + "battle_champion_kieran": "ÉV - Vs. Kassis le Maitre", + "battle_hoenn_elite": "ROSA - Vs. Conseil 4", + "battle_unova_elite": "NB - Vs. Conseil 4", + "battle_kalos_elite": "XY - Vs. Conseil 4", + "battle_alola_elite": "SL - Vs. Conseil 4", + "battle_galar_elite": "ÉB - Vs. Tournoi des Champions", + "battle_paldea_elite": "ÉV - Vs. Conseil 4", + "battle_bb_elite": "ÉV - Vs. Conseil 4 de l’Institut Myrtille", + "battle_final_encounter": "PDM ÉSDX - Vs. Rayquaza", + "battle_final": "NB - Vs. Ghetis", + "battle_kanto_gym": "N2B2 - Vs. Champion·ne d’Arène de Kanto", + "battle_johto_gym": "N2B2 - Vs. Champion·ne d’Arène de Johto", + "battle_hoenn_gym": "N2B2 - Vs. Champion·ne d’Arène de Hoenn", + "battle_sinnoh_gym": "N2B2 - Vs. Champion·ne d’Arène de Sinnoh", + "battle_unova_gym": "NB - Vs. Champion·ne d’Arène d’Unys", + "battle_kalos_gym": "XY - Vs. Champion·ne d’Arène de Kalos", + "battle_galar_gym": "ÉB - Vs. Champion·ne d’Arène de Galar", + "battle_paldea_gym": "ÉV - Vs. Champion·ne d’Arène de Paldea", + "battle_legendary_kanto": "XY - Vs. Légendaire de Kanto", + "battle_legendary_raikou": "HGSS - Vs. Raikou", + "battle_legendary_entei": "HGSS - Vs. Entei", + "battle_legendary_suicune": "HGSS - Vs. Suicune", + "battle_legendary_lugia": "HGSS - Vs. Lugia", + "battle_legendary_ho_oh": "HGSS - Vs. Ho-oh", + "battle_legendary_regis_g5": "N2B2 - Vs. Colosses Légendaires", + "battle_legendary_regis_g6": "ROSA - Vs. Colosses Légendaires", + "battle_legendary_gro_kyo": "ROSA - Vs. Groudon/Kyogre", + "battle_legendary_rayquaza": "ROSA - Vs. Rayquaza", + "battle_legendary_deoxys": "ROSA - Vs. Deoxys", + "battle_legendary_lake_trio": "ROSA - Vs. Gardiens des Lacs", + "battle_legendary_sinnoh": "ROSA - Vs. Légendaire de Sinnoh", + "battle_legendary_dia_pal": "ROSA - Vs. Dialga/Palkia", + "battle_legendary_giratina": "ROSA - Vs. Giratina", + "battle_legendary_arceus": "HGSS - Vs. Arceus", + "battle_legendary_unova": "NB - Vs. Légendaire d’Unys", + "battle_legendary_kyurem": "NB - Vs. Kyurem", + "battle_legendary_res_zek": "NB - Vs. Reshiram/Zekrom", + "battle_legendary_xern_yvel": "XY - Vs. Xerneas/Yveltal", + "battle_legendary_tapu": "SL - Vs. Divinités gardiennes d’Alola", + "battle_legendary_sol_lun": "SL - Vs. Solgaleo/Lunala", + "battle_legendary_ub": "SL - Vs. Ultra-Chimère", + "battle_legendary_dusk_dawn": "USUL - Vs. Necrozma Crinière du Couchant/Ailes de l’Aurore", + "battle_legendary_ultra_nec": "USUL - Vs. Ultra-Necrozma", + "battle_legendary_zac_zam": "ÉB - Vs. Zacian/Zamazenta", + "battle_legendary_glas_spec": "ÉB - Vs. Blizzeval/Spectreval", + "battle_legendary_calyrex": "ÉB - Vs. Sylveroy", + "battle_legendary_birds_galar": "ÉB - Vs. Oiseaux Légendaires de Galar", + "battle_legendary_ruinous": "ÉV - Vs. Trésors du fléau", + "battle_legendary_loyal_three": "ÉV - Vs. Adoramis", + "battle_legendary_ogerpon": "ÉV - Vs. Ogerpon", + "battle_legendary_terapagos": "ÉV - Vs. Terapagos", + "battle_legendary_pecharunt": "ÉV - Vs. Pêchaminus", + "battle_rival": "NB - Vs. Rival", + "battle_rival_2": "NB - Vs. N", + "battle_rival_3": "NB - Combat final Vs. N", + "battle_trainer": "NB - Vs. Dresseur·euse", + "battle_wild": "NB - Vs. Pokémon sauvage", + "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", + "end_summit": "PDM ÉSDX - Tour Céleste", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "NB - Vs. Team Plasma", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PDM EdS - Cratère Obscur", + "badlands": "PDM EdS - Vallée Stérile", + "beach": "PDM EdS - Falaise Trempée", + "cave": "PDM EdS - Pic Céleste (grotte)", + "construction_site": "PDM EdS - Carrière Rocher", + "desert": "PDM EdS - Désert du Nord", + "dojo": "PDM EdS - Dojo Ossatueur", + "end": "PDM EdS - Tour Céleste", + "factory": "PDM EdS - Ruines Cachées", + "fairy_cave": "PDM EdS - Caverne Étoile", + "forest": "PDM EdS - Forêt Crépuscule", + "grass": "PDM EdS - Bois aux Pommes", + "graveyard": "PDM EdS - Forêt Trompeuse", + "ice_cave": "PDM EdS - Montagne Glacier", + "island": "PDM EdS - Côte Escarpée", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PDM EdS - Caverne Cristal", + "meadow": "PDM EdS - Pic Céleste (forêt)", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PDM EdS - Mt Corne", + "plains": "PDM EdS - Pic Céleste (prairie)", + "power_plant": "PDM EdS - Plaines Élek", + "ruins": "PDM EdS - Ruine Scellée", + "sea": "PDM EdS - Caverne Saline", + "seabed": "PDM EdS - Caverne Saline profondeurs", + "slum": "PDM EdS - Pic Céleste (côte)", + "snowy_forest": "PDM EdS - Pic Céleste (plaine enneigée)", + "space": "PDM EdS - Ravin Aubaine", + "swamp": "PDM EdS - Mer Fermée", + "tall_grass": "PDM EdS - Forêt Brumeuse", + "temple": "PDM EdS - Grotte Égide", + "town": "PDM EdS - Donjon aléatoire - Thème 3", + "volcano": "PDM EdS - Grotte Étuve", + "wasteland": "PDM EdS - Terres Illusoires", + + // Encounter + "encounter_ace_trainer": "NB - Regards croisés (Topdresseur·euse)", + "encounter_backpacker": "NB - Regards croisés (Randonneur·euse)", + "encounter_clerk": "NB - Regards croisés (Employé·e)", + "encounter_cyclist": "NB - Regards croisés (Cycliste)", + "encounter_lass": "NB - Regards croisés (Fillette)", + "encounter_parasol_lady": "NB - Regards croisés (Sœur Parasol)", + "encounter_pokefan": "NB - Regards croisés (Pokéfan)", + "encounter_psychic": "NB - Regards croisés (Kinésiste)", + "encounter_rich": "NB - Regards croisés (Gentleman)", + "encounter_rival": "NB - Tcheren", + "encounter_roughneck": "NB - Regards croisés (Loubard)", + "encounter_scientist": "NB - Regards croisés (Scientifique)", + "encounter_twins": "NB - Regards croisés (Jumelles)", + "encounter_youngster": "NB - Regards croisés (Gamin)", + + // Other + "heal": "NB - Soin de Pokémon", + "menu": "PDM EdS - Bienvenue dans le monde de Pokémon !", + "title": "PDM EdS - Menu Principal", +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 59e8eb9f307..6bc5a53a376 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const frConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts index 382e9a179fe..d23cf5d1b02 100644 --- a/src/locales/fr/dialogue.ts +++ b/src/locales/fr/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Nous sommes de retour !" + }, + "victory": { + 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" + }, + }, + "magma_grunt": { + "encounter": { + 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" + }, + "victory": { + 1: "Je…?\nJ’ai perdu ?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour un gamin !" + }, + "victory": { + 1: "Comment ça ?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Ne te mets pas en travers de la Team Galaxie !" + }, + "victory": { + 1: "Désactivation…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" + }, + "victory": { + 1: "Plasmaaaaaaaaa !" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Le style et le bon gout, il n’y a que ça qui compte !" + }, + "victory": { + 1: "Mon futur me semble guère radieux." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" + }, + "victory": { + 1: "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’un gamin." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" + }, + "victory": { + 1: "Comment c'est possible… ?\nLe grand dessein de la Team Rocket n’est plus qu’une illusion…" + }, + "defeat": { + 1: "La Team Rocket renaitra, et je dominerai le monde !" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" + }, + "victory": { + 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" + }, + "defeat": { + 1: "La Team Magma vaincra !" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + 1: "Ce… Ce n'est pas… Gnn…" + }, + "defeat": { + 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + 1: "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + 1: "Comme si j’y avait cru…" + }, + "defeat": { + 1: "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu t’es senti obligé de venir ici dans un acte vide de sens.\nJe vais te le faire regretter." + }, + "victory": { + 1: "Intéressant. Et plutôt curieux." + }, + "defeat": { + 1: "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées.\nIl est l’heure d’y mettre un terme." + }, + "victory": { + 1: "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + 1: "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + 1: "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + 1: "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + 1: "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "Ton future ou le mien… Voyons lequel mérite plus." + }, + "victory": { + 1: "Ohhhh… !" + }, + "defeat": { + 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -2288,7 +2468,7 @@ export const PGMdialogue: DialogueTranslationEntries = { $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? $@c{serious}…et c’est comme si quelque chose ici me parlait. - $Comme si c’était tout ce que ce monde avait toujours connu. + $Comme si c’était tout ce que ce monde avait toujours connu. $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. @@ -2686,6 +2866,210 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "I'll tune up for the next race." }, }, + "firebreather": { + "encounter": { + 1: "My flames shall devour you!", + 2: "My soul is on fire. I'll show you how hot it burns!", + 3: "Step right up and take a look!" + }, + "victory": { + 1: "I burned down to ashes...", + 2: "Yow! That's hot!", + 3: "Ow! I scorched the tip of my nose!" + }, + }, + "sailor": { + "encounter": { + 1: "Matey, you're walking the plank if you lose!", + 2: "Come on then! My sailor's pride is at stake!", + 3: "Ahoy there! Are you seasick?" + }, + "victory": { + 1: "Argh! Beaten by a kid!", + 2: "Your spirit sank me!", + 3: "I think it's me that's seasick..." + }, + }, + "rocket_grunt": { + "encounter": { + 1: "Nous sommes de retour !" + }, + "victory": { + 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" + }, + }, + "magma_grunt": { + "encounter": { + 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" + }, + "victory": { + 1: "Je…?\nJ’ai perdu ?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !" + }, + "victory": { + 1: "Comment ça ?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Ne te mets pas en travers de la Team Galaxie !" + }, + "victory": { + 1: "Désactivation…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" + }, + "victory": { + 1: "Plasmaaaaaaaaa !" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Le style et le bon gout, il n’y a que ça qui compte !" + }, + "victory": { + 1: "Mon futur me semble guère radieux." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" + }, + "victory": { + 1: "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’une gamine." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" + }, + "victory": { + 1: "Comment c'est possible… ?\nLe grand dessein de la Team Rocket n’est plus qu’une illusion…" + }, + "defeat": { + 1: "La Team Rocket renaitra, et je dominerai le monde !" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" + }, + "victory": { + 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" + }, + "defeat": { + 1: "La Team Magma vaincra !" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + 1: "Ce… Ce n'est pas… Gnn…" + }, + "defeat": { + 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + 1: "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + 1: "Comme si j’y avait cru…" + }, + "defeat": { + 1: "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu t’es sentie obligée de venir ici dans un acte vide de sens.\nJe vais te le faire regretter." + }, + "victory": { + 1: "Intéressant. Et plutôt curieux." + }, + "defeat": { + 1: "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées.\nIl est l’heure d’y mettre un terme." + }, + "victory": { + 1: "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + 1: "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + 1: "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + 1: "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + 1: "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "Ton future ou le mien… Voyons lequel mérite plus." + }, + "victory": { + 1: "Ohhhh… !" + }, + "defeat": { + 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -4565,7 +4949,8 @@ export const PGFdialogue: DialogueTranslationEntries = { $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait.\nComme si c’était tout ce que ce monde avait toujours connu. + $@c{serious}…et c’est comme si quelque chose ici me parlait. + $Comme si c’était tout ce que ce monde avait toujours connu. $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. @@ -4592,7 +4977,7 @@ export const PGFdialogue: DialogueTranslationEntries = { $@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant… $@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es le seul à en être capable. $@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité. - $@c{neutral}Si tu ne parviens à pas me battre ici et maintenant, tu n’as aucune chance.` + $@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance.` }, "victory": { 1: `@c{smile_ehalf}Je… Je crois que j'ai rempli ma mission… diff --git a/src/locales/fr/egg.ts b/src/locales/fr/egg.ts index b7df2d51cc7..96fbc4dce15 100644 --- a/src/locales/fr/egg.ts +++ b/src/locales/fr/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Vous n’avez pas assez de coupons !", "tooManyEggs": "Vous avez trop d’Œufs !", "pull": "Tirage", - "pulls": "Tirages" + "pulls": "Tirages", + "sameSpeciesEgg": "{{species}} sortira de cet Œuf !", + "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", + "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", + "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", } as const; diff --git a/src/locales/fr/fight-ui-handler.ts b/src/locales/fr/fight-ui-handler.ts index 5472838d780..8bcf7732626 100644 --- a/src/locales/fr/fight-ui-handler.ts +++ b/src/locales/fr/fight-ui-handler.ts @@ -4,6 +4,6 @@ export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "Puissance", "accuracy": "Précision", - "abilityFlyInText": " {{passive}}{{abilityName}} de {{pokemonName}}", + "abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}", "passive": "Passif ", // The space at the end is important } as const; diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index 2a9eecd66ec..b8446b1aa68 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importer données", "exportData": "Exporter données", "cancel": "Retour", - "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?" + "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.ts index 8b13335fe57..8ed1273d6f7 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -38,14 +38,15 @@ export const menu: SimpleTranslationEntries = { "weeklyRankings": "Classement de la Semaine", "noRankings": "Pas de Classement", "positionIcon": "#", - "usernameScoreboard": "Username", + "usernameScoreboard": "Utilisateur", "score": "Score", - "wave": "Wave", + "wave": "Vague", "loading": "Chargement…", - "loadingAsset": "Chargement de la ressource: {{assetName}}", + "loadingAsset": "Chargement de la ressource : {{assetName}}", "playersOnline": "Joueurs Connectés", "yes":"Oui", "no":"Non", "disclaimer": "AVERTISSEMENT", "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", + "choosePokemon": "Sélectionnez un Pokémon.", } as const; diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 97a31161dc4..43e7c5ad757 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -4,7 +4,7 @@ export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { "AddPokeballModifierType": { name: "{{pokeballName}} x{{modifierCount}}", - description: "Recevez {{modifierCount}} {{pokeballName}}s (Inventaire : {{pokeballAmount}}) \nTaux de capture : {{catchRate}}.", + description: "Recevez {{modifierCount}} {{pokeballName}}·s (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}.", }, "AddVoucherModifierType": { name: "{{voucherTypeName}} x{{modifierCount}}", @@ -17,7 +17,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonHpRestoreModifierType": { - description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé", + description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé.", extra: { "fully": "Restaure tous les PV d’un Pokémon.", "fullyWithStatus": "Restaure tous les PV d’un Pokémon et soigne tous ses problèmes de statut.", @@ -73,7 +73,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Réanime et restaure tous les PV de tous les Pokémon K.O.", }, "MoneyRewardModifierType": { - description: "Octroie une {{moneyMultiplier}} somme d’argent ({{moneyAmount}}₽).", + description: "Octroie une {{moneyMultiplier}} somme d’argent.\n({{moneyAmount}} ₽)", extra: { "small": "petite", "moderate": "moyenne", @@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TmModifierTypeWithInfo": { name: "CT{{moveId}} - {{moveName}}", - description: "Apprend la capacité {{moveName}} à un Pokémon\n(Hold C or Shift for more info).", + description: "Apprend la capacité {{moveName}} à un Pokémon\n(Maintenez C ou Maj pour plus d’infos).", }, "EvolutionItemModifierType": { description: "Permet à certains Pokémon d’évoluer.", @@ -110,7 +110,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Permet à certains Pokémon de changer de forme.", }, "FusePokemonModifierType": { - description: "Fusionne deux Pokémon (transfère le Talent, sépare les stats de base et les types, partage le movepool).", + description: "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage le movepool).", }, "TerastallizeModifierType": { name: "Téra-Éclat {{teraType}}", @@ -151,7 +151,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Cendre Sacrée" }, - "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O." }, + "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O. ." }, "ETHER": { name: "Huile" }, "MAX_ETHER": { name: "Huile Max" }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Grelot Zen" }, + "EVIOLITE": { name: "Évoluroc", description: "Un étrange concentré d’évolution qui augmente la Défense et la Défense Spéciale d’un Pokémon pouvant évoluer." }, + "SOUL_DEW": { name: "Rosée Âme", description: "Augmente de 10% l’influence de la nature d’un Pokémon sur ses statistiques (cumulatif)." }, "NUGGET": { name: "Pépite" }, @@ -211,10 +213,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "KINGS_ROCK": { name: "Roche Royale", description: "Ajoute 10% de chances qu’une capacité offensive apeure l’adversaire." }, "LEFTOVERS": { name: "Restes", description: "Soigne à chaque tour 1/16 des PV max d’un Pokémon." }, - "SHELL_BELL": { name: "Grelot Coque", description: "Soigne 1/8 des dégâts infligés par un Pokémon." }, + "SHELL_BELL": { name: "Grelot Coque", description: "Soigne son porteur avec 1/8 des dégâts qu’il inflige à un Pokémon." }, "TOXIC_ORB": { name: "Orbe Toxique", description: "Un orbe bizarre qui empoisonne gravement son porteur durant le combat." }, - "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brûle son porteur durant le combat." }, + "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brule son porteur durant le combat." }, "BATON": { name: "Bâton", description: "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts index 59de6c82d32..cd85b0f8cb9 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -10,7 +10,7 @@ export const settings: SimpleTranslationEntries = { "keyboard": "Clavier", "gameSpeed": "Vitesse du jeu", "hpBarSpeed": "Vit. barre de PV", - "expGainsSpeed": "Vit.barre d’Exp", + "expGainsSpeed": "Vit. barre d’Exp", "expPartyDisplay": "Afficher Exp équipe", "skipSeenDialogues": "Passer dialogues connus", "battleStyle": "Style de combat", @@ -41,13 +41,13 @@ export const settings: SimpleTranslationEntries = { "fancy": "Amélioré", "abbreviated": "Abrégé", "moveAnimations": "Animations de combat", - "showStatsOnLevelUp": "Afficher stats à la montée de niveau", + "showStatsOnLevelUp": "Afficher stats à la montée de N.", "candyUpgradeNotification": "Notif amélioration de bonbon", "passivesOnly": "Passifs", "candyUpgradeDisplay": "Amélioration bonbon", "icon": "Icône", "animation": "Animation", - "moveInfo": "Info de capacité", + "moveInfo": "Infos de capacité", "showMovesetFlyout": "Afficher le volet de capacités", "showArenaFlyout": "Afficher le volet d’arène", "showTimeOfDayWidget": "Widget de l’heure", @@ -58,16 +58,16 @@ export const settings: SimpleTranslationEntries = { "consistent": "Consistant", "mixedAnimated": "Mixte", "fusionPaletteSwaps": "Palettes de fusion", - "playerGender": "Genre du joueur", + "playerGender": "Genre de l’avatar", "typeHints": "Indications de type", "masterVolume": "Vol. principal", "bgmVolume": "Vol. musique", "seVolume": "Vol. effets", - "musicPreference": "Préférence musicale", + "musicPreference": "Préf. musicale", "mixed": "Mixte", - "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton", + "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton.", "delete": "Supprimer", - "keyboardPleasePress": "Veuillez appuyer sur une touche de votre clavier", + "keyboardPleasePress": "Veuillez appuyer sur une touche de votre clavier.", "reset": "Réinitialiser", "requireReload": "Redémarrage requis", "action": "Action", @@ -92,7 +92,8 @@ export const settings: SimpleTranslationEntries = { "buttonSpeedUp": "Accélérer", "buttonSlowDown": "Ralentir", "alt": " (Alt)", - "mute": "Mute", + "mute": "Muet", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Montrer titre de la musique", } as const; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index 87ede732f11..84fb56c9ccc 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Sélectionnez laquelle échanger avec", "unlockPassive": "Débloquer Passif", "reduceCost": "Diminuer le cout", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": » Chromatiques", "cycleForm": ": » Formes", "cycleGender": ": » Sexes", diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index 17dbfd89fb1..1f6fcfb1258 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -3,6 +3,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", "badDreams": "{{pokemonName}} è tormentato dagli incubi!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "Venire colpito da {{moveName}} ha caricato {{pokemonName}}!", - "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!" + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index a4b3c32db07..901d39cce51 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", "moneyWon": "Hai vinto {{moneyAmount}}₽", "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Vai! {{pokemonName}}!", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiando", "escapeVerbFlee": "fuggendo", "notDisabled": "{{pokemonName}}'s {{moveName}} non è più\ndisabilitata!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", "eggHatching": "Oh!", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", @@ -62,14 +65,14 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", - "statRose": "è aumentato/a", - "statSharplyRose": "è aumentato/a molto", - "statRoseDrastically": "è aumentato/a drasticamente", - "statWontGoAnyHigher": "non può aumentare più di così", - "statFell": "è diminuito/a", - "statHarshlyFell": "è diminuito/a molto", - "statSeverelyFell": "è diminuito/a drasticamente", - "statWontGoAnyLower": "non può diminuire più di così", + "statRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", + "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", + "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", + "statFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", + "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", + "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", diff --git a/src/locales/it/bgm-name.ts b/src/locales/it/bgm-name.ts new file mode 100644 index 00000000000..1e35a2a095b --- /dev/null +++ b/src/locales/it/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowa Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "PMD EoS Lower Brine Cave", + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "PMD EoS Fortune Ravine", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 7cc063a6b23..fa0ddb5add2 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const itConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/it/dialogue.ts b/src/locales/it/dialogue.ts index 0fbd8cabf67..702b550c45a 100644 --- a/src/locales/it/dialogue.ts +++ b/src/locales/it/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts index 63c8290edee..9b60b2f1835 100644 --- a/src/locales/it/egg.ts +++ b/src/locales/it/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Non hai abbastanza Biglietti!", "tooManyEggs": "Hai troppe Uova!", "pull": "Tiro", - "pulls": "Tiri" + "pulls": "Tiri", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "Dall’Uovo è nato {{pokemonName}}!", + "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", + "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", } as const; diff --git a/src/locales/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts index 9a1e16a77b5..7aae9e26f6d 100644 --- a/src/locales/it/menu-ui-handler.ts +++ b/src/locales/it/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importa Dati", "exportData": "Esporta Dati", "cancel": "Annulla", - "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?" + "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index 187743a7921..91d2a0251ce 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -53,4 +53,5 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "Questo gioco è un prodotto incompleto; si potrebbero riscontrare errori (inclusa la perdita dei dati di salvataggio),\ncambiamenti impercettibili, e non è detto che venga aggiornato nel tempo o mai completato del tutto.", + "choosePokemon": "Choose a Pokémon.", } as const; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 07e7e6909f4..963a06a4e5d 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Calmanella" }, + "EVIOLITE": { name: "Evolcondensa", description: "Misteriosa materia evolutiva. Aumenta la Difesa e la Difesa Speciale di un Pokémon che può ancora evolversi." }, + "SOUL_DEW": { name: "Cuorugiada", description: "Aumenta del 10% l'influenza della natura di un Pokémon sulle sue statistiche (Aggiuntivo)." }, "NUGGET": { name: "Pepita" }, diff --git a/src/locales/it/settings.ts b/src/locales/it/settings.ts index ea70c2ec94b..af48368aeeb 100644 --- a/src/locales/it/settings.ts +++ b/src/locales/it/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support" + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index 5f9960561ca..c84334fcd6a 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -29,6 +29,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "Seleziona natura.", "selectMoveSwapOut": "Seleziona una mossa da scambiare.", "selectMoveSwapWith": "Seleziona una mossa da scambiare con", + "sameSpeciesEgg": "Buy an Egg", "unlockPassive": "Sblocca passiva", "reduceCost": "Riduci costo", "cycleShiny": ": Shiny", diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index c6c29b5f200..7bc38977278 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -3,8 +3,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", - "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", - "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/ko/ability.ts b/src/locales/ko/ability.ts index f11c1363924..18b102800cf 100644 --- a/src/locales/ko/ability.ts +++ b/src/locales/ko/ability.ts @@ -1154,7 +1154,7 @@ export const ability: AbilityTranslationEntries = { }, beadsOfRuin: { name: "재앙의구슬", - description: "재앙을 부르는 곡옥의 힘으 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." + description: "재앙을 부르는 곡옥의 힘으로 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." }, orichalcumPulse: { name: "진홍빛고동", diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts index a4141da13d8..d8b8cc54f66 100644 --- a/src/locales/ko/achv.ts +++ b/src/locales/ko/achv.ts @@ -26,7 +26,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "DamageAchv": { - description: "한 번의 공격만으로 {{damageAmount}} 대미지", + description: "한 번의 공격만으로 {{damageAmount}} 데미지", }, "250_DMG": { name: "강타자", diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index 70464c8487a..a1517402107 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "{{trainerName}}[[와]]의\n승부에서 이겼다!", "moneyWon": "상금으로\n₽{{moneyAmount}}을 손에 넣었다!", "pokemonCaught": "신난다-!\n{{pokemonName}}[[를]] 잡았다!", + "addedAsAStarter": "{{pokemonName}}[[가]]\n스타팅 포켓몬에 추가되었다!", "partyFull": "지닌 포켓몬이 가득 찼습니다. {{pokemonName}}[[를]]\n대신해 포켓몬을 놓아주시겠습니까?", "pokemon": "포켓몬", "sendOutPokemon": "가랏! {{pokemonName}}!", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "교체할", "escapeVerbFlee": "도망칠", "notDisabled": "{{pokemonName}}의\n{{moveName}} 사슬묶기가 풀렸다!", + "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", + "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", "eggHatching": "어라…?", "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", @@ -60,16 +63,16 @@ export const battle: SimpleTranslationEntries = { "foePokemonWithAffix": "상대 {{pokemonName}}", "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", - "regainHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!", + "regainHealth": "{{pokemonName}}[[는]]\n체력을 회복했다!", "fainted": "{{pokemonNameWithAffix}}[[는]] 쓰러졌다!", - "statRose": "[[가]] 올라갔다!", - "statSharplyRose": "[[가]] 크게 올라갔다!", - "statRoseDrastically": "[[가]] 매우 크게 올라갔다!", - "statWontGoAnyHigher": "[[는]] 더 올라가지 않는다!", - "statFell": "[[가]] 떨어졌다!", - "statHarshlyFell": "[[가]] 크게 떨어졌다!", - "statSeverelyFell": "[[가]] 매우 크게 떨어졌다!", - "statWontGoAnyLower": "[[는]] 더 떨어지지 않는다!", + "statRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statSharplyRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statRoseDrastically": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statHarshlyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statSeverelyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!", "battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts new file mode 100644 index 00000000000..59ee2d1adf9 --- /dev/null +++ b/src/locales/ko/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "BW2 관동 챔피언 배틀", + "battle_johto_champion": "BW2 성도 챔피언 배틀", + "battle_hoenn_champion": "BW2 호연 챔피언 배틀", + "battle_sinnoh_champion": "BW2 신오 챔피언 배틀", + "battle_champion_alder": "BW 하나 챔피언 배틀", + "battle_champion_iris": "BW2 하나 챔피언 배틀", + "battle_kalos_champion": "XY 칼로스 챔피언 배틀", + "battle_alola_champion": "USUM 알로라 챔피언 배틀", + "battle_galar_champion": "SWSH 가라르 챔피언 배틀", + "battle_champion_geeta": "SV 챔피언 테사 배틀", + "battle_champion_nemona": "SV 챔피언 네모 배틀", + "battle_champion_kieran": "SV 챔피언 카지 배틀", + "battle_hoenn_elite": "ORAS 사천왕 배틀", + "battle_unova_elite": "BW 사천왕 배틀", + "battle_kalos_elite": "XY 사천왕 배틀", + "battle_alola_elite": "SM 사천왕 배틀", + "battle_galar_elite": "SWSH 리그 토너먼트 배틀", + "battle_paldea_elite": "SV 사천왕 배틀", + "battle_bb_elite": "SV 블루베리 리그 사천왕 배틀", + "battle_final_encounter": "불가사의 던전 구조대 DX 레쿠쟈의 영역", + "battle_final": "BW 게치스 배틀", + "battle_kanto_gym": "BW2 관동 체육관 배틀", + "battle_johto_gym": "BW2 성도 체육관 배틀", + "battle_hoenn_gym": "BW2 호연 체육관 배틀", + "battle_sinnoh_gym": "BW2 신오 체육관 배틀", + "battle_unova_gym": "BW 하나 체육관 배틀", + "battle_kalos_gym": "XY 칼로스 체육관 배틀", + "battle_galar_gym": "SWSH 가라르 체육관 배틀", + "battle_paldea_gym": "SV 팔데아 체육관 배틀", + "battle_legendary_kanto": "XY 관동 전설 조우 배틀", + "battle_legendary_raikou": "HGSS 라이코 배틀", + "battle_legendary_entei": "HGSS 엔테이 배틀", + "battle_legendary_suicune": "HGSS 스이쿤 배틀", + "battle_legendary_lugia": "HGSS 루기아 배틀", + "battle_legendary_ho_oh": "HGSS 칠색조 배틀", + "battle_legendary_regis_g5": "BW2 레지시리즈 배틀", + "battle_legendary_regis_g6": "ORAS 레지시리즈 배틀", + "battle_legendary_gro_kyo": "ORAS 그란돈 & 가이오가 배틀", + "battle_legendary_rayquaza": "ORAS 레쿠쟈 배틀", + "battle_legendary_deoxys": "ORAS 데오키시스 배틀", + "battle_legendary_lake_trio": "ORAS 호수의 수호신 배틀", + "battle_legendary_sinnoh": "ORAS 신오 전설 조우 배틀", + "battle_legendary_dia_pal": "ORAS 디아루가 & 펄기아 배틀", + "battle_legendary_giratina": "ORAS 기라티나 배틀", + "battle_legendary_arceus": "HGSS 아르세우스 배틀", + "battle_legendary_unova": "BW 하나 전설 조우 배틀", + "battle_legendary_kyurem": "BW 큐레무 배틀", + "battle_legendary_res_zek": "BW 레시라무 & 제크로무 배틀", + "battle_legendary_xern_yvel": "XY 제르네아스 & 이벨타르 배틀", + "battle_legendary_tapu": "SM 섬 수호신 배틀", + "battle_legendary_sol_lun": "SM 솔가레오 & 루나아라 배틀", + "battle_legendary_ub": "SM 울트라비스트 배틀", + "battle_legendary_dusk_dawn": "USUM 황혼의 갈기 & 새벽의 날개 네크로즈마 배틀", + "battle_legendary_ultra_nec": "USUM 울트라 네크로즈마 배틀", + "battle_legendary_zac_zam": "SWSH 자시안 & 자마젠타 배틀", + "battle_legendary_glas_spec": "SWSH 블리자포스 & 레이스포스 배틀", + "battle_legendary_calyrex": "SWSH 버드렉스 배틀", + "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", + "battle_legendary_ruinous": "SV 재앙의 보물 배틀", + "battle_legendary_loyal_three": "SV 세벗들 배틀", + "battle_legendary_ogerpon": "SV 오거폰 배틀", + "battle_legendary_terapagos": "SV 테라파고스 배틀", + "battle_legendary_pecharunt": "SV 복숭악동 배틀", + "battle_rival": "BW 라이벌 배틀", + "battle_rival_2": "BW N 배틀", + "battle_rival_3": "BW 최종전 N 배틀", + "battle_trainer": "BW 트레이너 배틀", + "battle_wild": "BW 야생 포켓몬 배틀", + "battle_wild_strong": "BW 강한 야생 포켓몬 조우 배틀", + "end_summit": "불가사의 던전 구조대 DX 천공의 탑 꼭대기", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW 플라스마단 배틀", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "불가사의 던전 하늘의 탐험대 어둠의 화구", + "badlands": "불가사의 던전 하늘의 탐험대 불모의 계곡", + "beach": "불가사의 던전 하늘의 탐험대 축축한 암반", + "cave": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 동굴", + "construction_site": "불가사의 던전 하늘의 탐험대 바위 채석장", + "desert": "불가사의 던전 하늘의 탐험대 북쪽 사막", + "dojo": "불가사의 던전 하늘의 탐험대 텅구리 도장", + "end": "불가사의 던전 구조대DX 천공의 탑", + "factory": "불가사의 던전 하늘의 탐험대 숨겨진 유적", + "fairy_cave": "불가사의 던전 하늘의 탐험대 별의 동굴", + "forest": "불가사의 던전 하늘의 탐험대 검은 숲", + "grass": "불가사의 던전 하늘의 탐험대 사과의 숲", + "graveyard": "불가사의 던전 하늘의 탐험대 신비의 숲", + "ice_cave": "불가사의 던전 하늘의 탐험대 광대한 얼음산", + "island": "불가사의 던전 하늘의 탐험대 연안의 암반", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "불가사의 던전 하늘의 탐험대 수정 동굴", + "meadow": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 숲", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "불가사의 던전 하늘의 탐험대 뿔산", + "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", + "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", + "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", + "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", + "seabed": "불가사의 던전 하늘의 탐험대 바닷가 동굴(저층)", + "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", + "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", + "space": "불가사의 던전 하늘의 탐험대 행운 협곡", + "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", + "tall_grass": "불가사의 던전 하늘의 탐험대 짙은 안개의 숲", + "temple": "불가사의 던전 하늘의 탐험대 파수꾼의 동굴", + "town": "불가사의 던전 하늘의 탐험대 랜덤 던전 테마 3", + "volcano": "불가사의 던전 하늘의 탐험대 열수의 동굴", + "wasteland": "불가사의 던전 하늘의 탐험대 환상의 대지", + + // Encounter + "encounter_ace_trainer": "BW 눈이 마주치면 승부! (엘리트 트레이너)", + "encounter_backpacker": "BW 눈이 마주치면 승부! (등산가)", + "encounter_clerk": "BW 눈이 마주치면 승부! (회사원)", + "encounter_cyclist": "BW 눈이 마주치면 승부! (사이클링)", + "encounter_lass": "BW 눈이 마주치면 승부! (짧은 치마)", + "encounter_parasol_lady": "BW 눈이 마주치면 승부! (파라솔 아가씨)", + "encounter_pokefan": "BW 눈이 마주치면 승부! (애호가클럽)", + "encounter_psychic": "BW 눈이 마주치면 승부! (초능력자)", + "encounter_rich": "BW 눈이 마주치면 승부! (신사)", + "encounter_rival": "BW 체렌", + "encounter_roughneck": "BW 눈이 마주치면 승부! (빡빡이)", + "encounter_scientist": "BW 눈이 마주치면 승부! (연구원)", + "encounter_twins": "BW 눈이 마주치면 승부! (쌍둥이)", + "encounter_youngster": "BW 눈이 마주치면 승부! (반바지 꼬마)", + + // Other + "heal": "BW 포켓몬 센터", + "menu": "불가사의 던전 하늘의 탐험대 포켓몬 세계에 온 것을 환영한다!", + "title": "불가사의 던전 하늘의 탐험대 메뉴 테마", +} as const; diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index 3ec162abd34..10fa5cb9a3d 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const koConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index 9dcd6294e7c..d90cba74c36 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -928,71 +928,71 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "marlon": { "encounter": { - 1: "You look strong! Shoots! Let's start!", - 2: "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.", - 3: "Oh ho, so I'm facing you! That's off the wall." + 1: "너 강해보이네! 받아라! 승부 시작이야!", + 2: "난 넓은 대양처럼 강인하다고. 너 분명히 휩쓸려 갈거야.", + 3: "오, 내가 너를 마주 보고 있군! 둘다 파도에서 떨어지겠어." }, "victory": { - 1: "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!", - 2: "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!", - 3: "You're strong as a gnarly wave!" + 1: "너… 좋은 포켓몬을 키우고 있구나! 꽤 하는군! 끝내주는 트레이너야!", + 2: "강해 보이는 게 아니고 진짜 강하구나! 에-, 나도 휩쓸려버렸어!", + 3: "넌 거친 파도처럼 강인하구나!" }, "defeat": { - 1: "You're tough, but it's not enough to sway the sea, 'K!", - 2: "Hee! Looks like I went and won again!", - 3: "Sweet, sweet victory!" + 1: "넌 강하지만, 바다를 흔들기에는 역부족이네, 그치!", + 2: "아하핫! 내가 또 이긴 것 같네!", + 3: "달콤하네, 승리 역시 달콤하고!" } }, "shauntal": { "encounter": { - 1: "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.", - 2: "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?", - 3: "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?" + 1: "미안합니다. 도전자이시죠?\n고스트포켓몬 조련사인 사천왕 망초가 상대하겠습니다.", + 2: "겨루었던 트레이너와 포켓몬의 마음이 통하는 모습을 이야기로 만드는 것을 좋아해서요!\n그러니까 당신들에 대한 취재를 허락해 주세요?", + 3: "포켓몬과 함께 일하는 모든 사람들은 각자 이야기를 갖고 있죠.\n어떤 이야기를 들려드릴까요?" }, "victory": { - 1: "Wow. I'm dumbstruck!", - 2: "S-sorry! First, I must apologize to my Pokémon…\n\nI'm really sorry you had a bad experience because of me!", - 3: "Even in light of that, I'm still one of the Elite Four!" + 1: "…우와. 저 아연실색 망연자실이에요!", + 2: "미-미 미안합니다! 먼저 포켓몬에게 사과해야지…\n\n나 때문에 괴로운 기억을 만들게 돼서 정말 미안해!", + 3: "그치만, 전 여전히 사천왕인걸요!" }, "defeat": { - 1: "Eheh.", - 2: "That gave me excellent material for my next novel!", - 3: "And so, another tale ends…" + 1: "에헤헤.", + 2: "다음 소설의 완벽한 소재를 얻었다!", + 3: "그리고 이렇게, 또 다른 이야기가 끝났습니다…" } }, "marshal": { "encounter": { - 1: "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!", - 2: "Victory, decisive victory, is my intention! Challenger, here I come!", - 3: "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!" + 1: "노간주 스승님이, 잠재력을 보고 네게 관심을 갖고 계시더군.\n그 힘의 한계까지 데려가는 것이 이번 의도다! 그럼 간다!", + 2: "승리, 압도적인 승리, 내가 바라는 것이다! 강인한 도전자여, 간다!", + 3: "깨뜨리는 것은 약한 자신, 관철하는 것은 강한 신념!\n 그리고 바라는 것은 압도적인 승리!" }, "victory": { - 1: "Whew! Well done!", - 2: "As your battles continue, aim for even greater heights!", - 3: "The strength shown by you and your Pokémon has deeply impressed me…" + 1: "후우! 잘 싸웠다!", + 2: "역시 대단하구나! 싸워서 더욱더 높은 곳을 노려라…!", + 3: "너와 네 포켓몬이 보여준 그 힘, 감명 깊군…" }, "defeat": { - 1: "Hmm.", - 2: "That was good battle.", - 3: "Haaah! Haaah! Haiyaaaah!" + 1: "흐음.", + 2: "좋은 승부였다.", + 3: "하압! 하압! 히야아아압!!!!" } }, "cheren": { "encounter": { - 1: "You remind me of an old friend. That makes me excited about this Pokémon battle!", - 2: `Pokémon battles have no meaning if you don't think why you battle. - $Or better said, it makes battling together with Pokémon meaningless.`, - 3: "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you." + 1: "넌 내 오랜 친구가 생각나게 하는군. 그 덕분에 이 배틀이 기대돼!", + 2: `왜 하고 있는지 생각하지 않으면, 포켓몬 배틀은 의미가 없어 . + $좋게 말하면, 함께 포켓몬과 승부하는 것이 무의미해 지는 것이지.`, + 3: "내 이름은 체렌! 체육관 관장이자 선생님을 하고 있지! 널 만나게 되서 기쁘군." }, "victory": { - 1: "Thank you! I saw what was missing in me.", - 2: "Thank you! I feel like I saw a little of the way toward my ideals.", - 3: "Hmm… This is problematic." + 1: "고마워! 내 안에 무엇이 부족했는지 알게 됐네.", + 2: "고마워! 내가 추구하는 이상에 조금 다가간 것 같아.", + 3: "으음… 이건 문제가 있군." }, "defeat": { - 1: "As a Gym Leader, I aim to be a wall for you to overcome.", - 2: "All right!", - 3: "I made it where I am because Pokémon were by my side.\nPerhaps we need to think about why Pokémon help us not in terms of Pokémon and Trainers but as a relationship between living beings." + 1: "체육관 관장으로서, 나는 넘어야할 벽이 되고자 하고 있거든.", + 2: "좋았어!", + 3: "포켓몬이 곁에 있었기 때문에 여기까지 올 수 있었어.\n생명체와 생명체라는 동등한 관계에서 포켓몬이 우리에게 도움을 주는 이유를 생각해 볼 필요는 있지." } }, "chili": { @@ -1226,14 +1226,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "clay": { "encounter": { - 1: "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!" + 1: "실망스럽군! 나를 기다리게 하다니, 이 꼬마가. 아무튼 실력을 확인해 볼까!" }, "victory": { - 1: "Man oh man… It feels good to go all out and still be defeated!" + 1: "이런 이런… 진심으로 싸워서 진 거라 오히려 시원한 기분이군!" }, "defeat": { - 1: `What's important is how ya react to losin'. - $That's why folks who use losin' as fuel to get better are tough.`, + 1: `중요한 것은 패배에 어떻게 반응하는 거다. + $그렇기 때문에 패배를 연료로 삼아 나아가는 사람들은 강인하지.`, } }, "kofu": { @@ -1350,14 +1350,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "malva": { "encounter": { - 1: `I feel like my heart might just burst into flames. - $I'm burning up with my hatred for you, runt!`, + 1: `심장이 불에 타버릴 것만 같아요. + $당신에 대한 증오로 불타고 있거든요, 얄미운 트레이너!`, }, "victory": { - 1: "What news… So a new challenger has defeated Malva!" + 1: "도전자가… 사천왕 파키라에게서 멋지게 승리를 쟁취했습니다!" }, "defeat": { - 1: "I am delighted! Yes, delighted that I could squash you beneath my heel." + 1: "기쁘네요! 당신을 짓밟을 수 있어서 말이죠!" } }, "hala": { @@ -1442,36 +1442,36 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "lenora": { "encounter": { - 1: "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!" + 1: "자 그럼 도전자여, 애정을 담아 키운 포켓몬으로 어떤 방식으로 싸우는지 연구해 보겠다!" }, "victory": { - 1: "My theory about you was correct. You're more than just talented… You're motivated! I salute you!" + 1: "너에 대한 내 가설이 맞았네. 재능만 있는 게 아니라… 대단한 녀석이구나! 너 반할것 같잖아!" }, "defeat": { - 1: "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!" + 1: "아 하 하! 패배했다면, 그 이유를 분석하고, 다음 승부에서 그 지식을 활용하도록!" } }, "siebold": { "encounter": { - 1: "As long as I am alive, I shall strive onward to seek the ultimate cuisine... and the strongest opponents in battle!" + 1: "살아가는 동안, 궁극적인 요리와 강력한 상대를 찾기 위해… 열과 성을 다할 것입니다!" }, "victory": { - 1: "I shall store my memory of you and your Pokémon forever away within my heart." + 1: "당신에 대한 기억을 제 가슴 속에 담아두겠습니다." }, "defeat": { - 1: `Our Pokémon battle was like food for my soul. It shall keep me going. - $That is how I will pay my respects to you for giving your all in battle!`, + 1: `우리의 포켓몬 배틀은 영혼의 양식과 같습니다. 그건 저를 계속 지탱할 거예요. + $이것이 제가 전투에서 모든 것을 바친 당신에게, 경의를 표하는 방법입니다!`, } }, "roxie": { "encounter": { - 1: "Get ready! I'm gonna knock some sense outta ya!" + 1: "간다! 너의 이성을 싹 날려줄 거야!!" }, "victory": { - 1: "Wild! Your reason's already more toxic than mine!" + 1: "굉-장해! 네 이성, 이미 나보다 TOXIC해버렸잖아!" }, "defeat": { - 1: "Hey, c'mon! Get serious! You gotta put more out there!" + 1: "헤이, 잠깐-! 좀 더 진지해져! 넌 더 날아가야한다구!" } }, "olivia": { @@ -1521,52 +1521,52 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "grimsley": { "encounter": { - 1: "The winner takes everything, and there's nothing left for the loser." + 1: "이긴 자가 모든 것을 갖고 패배한 자에겐 아무것도 남지 않는다." }, "victory": { - 1: "When one loses, they lose everything… The next thing I'll look for will be victory, too!" + 1: "누군가가 이기면 상대한 누군가가 진다… 난 다음 승리를 목표로 하겠어!" }, "defeat": { - 1: "If somebody wins, the person who fought against that person will lose." + 1: "누군가가 이기면, 그 사람과 싸운 사람은 지게 되는 것이지." } }, "caitlin": { "encounter": { - 1: `It's me who appeared when the flower opened up. You who have been waiting… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, + 1: `피어난 꽃에서 나타난 것은 나. 거기 있는 당신… + $강함과 상냥함을 함께 갖춘 포켓몬 트레이너인 것 같네. + $이 카틀레야가 대전 상대로 원하는 건 최고의 강함… + $너도 그 실력을 마음껏 펼쳐 봐!`, }, "victory": { - 1: "My Pokémon and I learned so much! I offer you my thanks." + 1: "대전을 통해서 저도 포켓몬도 성장합니다. 감사드립니다." }, "defeat": { - 1: "I aspire to claim victory with elegance and grace." + 1: "더욱 엘레강트하고 엑셀런트하게 승리를 쟁취하고 싶거든." } }, "diantha": { "encounter": { - 1: `Battling against you and your Pokémon, all of you brimming with hope for the future… - $Honestly, it just fills me up with energy I need to keep facing each new day! It does!`, + 1: `미래를 향한 희망으로 빛나는 당신과, 당신의 포켓몬을 상대로 승부하는 것… + $솔직히, 매일매일 새로운 날을 위해 필요한 에너지가 채워지는 것 같아요! 정말로요!`, }, "victory": { - 1: "Witnessing the noble spirits of you and your Pokémon in battle has really touched my heart…" + 1: "고귀한 영혼을 지닌 포켓몬과 트레이너의 모습에 격하게 마음이 흔들려서…" }, "defeat": { - 1: "Oh, fantastic! What did you think? My team was pretty cool, right?" + 1: "정말, 환상적이야! 어떻게 생각하시나요? 저의 포켓몬들, 꽤 멋있었죠?" } }, "wikstrom": { "encounter": { - 1: `Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! - $Let the battle begin! En garde!`, + 1: `잘 왔네, 젊은 도전자여! 이 몸은 사천왕 중 한 명인 강철의 남자 간피다! + $자 그럼 간다, 간다! 간닷!`, }, "victory": { - 1: "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!" + 1: "정말 영광이군! 자네의 포켓몬과 서로 신뢰하는 힘, 날 능가하는군!!" }, "defeat": { - 1: `What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! - $Winning against such a worthy opponent doth give my soul wings--thus do I soar!`, + 1: `이게 무슨 마법이지? 내 마음의 떨림이 멈추질 않는군! + $가치 있는 상대를 이기는 것은 영혼에 날개를 달아주는 것과 같지--그런 내가 비상하는 것일까!`, } }, "acerola": { @@ -1652,14 +1652,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "drasna": { "encounter": { - 1: `You must be a strong Trainer. Yes, quite strong indeed… - $That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!` + 1: `당신 강하시죠? 그것도 상당히 꽤 말이에요… + $어머 기뻐라! 그런 상대와 놀면 포켓몬들도 쑥쑥 크겠어요!` }, "victory": { - 1: "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!" + 1: "어머머 벌써 끝나버리다니… 미안해요, 괜찮으면 또 오세요!" }, "defeat": { - 1: "How can this be?" + 1: "어머, 웬일이야?" } }, "kahili": { @@ -1768,18 +1768,18 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "iris": { "encounter": { - 1: `Know what? I really look forward to having serious battles with strong Trainers! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, + 1: `나는 말이지, 강한 트레이너와의 진지한 승부를 즐겨! + $왜냐면 그렇잖아! 이곳에 오는 건 마음 깊이 승리를 추구하는 트레이너. + #함께 싸우는 건 수많은 승부를 헤쳐온 포켓몬. + $그런 상대와 겨룰 수 있다면 나도! 내 포켓몬도! + $더욱더 강해지고 서로 알 수 있으니까! 으응! 그럼 간다! + $포켓몬리그 챔피언 아이리스! 당신을 이기겠습니다!!`, }, "victory": { - 1: "Aghhhh… I did my best, but we lost…" + 1: "후와아아아… 힘을 모두 발휘했는데도 우리가 졌네." }, "defeat": { - 1: "Yay! We won!" + 1: "우와! 이겼다!" } }, "hau": { @@ -1924,13 +1924,13 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "olympia": { "encounter": { - 1: "An ancient custom deciding one's destiny. The battle begins!" + 1: "이 의식은 앞으로의 길을 정하는 것입니다. 포켓몬 승부를 시작해볼까요!" }, "victory": { - 1: "Create your own path. Let nothing get in your way. Your fate, your future." + 1: "당신이라면 별이라도 움직여서 가야 할 길을 만들어 낼 것 같습니다." }, "defeat": { - 1: "Our path is clear now." + 1: "우리의 길은 이제 분명해졌습니다." } }, "volkner": { @@ -1950,130 +1950,130 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "burgh": { "encounter": { - 1: `M'hm… If I win this battle, I feel like I can draw a picture unlike any before it. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` + 1: `으-음… 이번 배틀에서 이기면, 예전과는 다른 그림을 그릴 수 있을 것 같아. + $맞아! 난 승리 뮤즈의 목소리를 선명하게 들을 수 있거든. 그럼 승부다!`, + 2: `물론, 난 내 포켓몬을 자랑스럽게 생각하거든! + $자 그럼… 바로 승부할까!` }, "victory": { - 1: "Is it over? Has my muse abandoned me?", - 2: "Hmm… It's over! You're incredible!" + 1: "벌써 끝이라고? 뮤즈가 나를 버리고 떠나버렸나?", + 2: "아우… 져버렸네! 너 굉장히 강하잖아!" }, "defeat": { - 1: "Wow… It's beautiful somehow, isn't it…", - 2: `Sometimes I hear people say something was an ugly win. - $I think if you're trying your best, any win is beautiful.` + 1: "우와… 왠지 뭔가 아름답네, 그치…", + 2: `가끔 사람들이 못난 승리라고 말하는 걸 듣곤 해. + $그치만 난 최선을 다했다면, 어떤 승리든 아름답다고 생각하거든.` } }, "elesa": { "encounter": { - 1: `C'est fini! When I'm certain of that, I feel an electric jolt run through my body! - $I want to feel the sensation, so now my beloved Pokémon are going to make your head spin!`, + 1: `컴플리트…! 확신이 들때면, 내 몸을 통하는 전기가 짜릿짜릿하게 느껴져! + $그 감각을 느끼고 싶으니까…, 다음은 사랑스러운 포켓몬들로 너를 어질어질하게 할게!`, }, "victory": { - 1: "I meant to make your head spin, but you shocked me instead." + 1: "어질어질하게 만들 셈이였는데, 너한테는 짜릿짜릿하게 당해버렸네." }, "defeat": { - 1: "That was unsatisfying somehow… Will you give it your all next time?" + 1: "왠지 부족한 기분이야… 다음에는 최선을 다할 수 있지?" } }, "skyla": { "encounter": { - 1: `It's finally time for a showdown! That means the Pokémon battle that decides who's at the top, right? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, + 1: `드디어 대결의 시간이야! 누가 정상에 오를지 결정짓는 포켓몬 배틀, 그치? + $난 정상에 있는 게 좋아! 높은 곳에서는 항상 멀리 볼 수 있으니까! + $그럼, 다음은 나랑 더욱 즐거운 것을 할까?`, }, "victory": { - 1: "Being your opponent in battle is a new source of strength to me. Thank you!" + 1: "배틀에서 네 상대가 되는 거, 뭔가 새로운 모티브가 되네. 고마워!" }, "defeat": { - 1: "Win or lose, you always gain something from a battle, right?" + 1: "이기든 지든, 항상 무언가를 얻게 돼, 그치?" } }, "brycen": { "encounter": { - 1: `There is also strength in being with other people and Pokémon. - $Receiving their support makes you stronger. I'll show you this power!`, + 1: `다른사람이나 포켓몬과 함께 있을 때도 힘이 생긴다. + $그 도움을 받는 것이 너를 강하게 만들었겠지. 그 힘을 보이거라!`, }, "victory": { - 1: "The wonderful combination of you and your Pokémon! What a beautiful friendship!" + 1: "너와 포켓몬과! 멋진 콤비네이션! 아름다운 우정!" }, "defeat": { - 1: "Extreme conditions really test you and train you!" + 1: "극한에서 시험받고 단련하도록!" } }, "drayden": { "encounter": { - 1: `What I want to find is a young Trainer who can show me a bright future. - $Let's battle with everything we have: your skill, my experience, and the love we've raised our Pokémon with!`, + 1: `지금 찾는 것은 밝은 미래를 보여줄 젋은 트레이너의 존재. + $승부에서 모든 걸 보이도록. 네 기술, 내 경험, 그리고 포켓몬을 키워온 사랑도 함께!`, }, "victory": { - 1: "This intense feeling that floods me after a defeat… I don't know how to describe it." + 1: "패배하여 끓어오르는 이 마음… 뭐라고 표현해야 좋을까." }, "defeat": { - 1: "Harrumph! I know your ability is greater than that!" + 1: "실망스럽군! 난 자네의 능력이 그보다 더 크다는 걸 알고있네!" } }, "grant": { "encounter": { - 1: `There is only one thing I wish for. - $That by surpassing one another, we find a way to even greater heights.`, + 1: `제가 바라는 것은 단 하나뿐입니다. + $서로가 서로를 뛰어넘어, 더 높은 벽에 도달하는 것입니다.`, }, "victory": { - 1: "You are a wall that I am unable to surmount!" + 1: "내 앞에 솟아 있는 높은 벽… 그건 바로 당신입니다." }, "defeat": { - 1: `Do not give up. - $That is all there really is to it. - $The most important lessons in life are simple.`, + 1: `인생에서 중요한 교훈은 간단합니다. + $포기하지 않는 것. + $이것이 전부입니다.`, } }, "korrina": { "encounter": { - 1: "Time for Lady Korrina's big appearance!" + 1: "코르니 납시오!" }, "victory": { - 1: "It's your very being that allows your Pokémon to evolve!" + 1: "네 존재가 너의 포켓몬을 점점 진화시키고 있어!" }, "defeat": { - 1: "What an explosive battle!" + 1: "정말 멋진 배틀이었어!" } }, "clemont": { "encounter": { - 1: "Oh! I'm glad that we got to meet!" + 1: "아앗! 잘 부탁드립니다!" }, "victory": { - 1: "Your passion for battle inspires me!" + 1: "당신들의 승부를 향한 마음에 자극을 받았습니다!" }, "defeat": { - 1: "Looks like my Trainer-Grow-Stronger Machine, Mach 2 is really working!" + 1: "저의 슈퍼트레이닝 발명품이 효과가 있는 것 같군요!" } }, "valerie": { "encounter": { - 1: `Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, + 1: `어라,트레이너님… 슝슝 워프해서… 이렇게 만나서 반갑네. + $그리고 내가 보기엔 당신은 노력했기에, 이 승부에 참가할 수 있게 된 것 같아. + $찾기 힘든 요정 같은 페어리 타입, 우리 포켓몬들 사뿐하고 화사하지만 강하다구.`, }, "victory": { - 1: "I hope that you will find things worth smiling about tomorrow…" + 1: "난 당신이 내일을 생각하며 웃을 수 있는 것들을 찾길 바라고 있을게…" }, "defeat": { - 1: "Oh goodness, what a pity…" + 1: "앗 이런, 가엾어라…" } }, "wulfric": { "encounter": { - 1: `You know what? We all talk big about what you learn from battling and bonds and all that… - $But really, I just do it 'cause it's fun. - $Who cares about the grandstanding? Let's get to battling!`, + 1: `그거 알아? 그거… 전투와 유대감을 통해 배운다거나 하는… 거 뭐더라, 음. + $여튼 말이지, 난 그냥 재밌어서 하는 거야. + $내 자랑은 별로 듣고 싶지 않으려나? 자, 포켓몬을 꺼내자!`, }, "victory": { - 1: "Outstanding! I'm tough as an iceberg, but you smashed me through and through!" + 1: "그거야, 바로 그거! 멋지다고. 단단한 얼음을 깨부쉈구나!" }, "defeat": { - 1: "Tussle with me and this is what happens!" + 1: "나와 싸우면 그런 일이 벌어진다니까!" } }, "kabu": { diff --git a/src/locales/ko/egg.ts b/src/locales/ko/egg.ts index 3c2d1447c44..88a845c6424 100644 --- a/src/locales/ko/egg.ts +++ b/src/locales/ko/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "바우처가 충분하지 않습니다!", "tooManyEggs": "알을 너무 많이 갖고 있습니다!", "pull": "뽑기", - "pulls": "뽑기" + "pulls": "뽑기", + "sameSpeciesEgg": "{{species}}[[가]] 이 알에서 부화할 거야!", + "hatchFromTheEgg": "알이 부화해서\n{{pokemonName}}[[가]] 태어났다!", + "eggMoveUnlock": "알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", + "rareEggMoveUnlock": "레어 알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", } as const; diff --git a/src/locales/ko/game-mode.ts b/src/locales/ko/game-mode.ts index e85a9bb232b..423f2adb26a 100644 --- a/src/locales/ko/game-mode.ts +++ b/src/locales/ko/game-mode.ts @@ -2,8 +2,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "클래식", - "endless": "엔들리스", - "endlessSpliced": "엔들리스(융합체)", + "endless": "엔드리스", + "endlessSpliced": "엔드리스(융합체)", "dailyRun": "데일리 런", "unknown": "언노운", "challenge": "챌린지", diff --git a/src/locales/ko/menu-ui-handler.ts b/src/locales/ko/menu-ui-handler.ts index 5e13d010438..94c3cb2df0c 100644 --- a/src/locales/ko/menu-ui-handler.ts +++ b/src/locales/ko/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "데이터 불러오기", "exportData": "데이터 내보내기", "cancel": "취소", - "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?" + "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.ts index 134963d6cce..7e0b61ef992 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.ts @@ -53,4 +53,5 @@ export const menu: SimpleTranslationEntries = { "no":"아니오", "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", + "choosePokemon": "포켓몬을 선택하세요.", } as const; diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index a0bae4ea703..1201a1a436a 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "평온의방울" }, + "EVIOLITE": { name: "진화의휘석", description: "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." }, + "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다 (합연산)." }, "NUGGET": { name: "금구슬" }, @@ -199,7 +201,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "MULTI_LENS": { name: "멀티렌즈" }, - "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술을 썼을 때 효율이 10% 증가한다 (부활 제외)." }, + "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술이나 도구를 썼을 때 효율이 10% 증가한다 (부활 제외)." }, "CANDY_JAR": { name: "사탕단지", description: "이상한사탕 종류의 아이템이 올려주는 레벨이 1 증가한다." }, "BERRY_POUCH": { name: "열매주머니", description: "사용한 나무열매가 소모되지 않을 확률이 30% 추가된다." }, diff --git a/src/locales/ko/move.ts b/src/locales/ko/move.ts index ae1bbf088e3..3781725bc6f 100644 --- a/src/locales/ko/move.ts +++ b/src/locales/ko/move.ts @@ -2937,7 +2937,7 @@ export const move: MoveTranslationEntries = { }, bouncyBubble: { name: "생생버블", - effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 데미지의 절만큼 HP를 회복한다." + effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 준 데미지만큼 HP를 회복한다." }, buzzyBuzz: { name: "찌릿찌릿일렉", diff --git a/src/locales/ko/settings.ts b/src/locales/ko/settings.ts index 28fe99f265f..ef1469fc8cb 100644 --- a/src/locales/ko/settings.ts +++ b/src/locales/ko/settings.ts @@ -36,7 +36,7 @@ export const settings: SimpleTranslationEntries = { "legacy": "레거시", "windowType": "윈도우 타입", "moneyFormat": "소지금 표시", - "damageNumbers": "대미지 숫자 표시", + "damageNumbers": "데미지 숫자 표시", "simple": "심플", "fancy": "팬시", "abbreviated": "축약", @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (대체)", "mute": "음소거", "controller": "컨트롤러", - "gamepadSupport": "게임패드 지원" + "gamepadSupport": "게임패드 지원", + "showBgmBar": "BGM 제목 보여주기", } as const; diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index f78e760c4e0..6fdd21a3454 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", + "sameSpeciesEgg": "알 구매하기", "cycleShiny": ": 특별한 색", "cycleForm": ": 폼", "cycleGender": ": 암수", diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index 766243c7d7e..4e3d6d11487 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -3,8 +3,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!", "badDreams": "{{pokemonName}} está tendo pesadelos!", - "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", + "costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!", "perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", - "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!" + "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", + "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index e7a3adf4b31..2e88e5445de 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "Você derrotou\n{{trainerName}}!", "moneyWon": "Você ganhou\n₽{{moneyAmount}} por ganhar!", "pokemonCaught": "{{pokemonName}} foi capturado!", + "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", "partyFull": "Sua equipe está cheia.\nSolte um Pokémon para ter espaço para {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}}, eu escolho você!!", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "trocar", "escapeVerbFlee": "fugir", "notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!", + "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", + "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", "skipItemQuestion": "Tem certeza de que não quer escolher um item?", "eggHatching": "Opa?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", @@ -62,70 +65,70 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", "fainted": "{{pokemonNameWithAffix}} desmaiou!", - "statRose": "aumentou", - "statSharplyRose": "aumentou bruscamente", - "statRoseDrastically": "aumentou drasticamente", - "statWontGoAnyHigher": "não vai mais aumentar", - "statFell": "diminuiu", - "statHarshlyFell": "diminuiu duramente", - "statSeverelyFell": "diminuiu severamente", - "statWontGoAnyLower": "não vai mais diminuir", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", - "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", - "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" + "statRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", + "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", + "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", + "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", + "statFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", + "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", + "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", + "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", + "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} hesitou!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!", + "battlerTagsConfusedLapseHurtItself": "Se machucou em sua\nconfusão!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} foi semeado!", + "battlerTagsSeededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!", + "battlerTagsSeededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!", + "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} ganhou\num Encore!", + "battlerTagsEncoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!", + "battlerTagsAquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!", + "battlerTagsHighestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!", + "battlerTagsHighestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!" } as const; diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts new file mode 100644 index 00000000000..1e35a2a095b --- /dev/null +++ b/src/locales/pt_BR/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowa Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "PMD EoS Lower Brine Cave", + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "PMD EoS Fortune Ravine", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/pt_BR/challenges.ts b/src/locales/pt_BR/challenges.ts index fd07fb5de3d..7c991189bc8 100644 --- a/src/locales/pt_BR/challenges.ts +++ b/src/locales/pt_BR/challenges.ts @@ -18,7 +18,7 @@ export const challenges: TranslationEntries = { "gen_9": "nona", }, "singleType": { - "name": "Tipo Único", + "name": "Monotipo", "desc": "Você só pode user Pokémon do tipo {{type}}.", "desc_default": "Você só pode user Pokémon de um único tipo." }, diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index ba658d43938..53195fbc32e 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -1,9 +1,12 @@ +import { common } from "#app/locales/pt_BR/common.js"; +import { settings } from "#app/locales/pt_BR/settings.js"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -27,6 +30,7 @@ import { menuUiHandler } from "./menu-ui-handler"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; +import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; import { pokemonInfo } from "./pokemon-info"; @@ -38,9 +42,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "#app/locales/pt_BR/settings.js"; -import { common } from "#app/locales/pt_BR/common.js"; export const ptBrConfig = { ability: ability, @@ -48,6 +49,7 @@ export const ptBrConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/pt_BR/dialogue.ts b/src/locales/pt_BR/dialogue.ts index a566192fef5..3325cf81cf9 100644 --- a/src/locales/pt_BR/dialogue.ts +++ b/src/locales/pt_BR/dialogue.ts @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Estou achando que quem tá enjoado sou eu..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Se prepara pra encrenca!" + }, + "victory": { + 1: "Equipe Rocket decolando de novo!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "Se você se meter com a Equipe Magma, não teremos piedade!" + }, + "victory": { + 1: "Ahn? Eu perdi?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Não pegamos leve com quem se mete com a Equipe Aqua, nem mesmo crianças!" + }, + "victory": { + 1: "Tá de brincadeira!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Não mexe com a Equipe Galáctica!" + }, + "victory": { + 1: "Fui amassado..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Não toleramos pessoas que pensam diferente de nós!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "A moda é a coisa mais importante pra gente!" + }, + "victory": { + 1: "O futuro não parece brilhante pra mim." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Tenho que admitir, estou impressionado que tenha chegado até aqui!" + }, + "victory": { + 1: "QUÊ! Isso não é possível!" + }, + "defeat": { + 1: "Guarde minhas palavras.\nNão ser capaz de medir sua própria força mostra que você ainda é uma criança." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Meus antigos associados precisam de mim... Você vai ficar no meu caminho?" + }, + "victory": { + 1: "Como isso é possível...?\nO precioso sonho da Equipe Rocket se tornou pouco mais que uma ilusão..." + }, + "defeat": { + 1: "A Equipe Rocket renascerá, e eu dominarei o mundo!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Eu vou te enterrar com minhas próprias mãos.\nEspero que você aprecie essa honra!" + }, + "victory": { + 1: "Ugh! Você é... bastante capaz...\nEu fiquei para trás, mas apenas por um triz..." + }, + "defeat": { + 1: "A Equipe Magma vai prevalecer!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "Você é o último obstáculo entre mim e meus objetivos.\nPrepare-se para meu ataque final! Fuhahaha!" + }, + "victory": { + 1: "Isso... Isso não é... Ngh..." + }, + "defeat": { + 1: "E agora... Eu transformarei este planeta em uma terra ideal para a humanidade." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Eu sou o líder da Equipe Aqua, então temo que esse seja o fim da linha para você." + }, + "victory": { + 1: "Vamos nos encontrar de novo em algum lugar. Eu vou ter certeza de lembrar desse rosto." + }, + "defeat": { + 1: "Brilhante! Nada vai parar minha equipe agora!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Estive esperando tanto tempo por este dia.\nEste é o verdadeiro poder da minha equipe!" + }, + "victory": { + 1: "Como eu suspeitava..." + }, + "defeat": { + 1: "Eu vou voltar tudo neste mundo ao seu estado puro e original!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Você foi compelido a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!" + }, + "victory": { + 1: "Interessante. E bastante curioso." + }, + "defeat": { + 1: "Eu criarei meu novo mundo..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nos encontramos novamente. Parece que nossos destinos estão entrelaçados.\nMas aqui e agora, eu finalmente quebrarei esse vínculo!" + }, + "victory": { + 1: "Como? Como? COMO?!" + }, + "defeat": { + 1: "Até logo." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Ninguém pode me deter! Não importa quem seja ou o que faça!" + }, + "victory": { + 1: "Como isso é possível? Eu sou o criador da Equipe Plasma! Eu sou perfeito!" + }, + "defeat": { + 1: "Eu sou o governante perfeito de um novo mundo perfeito! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Vamos! Eu quero ver sua cara depois que você perder toda a esperança!" + }, + "victory": { + 1: "Meus cálculos... Não! Meus planos cuidadosos! O mundo deveria ser meu!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Você está aqui para me deter? Mostre-me em batalha." + }, + "victory": { + 1: "Você está aqui para me deter. Mas eu peço que você espere." + }, + "defeat": { + 1: "Pokémon... não devem mais existir." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "O futuro que você quer, ou o futuro que eu quero... Vamos ver qual é o mais merecedor, não é mesmo?" + }, + "victory": { + 1: "Uau!" + }, + "defeat": { + 1: "Tolos sem visão continuarão a poluir este belo mundo." + } + }, "brock": { "encounter": { 1: "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", @@ -4669,6 +4849,8 @@ export const PGMmiscDialogue: SimpleTranslationEntries = { $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, + "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", + "ending_name": "Desenvolvedores" }; // Diálogo que não se enquadra em nenhuma outra categoria (por exemplo, mensagens de tutorial ou o final do jogo). Para quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMmiscDialogue. @@ -4689,6 +4871,8 @@ export const PGFmiscDialogue: SimpleTranslationEntries = { $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, + "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", + "ending_name": "Desenvolvedores" }; diff --git a/src/locales/pt_BR/egg.ts b/src/locales/pt_BR/egg.ts index 112e5c61240..6690c293aaf 100644 --- a/src/locales/pt_BR/egg.ts +++ b/src/locales/pt_BR/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Você não tem vouchers suficientes!", "tooManyEggs": "Você já tem muitos ovos!", "pull": "Prêmio", - "pulls": "Prêmios" + "pulls": "Prêmios", + "sameSpeciesEgg": "{{species}} vai rachar desse ovo!", + "hatchFromTheEgg": "{{pokemonName}} nasceu do ovo!", + "eggMoveUnlock": "Movimento de Ovo desbloqueado: {{moveName}}", + "rareEggMoveUnlock": "Movimento Raro de Ovo desbloqueado: {{moveName}}", } as const; diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.ts index 47386943831..258433d72c6 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importar dados", "exportData": "Exportar dados", "cancel": "Cancelar", - "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?" + "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index 2837ff55e26..ea6c94fe509 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -52,5 +52,6 @@ export const menu: SimpleTranslationEntries = { "yes": "Sim", "no": "Não", "disclaimer": "AVISO", - "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído." + "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído.", + "choosePokemon": "Escolha um Pokémon.", } as const; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index b63d237a4ee..a0df10218ec 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -4,11 +4,11 @@ export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { "AddPokeballModifierType": { name: "{{modifierCount}}x {{pokeballName}}", - description: "Ganhe x{{modifierCount}} {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", + description: "Ganhe {{modifierCount}}x {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", }, "AddVoucherModifierType": { name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Ganhe x{{modifierCount}} {{voucherTypeName}}.", + description: "Ganhe {{modifierCount}}x {{voucherTypeName}}.", }, "PokemonHeldItemModifierType": { extra: { @@ -402,7 +402,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "CrioDisco", "DOUSE_DRIVE": "HidroDisco", - "FIST_PLATE": "Placa de Punho", + "FIST_PLATE": "Placa do Punho", "SKY_PLATE": "Placa do Céu", "TOXIC_PLATE": "Placa Tóxica", "EARTH_PLATE": "Placa Terrestre", @@ -412,15 +412,15 @@ export const modifierType: ModifierTypeTranslationEntries = { "IRON_PLATE": "Placa de Ferro", "FLAME_PLATE": "Placa da Chama", "SPLASH_PLATE": "Placa de Respingo", - "MEADOW_PLATE": "Placa de Prado", + "MEADOW_PLATE": "Placa da Planície", "ZAP_PLATE": "Placa Elétrica", "MIND_PLATE": "Placa Mental", "ICICLE_PLATE": "Placa de Gelo", - "DRACO_PLATE": "Placa de Draco", - "DREAD_PLATE": "Placa do Pavor", - "PIXIE_PLATE": "Placa Duende", + "DRACO_PLATE": "Placa do Dragão", + "DREAD_PLATE": "Placa Sombria", + "PIXIE_PLATE": "Placa de Fada", "BLANK_PLATE": "Placa em Branco", - "LEGEND_PLATE": "Placa de Legenda", + "LEGEND_PLATE": "Placa Lendária", "FIGHTING_MEMORY": "Memória de Lutador", "FLYING_MEMORY": "Memória Voadora", "POISON_MEMORY": "Memória Venenosa", @@ -436,7 +436,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "PSYCHIC_MEMORY": "Memória Psíquica", "ICE_MEMORY": "Memória de Gelo", "DRAGON_MEMORY": "Memória do Dragão", - "DARK_MEMORY": "Memória Negra", + "DARK_MEMORY": "Memória Sombria", "FAIRY_MEMORY": "Memória de Fada", "BLANK_MEMORY": "Memória Vazia", }, diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index 233ec62fa06..092cc0583ad 100644 --- a/src/locales/pt_BR/move.ts +++ b/src/locales/pt_BR/move.ts @@ -2219,7 +2219,7 @@ export const move: MoveTranslationEntries = { }, "snarl": { name: "Snarl", - effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo a Defesa Especial do Pokémon oponente." + effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo o Ataque Especial do Pokémon oponente." }, "icicleCrash": { name: "Icicle Crash", diff --git a/src/locales/pt_BR/settings.ts b/src/locales/pt_BR/settings.ts index f094e64d495..9d336cf0757 100644 --- a/src/locales/pt_BR/settings.ts +++ b/src/locales/pt_BR/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mudo", "controller": "Controle", - "gamepadSupport": "Suporte para Controle" + "gamepadSupport": "Suporte para Controle", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index 0b349468aee..eb2709a0da8 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "Escolha o movimento que substituirá", "unlockPassive": "Aprender Passiva", "reduceCost": "Reduzir Custo", + "sameSpeciesEgg": "Comprar Ovo", "cycleShiny": ": » Shiny", "cycleForm": ": » Forma", "cycleGender": ": » Gênero", diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index 908b3aaf258..9f128e41ad1 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -3,6 +3,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", "badDreams": "{{pokemonName}} 被折磨着!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}} 因为 {{abilityName}}\n避免了伤害!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "受 {{moveName}} 的影响, {{pokemonName}} 提升了能力!", - "iceFaceAvoidedDamage": "{{pokemonName}} 因为 {{abilityName}}\n避免了伤害!" + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index 09bcb5b1c3d..196ad14221b 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "你击败了\n{{trainerName}}!", "moneyWon": "你赢得了\n₽{{moneyAmount}}!", "pokemonCaught": "{{pokemonName}} 被抓住了!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "你的队伍已满员.是否放生其他宝可梦\n为 {{pokemonName}} 腾出空间?", "pokemon": "宝可梦", "sendOutPokemon": "上吧!\n{{pokemonName}}!", @@ -53,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "切换", "escapeVerbFlee": "逃跑", "notDisabled": "{{moveName}} 不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", "ivScannerUseQuestion": "对 {{pokemonName}} 使用个体值扫描仪?", @@ -62,70 +65,70 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} 吸取了体力!", "regainHealth": "{{pokemonName}} 回复了体力!", "fainted": "{{pokemonNameWithAffix}} 倒下了!", - "statRose": "提高了!", - "statSharplyRose": "大幅提高了!", - "statRoseDrastically": "极大幅提高了!", - "statWontGoAnyHigher": "已经无法再提高了!", - "statFell": "降低了!", - "statHarshlyFell": "大幅降低了!", - "statSeverelyFell": "极大幅降低了!", - "statWontGoAnyLower": "已经无法再降低了!", + "statRose": "{{pokemonNameWithAffix}} 的 {{stats}} 提高了!", + "statSharplyRose": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅提高了!", + "statRoseDrastically": "{{pokemonNameWithAffix}} 的 {{stats}} 极大幅提高了!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}} 的 {{stats}} 已经无法再提高了!", + "statFell": "{{pokemonNameWithAffix}} 的 {{stats}} 降低了!", + "statHarshlyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅降低了!", + "statSeverelyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 极大幅降低了!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}} 的 {{stats}} 已经无法再降低了!", "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}点!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} 因为技能\n无法动弹!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} 不能逃跑!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} 摆脱了\n {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} 畏缩了!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} 混乱了!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} 的混乱\n解除了!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} 已经\n混乱了。", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} 正在\n混乱中!", - "battlerTagsConfusedLapseHurtItself": "不知所以地\n攻击了自己!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} 不再受到\n同命的影响", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和\n{{pokemonNameWithAffix2}} 同归于尽了!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} 对\n {{sourcePokemonName}}着迷了!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} 已经\n着迷了!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} 对\n{{sourcePokemonName}}着迷中!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻击的反作用力而无法动弹!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}摆脱了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏缩了!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混乱了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混乱解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已经混乱了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混乱中!", + "battlerTagsConfusedLapseHurtItself": "不知所以地攻击了自己!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影响", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同归于尽了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}对{{sourcePokemonName}}着迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}已经着迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}对{{sourcePokemonName}}着迷中!", "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不会着迷!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治愈了\n着迷状态!", - "battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}} 身上!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}用寄生种子\n回复了体力!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}的寄生种子\n被乌泥浆吸干了!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} 被恶梦缠身!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} 已经被恶梦缠身!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} 正被恶梦缠身!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} 接受了再来一次!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}} 的再来一次\n状态解除了!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} 摆出了帮助\n {{pokemonName}} 的架势!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} 用扎根回复了体力!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} 扎根了!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} 用水流环\n包裹了自己!", - "battlerTagsAquaRingLapse": "{{moveName}} 回复了\n{{pokemonName}}的体力!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} 产生睡意了!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} 受到了\n {{moveName}}的伤害!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} 被\n{{sourcePokemonName}}的 {{moveName}}紧紧束缚住了!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} 被\n{{sourcePokemonName}}绑紧了!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} 被困在了\n旋涡之中!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} 用贝壳夹住了\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} 被\nby {{moveName}}困住了!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} 被困在了\n熔岩旋涡之中!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} 被捕兽夹\n困住了!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} 困住了\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} 受到了 \n{{sourcePokemonNameWithAffix}} 的死缠烂打!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\n在攻击中\n保护了自己!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} 摆出了\n挺住攻击的架势!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} 挺住了攻击!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} 挺住了攻击!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的\n灭亡计时变成 {{turnCount}} 了!", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} 正在偷懒!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}} 的 {{statName}}\n升高了!", - "battlerTagsHighestStatBoostOnRemove": " {{pokemonNameWithAffix}} 的\n{{abilityName}}效果解除了!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} \n现在干劲十足!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} \n如释重负似地放松了下来。", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治愈了着迷状态!", + "battlerTagsSeededOnAdd": "将种子种植在了{{pokemonNameWithAffix}}身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}被寄生种子吸取了体力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥浆!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}开始做恶梦了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}已经被恶梦缠身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}正被恶梦缠身!", + "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}}接受了再来一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}的再来一次状态解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}摆出了帮助{{pokemonName}} 的架势!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}用扎根回复了体力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}用水流环包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回复了{{pokemonName}}的体力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}产生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的伤害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}紧紧束缚住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}绑紧了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋涡之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳夹住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩风暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}被捕兽夹困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死缠烂打!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}摆出了防守的架势!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}在攻击中保护了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}摆出了挺住攻击的架势!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻击!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻击!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的灭亡计时变成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懒!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}无法拿出平时的水平!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢复了平时的水平!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}现在干劲十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如释重负似地放松了下来。", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了盐腌状态!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了 {{moveName}} 的伤害!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} 削减了自己的体力,\n并诅咒了 {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} 正受到诅咒!" + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的伤害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,并诅咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到诅咒!" } as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts new file mode 100644 index 00000000000..295c17bd9eb --- /dev/null +++ b/src/locales/zh_CN/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "BGM", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "黑2白2「决战!关都冠军」", + "battle_johto_champion": "黑2白2「决战!城都冠军」", + "battle_hoenn_champion": "黑2白2「决战!丰缘冠军」", + "battle_sinnoh_champion": "黑2白2「决战!神奥冠军」", + "battle_champion_alder": "黑白「决战!合众冠军」", + "battle_champion_iris": "黑2白2「决战!合众冠军」", + "battle_kalos_champion": "XY「决战!卡洛斯冠军」", + "battle_alola_champion": "究极日月「顶上决战!」", + "battle_galar_champion": "剑盾「决战!伽勒尔冠军」", + "battle_champion_geeta": "朱紫「决战!帕底亚首席也慈」", + "battle_champion_nemona": "朱紫「决战!帕底亚冠军妮莫」", + "battle_champion_kieran": "朱紫「决战!蓝莓学园冠军乌栗」", + "battle_hoenn_elite": "Ω红宝石α蓝宝石 「战斗!丰缘四天王」", + "battle_unova_elite": "黑白 「战斗!合众四天王」", + "battle_kalos_elite": "XY「战斗!卡洛斯四天王」", + "battle_alola_elite": "日月「战斗!阿罗拉四天王」", + "battle_galar_elite": "剑盾「联盟锦标赛」", + "battle_paldea_elite": "朱紫「战斗!帕底亚四天王」", + "battle_bb_elite": "朱紫「战斗!蓝之圆盘四天王」", + "battle_final_encounter": "探险队DX 「裂空座的领域」", + "battle_final": "黑白「战斗!魁奇思」", + "battle_kanto_gym": "黑2白2「战斗!关都道馆主」", + "battle_johto_gym": "黑2白2「战斗!城都道馆主」", + "battle_hoenn_gym": "黑2白2「战斗!合众道馆主」", + "battle_sinnoh_gym": "黑2白2「战斗!神奥道馆主」", + "battle_unova_gym": "黑白「战斗!合众道馆主」", + "battle_kalos_gym": "XY「战斗!卡洛斯道馆主」", + "battle_galar_gym": "剑盾「战斗!伽勒尔道馆主」", + "battle_paldea_gym": "朱紫「战斗!帕底亚道馆主」", + "battle_legendary_kanto": "XY「战斗!传说宝可梦(关都)」", + "battle_legendary_raikou": "心金魂银「战斗!雷公」", + "battle_legendary_entei": "心金魂银「战斗!炎帝」", + "battle_legendary_suicune": "心金魂银「战斗!水君」", + "battle_legendary_lugia": "心金魂银「战斗!洛奇亚」", + "battle_legendary_ho_oh": "心金魂银「战斗!凤王」", + "battle_legendary_regis_g5": "黑2白2「战斗!传说中的巨人」", + "battle_legendary_regis_g6": "Ω红宝石α蓝宝石「战斗!传说中的巨人」", + "battle_legendary_gro_kyo": "Ω红宝石α蓝宝石「战斗!原始回归」", + "battle_legendary_rayquaza": "Ω红宝石α蓝宝石「战斗!超古代宝可梦」", + "battle_legendary_deoxys": "Ω红宝石α蓝宝石「战斗!代欧奇希斯」", + "battle_legendary_lake_trio": "Ω红宝石α蓝宝石「战斗!由克希・艾姆利多・亚克诺姆」", + "battle_legendary_sinnoh": "Ω红宝石α蓝宝石「战斗!传说的宝可梦」", + "battle_legendary_dia_pal": "Ω红宝石α蓝宝石「战斗!帝牙卢卡・帕路奇亚」", + "battle_legendary_giratina": "Ω红宝石α蓝宝石「战斗!骑拉帝纳」", + "battle_legendary_arceus": "心金魂银「阿尔宙斯」", + "battle_legendary_unova": "黑白「战斗!传说的宝可梦」", + "battle_legendary_kyurem": "黑白「战斗!酋雷姆」", + "battle_legendary_res_zek": "黑白「战斗!莱希拉姆・捷克罗姆」", + "battle_legendary_xern_yvel": "XY「战斗!哲尔尼亚斯・伊裴尔塔尔」", + "battle_legendary_tapu": "日月「战斗!卡璞」", + "battle_legendary_sol_lun": "日月「战斗!露奈雅拉・索尔迦雷欧」", + "battle_legendary_ub": "日月「战斗!究极异兽」", + "battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」", + "battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」", + "battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」", + "battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」", + "battle_legendary_calyrex": "剑盾「战斗!蕾冠王」", + "battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」", + "battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」", + "battle_legendary_loyal_three": "朱紫「战斗!宝伴」", + "battle_legendary_ogerpon": "朱紫「战斗!厄鬼椪」", + "battle_legendary_terapagos": "朱紫「战斗!太乐巴戈斯」", + "battle_legendary_pecharunt": "朱紫「战斗!桃歹郎」", + "battle_rival": "黑白「战斗!黑连・贝尔」", + "battle_rival_2": "黑白「战斗!N」", + "battle_rival_3": "黑白「决战!N」", + "battle_trainer": "黑白「战斗!训练师」", + "battle_wild": "黑白「战斗!野生宝可梦」", + "battle_wild_strong": "黑白「战斗!强大野生宝可梦」", + "end_summit": "探险队DX 「天空之柱 顶层」", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "黑白「战斗!等离子团」", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "空之探险队「黑暗小丘」", + "badlands": "空之探险队「枯竭之谷」", + "beach": "空之探险队「潮湿岩地」", + "cave": "空之探险队「天空顶端(洞窟)」", + "construction_site": "空之探险队「幻影石室」", + "desert": "空之探险队「北方沙漠」", + "dojo": "空之探险队「嘎啦嘎啦道场」", + "end": "探险队DX「天空之柱」", + "factory": "空之探险队「隐藏遗迹」", + "fairy_cave": "空之探险队「星之洞窟」", + "forest": "空之探险队「黑暗森林」", + "grass": "空之探险队「苹果森林」", + "graveyard": "空之探险队「神秘森林」", + "ice_cave": "空之探险队「大冰山」", + "island": "空之探险队「沿岸岩地」", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "空之探险队「水晶洞窟」", + "meadow": "空之探险队「天空顶端(森林)」", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "空之探险队「角山」", + "plains": "空之探险队「天空顶端(草原)」", + "power_plant": "空之探险队「电气平原 深处」", + "ruins": "空之探险队「封印岩地 深处」", + "sea": "空之探险队「石滩洞窟」", + "seabed": "空之探险队「石滩洞窟 下层」", + "slum": "空之探险队「天空顶端(岩场)」", + "snowy_forest": "空之探险队「天空顶端(雪山)」", + "space": "空之探险队「财宝岩地」", + "swamp": "空之探险队「封闭之海」", + "tall_grass": "空之探险队「浓雾森林」", + "temple": "空之探险队「守护洞穴」", + "town": "空之探险队「随机迷宫3」", + "volcano": "空之探险队「热水洞窟」", + "wasteland": "空之探险队「梦幻高原」", + + // Encounter + "encounter_ace_trainer": "黑白 「视线!精英训练师」", + "encounter_backpacker": "黑白 「视线!背包客」", + "encounter_clerk": "黑白 「视线!上班族」", + "encounter_cyclist": "黑白 「视线!自行车手」", + "encounter_lass": "黑白 「视线!迷你裙」", + "encounter_parasol_lady": "黑白 「视线!阳伞姐姐」", + "encounter_pokefan": "黑白 「视线!宝可梦爱好者」", + "encounter_psychic": "黑白 「视线!超能力者」", + "encounter_rich": "黑白 「视线!绅士」", + "encounter_rival": "黑白「黑连」", + "encounter_roughneck": "黑白 「视线!光头」", + "encounter_scientist": "黑白 「视线!科学家」", + "encounter_twins": "黑白 「视线!双胞胎」", + "encounter_youngster": "黑白 「视线!短裤小子」", + + // Other + "heal": "黑白「宝可梦回复」", + "menu": "空之探险队「欢迎来到宝可梦的世界」", + "title": "空之探险队「主题曲」", +} as const; diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index d15a725fbb0..0a7156b2b8c 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -5,8 +5,8 @@ export const challenges: TranslationEntries = { "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", "singleGeneration": { "name": "单一世代", - "desc": "你只能使用第{{gen}}世代的宝可梦", - "desc_default": "你只能使用所选世代的宝可梦", + "desc": "你只能使用第{{gen}}\n世代的宝可梦", + "desc_default": "你只能使用所选\n世代的宝可梦", "gen_1": "一", "gen_2": "二", "gen_3": "三", @@ -19,7 +19,7 @@ export const challenges: TranslationEntries = { }, "singleType": { "name": "单属性", - "desc": "你只能使用{{type}}属性的宝可梦", - "desc_default": "你只能使用所选属性的宝可梦" + "desc": "你只能使用{{type}}\n属性的宝可梦", + "desc_default": "你只能使用所选\n属性的宝可梦" }, } as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index ecef682581f..169c91535ed 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const zhCnConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/zh_CN/dialogue.ts b/src/locales/zh_CN/dialogue.ts index b9bed8fe4c4..483b165e826 100644 --- a/src/locales/zh_CN/dialogue.ts +++ b/src/locales/zh_CN/dialogue.ts @@ -382,6 +382,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "好像是我晕船了…" }, }, + "rocket_grunt": { + "encounter": { + 1: "你要有麻烦了!" + }, + "victory": { + 1: "火箭队又起飞了!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "如果你挡在熔岩队路上,那就别指望我们手下留情!" + }, + "victory": { + 1: "哈?我输了?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!" + }, + "victory": { + 1: "你在开玩笑吧?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "别惹银河队!" + }, + "victory": { + 1: "停机了…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "异端不共戴天!" + }, + "victory": { + 1: "等离子子子子子子!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "时尚最重要!" + }, + "victory": { + 1: "未来一片黑暗啊…" + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "我不得不说,能来到这里,你的确很不简单!" + }, + "victory": { + 1: "什么!这不可能!" + }, + "defeat": { + 1: "记住我的话。无法衡量自己的力量,说明你还是个孩子。" + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "我的老伙计还需要我…你要挡我的路吗?" + }, + "victory": { + 1: "这怎么可能…?\n火箭队的梦想…就这么成为泡影了…" + }, + "defeat": { + 1: "火箭队会重生,而我会统治世界!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "我会亲手埋葬你,希望你能喜欢!" + }, + "victory": { + 1: "啊!你…很厉害…我落后了…一点…" + }, + "defeat": { + 1: "熔岩队必胜!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "你是我实现目标最后的障碍。\n准备好迎接我最强的一击吧!哈哈哈哈!" + }, + "victory": { + 1: "这…这不…呃" + }, + "defeat": { + 1: "现在…我要把这个星球变成人类的理想国度!" + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "我是海洋队的老大,所以,你的路大概走到头了。" + }, + "victory": { + 1: "下次再见吧。我会记住你的脸的。" + }, + "defeat": { + 1: "天才!我的队伍不会再退缩了!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "我等这一天很久了。\n这就是我的真实力量!" + }, + "victory": { + 1: "果然很强……啊!" + }, + "defeat": { + 1: "我会让这世界上的一切回归到最初的纯净状态!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "但在这之前,让我见识见识你那敢向银河队叫板的实力吧。" + }, + "victory": { + 1: "有意思,简直太有意思了。" + }, + "defeat": { + 1: "我要创造我的新世界…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "是啊,我和你还真是有缘呢。\n不过,这段孽缘…就让我在此斩断吧!" + }, + "victory": { + 1: "怎么可能!怎么可能!怎么可能!" + }, + "defeat": { + 1: "永别了。" + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "无论是谁做了什么!都无法阻止我!" + }, + "victory": { + 1: "怎么回事?我可是建立了等离子队的完美的人啊!\n是要改变世界的完美的统治者!" + }, + "defeat": { + 1: "我是坐拥世界的完美统治者!哇哈哈哈!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "来吧!让我看看你彻底绝望时的那张脸!" + }, + "victory": { + 1: "不!我的伟大目标!我要完全支配世界啊!" + }, + "defeat": { + 1: "酋雷姆!融合吧!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "你想要阻止我?在对战中展示给我看吧!" + }, + "victory": { + 1: "看来你的确是想要阻止我。但是,先等一下。" + }, + "defeat": { + 1: "宝可梦…不该存在。" + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "你我的未来…究竟哪个才正确,\n就让我们来问问各自的宝可梦吧!" + }, + "victory": { + 1: "哇啊啊啊!" + }, + "defeat": { + 1: "没有远见的蠢货会继续玷污这个美丽的世界。" + } + }, "brock": { "encounter": { 1: "我对岩石属性宝可梦的专精会击败你!来吧!", diff --git a/src/locales/zh_CN/egg.ts b/src/locales/zh_CN/egg.ts index 0ea464ca5a9..6a0f3f92d2e 100644 --- a/src/locales/zh_CN/egg.ts +++ b/src/locales/zh_CN/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "你没有足够的兑换券!", "tooManyEggs": "你的蛋太多啦!", "pull": "次", - "pulls": "次" + "pulls": "次", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "{{pokemonName}} 从蛋中孵化了!", + "eggMoveUnlock": "蛋招式已解锁: {{moveName}}", + "rareEggMoveUnlock": "稀有蛋招式已解锁: {{moveName}}", } as const; diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.ts index 6107c1c2800..97c47ce5621 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "导入数据", "exportData": "导出数据", "cancel": "取消", - "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?" + "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index 97af66c8d3a..1b5b48538c3 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -53,4 +53,5 @@ export const menu: SimpleTranslationEntries = { "no": "否", "disclaimer": "免责声明", "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", + "choosePokemon": "Choose a Pokémon.", } as const; diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 52971fe08f3..c3b11722e72 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -93,7 +93,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "招式命中率增加{{accuracyAmount}} (最大100)。", }, "PokemonMultiHitModifierType": { - description: "攻击造成一次额外伤害,\n每堆叠一件会让攻击伤害\n衰减60/75/82.5%。", + description: "攻击以40/25/12.5%的伤害造成2/3/4次伤害", }, "TmModifierType": { name: "招式学习器 {{moveId}} - {{moveName}}", @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, + "EVIOLITE": { name: "进化奇石", description: "进化的神奇石块。携带后,还能进化的宝可梦的 防御和特防就会提高。" }, + "SOUL_DEW": { name: "心之水滴", description: "增加宝可梦性格影响10% (加算)。" }, "NUGGET": { name: "金珠" }, diff --git a/src/locales/zh_CN/settings.ts b/src/locales/zh_CN/settings.ts index f37a59613f5..3ca6cb435c6 100644 --- a/src/locales/zh_CN/settings.ts +++ b/src/locales/zh_CN/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (备用)", "mute": "静音", "controller": "控制器", - "gamepadSupport": "手柄支持" + "gamepadSupport": "手柄支持", + "showBgmBar": "显示音乐名称", } as const; diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index 05824853e40..475dfc5ffd0 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -31,6 +31,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "选择要替换成的招式", "unlockPassive": "解锁被动", "reduceCost": "降低花费", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": 闪光", "cycleForm": ": 形态", "cycleGender": ": 性别", diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index 8dcbd0e8408..c436e5021f7 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -1,8 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}} 被折磨着!", + "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", + "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", + "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", + "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/zh_TW/achv.ts b/src/locales/zh_TW/achv.ts index 4f59ecb2135..8b85f59447e 100644 --- a/src/locales/zh_TW/achv.ts +++ b/src/locales/zh_TW/achv.ts @@ -3,266 +3,266 @@ import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { "Achievements": { - name: "Achievements", + name: "成就", }, "Locked": { - name: "Locked", + name: "未解鎖", }, "MoneyAchv": { - description: "Accumulate a total of ₽{{moneyAmount}}", + description: "累計獲得 ₽{{moneyAmount}}", }, "10K_MONEY": { - name: "Money Haver", + name: "小有積蓄", }, "100K_MONEY": { - name: "Rich", + name: "大戶人家", }, "1M_MONEY": { - name: "Millionaire", + name: "百萬富翁", }, "10M_MONEY": { - name: "One Percenter", + name: "暴發戶", }, "DamageAchv": { - description: "Inflict {{damageAmount}} damage in one hit", + description: "在單次攻擊中造成 {{damageAmount}} 點傷害", }, "250_DMG": { - name: "Hard Hitter", + name: "重拳出擊", }, "1000_DMG": { - name: "Harder Hitter", + name: "神拳猛擊", }, "2500_DMG": { - name: "That's a Lotta Damage!", + name: "奪少?", }, "10000_DMG": { - name: "One Punch Man", + name: "一拳超人", }, "HealAchv": { - description: "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item", + description: "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點", }, "250_HEAL": { - name: "Novice Healer", + name: "新手奶媽", }, "1000_HEAL": { - name: "Big Healer", + name: "治療擔當", }, "2500_HEAL": { - name: "Cleric", + name: "牧師", }, "10000_HEAL": { - name: "Recovery Master", + name: "泉水", }, "LevelAchv": { - description: "Level up a Pokémon to Lv{{level}}", + description: "將一隻寶可夢提升到 Lv{{level}}", }, "LV_100": { - name: "But Wait, There's More!", + name: "别急,後面還有", }, "LV_250": { - name: "Elite", + name: "精英", }, "LV_1000": { - name: "To Go Even Further Beyond", + name: "天外有天", }, "RibbonAchv": { - description: "Accumulate a total of {{ribbonAmount}} Ribbons", + description: "累計獲得 {{ribbonAmount}} 個勛章", }, "10_RIBBONS": { - name: "Pokémon League Champion", + name: "寶可夢聯盟冠軍", }, "25_RIBBONS": { - name: "Great League Champion", + name: "超級球聯盟冠軍", }, "50_RIBBONS": { - name: "Ultra League Champion", + name: "高級球聯盟冠軍", }, "75_RIBBONS": { - name: "Rogue League Champion", + name: "肉鴿球聯盟冠軍", }, "100_RIBBONS": { - name: "Master League Champion", + name: "大師球聯盟冠軍", }, "TRANSFER_MAX_BATTLE_STAT": { - name: "Teamwork", - description: "Baton pass to another party member with at least one stat maxed out", + name: "團隊協作", + description: "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢", }, "MAX_FRIENDSHIP": { - name: "Friendmaxxing", - description: "Reach max friendship on a Pokémon", + name: "親密無間", + description: "使一隻寶可夢的親密度達到最大值", }, "MEGA_EVOLVE": { - name: "Megamorph", - description: "Mega evolve a Pokémon", + name: "大變身", + description: "超級進化一隻寶可夢", }, "GIGANTAMAX": { - name: "Absolute Unit", - description: "Gigantamax a Pokémon", + name: "這位更是重量級", + description: "極巨化一隻寶可夢", }, "TERASTALLIZE": { - name: "STAB Enthusiast", - description: "Terastallize a Pokémon", + name: "本系愛好者", + description: "太晶化一隻寶可夢", }, "STELLAR_TERASTALLIZE": { - name: "The Hidden Type", - description: "Stellar Terastallize a Pokémon", + name: "隱藏屬性", + description: "星晶化一隻寶可夢", }, "SPLICE": { - name: "Infinite Fusion", - description: "Splice two Pokémon together with DNA Splicers", + name: "無限融合", + description: "使用基因之楔將兩隻寶可夢融合在一起", }, "MINI_BLACK_HOLE": { - name: "A Hole Lot of Items", - description: "Acquire a Mini Black Hole", + name: "一大洞的道具", + description: "獲得一個迷你黑洞", }, "CATCH_MYTHICAL": { - name: "Mythical", - description: "Catch a mythical Pokémon", + name: "神秘禮物", + description: "捕捉一隻幻之寶可夢", }, "CATCH_SUB_LEGENDARY": { - name: "(Sub-)Legendary", - description: "Catch a sub-legendary Pokémon", + name: "二級傳說", + description: "捕捉一隻準傳說寶可夢", }, "CATCH_LEGENDARY": { - name: "Legendary", - description: "Catch a legendary Pokémon", + name: "傳說", + description: "捕捉一隻傳說寶可夢", }, "SEE_SHINY": { - name: "Shiny", - description: "Find a shiny Pokémon in the wild", + name: "閃耀奪目", + description: "在野外找到一隻閃光寶可夢", }, "SHINY_PARTY": { - name: "That's Dedication", - description: "Have a full party of shiny Pokémon", + name: "嘔心瀝血", + description: "擁有一支由閃光寶可夢組成的滿員隊伍", }, "HATCH_MYTHICAL": { - name: "Mythical Egg", - description: "Hatch a mythical Pokémon from an egg", + name: "幻獸蛋", + description: "從蛋中孵化出一隻幻之寶可夢", }, "HATCH_SUB_LEGENDARY": { - name: "Sub-Legendary Egg", - description: "Hatch a sub-legendary Pokémon from an egg", + name: "二級傳說蛋", + description: "從蛋中孵化出一隻準傳說寶可夢", }, "HATCH_LEGENDARY": { - name: "Legendary Egg", - description: "Hatch a legendary Pokémon from an egg", + name: "傳說蛋", + description: "從蛋中孵化出一隻傳說寶可夢", }, "HATCH_SHINY": { - name: "Shiny Egg", - description: "Hatch a shiny Pokémon from an egg", + name: "金色傳說!", + description: "從蛋中孵化出一隻閃光寶可夢", }, "HIDDEN_ABILITY": { - name: "Hidden Potential", - description: "Catch a Pokémon with a hidden ability", + name: "隱藏實力", + description: "捕捉一隻擁有隱藏特性的寶可夢", }, "PERFECT_IVS": { - name: "Certificate of Authenticity", - description: "Get perfect IVs on a Pokémon", + name: "合格證", + description: "獲得一隻擁有完美個體值的寶可夢", }, "CLASSIC_VICTORY": { - name: "Undefeated", - description: "Beat the game in classic mode", + name: "戰無不勝", + description: "在經典模式中通關遊戲", }, "MONO_GEN_ONE": { - name: "The Original Rival", - description: "Complete the generation one only challenge.", + name: "最初的勁敵", + description: "完成僅限第一世代的挑戰.", }, "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Complete the generation two only challenge.", + name: "1.5世代", + description: "完成僅限第二世代的挑戰.", }, "MONO_GEN_THREE": { - name: "Too much water?", - description: "Complete the generation three only challenge.", + name: "“水太多了”", + description: "完成僅限第三世代的挑戰.", }, "MONO_GEN_FOUR": { - name: "Is she really the hardest?", - description: "Complete the generation four only challenge.", + name: "她真是最強冠軍嗎?", + description: "完成僅限第四世代的挑戰.", }, "MONO_GEN_FIVE": { - name: "All Original", - description: "Complete the generation five only challenge.", + name: "完全原創", + description: "完成僅限第五世代的挑戰.", }, "MONO_GEN_SIX": { - name: "Almost Royalty", - description: "Complete the generation six only challenge.", + name: "女大公", + description: "完成僅限第六世代的挑戰.", }, "MONO_GEN_SEVEN": { - name: "Only Technically", - description: "Complete the generation seven only challenge.", + name: "首屆冠軍", + description: "完成僅限第七世代的挑戰.", }, "MONO_GEN_EIGHT": { - name: "A Champion Time!", - description: "Complete the generation eight only challenge.", + name: "冠軍時刻!", + description: "完成僅限第八世代的挑戰.", }, "MONO_GEN_NINE": { - name: "She was going easy on you", - description: "Complete the generation nine only challenge.", + name: "她又放水了", + description: "完成僅限第九世代的挑戰.", }, "MonoType": { - description: "Complete the {{type}} monotype challenge.", + description: "完成 {{type}} 單屬性挑戰.", }, "MONO_NORMAL": { - name: "Mono NORMAL", + name: "異乎尋常的尋常", }, "MONO_FIGHTING": { - name: "I Know Kung Fu", + name: "我有真功夫", }, "MONO_FLYING": { - name: "Mono FLYING", + name: "憤怒的小鳥", }, "MONO_POISON": { - name: "Kanto's Favourite", + name: "關都地區特色", }, "MONO_GROUND": { - name: "Mono GROUND", + name: "地震預報", }, "MONO_ROCK": { - name: "Brock Hard", + name: "堅如磐石", }, "MONO_BUG": { - name: "Sting Like A Beedrill", + name: "音箱蟀俠", }, "MONO_GHOST": { - name: "Who you gonna call?", + name: "捉鬼敢死隊", }, "MONO_STEEL": { - name: "Mono STEEL", + name: "鐵巨人", }, "MONO_FIRE": { - name: "Mono FIRE", + name: "搓火球解決一切", }, "MONO_WATER": { - name: "When It Rains, It Pours", + name: "當雨來臨,傾盆而下", }, "MONO_GRASS": { - name: "Mono GRASS", + name: "別踏這個青", }, "MONO_ELECTRIC": { - name: "Mono ELECTRIC", + name: "瞄準大岩蛇的角!", }, "MONO_PSYCHIC": { - name: "Mono PSYCHIC", + name: "腦洞大開", }, "MONO_ICE": { - name: "Mono ICE", + name: "如履薄冰", }, "MONO_DRAGON": { - name: "Mono DRAGON", + name: "準神俱樂部", }, "MONO_DARK": { - name: "It's just a phase", + name: "總有叛逆期", }, "MONO_FAIRY": { - name: "Mono FAIRY", + name: "林克,醒醒!", }, } as const; diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index b4d0aa9d50e..50cf1fa8b9c 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -2,127 +2,130 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出現了.", - "trainerAppeared": "{{trainerName}}\n想要和你對戰!", - "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", - "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", - "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", - "playerComeBack": "回來吧, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", - "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", - "switchQuestion": "要更換\n{{pokemonName}}嗎?", - "trainerDefeated": "你擊敗了\n{{trainerName}}!", - "pokemonCaught": "{{pokemonName}} 被抓住了!", + "trainerAppeared": "{{trainerName}}\n想要和你對戰!", + "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", + "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", + "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", + "playerComeBack": "回來吧, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", + "playerGo": "去吧! {{pokemonName}}!", + "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", + "switchQuestion": "要更換\n{{pokemonName}}嗎?", + "trainerDefeated": "你擊敗了\n{{trainerName}}!", + "pokemonCaught": "{{pokemonName}} 被抓住了!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "pokemon": "寶可夢", - "sendOutPokemon": "上吧! {{pokemonName}}!", - "hitResultCriticalHit": "擊中了要害!", - "hitResultSuperEffective": "效果拔群!", + "sendOutPokemon": "上吧! {{pokemonName}}!", + "hitResultCriticalHit": "擊中了要害!", + "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", - "hitResultOneHitKO": "一擊切殺!", - "attackFailed": "但是失敗了!", - "attackHitsCount": "擊中 {{count}} 次!", - "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", - "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", - "learnMove": "{{pokemonName}} 學會了{{moveName}}!", + "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", + "hitResultOneHitKO": "一擊切殺!", + "attackFailed": "但是失敗了!", + "attackHitsCount": "擊中 {{count}} 次!", + "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", + "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", + "learnMove": "{{pokemonName}} 學會了{{moveName}}!", "learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.", "learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.", - "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", - "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", + "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", + "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", - "learnMoveForgetQuestion": "要忘記哪個技能?", + "learnMoveForgetQuestion": "要忘記哪個技能?", "learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", + "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", "learnMoveAnd": "然後…", - "levelCapUp": "等級上限提升到 {{levelCap}}!", + "levelCapUp": "等級上限提升到 {{levelCap}}!", "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", "moveNoPP": "這個技能的PP用完了", - "moveDisabled": "{{moveName}} 被禁用!", + "moveDisabled": "{{moveName}} 被禁用!", "noPokeballForce": "一股無形的力量阻止了你使用精靈球。", - "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", - "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", - "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", + "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", + "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", + "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", "noEscapeForce": "一股無形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", - "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", - "runAwaySuccess": "你成功逃脫了!", - "runAwayCannotEscape": "你無法逃脫!", + "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", + "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", + "runAwaySuccess": "你成功逃脫了!", + "runAwayCannotEscape": "你無法逃脫!", "escapeVerbSwitch": "切換", "escapeVerbFlee": "逃跑", - "notDisabled": "{{moveName}} 不再被禁用!", - "skipItemQuestion": "你要跳過拾取道具嗎?", - "eggHatching": "咦?", - "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描?", - "wildPokemonWithAffix": "Wild {{pokemonName}}", - "foePokemonWithAffix": "Foe {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} regained\nhealth!", - "fainted": "{{pokemonNameWithAffix}} fainted!", - "statRose": "rose", - "statSharplyRose": "sharply rose", - "statRoseDrastically": "rose drastically", - "statWontGoAnyHigher": "won't go any higher", - "statFell": "fell", - "statHarshlyFell": "harshly fell", - "statSeverelyFell": "severely fell", - "statWontGoAnyLower": "won't go any lower", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", - "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", - "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", - "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}", - "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", - "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", - "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", - "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", - "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", - "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", - "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", - "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", - "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", - "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", - "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", - "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", - "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", - "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", - "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", - "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", - "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", - "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", - "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!", - "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", - "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", - "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", - "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", - "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", - "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", - "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", - "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", - "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", - "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", - "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", - "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", - "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", - "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", - "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", - "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", - "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", - "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", - "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", - "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", - "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", - "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", - "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", - "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", - "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", - "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" + "notDisabled": "{{moveName}} 不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "skipItemQuestion": "你要跳過拾取道具嗎?", + "eggHatching": "咦?", + "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", + "wildPokemonWithAffix": "野生的 {{pokemonName}}", + "foePokemonWithAffix": "對手 {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!", + "drainMessage": "{{pokemonName}} 吸取了體力!", + "regainHealth": "{{pokemonName}} 回復了體力!", + "fainted": "{{pokemonNameWithAffix}} 倒下了!", + "statRose": "{{pokemonNameWithAffix}} 的 {{stats}} 提高了!", + "statSharplyRose": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅提高了!", + "statRoseDrastically": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅提高了!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再提高了!", + "statFell": "{{pokemonNameWithAffix}} 的 {{stats}} 降低了!", + "statHarshlyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅降低了!", + "statSeverelyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅降低了!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再降低了!", + "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏縮了!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混亂了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混亂解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已經混亂了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混亂中!", + "battlerTagsConfusedLapseHurtItself": "不知所以地攻擊了自己!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影響", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同歸於盡了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}已經著迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷中!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不會著迷!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治癒了著迷狀態!", + "battlerTagsSeededOnAdd": "將種子種植在了{{pokemonNameWithAffix}}身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}被寄生種子吸取了體力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥漿!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}開始做惡夢了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}已經被惡夢纏身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}正被惡夢纏身!", + "battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}}接受了再來一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}的再來一次狀態解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}擺出了幫助{{pokemonName}} 的架勢!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}用扎根回復了體力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}用水流環包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回復了{{pokemonName}}的體力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}產生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的傷害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}緊緊束縛住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}綁緊了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋渦之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用貝殼夾住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩風暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}被捕獸夾困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死纏爛打!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}擺出了防守的架勢!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}在攻擊中保護了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}擺出了挺住攻擊的架勢!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!" } as const; diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts new file mode 100644 index 00000000000..1e35a2a095b --- /dev/null +++ b/src/locales/zh_TW/bgm-name.ts @@ -0,0 +1,144 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowa Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + //"jungle": "jungle", // The composer thinks about a more creative name + //"labratory": "labratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + //"metropolis": "metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "PMD EoS Lower Brine Cave", + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "PMD EoS Fortune Ravine", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/zh_TW/biome.ts b/src/locales/zh_TW/biome.ts index d3f34c021d4..dbfa2f7adb9 100644 --- a/src/locales/zh_TW/biome.ts +++ b/src/locales/zh_TW/biome.ts @@ -1,40 +1,40 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { - "unknownLocation": "Somewhere you can\'t remember", - "TOWN": "Town", - "PLAINS": "Plains", - "GRASS": "Grassy Field", - "TALL_GRASS": "Tall Grass", - "METROPOLIS": "Metropolis", - "FOREST": "Forest", - "SEA": "Sea", - "SWAMP": "Swamp", - "BEACH": "Beach", - "LAKE": "Lake", - "SEABED": "Seabed", - "MOUNTAIN": "Mountain", - "BADLANDS": "Badlands", - "CAVE": "Cave", - "DESERT": "Desert", - "ICE_CAVE": "Ice Cave", - "MEADOW": "Meadow", - "POWER_PLANT": "Power Plant", - "VOLCANO": "Volcano", - "GRAVEYARD": "Graveyard", - "DOJO": "Dojo", - "FACTORY": "Factory", - "RUINS": "Ancient Ruins", - "WASTELAND": "Wasteland", - "ABYSS": "Abyss", - "SPACE": "Space", - "CONSTRUCTION_SITE": "Construction Site", - "JUNGLE": "Jungle", - "FAIRY_CAVE": "Fairy Cave", - "TEMPLE": "Temple", - "SLUM": "Slum", - "SNOWY_FOREST": "Snowy Forest", - "ISLAND": "Island", - "LABORATORY": "Laboratory", + "unknownLocation": "未知領域", + "TOWN": "城鎮", + "PLAINS": "平原", + "GRASS": "草地", + "TALL_GRASS": "高草叢", + "METROPOLIS": "城市", + "FOREST": "森林", + "SEA": "海洋", + "SWAMP": "沼澤", + "BEACH": "沙灘", + "LAKE": "湖泊", + "SEABED": "海底", + "MOUNTAIN": "山脈", + "BADLANDS": "不毛之地", + "CAVE": "洞窟", + "DESERT": "沙漠", + "ICE_CAVE": "寒冰洞窟", + "MEADOW": "花叢", + "POWER_PLANT": "發電廠", + "VOLCANO": "火山", + "GRAVEYARD": "墓地", + "DOJO": "道場", + "FACTORY": "工廠", + "RUINS": "遺跡", + "WASTELAND": "荒地龍巢", + "ABYSS": "幽谷深淵", + "SPACE": "太空", + "CONSTRUCTION_SITE": "工地", + "JUNGLE": "叢林", + "FAIRY_CAVE": "妖精洞窟", + "TEMPLE": "神殿", + "SLUM": "陋巷", + "SNOWY_FOREST": "冰雪森林", + "ISLAND": "島嶼", + "LABORATORY": "研究所", "END": "???", } as const; diff --git a/src/locales/zh_TW/challenges.ts b/src/locales/zh_TW/challenges.ts index 6b46ac8c7ab..e702ec4f278 100644 --- a/src/locales/zh_TW/challenges.ts +++ b/src/locales/zh_TW/challenges.ts @@ -2,11 +2,11 @@ import { TranslationEntries } from "#app/interfaces/locales"; export const challenges: TranslationEntries = { "title": "適用挑戰條件", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "illegalEvolution": "{{pokemon}} 進化成了不符合\n挑戰條件的寶可夢!", "singleGeneration": { "name": "單一世代", - "desc": "你只能使用第{{gen}}世代的寶可夢", - "desc_default": "你只能使用所選世代的寶可夢", + "desc": "你只能使用第{{gen}}\n世代的寶可夢", + "desc_default": "你只能使用所選\n世代的寶可夢", "gen_1": "一", "gen_2": "二", "gen_3": "三", @@ -19,7 +19,7 @@ export const challenges: TranslationEntries = { }, "singleType": { "name": "單屬性", - "desc": "你只能使用{{type}}屬性的寶可夢", - "desc_default": "你只能使用所選屬性的寶可夢" + "desc": "你只能使用{{type}}\n屬性的寶可夢", + "desc_default": "你只能使用所選\n屬性的寶可夢" }, } as const; diff --git a/src/locales/zh_TW/command-ui-handler.ts b/src/locales/zh_TW/command-ui-handler.ts index 9fad34bb64f..300b20224b3 100644 --- a/src/locales/zh_TW/command-ui-handler.ts +++ b/src/locales/zh_TW/command-ui-handler.ts @@ -5,5 +5,5 @@ export const commandUiHandler: SimpleTranslationEntries = { "ball": "精靈球", "pokemon": "寶可夢", "run": "逃跑", - "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", + "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", } as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 08063f9f154..1cbb4e6e2c1 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -48,6 +49,7 @@ export const zhTwConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, diff --git a/src/locales/zh_TW/dialogue.ts b/src/locales/zh_TW/dialogue.ts index 119f9e8bb8f..0823236bc84 100644 --- a/src/locales/zh_TW/dialogue.ts +++ b/src/locales/zh_TW/dialogue.ts @@ -382,6 +382,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "好像是我暈船了…" }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "我對岩石屬性寶可夢的專精會擊敗你!來吧!", @@ -2136,7 +2316,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_6_female": { "encounter": { - 1: "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。", + 1: "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。", }, "victory": { 1: "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答應我……在你拯救世界之後\n……要……平安到家。$@c{smile_ehalf}……謝謝你。", diff --git a/src/locales/zh_TW/egg.ts b/src/locales/zh_TW/egg.ts index 9668385f71e..eecfcf0b735 100644 --- a/src/locales/zh_TW/egg.ts +++ b/src/locales/zh_TW/egg.ts @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "你沒有足夠的兌換券!", "tooManyEggs": "你的蛋太多啦!", "pull": "抽", - "pulls": "抽" + "pulls": "抽", + "sameSpeciesEgg": "{{species}} 會從這個蛋裡孵化!", + "hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!", + "eggMoveUnlock": "蛋招式已解鎖: {{moveName}}", + "rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}", } as const; diff --git a/src/locales/zh_TW/fight-ui-handler.ts b/src/locales/zh_TW/fight-ui-handler.ts index 6885d0fcc2a..d86a703d844 100644 --- a/src/locales/zh_TW/fight-ui-handler.ts +++ b/src/locales/zh_TW/fight-ui-handler.ts @@ -4,6 +4,6 @@ export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "威力", "accuracy": "命中率", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important + "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", + "passive": "被動能力 ", // The space at the end is important } as const; diff --git a/src/locales/zh_TW/game-mode.ts b/src/locales/zh_TW/game-mode.ts index 903f1a63072..dc2a227d638 100644 --- a/src/locales/zh_TW/game-mode.ts +++ b/src/locales/zh_TW/game-mode.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { - "classic": "Classic", - "endless": "Endless", - "endlessSpliced": "Endless (Spliced)", - "dailyRun": "Daily Run", - "unknown": "Unknown", - "challenge": "Challenge", + "classic": "經典模式", + "endless": "無盡模式", + "endlessSpliced": "融合無盡模式", + "dailyRun": "每日挑戰", + "unknown": "未知", + "challenge": "挑戰模式", } as const; diff --git a/src/locales/zh_TW/game-stats-ui-handler.ts b/src/locales/zh_TW/game-stats-ui-handler.ts index a29eaf5d1b6..343ae7240cb 100644 --- a/src/locales/zh_TW/game-stats-ui-handler.ts +++ b/src/locales/zh_TW/game-stats-ui-handler.ts @@ -1,44 +1,44 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Stats", - "playTime": "Play Time", - "totalBattles": "Total Battles", - "starters": "Starters", - "shinyStarters": "Shiny Starters", - "speciesSeen": "Species Seen", - "speciesCaught": "Species Caught", - "ribbonsOwned": "Ribbons Owned", - "classicRuns": "Classic Runs", - "classicWins": "Classic Wins", - "dailyRunAttempts": "Daily Run Attempts", - "dailyRunWins": "Daily Run Wins", - "endlessRuns": "Endless Runs", - "highestWaveEndless": "Highest Wave (Endless)", - "highestMoney": "Highest Money", - "highestDamage": "Highest Damage", - "highestHPHealed": "Highest HP Healed", - "pokemonEncountered": "Pokémon Encountered", - "pokemonDefeated": "Pokémon Defeated", - "pokemonCaught": "Pokémon Caught", - "eggsHatched": "Eggs Hatched", - "subLegendsSeen": "Sub-Legends Seen", - "subLegendsCaught": "Sub-Legends Caught", - "subLegendsHatched": "Sub-Legends Hatched", - "legendsSeen": "Legends Seen", - "legendsCaught": "Legends Caught", - "legendsHatched": "Legends Hatched", - "mythicalsSeen": "Mythicals Seen", - "mythicalsCaught": "Mythicals Caught", - "mythicalsHatched": "Mythicals Hatched", - "shiniesSeen": "Shinies Seen", - "shiniesCaught": "Shinies Caught", - "shiniesHatched": "Shinies Hatched", - "pokemonFused": "Pokémon Fused", - "trainersDefeated": "Trainers Defeated", - "eggsPulled": "Eggs Pulled", - "rareEggsPulled": "Rare Eggs Pulled", - "epicEggsPulled": "Epic Eggs Pulled", - "legendaryEggsPulled": "Legendary Eggs Pulled", - "manaphyEggsPulled": "Manaphy Eggs Pulled", + "stats": "統計", + "playTime": "遊戲時間", + "totalBattles": "總戰鬥次數", + "starters": "初始寶可夢", + "shinyStarters": "閃光初始寶可夢", + "speciesSeen": "遇到的種類", + "speciesCaught": "捕捉的種類", + "ribbonsOwned": "擁有緞帶數", + "classicRuns": "經典模式次數", + "classicWins": "經典模式通關次數", + "dailyRunAttempts": "每日挑戰次數", + "dailyRunWins": "每日挑戰通關次數", + "endlessRuns": "無盡模式挑戰次數", + "highestWaveEndless": "最高層數(無盡)", + "highestMoney": "最多金錢", + "highestDamage": "最高傷害", + "highestHPHealed": "最多治療", + "pokemonEncountered": "遇敵數量", + "pokemonDefeated": "打倒數量", + "pokemonCaught": "捕捉數量", + "eggsHatched": "孵蛋數量", + "subLegendsSeen": "遇到的二級神寶可夢", + "subLegendsCaught": "捕捉的二級神寶可夢", + "subLegendsHatched": "孵化的二級神寶可夢", + "legendsSeen": "遇到的傳說寶可夢", + "legendsCaught": "捕捉的傳說寶可夢", + "legendsHatched": "孵化的傳說寶可夢", + "mythicalsSeen": "遇到的幻獸寶可夢", + "mythicalsCaught": "捕捉的幻獸寶可夢", + "mythicalsHatched": "孵化的幻獸寶可夢", + "shiniesSeen": "遇到的閃光寶可夢", + "shiniesCaught": "捕捉的閃光寶可夢", + "shiniesHatched": "孵化的閃光寶可夢", + "pokemonFused": "融合寶可夢次數", + "trainersDefeated": "打敗的訓練師數", + "eggsPulled": "總扭蛋次數", + "rareEggsPulled": "稀有扭蛋數", + "epicEggsPulled": "史詩扭蛋數", + "legendaryEggsPulled": "傳說扭蛋數", + "manaphyEggsPulled": "瑪娜霏扭蛋數", } as const; diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.ts index 6108b732d95..21ba10ba30e 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.ts @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "導入數據", "exportData": "導出數據", "cancel": "取消", - "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?" + "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index 443b569d908..4ecaf8d4d9d 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -11,7 +11,7 @@ export const menu: SimpleTranslationEntries = { "dailyRun": "每日挑戰 (Beta)", "loadGame": "加載遊戲", "newGame": "新遊戲", - "settings": "Settings", + "settings": "設定", "selectGameMode": "選擇遊戲模式", "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!", "username": "用戶名", @@ -53,4 +53,5 @@ export const menu: SimpleTranslationEntries = { "no":"否", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "choosePokemon": "Choose a Pokémon.", } as const; diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index 769c01e072f..8d7695bb735 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -187,6 +187,10 @@ export const modifierType: ModifierTypeTranslationEntries = { LUCKY_EGG: { name: "幸運蛋" }, GOLDEN_EGG: { name: "金蛋" }, SOOTHE_BELL: { name: "安撫之鈴" }, + EVIOLITE: { + name: "進化奇石", + description: "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" + }, SOUL_DEW: { name: "心之水滴", description: "增加寶可夢性格影響10% (加算)。", @@ -243,14 +247,14 @@ export const modifierType: ModifierTypeTranslationEntries = { "攜帶該道具的寶可夢在攻擊對方成功造成傷\n害時,攜帶者的HP會恢復其所造成傷害\n的1/8。", }, TOXIC_ORB: { - name: "Toxic Orb", + name: "劇毒寶珠", description: - "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle" + "觸碰後會放出毒的神奇寶珠。\n攜帶後,在戰鬥時會變成劇毒狀態。" }, FLAME_ORB: { - name: "Flame Orb", + name: "火焰寶珠", description: - "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle" + "觸碰後會放出熱量的神奇寶珠。\n攜帶後,在戰鬥時會變成灼傷狀態。" }, BATON: { name: "接力棒", @@ -308,14 +312,14 @@ export const modifierType: ModifierTypeTranslationEntries = { }, TempBattleStatBoosterStatName: { - "ATK": "Attack", - "DEF": "Defense", - "SPATK": "Sp. Atk", - "SPDEF": "Sp. Def", - "SPD": "Speed", - "ACC": "Accuracy", - "CRIT": "Critical Hit Ratio", - "EVA": "Evasiveness", + "ATK": "攻擊", + "DEF": "防禦", + "SPATK": "特攻", + "SPDEF": "特防", + "SPD": "速度", + "ACC": "命中", + "CRIT": "會心", + "EVA": "閃避", "DEFAULT": "???", }, diff --git a/src/locales/zh_TW/party-ui-handler.ts b/src/locales/zh_TW/party-ui-handler.ts index 894ea14bb12..dfe1a3629b6 100644 --- a/src/locales/zh_TW/party-ui-handler.ts +++ b/src/locales/zh_TW/party-ui-handler.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" + "SEND_OUT": "上場", + "SUMMARY": "概要", + "CANCEL": "取消", + "RELEASE": "放生", + "APPLY": "應用", + "TEACH": "教授" } as const; diff --git a/src/locales/zh_TW/pokemon-info-container.ts b/src/locales/zh_TW/pokemon-info-container.ts index 2d70e769b24..19cb5219465 100644 --- a/src/locales/zh_TW/pokemon-info-container.ts +++ b/src/locales/zh_TW/pokemon-info-container.ts @@ -1,11 +1,11 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Moveset", - "gender": "Gender:", - "ability": "Ability:", - "nature": "Nature:", - "epic": "Epic", - "rare": "Rare", - "common": "Common" + "moveset": "招式", + "gender": "性别:", + "ability": "特性:", + "nature": "性格:", + "epic": "史詩", + "rare": "稀有", + "common": "常見" } as const; diff --git a/src/locales/zh_TW/pokemon.ts b/src/locales/zh_TW/pokemon.ts index 7bbbfd6b08c..2a82f11f4c3 100644 --- a/src/locales/zh_TW/pokemon.ts +++ b/src/locales/zh_TW/pokemon.ts @@ -987,7 +987,7 @@ export const pokemon: SimpleTranslationEntries = { "great_tusk": "雄偉牙", "scream_tail": "吼叫尾", "brute_bonnet": "猛惡菇", - "flutter_mane": "振翼發", + "flutter_mane": "振翼髮", "slither_wing": "爬地翅", "sandy_shocks": "沙鐵皮", "iron_treads": "鐵轍跡", diff --git a/src/locales/zh_TW/save-slot-select-ui-handler.ts b/src/locales/zh_TW/save-slot-select-ui-handler.ts index 4a9e02eebee..68377aec4b2 100644 --- a/src/locales/zh_TW/save-slot-select-ui-handler.ts +++ b/src/locales/zh_TW/save-slot-select-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Overwrite the data in the selected slot?", - "loading": "Loading...", - "wave": "Wave", + "overwriteData": "要覆蓋該槽位的存檔嗎?", + "loading": "正在加載...", + "wave": "層數", "lv": "Lv", "empty": "空", } as const; diff --git a/src/locales/zh_TW/settings.ts b/src/locales/zh_TW/settings.ts index c70a8e0c625..dcb87fafe35 100644 --- a/src/locales/zh_TW/settings.ts +++ b/src/locales/zh_TW/settings.ts @@ -94,5 +94,6 @@ export const settings: SimpleTranslationEntries = { "alt": " (備用)", "mute": "靜音", "controller": "控制器", - "gamepadSupport": "手柄支持" + "gamepadSupport": "手柄支持", + "showBgmBar": "Show Music Names", } as const; diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index 94ce83956cc..ae9a4083d20 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -32,6 +32,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectMoveSwapWith": "選擇想要替換成的招式", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", + "sameSpeciesEgg": "買蛋", "cycleShiny": ": 閃光", "cycleForm": ": 形態", "cycleGender": ": 性別", diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 6fea28823f3..594363ce009 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -48,7 +48,7 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "鐵路員工", "doctor": "醫生", "doctor_female": "醫生", - "firebreather": "Firebreather", + "firebreather": "吹火人", "fisherman": "垂釣者", "fisherman_female": "垂釣者", "gentleman": "紳士", diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.ts index c83e0fdc5bf..7efdc8af0ad 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.ts @@ -4,7 +4,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "日照變強了!", + "sunnyStartMessage": "日照變強了!", "sunnyLapseMessage": "日照很強。", "sunnyClearMessage": "日照復原了。", @@ -15,22 +15,22 @@ export const weather: SimpleTranslationEntries = { "sandstormStartMessage": "開始刮沙暴了!", "sandstormLapseMessage": "沙暴肆虐。", "sandstormClearMessage": "沙暴停止了。", - "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", + "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", - "hailStartMessage": "開始下冰雹了!", + "hailStartMessage": "開始下冰雹了!", "hailLapseMessage": "冰雹繼續肆虐。", "hailClearMessage": "冰雹不再下了。", - "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", + "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", - "snowStartMessage": "開始下雪了!", + "snowStartMessage": "開始下雪了!", "snowLapseMessage": "雪繼續下。", "snowClearMessage": "雪停了。", - "fogStartMessage": "起霧了!", + "fogStartMessage": "起霧了!", "fogLapseMessage": "霧很濃。", "fogClearMessage": "霧散了。", - "heavyRainStartMessage": "開始下起了暴雨!", + "heavyRainStartMessage": "開始下起了暴雨!", "heavyRainLapseMessage": "暴雨勢頭不減。", "heavyRainClearMessage": "暴雨停了。", @@ -38,7 +38,7 @@ export const weather: SimpleTranslationEntries = { "harshSunLapseMessage": "強日照勢頭不減。", "harshSunClearMessage": "日照復原了。", - "strongWindsStartMessage": "吹起了神秘的亂流!", + "strongWindsStartMessage": "吹起了神秘的亂流!", "strongWindsLapseMessage": "神秘的亂流勢頭不減。", "strongWindsClearMessage": "神秘的亂流停止了。" }; diff --git a/src/main.ts b/src/main.ts index e750335ddd4..41cd68afc1e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -150,7 +150,6 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); -document.fonts.load("12px unifont"); let game; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 7094185eff2..895ee4b46c2 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1193,6 +1193,8 @@ export const modifierTypes = { SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), + EVIOLITE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVIOLITE", "eviolite", (type, args) => new Modifiers.EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [Stat.DEF, Stat.SPDEF], 1.5)), + SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.NUGGET", "nugget", 1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small"), @@ -1366,6 +1368,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.MINT, 4), new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32), new WeightedModifierType(modifierTypes.AMULET_COIN, 3), + //new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0), new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 626d744eef2..efd67104215 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -64,13 +64,19 @@ export class ModifierBar extends Phaser.GameObjects.Container { this.setScale(0.5); } - updateModifiers(modifiers: PersistentModifier[]) { + /** + * Method to update content displayed in {@linkcode ModifierBar} + * @param {PersistentModifier[]} modifiers - The list of modifiers to be displayed in the {@linkcode ModifierBar} + * @param {boolean} hideHeldItems - If set to "true", only modifiers not assigned to a Pokémon are displayed + */ + updateModifiers(modifiers: PersistentModifier[], hideHeldItems: boolean = false) { this.removeAll(true); const visibleIconModifiers = modifiers.filter(m => m.isIconVisible(this.scene as BattleScene)); const nonPokemonSpecificModifiers = visibleIconModifiers.filter(m => !(m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); const pokemonSpecificModifiers = visibleIconModifiers.filter(m => (m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); - const sortedVisibleIconModifiers = nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); + + const sortedVisibleIconModifiers = hideHeldItems ? nonPokemonSpecificModifiers : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); const thisArg = this; @@ -322,7 +328,8 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier match(modifier: Modifier): boolean { if (modifier instanceof DoubleBattleChanceBoosterModifier) { - return (modifier as DoubleBattleChanceBoosterModifier).battlesLeft === this.battlesLeft; + // Check type id to not match different tiers of lures + return modifier.type.id === this.type.id && modifier.battlesLeft === this.battlesLeft; } return false; } @@ -334,9 +341,15 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier getArgs(): any[] { return [ this.battlesLeft ]; } - + /** + * Modifies the chance of a double battle occurring + * @param args A single element array containing the double battle chance as a NumberHolder + * @returns {boolean} Returns true if the modifier was applied + */ apply(args: any[]): boolean { const doubleBattleChance = args[0] as Utils.NumberHolder; + // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt + // A double battle will initiate if the generated number is 0 doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 2); return true; @@ -693,6 +706,83 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for held items, specifically Eviolite, that apply + * {@linkcode Stat} boost(s) using a multiplier if the holder can evolve. + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class EvolutionStatBoosterModifier extends PokemonHeldItemModifier { + /** The stats that the held item boosts */ + private stats: Stat[]; + /** The multiplier used to increase the relevant stat(s) */ + private multiplier: number; + + constructor(type: ModifierType, pokemonId: integer, stats: Stat[], multiplier: number, stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.stats = stats; + this.multiplier = multiplier; + } + + clone() { + return new EvolutionStatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.stats, this.multiplier ]; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof EvolutionStatBoosterModifier; + } + + /** + * Checks if the incoming stat is listed in {@linkcode stats} + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Stat} being checked at the time + * [2] {@linkcode Utils.NumberHolder} N/A + * @returns true if the stat could be boosted, false otherwise + */ + shouldApply(args: any[]): boolean { + return this.stats.includes(args[1] as Stat); + } + + /** + * Boosts the incoming stat value by a {@linkcode multiplier} if the holder + * can evolve. Note that, if the holder is a fusion, they will receive + * only half of the boost if either of the fused members are fully + * evolved. However, if they are both unevolved, the full boost + * will apply. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Stat} N/A + * [2] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat + * @returns true if the stat boost applies successfully, false otherwise + * @see shouldApply + */ + apply(args: any[]): boolean { + const holder = args[0] as Pokemon; + const statValue = args[2] as Utils.NumberHolder; + const isUnevolved = holder.getSpeciesForm(true).speciesId in pokemonEvolutions; + + if (holder.isFusion() && (holder.getFusionSpeciesForm(true).speciesId in pokemonEvolutions) !== isUnevolved) { + // Half boost applied if holder is fused and either part of fusion is fully evolved + statValue.value *= 1 + (this.multiplier - 1) / 2; + return true; + } else if (isUnevolved) { + // Full boost applied if holder is unfused and unevolved or, if fused, both parts of fusion are unevolved + statValue.value *= this.multiplier; + return true; + } + + return false; + } + + getMaxHeldItemCount(_pokemon: Pokemon): integer { + return 1; + } +} + /** * Applies Specific Type item boosts (e.g., Magnet) */ diff --git a/src/overrides.ts b/src/overrides.ts index 6ae3af64299..837d9bf520d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -9,6 +9,8 @@ import { PokeballType } from "./data/pokeball"; import { Gender } from "./data/gender"; import { StatusEffect } from "./data/status-effect"; import { modifierTypes } from "./modifier/modifier-type"; +import { VariantTier } from "./enums/variant-tiers"; +import { EggTier } from "#enums/egg-type"; import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; @@ -36,9 +38,9 @@ export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override export const XP_MULTIPLIER_OVERRIDE: number = null; -export const IMMEDIATE_HATCH_EGGS_OVERRIDE: boolean = false; // default 1000 export const STARTING_MONEY_OVERRIDE: integer = 0; +export const FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = { active: false, pokeballs: { @@ -98,6 +100,17 @@ export const OPP_SHINY_OVERRIDE: boolean = false; export const OPP_VARIANT_OVERRIDE: Variant = 0; export const OPP_IVS_OVERRIDE: integer | integer[] = []; +/** + * EGG OVERRIDES + */ + +export const EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; +export const EGG_TIER_OVERRIDE: EggTier = null; +export const EGG_SHINY_OVERRIDE: boolean = false; +export const EGG_VARIANT_OVERRIDE: VariantTier = null; +export const EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; +export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; + /** * MODIFIER / ITEM OVERRIDES * if count is not provided, it will default to 1 diff --git a/src/phases.ts b/src/phases.ts index dd3ebf148fb..0d86a98ef92 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -19,14 +19,14 @@ import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags"; +import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr } from "./data/ability"; +import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -2239,6 +2239,7 @@ export class TurnStartPhase extends FieldPhase { this.scene.getField(true).filter(p => p.summonData).map(p => { const bypassSpeed = new Utils.BooleanHolder(false); + applyAbAttrs(BypassSpeedChanceAbAttr, p, null, bypassSpeed); this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; }); @@ -2422,7 +2423,7 @@ export class TurnEndPhase extends FieldPhase { if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), - Math.max(pokemon.getMaxHp() >> 4, 1), getPokemonMessage(pokemon, "'s HP was restored."), true)); + Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); } if (!pokemon.isPlayer()) { @@ -2582,7 +2583,7 @@ export class MovePhase extends BattlePhase { if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) { this.scene.queueMessage(`${this.move.getName()} is disabled!`); } - if (this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails + if (this.pokemon.isActive(true) && this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails this.fail(); this.showMoveText(); this.showFailedText(); @@ -3033,7 +3034,7 @@ export class MoveEffectPhase extends PokemonPhase { return true; } - const hiddenTag = target.getTag(HiddenTag); + const hiddenTag = target.getTag(SemiInvulnerableTag); if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === hiddenTag.tagType)) { return false; } @@ -3380,7 +3381,7 @@ export class StatChangePhase extends PokemonPhase { } else { statsFragment = getBattleStatName(relLevelStats[0]); } - messages.push(getPokemonMessage(this.getPokemon(), `'s ${statsFragment} ${getBattleStatLevelChangeDescription(Math.abs(parseInt(rl)), levels >= 1)}!`)); + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1)); }); return messages; @@ -3496,6 +3497,7 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { pokemon.status.incrementTurn(); const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectActivationText(pokemon.status.effect))); @@ -4009,6 +4011,10 @@ export class MoneyRewardPhase extends BattlePhase { this.scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + if (this.scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + this.scene.addMoney(moneyAmount.value); const userLocale = navigator.language || "en-US"; @@ -4708,7 +4714,7 @@ export class PokemonHealPhase extends CommonAnimPhase { pokemon.resetStatus(); pokemon.updateInfo().then(() => super.end()); } else if (this.showFullHpMessage) { - this.message = getPokemonMessage(pokemon, "'s\nHP is full!"); + this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); } if (this.message) { @@ -5255,7 +5261,7 @@ export class EggLapsePhase extends Phase { super.start(); const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => { - return Overrides.IMMEDIATE_HATCH_EGGS_OVERRIDE ? true : --egg.hatchWaves < 1; + return Overrides.EGG_IMMEDIATE_HATCH_OVERRIDE ? true : --egg.hatchWaves < 1; }); let eggCount: integer = eggsToHatch.length; diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 14e5c74f12c..3bcac101465 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -12,12 +12,45 @@ import { ptBrConfig } from "#app/locales/pt_BR/config.js"; import { zhCnConfig } from "#app/locales/zh_CN/config.js"; import { zhTwConfig } from "#app/locales/zh_TW/config.js"; +const unicodeHalfAndFullWidthForms = [ + "U+FF00-FFEF" +]; + +const unicodeCJK = [ + "U+2E80-2EFF", + "U+3000-303F", + "U+31C0-31EF", + "U+3200-32FF", + "U+3400-4DBF", + "U+4E00-9FFF", + "U+F900-FAFF", + "U+FE30-FE4F", +].join(","); + +const unicodeHangul = [ + "U+1100-11FF", + "U+3130-318F", + "U+A960-A97F", + "U+AC00-D7AF", + "U+D7B0-D7FF", +].join(","); + const fonts = [ - new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: "U+AC00-D7AC"}), + // korean + new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), Object.assign( - new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: "U+AC00-D7AC"}), + new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), { sizeAdjust: "133%" } ), + // unicode + Object.assign( + new FontFace("emerald", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), + { sizeAdjust: "70%", format: "opentype" } + ), + Object.assign( + new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), + { format: "opentype" } + ), ]; async function initFonts() { diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index 9bacb357035..b4bd4368bd9 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -1,20 +1,49 @@ -import { Egg, GachaType } from "../data/egg"; +import { EggTier } from "#enums/egg-type"; +import { Species } from "#enums/species"; +import { VariantTier } from "#enums/variant-tiers"; +import { EGG_SEED, Egg } from "../data/egg"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export default class EggData { public id: integer; - public gachaType: GachaType; + public tier: EggTier; + public sourceType: EggSourceType; public hatchWaves: integer; public timestamp: integer; + public variantTier: VariantTier; + public isShiny: boolean; + public species: Species; + public eggMoveIndex: number; + public overrideHiddenAbility: boolean; constructor(source: Egg | any) { const sourceEgg = source instanceof Egg ? source as Egg : null; this.id = sourceEgg ? sourceEgg.id : source.id; - this.gachaType = sourceEgg ? sourceEgg.gachaType : source.gachaType; + this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); + // legacy egg + if (source.species === 0) { + // check if it has a gachaType (deprecated) + this.sourceType = source.gachaType ?? source.sourceType; + } else { + this.sourceType = sourceEgg ? sourceEgg.sourceType : source.sourceType; + } this.hatchWaves = sourceEgg ? sourceEgg.hatchWaves : source.hatchWaves; this.timestamp = sourceEgg ? sourceEgg.timestamp : source.timestamp; + this.variantTier = sourceEgg ? sourceEgg.variantTier : source.variantTier; + this.isShiny = sourceEgg ? sourceEgg.isShiny : source.isShiny; + this.species = sourceEgg ? sourceEgg.species : source.species; + this.eggMoveIndex = sourceEgg ? sourceEgg.eggMoveIndex : source.eggMoveIndex; + this.overrideHiddenAbility = sourceEgg ? sourceEgg.overrideHiddenAbility : source.overrideHiddenAbility; } toEgg(): Egg { - return new Egg(this.id, this.gachaType, this.hatchWaves, this.timestamp); + // Species will be 0 if an old legacy is loaded from DB + if (!this.species) { + return new Egg({ id: this.id, hatchWaves: this.hatchWaves, sourceType: this.sourceType, timestamp: this.timestamp, tier: Math.floor(this.id / EGG_SEED) }); + } else { + return new Egg({id: this.id, tier: this.tier, sourceType: this.sourceType, hatchWaves: this.hatchWaves, + timestamp: this.timestamp, variantTier: this.variantTier, isShiny: this.isShiny, species: this.species, + eggMoveIndex: this.eggMoveIndex, overrideHiddenAbility: this.overrideHiddenAbility }); + } } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index f36bf1af229..ac54c942fc7 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,3 +1,4 @@ +import i18next from "i18next"; import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; @@ -1485,7 +1486,7 @@ export class GameData { if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(`${species.name} has been\nadded as a starter!`, null, () => checkPrevolution(), null, true); + this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(), null, true); } else { checkPrevolution(); } @@ -1551,7 +1552,9 @@ export class GameData { this.starterData[speciesId].eggMoves |= value; this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(`${eggMoveIndex === 3 ? "Rare " : ""}Egg Move unlocked: ${allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name}`, null, () => resolve(true), null, true); + + const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name; + this.scene.ui.showText(eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }), null, () => resolve(true), null, true); }); } diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 1cc525b0bac..b09de095259 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -96,7 +96,8 @@ export const SettingKeys = { Master_Volume: "MASTER_VOLUME", BGM_Volume: "BGM_VOLUME", SE_Volume: "SE_VOLUME", - Music_Preference: "MUSIC_PREFERENCE" + Music_Preference: "MUSIC_PREFERENCE", + Show_BGM_Bar: "SHOW_BGM_BAR", }; /** @@ -488,6 +489,14 @@ export const Setting: Array = [ default: 0, type: SettingType.DISPLAY }, + { + key: SettingKeys.Show_BGM_Bar, + label: i18next.t("settings:showBgmBar"), + options: OFF_ON, + default: 0, + type: SettingType.DISPLAY, + requireReload: true + }, { key: SettingKeys.Master_Volume, label: i18next.t("settings:masterVolume"), @@ -525,7 +534,8 @@ export const Setting: Array = [ default: 0, type: SettingType.AUDIO, requireReload: true - } + }, + ]; /** @@ -600,11 +610,13 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): case SettingKeys.Battle_Style: scene.battleStyle = value; break; + case SettingKeys.Show_BGM_Bar: + scene.showBgmBar = Setting[index].options[value].value === "On"; + break; case SettingKeys.Candy_Upgrade_Notification: if (scene.candyUpgradeNotification === value) { break; } - scene.candyUpgradeNotification = value; scene.eventTarget.dispatchEvent(new CandyUpgradeNotificationChangedEvent(value)); break; diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts new file mode 100644 index 00000000000..bfd1fdf59fe --- /dev/null +++ b/src/test/abilities/aura_break.test.ts @@ -0,0 +1,95 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { MoveEffectPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import Move, { allMoves } from "#app/data/move.js"; +import Pokemon from "#app/field/pokemon.js"; +import { FieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; +import { NumberHolder } from "#app/utils.js"; + +describe("Abilities - Aura Break", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const multiplier = 9 / 16; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + }); + + it("reverses the effect of fairy aura", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); + const basePower = allMoves[Moves.MOONBLAST].power; + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MOONBLAST)); + + const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.MOONBLAST]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(appliedPower).not.toBe(undefined); + expect(appliedPower).not.toBe(basePower); + expect(appliedPower).toBe(basePower * multiplier); + + }); + + it("reverses the effect of dark aura", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); + const basePower = allMoves[Moves.DARK_PULSE].power; + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DARK_PULSE)); + + const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.DARK_PULSE]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(appliedPower).not.toBe(undefined); + expect(appliedPower).not.toBe(basePower); + expect(appliedPower).toBe(basePower * multiplier); + }); +}); + +/** + * Calculates the mocked power of a move in a Pokémon battle, taking into account certain abilities. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used in the attack. + * @returns The calculated power of the move after applying any relevant ability effects. + * + * @remarks + * This function creates a NumberHolder with the initial power of the move. + * It then checks if the defender has an ability with the FieldMoveTypePowerBoostAbAttr. + * If so, it applies a power modification of 9/16 using an instance of FieldMoveTypePowerBoostAbAttr. + * The final calculated power is then returned. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move): number => { + const powerHolder = new NumberHolder(move.power); + + if (defender.hasAbilityWithAttr(FieldMoveTypePowerBoostAbAttr)) { + const auraBreakInstance = new FieldMoveTypePowerBoostAbAttr(move.type, 9 / 16); + auraBreakInstance.applyPreAttack(attacker, false, defender, move, [powerHolder]); + } + + return powerHolder.value; +}; diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 93bac836f61..53a04732b74 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -3,7 +3,6 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import * as overrides from "#app/overrides"; import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import Move, { allMoves, MoveCategory } from "#app/data/move.js"; @@ -42,13 +41,11 @@ describe("Abilities - Battery", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); }); it("does not raise the power of allies' non-special moves", async () => { @@ -61,13 +58,11 @@ describe("Abilities - Battery", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).toBe(basePower); - expect(appliedPower).not.toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); }); it("does not raise the power of the ability owner's special moves", async () => { @@ -80,25 +75,25 @@ describe("Abilities - Battery", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).toBe(basePower); - expect(appliedPower).not.toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); }); }); /** - * Calculates the adjusted applied power of a move. + * Calculates the mocked power of a move. + * Note this does not consider other damage calculations + * except the power multiplier from Battery. * * @param defender - The defending Pokémon. * @param attacker - The attacking Pokémon. * @param move - The move being used by the attacker. * @returns The adjusted power of the move. */ -const getAppliedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { const powerHolder = new NumberHolder(move.power); /** diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts new file mode 100644 index 00000000000..1b7eb3f7b90 --- /dev/null +++ b/src/test/abilities/costar.test.ts @@ -0,0 +1,91 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import Phaser from "phaser"; +import * as Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { CommandPhase, MessagePhase } from "#app/phases.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { Abilities } from "#app/enums/abilities.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - COSTAR", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT, Moves.CURSE]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + + test( + "ability copies positive stat changes", + async () => { + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon).not.toBe(undefined); + expect(rightPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.NASTY_PLOT)); + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + + expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + }, + TIMEOUT, + ); + + test( + "ability copies negative stat changes", + async () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon).not.toBe(undefined); + expect(rightPokemon).not.toBe(undefined); + + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(rightPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + }, + TIMEOUT, + ); +}); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 09fd8733f93..7d85f5bbc55 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -55,7 +55,7 @@ describe("Abilities - Ice Face", () => { it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SURGING_STRIKES]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); await game.startBattle([Species.HITMONLEE]); game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES)); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index a11feea9f88..a00239a651b 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Protean", () => { TIMEOUT, ); - test( + test.skip( "ability applies only once per switch in", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 5450aee9742..0ed2b10f4be 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -3,7 +3,6 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import * as overrides from "#app/overrides"; import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import Move, { allMoves, MoveCategory } from "#app/data/move.js"; @@ -42,13 +41,11 @@ describe("Abilities - Power Spot", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); }); it("raises the power of allies' physical moves by 30%", async () => { @@ -61,13 +58,11 @@ describe("Abilities - Power Spot", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); }); it("does not raise the power of the ability owner's moves", async () => { @@ -80,25 +75,25 @@ describe("Abilities - Power Spot", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const appliedPower = getAppliedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).toBe(basePower); - expect(appliedPower).not.toBe(basePower * multiplier); + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); }); }); /** - * Calculates the adjusted applied power of a move. + * Calculates the mocked power of a move. + * Note this does not consider other damage calculations + * except the power multiplier from Power Spot. * * @param defender - The defending Pokémon. * @param attacker - The attacking Pokémon. * @param move - The move being used by the attacker. * @returns The adjusted power of the move. */ -const getAppliedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { const powerHolder = new NumberHolder(move.power); /** diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index d102daf7fcc..125c03eb39c 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Protean", () => { TIMEOUT, ); - test( + test.skip( "ability applies only once per switch in", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts new file mode 100644 index 00000000000..6b72b83bd18 --- /dev/null +++ b/src/test/abilities/quick_draw.test.ts @@ -0,0 +1,117 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import {Abilities} from "#enums/abilities"; +import {Species} from "#enums/species"; +import {EnemyCommandPhase, TitlePhase, TurnEndPhase, TurnStartPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { Stat } from "#app/data/pokemon-stat"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allAbilities, BypassSpeedChanceAbAttr } from "#app/data/ability"; + + +describe("Abilities - Quick Draw", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue( + Abilities.QUICK_DRAW + ); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue( + Species.RATTATA + ); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ + Moves.TACKLE, + Moves.TACKLE, + Moves.TACKLE, + Moves.TACKLE, + ]); + + vi.spyOn( + allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], + "chance","get" + ).mockReturnValue(100); + }); + + it("makes pokemon going first in its priority bracket", async() => { + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getParty()[0]; + const enemy = game.scene.getEnemyParty()[0]; + + pokemon.stats[Stat.SPD] = 50; + enemy.stats[Stat.SPD] = 150; + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.run(EnemyCommandPhase); + await game.phaseInterceptor.run(TurnStartPhase); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(pokemon.battleData.abilityRevealed).toBe(true); + }, 20000); + + it("does not triggered by non damage moves", async () => { + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getParty()[0]; + const enemy = game.scene.getEnemyParty()[0]; + + pokemon.stats[Stat.SPD] = 50; + enemy.stats[Stat.SPD] = 150; + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC)); + + await game.phaseInterceptor.run(EnemyCommandPhase); + await game.phaseInterceptor.run(TurnStartPhase); + await game.phaseInterceptor.to(TitlePhase); + + expect(pokemon.battleData.abilityRevealed).not.toBe(true); + }, 20000); + + it("does not increase priority", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ + Moves.EXTREME_SPEED, + Moves.EXTREME_SPEED, + Moves.EXTREME_SPEED, + Moves.EXTREME_SPEED, + ]); + + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getParty()[0]; + const enemy = game.scene.getEnemyParty()[0]; + + pokemon.stats[Stat.SPD] = 50; + enemy.stats[Stat.SPD] = 150; + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.run(EnemyCommandPhase); + await game.phaseInterceptor.run(TurnStartPhase); + await game.phaseInterceptor.to(TitlePhase); + + expect(pokemon.battleData.abilityRevealed).toBe(true); + }, 20000); +}); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 1c9943fbfc8..d790469e952 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -27,6 +27,7 @@ describe("Abilities - Screen Cleaner", () => { game = new GameManager(phaserGame); vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); }); it("removes Aurora Veil", async () => { diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 7bfac5e8f18..b9d764971f0 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -3,7 +3,8 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import * as overrides from "#app/overrides"; import { - TurnEndPhase, + DamagePhase, + MoveEndPhase, } from "#app/phases"; import {getMovePosition} from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; @@ -45,7 +46,7 @@ describe("Abilities - Sturdy", () => { async () => { await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); expect(game.scene.getEnemyParty()[0].hp).toBe(1); }, TIMEOUT @@ -55,10 +56,13 @@ describe("Abilities - Sturdy", () => { "Sturdy doesn't activate when user is not at full HP", async () => { await game.startBattle(); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; + game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(DamagePhase); + expect(enemyPokemon.hp).toBe(0); expect(enemyPokemon.isFainted()).toBe(true); }, @@ -66,11 +70,12 @@ describe("Abilities - Sturdy", () => { ); test( - "Sturdy pokemon should be inmune to OHKO moves", + "Sturdy pokemon should be immune to OHKO moves", async () => { await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }, @@ -84,7 +89,8 @@ describe("Abilities - Sturdy", () => { await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(DamagePhase); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; expect(enemyPokemon.hp).toBe(0); expect(enemyPokemon.isFainted()).toBe(true); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index a799e203f03..c53be8c82a4 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -31,6 +31,7 @@ describe("Abilities - Unseen Fist", () => { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); test( @@ -81,7 +82,7 @@ async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, pro const enemyStartingHp = enemyPokemon.hp; game.doAttack(getMovePosition(game.scene, 0, attackMove)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); if (shouldSucceed) { expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts new file mode 100644 index 00000000000..89957362268 --- /dev/null +++ b/src/test/abilities/wind_power.test.ts @@ -0,0 +1,97 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +describe("Abilities - Wind Power", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("it becomes charged when hit by wind moves", async () => { + await game.startBattle([Species.MAGIKARP]); + const shiftry = game.scene.getEnemyPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + }); + + it("it becomes charged when Tailwind takes effect on its side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + }); + + it("does not become charged when Tailwind takes effect on opposing side", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + }); + + it("does not interact with Sandstorm", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + }); +}); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts new file mode 100644 index 00000000000..2b9361f5839 --- /dev/null +++ b/src/test/abilities/wind_rider.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; + +describe("Abilities - Wind Rider", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => { + await game.startBattle([Species.MAGIKARP]); + const shiftry = game.scene.getEnemyPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + }); + + it("Attack is increased by one stage when Tailwind is present on its side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + }); + + it("does not increase Attack when Tailwind is present on opposing side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + }); + + it("does not increase Attack when Tailwind is present on opposing side", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + }); + + it("does not interact with Sandstorm", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(shiftry.hp).equals(shiftry.getMaxHp()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(shiftry.hp).lessThan(shiftry.getMaxHp()); + }); +}); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index b5572bb4117..4dc4b1d4282 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -39,13 +39,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).not.toBe(100); - expect(appliedAccuracy).toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).not.toBe(100); + expect(mockedAccuracy).toBe(50); }); it("does not lower accuracy of non-status moves", async () => { @@ -53,13 +53,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); it("does not affect pokemon with Mold Breaker", async () => { @@ -69,13 +69,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); it("does not affect pokemon with Teravolt", async () => { @@ -85,13 +85,13 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); it("does not affect pokemon with Turboblaze", async () => { @@ -101,25 +101,28 @@ describe("Abilities - Wonder Skin", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - const appliedAccuracy = getAppliedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); await game.phaseInterceptor.to(TurnEndPhase); - expect(appliedAccuracy).not.toBe(undefined); - expect(appliedAccuracy).toBe(100); - expect(appliedAccuracy).not.toBe(50); + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); }); }); /** - * Calculates the adjusted applied accuracy of a move. + * Calculates the mocked accuracy of a move. + * Note this does not consider other accuracy calculations + * except the power multiplier from Wonder Skin. + * Bypassed by MoveAbilityBypassAbAttr {@linkcode MoveAbilityBypassAbAttr} * * @param defender - The defending Pokémon. * @param attacker - The attacking Pokémon. * @param move - The move being used by the attacker. * @returns The adjusted accuracy of the move. */ -const getAppliedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { +const getMockedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { const accuracyHolder = new NumberHolder(move.accuracy); /** diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index e6c4ad0e16e..07678e7e1ea 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,17 +1,33 @@ -import {beforeAll, describe, expect, it} from "vitest"; +import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; import BattleScene from "../../battle-scene"; -import { getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; +import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; import { Species } from "#enums/species"; import Phaser from "phaser"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggTier } from "#app/enums/egg-type.js"; +import { VariantTier } from "#app/enums/variant-tiers.js"; +import GameManager from "../utils/gameManager"; +import EggData from "#app/system/egg-data.js"; -describe("getLegendaryGachaSpeciesForTimestamp", () => { +describe("Egg Generation Tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; beforeAll(() => { - new Phaser.Game({ + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); }); + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async() => { + game = new GameManager(phaserGame); + await game.importData("src/test/utils/saves/everything.prsv"); + }); + it("should return Arceus for the 10th of June", () => { const scene = new BattleScene(); const timestamp = new Date(2024, 5, 10, 15, 0, 0, 0).getTime(); @@ -30,4 +46,246 @@ describe("getLegendaryGachaSpeciesForTimestamp", () => { expect(result).toBe(expectedSpecies); }); + it("should hatch an Arceus. Set from legendary gacha", async() => { + const scene = game.scene; + const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime(); + const expectedSpecies = Species.ARCEUS; + + const result = new Egg({scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.MASTER}).generatePlayerPokemon(scene).species.speciesId; + + expect(result).toBe(expectedSpecies); + }); + it("should hatch an Arceus. Set from species", () => { + const scene = game.scene; + const expectedSpecies = Species.ARCEUS; + + const result = new Egg({scene,species: expectedSpecies}).generatePlayerPokemon(scene).species.speciesId; + + expect(result).toBe(expectedSpecies); + }); + it("should return an common tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.COMMON; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an rare tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.GREAT; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an epic tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.ULTRA; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an legendary tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.MASTER; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return a manaphy egg set via species", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, species: Species.MANAPHY}).isManaphyEgg(); + + expect(result).toBe(expectedResult); + }); + it("should return a manaphy egg set via id", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, tier: EggTier.COMMON, id: 204}).isManaphyEgg(); + + expect(result).toBe(expectedResult); + }); + it("should return an egg with 1000 hatch waves", () => { + const scene = game.scene; + const expectedHatchWaves = 1000; + + const result = new Egg({scene, hatchWaves: expectedHatchWaves}).hatchWaves; + + expect(result).toBe(expectedHatchWaves); + }); + it("should return an shiny pokemon", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, isShiny: expectedResult, species: Species.BULBASAUR}).generatePlayerPokemon(scene).isShiny(); + + expect(result).toBe(expectedResult); + }); + it("should return a shiny common variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.COMMON; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return a shiny rare variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.RARE; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return a shiny epic variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.EPIC; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return an egg with an egg move index of 0, 1, 2 or 3", () => { + const scene = game.scene; + + const eggMoveIndex = new Egg({scene}).eggMoveIndex; + const result = eggMoveIndex && eggMoveIndex >= 0 && eggMoveIndex <= 3; + + expect(result).toBe(true); + }); + it("should return an egg with an rare egg move. Egg move index should be 3", () => { + const scene = game.scene; + const expectedEggMoveIndex = 3; + + const result = new Egg({scene, eggMoveIndex: expectedEggMoveIndex}).eggMoveIndex; + + expect(result).toBe(expectedEggMoveIndex); + }); + it("should return a hatched pokemon with a hidden ability", () => { + const scene = game.scene; + + const playerPokemon = new Egg({scene, overrideHiddenAbility: true, species: Species.BULBASAUR}).generatePlayerPokemon(scene); + const expectedAbilityIndex = playerPokemon.species.ability2 ? 2 : 1; + + const result = playerPokemon.abilityIndex; + + expect(result).toBe(expectedAbilityIndex); + }); + it("should add the egg to the game data", () => { + const scene = game.scene; + const expectedEggCount = 1; + + new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}); + + const result = scene.gameData.eggs.length; + + expect(result).toBe(expectedEggCount); + }); + it("should override the egg tier to common", () => { + const scene = game.scene; + const expectedEggTier = EggTier.COMMON; + + const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).tier; + + expect(result).toBe(expectedEggTier); + }); + it("should override the egg hatch waves", () => { + const scene = game.scene; + const expectedHatchWaves = 10; + + const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).hatchWaves; + + expect(result).toBe(expectedHatchWaves); + }); + it("should correctly load a legacy egg", () => { + const legacyEgg = { + gachaType: 1, + hatchWaves: 25, + id: 2077000788, + timestamp: 1718908955085, + isShiny: false, + overrideHiddenAbility: false, + sourceType: 0, + species: 0, + tier: 0, + variantTier: 0, + eggMoveIndex: 0, + }; + + const result = new EggData(legacyEgg).toEgg(); + + expect(result.tier).toBe(EggTier.GREAT); + expect(result.id).toBe(legacyEgg.id); + expect(result.timestamp).toBe(legacyEgg.timestamp); + expect(result.hatchWaves).toBe(legacyEgg.hatchWaves); + expect(result.sourceType).toBe(legacyEgg.gachaType); + }); + it("should increase egg pity", () => { + const scene = game.scene; + const startPityValues = [...scene.gameData.eggPity]; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON}); + + expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); + expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); + expect(scene.gameData.eggPity[EggTier.MASTER]).toBe(startPityValues[EggTier.MASTER] + 1); + }); + it("should increase legendary egg pity by two", () => { + const scene = game.scene; + const startPityValues = [...scene.gameData.eggPity]; + + new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON}); + + expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); + expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); + expect(scene.gameData.eggPity[EggTier.MASTER]).toBe(startPityValues[EggTier.MASTER] + 2); + }); + it("should not increase manaphy egg count if bulbasaurs are pulled", () => { + const scene = game.scene; + const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; + + for (let i = 0; i < 200; i++) { + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR}); + } + + expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount); + }); + it("should increase manaphy egg count", () => { + const scene = game.scene; + const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON}); + + expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount + 1); + }); + it("should increase rare eggs pulled statistic", () => { + const scene = game.scene; + const startingRareEggsPulled = scene.gameData.gameStats.rareEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.GREAT}); + + expect(scene.gameData.gameStats.rareEggsPulled).toBe(startingRareEggsPulled + 1); + }); + it("should increase epic eggs pulled statistic", () => { + const scene = game.scene; + const startingEpicEggsPulled = scene.gameData.gameStats.epicEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.ULTRA}); + + expect(scene.gameData.gameStats.epicEggsPulled).toBe(startingEpicEggsPulled + 1); + }); + it("should increase legendary eggs pulled statistic", () => { + const scene = game.scene; + const startingLegendaryEggsPulled = scene.gameData.gameStats.legendaryEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.MASTER}); + + expect(scene.gameData.gameStats.legendaryEggsPulled).toBe(startingLegendaryEggsPulled + 1); + }); }); diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts new file mode 100644 index 00000000000..5b4561d4877 --- /dev/null +++ b/src/test/items/eviolite.test.ts @@ -0,0 +1,278 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Stat } from "#app/data/pokemon-stat"; +import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; +import { Species } from "#enums/species"; + +describe("Items - Eviolite", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("EVIOLITE activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.PICHU + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Eviolite is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + }); + + it("EVIOLITE held by unevolved, unfused pokemon", async() => { + await game.startBattle([ + Species.PICHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.5); + expect(spDefValue.value / spDefStat).toBe(1.5); + }, 20000); + + it("EVIOLITE held by fully evolved, unfused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + }, 20000); + + it("EVIOLITE held by completely unevolved, fused pokemon", async() => { + await game.startBattle([ + Species.PICHU, + Species.CLEFFA + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.5); + expect(spDefValue.value / spDefStat).toBe(1.5); + }, 20000); + + it("EVIOLITE held by partially unevolved (base), fused pokemon", async() => { + await game.startBattle([ + Species.PICHU, + Species.CLEFABLE + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.25); + expect(spDefValue.value / spDefStat).toBe(1.25); + }, 20000); + + it("EVIOLITE held by partially unevolved (fusion), fused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + Species.CLEFFA + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.25); + expect(spDefValue.value / spDefStat).toBe(1.25); + }, 20000); + + it("EVIOLITE held by completely evolved, fused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + Species.CLEFABLE + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + }, 20000); +}); diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/lokalisation/battle-stat.test.ts index cd21f638258..d894d705947 100644 --- a/src/test/lokalisation/battle-stat.test.ts +++ b/src/test/lokalisation/battle-stat.test.ts @@ -41,7 +41,7 @@ function testBattleStatName(stat: BattleStat, expectMessage: string) { } function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { - const message = getBattleStatLevelChangeDescription(levels, up); + const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); console.log(`message ${message}, expected ${expectMessage}`); expect(message).toBe(expectMessage); } diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts new file mode 100644 index 00000000000..e9c3d920717 --- /dev/null +++ b/src/test/moves/aurora_veil.test.ts @@ -0,0 +1,124 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { WeatherType } from "#app/data/weather.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Aurora Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); + }); + + it("reduces damage of physical attacks by half in a single battle", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of physical attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.ROCK_SLIDE; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("reduces damage of special attacks by half in a single battle", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of special attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.DAZZLING_GLEAM; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Auroa Veil in this case {@linkcode Moves.AURORA_VEIL}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts new file mode 100644 index 00000000000..f94af93fc66 --- /dev/null +++ b/src/test/moves/flower_shield.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Biome } from "#app/enums/biome.js"; +import { Type } from "#app/data/type.js"; +import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; + +describe("Moves - Flower Shield", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); + + await game.startBattle([Species.MAGIKARP]); + const cherrim = game.scene.getEnemyPokemon(); + const magikarp = game.scene.getPlayerPokemon(); + + expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1); + }); + + it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); + const field = game.scene.getField(true); + + const grassPokemons = field.filter(p => p.getTypes().includes(Type.GRASS)); + const nonGrassPokemons = field.filter(pokemon => !grassPokemons.includes(pokemon)); + + grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(1)); + nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + }); + + /** + * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} + */ + it("does not increase defense of a pokemon in semi-vulnerable state", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); + + await game.startBattle([Species.CHERRIM]); + const paras = game.scene.getEnemyPokemon(); + const cherrim = game.scene.getPlayerPokemon(); + + expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(paras.getTag(SemiInvulnerableTag)).toBeUndefined; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(paras.getTag(SemiInvulnerableTag)).toBeDefined(); + expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1); + }); + + it("does nothing if there are no Grass-type pokemon on the field", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.MAGIKARP]); + const enemy = game.scene.getEnemyPokemon(); + const ally = game.scene.getPlayerPokemon(); + + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0); + }); +}); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 54b972e7cc0..f0b80ab90c0 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -36,6 +36,7 @@ describe("Moves - Follow Me", () => { vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); @@ -53,7 +54,7 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - playerPokemon.forEach(p => p.hp = 200); + const playerStartingHp = playerPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); await game.phaseInterceptor.to(CommandPhase); @@ -62,10 +63,10 @@ describe("Moves - Follow Me", () => { await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(playerPokemon[0].hp).toBeLessThan(200); - expect(playerPokemon[1].hp).toBe(200); + expect(playerPokemon[0].hp).toBeLessThan(playerStartingHp[0]); + expect(playerPokemon[1].hp).toBe(playerStartingHp[1]); }, TIMEOUT ); @@ -82,18 +83,18 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - playerPokemon.forEach(p => p.hp = 200); + const playerStartingHp = playerPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); await game.phaseInterceptor.to(CommandPhase); game.doAttack(getMovePosition(game.scene, 1, Moves.FOLLOW_ME)); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); playerPokemon.sort((a, b) => a.getBattleStat(Stat.SPD) - b.getBattleStat(Stat.SPD)); - expect(playerPokemon[1].hp).toBeLessThan(200); - expect(playerPokemon[0].hp).toBe(200); + expect(playerPokemon[1].hp).toBeLessThan(playerStartingHp[1]); + expect(playerPokemon[0].hp).toBe(playerStartingHp[0]); }, TIMEOUT ); @@ -114,7 +115,7 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -124,10 +125,11 @@ describe("Moves - Follow Me", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); @@ -147,7 +149,7 @@ describe("Moves - Follow Me", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.SNIPE_SHOT)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -157,10 +159,11 @@ describe("Moves - Follow Me", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SNIPE_SHOT)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); }); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts new file mode 100644 index 00000000000..063a17aead9 --- /dev/null +++ b/src/test/moves/gastro_acid.test.ts @@ -0,0 +1,93 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import { + Moves +} from "#app/enums/moves.js"; +import * as overrides from "#app/overrides"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveResult } from "#app/field/pokemon.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { Species } from "#app/enums/species.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Gastro Acid", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); + }); + + it("suppresses effect of ability", async () => { + /* + * Expected flow (enemies have WATER ABSORD, can only use SPLASH) + * - player mon 1 uses GASTRO ACID, player mon 2 uses SPLASH + * - both player mons use WATER GUN on their respective enemy mon + * - player mon 1 should have dealt damage, player mon 2 should have not + */ + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + game.doSelectTarget(BattlerIndex.ENEMY); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnInitPhase"); + + const enemyField = game.scene.getEnemyField(); + expect(enemyField[0].summonData.abilitySuppressed).toBe(true); + expect(enemyField[1].summonData.abilitySuppressed).toBe(false); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.doSelectTarget(BattlerIndex.ENEMY); + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.doSelectTarget(BattlerIndex.ENEMY_2); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyField[0].hp).toBeLessThan(enemyField[0].getMaxHp()); + expect(enemyField[1].hp).toBe(enemyField[1].getMaxHp()); + }, TIMEOUT); + + it("fails if used on an enemy with an already-suppressed ability", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + + await game.startBattle(); + + // Force player to be slower to enable Core Enforcer to proc its suppression effect + game.scene.getPlayerPokemon().stats[Stat.SPD] = 1; + game.scene.getEnemyPokemon().stats[Stat.SPD] = 2; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CORE_ENFORCER)); + + await game.phaseInterceptor.to("TurnInitPhase"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + + await game.phaseInterceptor.to("TurnInitPhase"); + + expect(game.scene.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }, TIMEOUT); +}); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts new file mode 100644 index 00000000000..30a27ce4412 --- /dev/null +++ b/src/test/moves/light_screen.test.ts @@ -0,0 +1,106 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Light Screen", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("reduces damage of special attacks by half in a single battle", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of special attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.DAZZLING_GLEAM; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("does not affect physical attacks", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Light Screen in this case {@linkcode Moves.LIGHT_SCREEN}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 6a204877150..1116810f743 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -35,6 +35,7 @@ describe("Moves - Rage Powder", () => { vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); @@ -54,7 +55,7 @@ describe("Moves - Rage Powder", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -64,10 +65,11 @@ describe("Moves - Rage Powder", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); @@ -88,7 +90,7 @@ describe("Moves - Rage Powder", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -98,10 +100,11 @@ describe("Moves - Rage Powder", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); // If redirection was bypassed, both enemies should be damaged - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(200)); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); }, TIMEOUT ); }); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts new file mode 100644 index 00000000000..00fb9a69f2f --- /dev/null +++ b/src/test/moves/reflect.test.ts @@ -0,0 +1,106 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Reflect", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("reduces damage of physical attacks by half in a single battle", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of physical attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.ROCK_SLIDE; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("does not affect special attacks", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Reflect in this case {@linkcode Moves.REFLECT}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts new file mode 100644 index 00000000000..db9363313a1 --- /dev/null +++ b/src/test/moves/roost.test.ts @@ -0,0 +1,64 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Roost", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); + }); + + test( + "move should ground the user until the end of turn", + async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOMPING_TANTRUM)); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(enemyPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.getTag(BattlerTagType.ROOSTED)).toBeUndefined(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 188207b713c..ec3f4977007 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -35,6 +35,7 @@ describe("Moves - Spotlight", () => { vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); @@ -52,7 +53,7 @@ describe("Moves - Spotlight", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); + const enemyStartingHp = enemyPokemon.map(p => p.hp); game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); await game.phaseInterceptor.to(SelectTargetPhase, false); @@ -62,10 +63,10 @@ describe("Moves - Spotlight", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(enemyPokemon[0].hp).toBeLessThan(200); - expect(enemyPokemon[1].hp).toBe(200); + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBe(enemyStartingHp[1]); }, TIMEOUT ); @@ -84,8 +85,6 @@ describe("Moves - Spotlight", () => { expect(enemyPokemon.length).toBe(2); enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); - enemyPokemon.forEach(p => p.hp = 200); - /** * Spotlight will target the slower enemy. In this situation without Spotlight being used, * the faster enemy would normally end up with the Center of Attention tag. @@ -94,6 +93,8 @@ describe("Moves - Spotlight", () => { const spotTarget = enemyPokemon[1].getBattlerIndex(); const attackTarget = enemyPokemon[0].getBattlerIndex(); + const enemyStartingHp = enemyPokemon.map(p => p.hp); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(spotTarget); @@ -102,10 +103,10 @@ describe("Moves - Spotlight", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); await game.phaseInterceptor.to(SelectTargetPhase, false); game.doSelectTarget(attackTarget); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(enemyPokemon[1].hp).toBeLessThan(200); - expect(enemyPokemon[0].hp).toBe(200); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + expect(enemyPokemon[0].hp).toBe(enemyStartingHp[0]); }, TIMEOUT ); }); diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts new file mode 100644 index 00000000000..efba97f8fe1 --- /dev/null +++ b/src/test/moves/tailwind.test.ts @@ -0,0 +1,108 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; + +describe("Abilities - Wind Rider", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("doubles the Speed stat of the Pokemons on its side", async () => { + await game.startBattle([Species.MAGIKARP, Species.MEOWTH]); + const magikarp = game.scene.getPlayerField()[0]; + const meowth = game.scene.getPlayerField()[1]; + + const magikarpSpd = magikarp.getStat(Stat.SPD); + const meowthSpd = meowth.getStat(Stat.SPD); + + expect(magikarp.getBattleStat(Stat.SPD)).equal(magikarpSpd); + expect(meowth.getBattleStat(Stat.SPD)).equal(meowthSpd); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.getBattleStat(Stat.SPD)).toBe(magikarpSpd * 2); + expect(meowth.getBattleStat(Stat.SPD)).toBe(meowthSpd * 2); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("lasts for 4 turns", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); + }); + + it("does not affect the opposing side", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.MAGIKARP]); + + const ally = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + const allySpd = ally.getStat(Stat.SPD); + const enemySpd = enemy.getStat(Stat.SPD); + + + expect(ally.getBattleStat(Stat.SPD)).equal(allySpd); + expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(ally.getBattleStat(Stat.SPD)).toBe(allySpd * 2); + expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined(); + }); +}); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts new file mode 100644 index 00000000000..c641643593e --- /dev/null +++ b/src/test/moves/thousand_arrows.test.ts @@ -0,0 +1,95 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + MoveEffectPhase, + TurnEndPhase +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Thousand Arrows", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + }); + + test( + "move should hit and ground Flying-type targets", + async () => { + await game.startBattle([ Species.ILLUMISE ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); + + test( + "move should hit and ground targets with Levitate", + async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); + + await game.startBattle([ Species.ILLUMISE ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); +}); diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index da54471a7e3..b1b00c8e15d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -24,6 +24,7 @@ import BattleScene from "#app/battle-scene.js"; import {MoveAnim} from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as battleScene from "#app/battle-scene"; +import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage.js"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -35,6 +36,7 @@ Object.defineProperty(window, "console", { InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; +Phaser.GameObjects.Image = MockImage; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { localStorage.setItem("toExport", data); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index f81f24af9bb..dac67bd7b4e 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -1,3 +1,5 @@ +import BattleScene from "#app/battle-scene.js"; +import { TextStyle, addTextObject } from "#app/ui/text.js"; export enum EventType { SHINY @@ -18,7 +20,7 @@ const timedEvents: TimedEvent[] = [ eventType: EventType.SHINY, shinyMultiplier: 2, startDate: new Date(Date.UTC(2024, 5, 14, 0)), - endDate: new Date(Date.UTC(2024, 5, 22, 0)), + endDate: new Date(Date.UTC(2024, 5, 23, 0)), bannerFilename: "pride-update" }, ]; @@ -60,3 +62,89 @@ export class TimedEventManager { return timedEvents.find((te: TimedEvent) => this.isActive(te)).bannerFilename ?? null; } } + +export class TimedEventDisplay extends Phaser.GameObjects.Container { + private event: TimedEvent; + private eventTimerText: Phaser.GameObjects.Text; + private banner: Phaser.GameObjects.Image; + private bannerShadow: Phaser.GameObjects.Rectangle; + private eventTimer: NodeJS.Timeout; + + constructor(scene: BattleScene, x: number, y: number, event: TimedEvent) { + super(scene, x, y); + this.event = event; + this.setVisible(false); + } + + setup() { + this.banner = new Phaser.GameObjects.Image(this.scene, 29, 64, this.event.bannerFilename); + this.banner.setName("img-event-banner"); + this.banner.setOrigin(0, 0); + this.banner.setScale(0.07); + this.bannerShadow = new Phaser.GameObjects.Rectangle( + this.scene, + this.banner.x - 2, + this.banner.y + 2, + this.banner.width, + this.banner.height, + 0x484848 + ); + this.bannerShadow.setName("rect-event-banner-shadow"); + this.bannerShadow.setScale(0.07); + this.bannerShadow.setAlpha(0.5); + this.bannerShadow.setOrigin(0,0); + this.eventTimerText = addTextObject( + this.scene, + this.banner.x + 8, + this.banner.y + 100, + this.timeToGo(this.event.endDate), + TextStyle.WINDOW + ); + this.eventTimerText.setName("text-event-timer"); + this.eventTimerText.setScale(0.15); + this.eventTimerText.setOrigin(0,0); + + this.add([this.eventTimerText, this.bannerShadow, this.banner]); + } + + show() { + this.setVisible(true); + this.updateCountdown(); + + this.eventTimer = setInterval(() => { + this.updateCountdown(); + }, 1000); + } + + clear() { + this.setVisible(false); + clearInterval(this.eventTimer); + this.eventTimer = null; + } + + private timeToGo(date: Date) { + + // Utility to add leading zero + function z(n) { + return (n < 10? "0" : "") + n; + } + const now = new Date(); + let diff = Math.abs(date.getTime() - now.getTime()); + + // Allow for previous times + diff = Math.abs(diff); + + // Get time components + const days = diff/8.64e7 | 0; + const hours = diff%8.64e7 / 3.6e6 | 0; + const mins = diff%3.6e6 / 6e4 | 0; + const secs = Math.round(diff%6e4 / 1e3); + + // Return formatted string + return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs)+ "s"; + } + + updateCountdown() { + this.eventTimerText.setText(this.timeToGo(this.event.endDate)); + } +} diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 2bc5f028ddb..a0b249695b9 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -44,9 +44,6 @@ export default class AbilityBar extends Phaser.GameObjects.Container { (this.scene as BattleScene).fieldUI.bringToTop(this); - if (this.tween) { - this.tween.stop(); - } this.y = baseY + ((this.scene as BattleScene).currentBattle.double ? 14 : 0); this.tween = this.scene.tweens.add({ diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index c4877cfca59..2069f034e89 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -58,10 +58,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const ui = this.getUi(); this.optionSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -48); + this.optionSelectContainer.setName(`option-select-${Mode[this.mode]}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); this.optionSelectBg = addWindow(this.scene, 0, 0, this.getWindowWidth(), this.getWindowHeight()); + this.optionSelectBg.setName("option-select-bg"); this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); @@ -82,6 +84,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join("\n"), TextStyle.WINDOW, { maxLines: options.length }); + this.optionSelectText.setName("text-option-select"); this.optionSelectText.setLineSpacing(12); this.optionSelectContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 963b1ac4eb1..9c0a2e7c8ce 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -89,6 +89,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { constructor(scene: Phaser.Scene) { super(scene, 0, 0); + this.setName("arena-flyout"); this.battleScene = this.scene as BattleScene; this.translationX = this.flyoutWidth; @@ -183,19 +184,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); } - /** - * Formats a string to title case - * @param unformattedText Text to be formatted - * @returns the formatted string - */ - private formatText(unformattedText: string): string { - const text = unformattedText.split("_"); - for (let i = 0; i < text.length; i++) { - text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); - } - return text.join(" "); - } /** Clears out the current string stored in all arena effect texts */ private clearText() { @@ -232,7 +221,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { break; } - textObject.text += this.formatText(fieldEffectInfo.name); + textObject.text += Utils.formatText(fieldEffectInfo.name); if (fieldEffectInfo.effecType === ArenaEffectType.TERRAIN) { textObject.text += " Terrain"; // Adds 'Terrain' since the enum does not contain it } @@ -273,16 +262,16 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; let name: string = ArenaTagType[tagAddedEvent.arenaTagType]; - if (isArenaTrapTag && tagAddedEvent.arenaTagMaxLayers > 1) { + if (isArenaTrapTag) { if (existingTrapTagIndex !== -1) { - this.fieldEffectInfo[existingTrapTagIndex].name = `${name} (${tagAddedEvent.arenaTagLayers})`; + const layers = tagAddedEvent.arenaTagMaxLayers > 1 ? ` (${tagAddedEvent.arenaTagLayers})` : ""; + this.fieldEffectInfo[existingTrapTagIndex].name = `${name}${layers}`; break; - } else { + } else if (tagAddedEvent.arenaTagMaxLayers > 1) { name = `${name} (${tagAddedEvent.arenaTagLayers})`; } } - this.fieldEffectInfo.push({ name, effecType: arenaEffectType, diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 49482d5c575..f2da553c6da 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -16,7 +16,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { private nameBox: Phaser.GameObjects.NineSlice; private nameText: Phaser.GameObjects.Text; - public bg: Phaser.GameObjects.Image; + public bg: Phaser.GameObjects.Sprite; public commandWindow: Phaser.GameObjects.NineSlice; public movesWindowContainer: Phaser.GameObjects.Container; public nameBoxContainer: Phaser.GameObjects.Container; @@ -31,33 +31,30 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textTimer = null; this.textCallbackTimer = null; - const bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); - bg.setOrigin(0, 1); - ui.add(bg); + this.bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); + this.bg.setName("sprite-battle-msg-bg"); + this.bg.setOrigin(0, 1); + ui.add(this.bg); - this.bg = bg; - - this.commandWindow = addWindow(this.scene, 201, -1, 118, 46); + this.commandWindow = addWindow(this.scene, 202, 0, 118, 48); + this.commandWindow.setName("window-command"); this.commandWindow.setOrigin(0, 1); this.commandWindow.setVisible(false); ui.add(this.commandWindow); - this.movesWindowContainer = this.scene.add.container(1, -1); + this.movesWindowContainer = this.scene.add.container(0, 0); + this.movesWindowContainer.setName("moves-bg"); this.movesWindowContainer.setVisible(false); - const movesWindow = addWindow(this.scene, 0, 0, 243, 46); + const movesWindow = addWindow(this.scene, 0, 0, 243, 48); + movesWindow.setName("moves-window"); movesWindow.setOrigin(0, 1); - this.movesWindowContainer.add(movesWindow); - const moveDetailsWindow = addWindow(this.scene, 238, 0, 80, 46, false, true, 2, 133); + const moveDetailsWindow = addWindow(this.scene, 240, 0, 80, 48, false, false, -1, 132); + moveDetailsWindow.setName("move-details-window"); moveDetailsWindow.setOrigin(0, 1); - this.movesWindowContainer.add(moveDetailsWindow); - - // TODO: Maybe remove this asset definitively if it's no longer needed? - // const commandFightLabels = this.scene.add.image(246, -10, 'command_fight_labels'); - // commandFightLabels.setOrigin(0, 1); - // this.movesWindowContainer.add(commandFightLabels); + this.movesWindowContainer.add([movesWindow, moveDetailsWindow]); ui.add(this.movesWindowContainer); const messageContainer = this.scene.add.container(12, -39); diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts new file mode 100644 index 00000000000..5bca9632012 --- /dev/null +++ b/src/ui/bgm-bar.ts @@ -0,0 +1,101 @@ +import BattleScene from "../battle-scene"; +import {addTextObject, TextStyle} from "./text"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; + + +const hiddenX = -150; +const shownX = 0; +const baseY = 0; + + +export default class BgmBar extends Phaser.GameObjects.Container { + private defaultWidth: number; + private defaultHeight: number; + + private bg: Phaser.GameObjects.NineSlice; + private musicText: Phaser.GameObjects.Text; + private noteText: Phaser.GameObjects.Text; + + private tween: Phaser.Tweens.Tween; + private autoHideTimer: NodeJS.Timeout; + private queue: (string)[] = []; + + + public shown: boolean; + + constructor(scene: BattleScene) { + super(scene, hiddenX, baseY); + } + + setup(): void { + this.defaultWidth = 200; + this.defaultHeight = 100; + + this.bg = this.scene.add.nineslice(-5, -5, "ability_bar_left", null, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); + this.bg.setOrigin(0, 0); + + this.add(this.bg); + + this.noteText = addTextObject(this.scene, 5, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); + this.noteText.setOrigin(0, 0); + this.add(this.noteText); + + this.musicText = addTextObject(this.scene, 30, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); + this.musicText.setOrigin(0, 0); + this.musicText.setWordWrapWidth(650, true); + + this.add(this.musicText); + + this.setVisible(false); + this.shown = false; + } + + /* + * Set the BGM Name to the BGM bar. + * @param {string} bgmName The name of the BGM to set. + */ + setBgmToBgmBar(bgmName: string): void { + this.noteText.setText(`${i18next.t("bgmName:music")}:`); + this.musicText.setText(`${this.getRealBgmName(bgmName)}`); + if (!(this.scene as BattleScene).showBgmBar) { + return; + } + + this.musicText.width = this.bg.width - 20; + this.musicText.setWordWrapWidth(this.defaultWidth * 4); + this.bg.width = Math.min(this.defaultWidth, this.noteText.displayWidth + this.musicText.displayWidth + 30); + + this.bg.height = Math.min(this.defaultHeight, this.musicText.displayHeight + 20); + + (this.scene as BattleScene).fieldUI.bringToTop(this); + + this.y = baseY; + } + + /* + Show or hide the BGM bar. + @param {boolean} visible Whether to show or hide the BGM bar. + */ + public toggleBgmBar(visible: boolean): void { + if (!(this.scene as BattleScene).showBgmBar) { + this.setVisible(false); + return; + } + this.scene.tweens.add({ + targets: this, + x: visible ? shownX : hiddenX, + duration: 500, + ease: "Sine.easeInOut", + onComplete: () => { + this.setVisible(true); + } + }); + } + + getRealBgmName(bgmName: string): string { + return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], {name: Utils.formatText(bgmName)}); + } +} + + diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index 67703b63aee..dce04276a4d 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -41,7 +41,7 @@ export default class GameChallengesUiHandler extends UiHandler { const ui = this.getUi(); this.challengesContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - this.challengesContainer.setName("container-challenges"); + this.challengesContainer.setName("challenges"); this.challengesContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -82,7 +82,7 @@ export default class GameChallengesUiHandler extends UiHandler { descriptionBg.setPositionRelative(this.optionsBg, this.optionsBg.width, 0); this.descriptionText = new BBCodeText(this.scene, descriptionBg.x + 6, descriptionBg.y + 4, "", { - fontFamily: "emerald, unifont", + fontFamily: "emerald", fontSize: 96, color: Color.ORANGE, padding: { @@ -116,7 +116,7 @@ export default class GameChallengesUiHandler extends UiHandler { this.startCursor.setVisible(false); this.valuesContainer = this.scene.add.container(0, 0); - this.valuesContainer.setName("container-values"); + this.valuesContainer.setName("values"); this.challengeLabels = []; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 852b1f855b6..8ccd05675c8 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -34,12 +34,14 @@ export default class CommandUiHandler extends UiHandler { i18next.t("commandUiHandler:run") ]; - this.commandsContainer = this.scene.add.container(216, -38.7); + this.commandsContainer = this.scene.add.container(217, -38.7); + this.commandsContainer.setName("commands"); this.commandsContainer.setVisible(false); ui.add(this.commandsContainer); for (let c = 0; c < commands.length; c++) { const commandText = addTextObject(this.scene, c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); + commandText.setName(commands[c]); this.commandsContainer.add(commandText); } } @@ -60,6 +62,7 @@ export default class CommandUiHandler extends UiHandler { } const messageHandler = this.getUi().getMessageHandler(); + messageHandler.bg.setVisible(true); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index c17816c4c55..0081b589288 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -3,12 +3,14 @@ import { Mode } from "./ui"; import { TextStyle, addTextObject, getEggTierTextTint } from "./text"; import MessageUiHandler from "./message-ui-handler"; import * as Utils from "../utils"; -import { EGG_SEED, Egg, GachaType, getEggTierDefaultHatchWaves, getEggDescriptor, getLegendaryGachaSpeciesForTimestamp } from "../data/egg"; +import { Egg, getLegendaryGachaSpeciesForTimestamp, IEggOptions } from "../data/egg"; import { VoucherType, getVoucherTypeIcon } from "../system/voucher"; import { getPokemonSpecies } from "../data/pokemon-species"; import { addWindow } from "./ui-theme"; import { Tutorial, handleTutorial } from "../tutorial"; import {Button} from "#enums/buttons"; +import * as Overrides from "../overrides"; +import { GachaType } from "#app/enums/gacha-types"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; @@ -285,6 +287,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { } pull(pullCount?: integer, count?: integer, eggs?: Egg[]): void { + if (Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE && !count) { + pullCount = Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE; + } + this.eggGachaOptionsContainer.setVisible(false); this.setTransitioning(true); @@ -379,56 +385,24 @@ export default class EggGachaUiHandler extends MessageUiHandler { } if (!eggs) { eggs = []; - const tierValueOffset = this.gachaCursor === GachaType.LEGENDARY ? 1 : 0; - const tiers = new Array(pullCount).fill(null).map(() => { - const tierValue = Utils.randInt(256); - return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; - }); - if (pullCount >= 25 && !tiers.filter(t => t >= EggTier.ULTRA).length) { - tiers[Utils.randInt(tiers.length)] = EggTier.ULTRA; - } else if (pullCount >= 10 && !tiers.filter(t => t >= EggTier.GREAT).length) { - tiers[Utils.randInt(tiers.length)] = EggTier.GREAT; - } - for (let i = 0; i < pullCount; i++) { - this.scene.gameData.eggPity[EggTier.GREAT] += 1; - this.scene.gameData.eggPity[EggTier.ULTRA] += 1; - this.scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; - // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. - if (this.scene.gameData.eggPity[EggTier.MASTER] >= 412 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.MASTER; - } else if (this.scene.gameData.eggPity[EggTier.ULTRA] >= 59 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.ULTRA; - } else if (this.scene.gameData.eggPity[EggTier.GREAT] >= 9 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.GREAT; - } - this.scene.gameData.eggPity[tiers[i]] = 0; - } + for (let i = 1; i <= pullCount; i++) { + const eggOptions: IEggOptions = { scene: this.scene, pulled: true, sourceType: this.gachaCursor }; - const timestamp = new Date().getTime(); - - for (const tier of tiers) { - const eggId = Utils.randInt(EGG_SEED, EGG_SEED * tier); - const egg = new Egg(eggId, this.gachaCursor, getEggTierDefaultHatchWaves(tier), timestamp); - if (egg.isManaphyEgg()) { - this.scene.gameData.gameStats.manaphyEggsPulled++; - egg.hatchWaves = getEggTierDefaultHatchWaves(EggTier.ULTRA); - } else { - switch (tier) { - case EggTier.GREAT: - this.scene.gameData.gameStats.rareEggsPulled++; - break; - case EggTier.ULTRA: - this.scene.gameData.gameStats.epicEggsPulled++; - break; - case EggTier.MASTER: - this.scene.gameData.gameStats.legendaryEggsPulled++; - break; + // Before creating the last egg, check if the guaranteed egg tier was already generated + // if not, override the egg tier + if (i === pullCount) { + const guaranteedEggTier = this.getGuaranteedEggTierFromPullCount(pullCount); + if (!eggs.some(egg => egg.tier >= guaranteedEggTier) && guaranteedEggTier !== EggTier.COMMON) { + eggOptions.tier = guaranteedEggTier; } } + + const egg = new Egg(eggOptions); eggs.push(egg); - this.scene.gameData.eggs.push(egg); - this.scene.gameData.gameStats.eggsPulled++; } + // Shuffle the eggs in case the guaranteed one got added as last egg + eggs = Utils.randSeedShuffle(eggs); + (this.scene.currentBattle ? this.scene.gameData.saveAll(this.scene, true, true, true) : this.scene.gameData.saveSystem()).then(success => { if (!success) { @@ -442,6 +416,17 @@ export default class EggGachaUiHandler extends MessageUiHandler { doPull(); } + getGuaranteedEggTierFromPullCount(pullCount: number): EggTier { + switch (pullCount) { + case 10: + return EggTier.GREAT; + case 25: + return EggTier.ULTRA; + default: + return EggTier.COMMON; + } + } + showSummary(eggs: Egg[]): void { this.transitioning = false; this.eggGachaSummaryContainer.setVisible(true); @@ -470,7 +455,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const eggSprite = this.scene.add.sprite(0, 0, "egg", `egg_${egg.getKey()}`); ret.add(eggSprite); - const eggText = addTextObject(this.scene, 0, 14, getEggDescriptor(egg), TextStyle.PARTY, { align: "center" }); + const eggText = addTextObject(this.scene, 0, 14, egg.getEggDescriptor(), TextStyle.PARTY, { align: "center" }); eggText.setOrigin(0.5, 0); eggText.setTint(getEggTierTextTint(!egg.isManaphyEgg() ? egg.tier : EggTier.ULTRA)); ret.add(eggText); @@ -586,11 +571,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { case Button.ACTION: switch (this.cursor) { case 0: - if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) { + if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 99) { - this.consumeVouchers(VoucherType.REGULAR, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 1); + } this.pull(); success = true; } else { @@ -599,11 +586,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 2: - if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) { + if (!this.scene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 95) { - this.consumeVouchers(VoucherType.PLUS, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PLUS, 1); + } this.pull(5); success = true; } else { @@ -613,15 +602,19 @@ export default class EggGachaUiHandler extends MessageUiHandler { break; case 1: case 3: - if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10) - || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM])) { + if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) + || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE)) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 90) { if (this.cursor === 3) { - this.consumeVouchers(VoucherType.PREMIUM, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PREMIUM, 1); + } } else { - this.consumeVouchers(VoucherType.REGULAR, 10); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 10); + } } this.pull(10); success = true; @@ -631,11 +624,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 4: - if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) { + if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 75) { - this.consumeVouchers(VoucherType.GOLDEN, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.GOLDEN, 1); + } this.pull(25); success = true; } else { diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index e4223824a2e..fd8444f73ef 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -3,7 +3,7 @@ import { Mode } from "./ui"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "./text"; import MessageUiHandler from "./message-ui-handler"; -import { Egg, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg"; +import { Egg } from "../data/egg"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; import i18next from "i18next"; @@ -163,7 +163,7 @@ export default class EggListUiHandler extends MessageUiHandler { setEggDetails(egg: Egg): void { this.eggSprite.setFrame(`egg_${egg.getKey()}`); - this.eggNameText.setText(`${i18next.t("egg:egg")} (${getEggDescriptor(egg)})`); + this.eggNameText.setText(`${i18next.t("egg:egg")} (${egg.getEggDescriptor()})`); this.eggDateText.setText( new Date(egg.timestamp).toLocaleString(undefined, { weekday: "short", @@ -172,8 +172,8 @@ export default class EggListUiHandler extends MessageUiHandler { day: "numeric" }) ); - this.eggHatchWavesText.setText(getEggHatchWavesMessage(egg.hatchWaves)); - this.eggGachaInfoText.setText(getEggGachaTypeDescriptor(this.scene, egg)); + this.eggHatchWavesText.setText(egg.getEggHatchWavesMessage()); + this.eggGachaInfoText.setText(egg.getEggTypeDescriptor(this.scene)); } setCursor(cursor: integer): boolean { diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 0ee5b511b31..ed520512443 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -13,6 +13,7 @@ import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; export default class FightUiHandler extends UiHandler { private movesContainer: Phaser.GameObjects.Container; + private moveInfoContainer: Phaser.GameObjects.Container; private typeIcon: Phaser.GameObjects.Sprite; private ppLabel: Phaser.GameObjects.Text; private ppText: Phaser.GameObjects.Text; @@ -34,48 +35,53 @@ export default class FightUiHandler extends UiHandler { const ui = this.getUi(); this.movesContainer = this.scene.add.container(18, -38.7); + this.movesContainer.setName("moves"); ui.add(this.movesContainer); - this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); + this.moveInfoContainer = this.scene.add.container(1, 0); + this.moveInfoContainer.setName("move-info"); + ui.add(this.moveInfoContainer); + + this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); this.typeIcon.setVisible(false); - ui.add(this.typeIcon); + this.moveInfoContainer.add(this.typeIcon); - this.moveCategoryIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 25, -36, "categories", "physical"); + this.moveCategoryIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 25, -36, "categories", "physical"); this.moveCategoryIcon.setVisible(false); - ui.add(this.moveCategoryIcon); + this.moveInfoContainer.add(this.moveCategoryIcon); - this.ppLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); + this.ppLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); this.ppLabel.setOrigin(0.0, 0.5); this.ppLabel.setVisible(false); this.ppLabel.setText(i18next.t("fightUiHandler:pp")); - ui.add(this.ppLabel); + this.moveInfoContainer.add(this.ppLabel); - this.ppText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); + this.ppText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); this.ppText.setOrigin(1, 0.5); this.ppText.setVisible(false); - ui.add(this.ppText); + this.moveInfoContainer.add(this.ppText); - this.powerLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); + this.powerLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); this.powerLabel.setOrigin(0.0, 0.5); this.powerLabel.setVisible(false); this.powerLabel.setText(i18next.t("fightUiHandler:power")); - ui.add(this.powerLabel); + this.moveInfoContainer.add(this.powerLabel); - this.powerText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); + this.powerText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); this.powerText.setOrigin(1, 0.5); this.powerText.setVisible(false); - ui.add(this.powerText); + this.moveInfoContainer.add(this.powerText); - this.accuracyLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); + this.accuracyLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); this.accuracyLabel.setOrigin(0.0, 0.5); this.accuracyLabel.setVisible(false); this.accuracyLabel.setText(i18next.t("fightUiHandler:accuracy")); - ui.add(this.accuracyLabel); + this.moveInfoContainer.add(this.accuracyLabel); - this.accuracyText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); + this.accuracyText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); this.accuracyText.setOrigin(1, 0.5); this.accuracyText.setVisible(false); - ui.add(this.accuracyText); + this.moveInfoContainer.add(this.accuracyText); } show(args: any[]): boolean { @@ -84,6 +90,7 @@ export default class FightUiHandler extends UiHandler { this.fieldIndex = args.length ? args[0] as integer : 0; const messageHandler = this.getUi().getMessageHandler(); + messageHandler.bg.setVisible(false); messageHandler.commandWindow.setVisible(false); messageHandler.movesWindowContainer.setVisible(true); this.setCursor(this.getCursor()); @@ -236,10 +243,12 @@ export default class FightUiHandler extends UiHandler { for (let moveIndex = 0; moveIndex < 4; moveIndex++) { const moveText = addTextObject(this.scene, moveIndex % 2 === 0 ? 0 : 100, moveIndex < 2 ? 0 : 16, "-", TextStyle.WINDOW); + moveText.setName("text-empty-move"); if (moveIndex < moveset.length) { const pokemonMove = moveset[moveIndex]; moveText.setText(pokemonMove.getName()); + moveText.setName(pokemonMove.getName()); moveText.setColor(this.getMoveColor(pokemon, pokemonMove) ?? moveText.style.color); } @@ -273,6 +282,7 @@ export default class FightUiHandler extends UiHandler { clear() { super.clear(); + const messageHandler = this.getUi().getMessageHandler(); this.clearMoves(); this.typeIcon.setVisible(false); this.ppLabel.setVisible(false); @@ -282,6 +292,7 @@ export default class FightUiHandler extends UiHandler { this.accuracyLabel.setVisible(false); this.accuracyText.setVisible(false); this.moveCategoryIcon.setVisible(false); + messageHandler.bg.setVisible(true); this.eraseCursor(); } diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 5b1b2caf917..571a09f3b37 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -10,8 +10,9 @@ import { updateUserInfo } from "../account"; import i18next from "i18next"; import {Button} from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; +import BgmBar from "#app/ui/bgm-bar"; -export enum MenuOptions { +enum MenuOptions { GAME_SETTINGS, ACHIEVEMENTS, STATS, @@ -24,7 +25,7 @@ export enum MenuOptions { LOG_OUT } -const wikiUrl = "https://wiki.pokerogue.net/start"; +let wikiUrl = "https://wiki.pokerogue.net/start"; const discordUrl = "https://discord.gg/uWpTfdKG49"; const githubUrl = "https://github.com/pagefaultgames/pokerogue"; const redditUrl = "https://www.reddit.com/r/pokerogue"; @@ -32,6 +33,7 @@ const redditUrl = "https://www.reddit.com/r/pokerogue"; export default class MenuUiHandler extends MessageUiHandler { private menuContainer: Phaser.GameObjects.Container; private menuMessageBoxContainer: Phaser.GameObjects.Container; + private menuOverlay: Phaser.GameObjects.Rectangle; private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; @@ -44,6 +46,9 @@ export default class MenuUiHandler extends MessageUiHandler { protected manageDataConfig: OptionSelectConfig; protected communityConfig: OptionSelectConfig; + public bgmBar: BgmBar; + + constructor(scene: BattleScene, mode?: Mode) { super(scene, mode); @@ -55,12 +60,28 @@ export default class MenuUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); + // wiki url directs based on languges available on wiki + const lang = i18next.resolvedLanguage.substring(0,2); + if (["de", "fr", "ko", "zh"].includes(lang)) { + wikiUrl = `https://wiki.pokerogue.net/${lang}:start`; + } + + this.bgmBar = new BgmBar(this.scene); + this.bgmBar.setup(); + + ui.bgmBar = this.bgmBar; this.menuContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - + this.menuContainer.setName("menu"); this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.menuOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0xffffff, 0.3); + this.menuOverlay.setName("menu-overlay"); + this.menuOverlay.setOrigin(0,0); + this.menuContainer.add(this.menuOverlay); + const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); menuMessageText.setWordWrapWidth(1224); menuMessageText.setOrigin(0, 0); @@ -79,6 +100,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.add(this.menuContainer); this.menuMessageBoxContainer = this.scene.add.container(0, 130); + this.menuMessageBoxContainer.setName("menu-message-box"); this.menuMessageBoxContainer.setVisible(false); this.menuContainer.add(this.menuMessageBoxContainer); @@ -88,6 +110,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuMessageBoxContainer.add(menuMessageText); + this.menuContainer.add(this.bgmBar); + this.message = menuMessageText; this.menuContainer.add(this.menuMessageBoxContainer); @@ -240,6 +264,7 @@ export default class MenuUiHandler extends MessageUiHandler { } show(args: any[]): boolean { + super.show(args); this.menuContainer.setVisible(true); @@ -253,6 +278,9 @@ export default class MenuUiHandler extends MessageUiHandler { handleTutorial(this.scene, Tutorial.Menu); + this.bgmBar.toggleBgmBar(true); + + return true; } @@ -294,6 +322,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.EGG_LIST); success = true; } else { + ui.showText(i18next.t("menuUiHandler:noEggs"), null, () => ui.showText(""), Utils.fixedInt(1500)); error = true; } break; @@ -408,6 +437,7 @@ export default class MenuUiHandler extends MessageUiHandler { clear() { super.clear(); this.menuContainer.setVisible(false); + this.bgmBar.toggleBgmBar(false); this.eraseCursor(); } diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 09f73ac2749..c403dc28abb 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -47,7 +47,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { ui.add(this.modifierContainer); this.transferButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 71, -64); - this.transferButtonContainer.setName("container-transfer-btn"); + this.transferButtonContainer.setName("transfer-btn"); this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); @@ -57,7 +57,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.transferButtonContainer.add(transferButtonText); this.checkButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -64); - this.checkButtonContainer.setName("container-use-btn"); + this.checkButtonContainer.setName("use-btn"); this.checkButtonContainer.setVisible(false); ui.add(this.checkButtonContainer); @@ -67,7 +67,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.checkButtonContainer.add(checkButtonText); this.rerollButtonContainer = this.scene.add.container(16, -64); - this.rerollButtonContainer.setName("container-reroll-brn"); + this.rerollButtonContainer.setName("reroll-brn"); this.rerollButtonContainer.setVisible(false); ui.add(this.rerollButtonContainer); @@ -180,8 +180,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const maxUpgradeCount = typeOptions.map(to => to.upgradeCount).reduce((max, current) => Math.max(current, max), 0); - this.scene.showFieldOverlay(750); + /* Force updateModifiers without pokemonSpecificModifiers */ + this.scene.getModifierBar().updateModifiers(this.scene.modifiers, true); + + /* Multiplies the appearance duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ + this.scene.showShopOverlay(750 * this.scene.gameSpeed); this.scene.updateAndShowText(750); + this.scene.updateBiomeWaveText(); this.scene.updateMoneyText(); let i = 0; @@ -472,9 +477,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.getUi().clearText(); this.eraseCursor(); - this.scene.hideFieldOverlay(250); + /* Multiplies the fade time duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ + this.scene.hideShopOverlay(750 * this.scene.gameSpeed); this.scene.hideLuckText(250); + /* Normally already called just after the shop, but not sure if it happens in 100% of cases */ + this.scene.getModifierBar().updateModifiers(this.scene.modifiers); + const options = this.options.concat(this.shopOptionsRows.flat()); this.options.splice(0, this.options.length); this.shopOptionsRows.splice(0, this.shopOptionsRows.length); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index a1a79e9f0af..59a4a605005 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -21,7 +21,7 @@ import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; import { Moves } from "#enums/moves"; -const defaultMessage = "Choose a Pokémon."; +const defaultMessage = i18next.t("menu:choosePokemon"); export enum PartyUiMode { SWITCH, @@ -163,31 +163,37 @@ export default class PartyUiHandler extends MessageUiHandler { const ui = this.getUi(); const partyContainer = this.scene.add.container(0, 0); + partyContainer.setName("party"); partyContainer.setVisible(false); ui.add(partyContainer); this.partyContainer = partyContainer; this.partyBg = this.scene.add.image(0, 0, "party_bg"); + this.partyBg.setName("img-party-bg"); partyContainer.add(this.partyBg); this.partyBg.setOrigin(0, 1); const partySlotsContainer = this.scene.add.container(0, 0); + partySlotsContainer.setName("party-slots"); partyContainer.add(partySlotsContainer); this.partySlotsContainer = partySlotsContainer; const partyMessageBoxContainer = this.scene.add.container(0, -32); + partyMessageBoxContainer.setName("party-msg-box"); partyContainer.add(partyMessageBoxContainer); const partyMessageBox = addWindow(this.scene, 1, 31, 262, 30); + partyMessageBox.setName("window-party-msg-box"); partyMessageBox.setOrigin(0, 1); partyMessageBoxContainer.add(partyMessageBox); this.partyMessageBox = partyMessageBox; - const partyMessageText = addTextObject(this.scene, 8, 10, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + const partyMessageText = addTextObject(this.scene, 10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + partyMessageText.setName("text-party-msg"); partyMessageText.setOrigin(0, 0); partyMessageBoxContainer.add(partyMessageText); @@ -1077,7 +1083,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { slotGenderText.setPositionRelative(slotLevelLabel, 36, 0); } else { - slotGenderText.setPositionRelative(slotName, 76, 3); + slotGenderText.setPositionRelative(slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); } slotGenderText.setOrigin(0, 0.25); @@ -1089,9 +1095,9 @@ class PartySlot extends Phaser.GameObjects.Container { splicedIcon.setScale(0.5); splicedIcon.setOrigin(0, 0); if (this.slotIndex >= battlerCount) { - splicedIcon.setPositionRelative(slotLevelLabel, 36 - (genderSymbol ? 8 : 0), 0.5); + splicedIcon.setPositionRelative(slotLevelLabel, 36 + (genderSymbol ? 8 : 0), 0.5); } else { - splicedIcon.setPositionRelative(slotName, 76 - (genderSymbol ? 8 : 0), 3.5); + splicedIcon.setPositionRelative(slotName, 76, 3.5); } slotInfoContainer.add(splicedIcon); @@ -1228,7 +1234,7 @@ class PartyCancelButton extends Phaser.GameObjects.Container { this.partyCancelPb = partyCancelPb; - const partyCancelText = addTextObject(this.scene, -7, -6, "Cancel", TextStyle.PARTY); + const partyCancelText = addTextObject(this.scene, -8, -7, "Cancel", TextStyle.PARTY); this.add(partyCancelText); } diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 482aeec6871..9ab3028b564 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -79,7 +79,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { } setup(): void { - this.setName("container-pkmn-info"); + this.setName("pkmn-info"); const currentLanguage = i18next.resolvedLanguage; const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)); const textSettings = languageSettings[langSettingKey]; @@ -88,7 +88,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { infoBg.setName("window-info-bg"); this.pokemonMovesContainer = this.scene.add.container(6, 14); - this.pokemonMovesContainer.setName("container-pkmn-moves"); + this.pokemonMovesContainer.setName("pkmn-moves"); this.movesContainerInitialX = this.pokemonMovesContainer.x; @@ -109,7 +109,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { for (let m = 0; m < 4; m++) { const moveContainer = this.scene.add.container(-6, 18 + 7 * m); moveContainer.setScale(0.5); - moveContainer.setName("container-move"); + moveContainer.setName("move"); const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 47c61011f8c..8a81ac4858d 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -119,7 +119,15 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { }; if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => saveAndCallback(), () => { + ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.gameData.deleteSession(cursor).then(response => { + if (response === false) { + this.scene.reset(true); + } else { + saveAndCallback(); + } + }); + }, () => { ui.revertMode(); ui.showText(null, 0); }, false, 0, 19, 2000); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 2ec4c437b3c..9bf0cb40975 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -98,6 +98,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler this.navigationIcons = {}; this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.settingsContainer.setName(`settings-${this.titleSelected}`); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 1834d5f09dd..6763c8d3d85 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -54,7 +54,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { const ui = this.getUi(); this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - + this.settingsContainer.setName(`settings-${this.title}`); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6 - 20), Phaser.Geom.Rectangle.Contains); this.navigationIcons = {}; @@ -62,6 +62,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.navigationContainer = new NavigationMenu(this.scene, 0, 0); this.optionsBg = addWindow(this.scene, 0, this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); const actionsBg = addWindow(this.scene, 0, (this.scene.game.canvas.height / 6) - this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, 22); diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index a0c59efdc06..f0e84f29e00 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -73,6 +73,7 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler }; break; case "ko": + case "ko-KR": this.settings[languageIndex].options[0] = { value: "한국어", label: "한국어", diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 34ee83b0f50..f32ea13deda 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -27,6 +27,8 @@ import { StatsContainer } from "./stats-container"; import { TextStyle, addBBCodeTextObject, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; +import { Egg } from "#app/data/egg"; +import * as Overrides from "../overrides"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; import {Passive as PassiveAttr} from "#enums/passive"; import * as Challenge from "../data/challenge"; @@ -36,6 +38,7 @@ import { Device } from "#enums/devices"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import {Button} from "#enums/buttons"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -98,17 +101,17 @@ const languageSettings: { [key: string]: LanguageSetting } = { } }; -const starterCandyCosts: { passive: integer, costReduction: [integer, integer] }[] = [ - { passive: 50, costReduction: [30, 75] }, // 1 - { passive: 45, costReduction: [25, 60] }, // 2 - { passive: 40, costReduction: [20, 50] }, // 3 - { passive: 30, costReduction: [15, 40] }, // 4 - { passive: 25, costReduction: [12, 35] }, // 5 - { passive: 20, costReduction: [10, 30] }, // 6 - { passive: 15, costReduction: [8, 20] }, // 7 - { passive: 10, costReduction: [5, 15] }, // 8 - { passive: 10, costReduction: [3, 10] }, // 9 - { passive: 10, costReduction: [3, 10] }, // 10 +const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ + { passive: 50, costReduction: [30, 75], egg: 35 }, // 1 + { passive: 45, costReduction: [25, 60], egg: 35 }, // 2 + { passive: 40, costReduction: [20, 50], egg: 35 }, // 3 + { passive: 30, costReduction: [15, 40], egg: 30 }, // 4 + { passive: 25, costReduction: [12, 35], egg: 25 }, // 5 + { passive: 20, costReduction: [10, 30], egg: 20 }, // 6 + { passive: 15, costReduction: [8, 20], egg: 15 }, // 7 + { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 + { passive: 10, costReduction: [3, 10], egg: 10 }, // 9 + { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 ]; function getPassiveCandyCount(baseValue: integer): integer { @@ -119,6 +122,10 @@ function getValueReductionCandyCounts(baseValue: integer): [integer, integer] { return starterCandyCosts[baseValue - 1].costReduction; } +function getSameSpeciesEggCandyCounts(baseValue: integer): integer { + return starterCandyCosts[baseValue - 1].egg; +} + /** * Calculates the icon position for a Pokemon of a given UI index * @param index UI index to calculate the icon position of @@ -680,35 +687,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.instructionsContainer); // instruction rows that will be pushed into the container dynamically based on need - this.shinyIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + // creating new sprites since they will be added to the scene later + this.shinyIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + this.shinyIconElement.setName("sprite-shiny-icon-element"); this.shinyIconElement.setScale(0.675); this.shinyIconElement.setOrigin(0.0, 0.0); this.shinyLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel.setName("text-shiny-label"); - this.formIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement.setName("sprite-form-icon-element"); this.formIconElement.setScale(0.675); this.formIconElement.setOrigin(0.0, 0.0); this.formLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel.setName("text-form-label"); - this.genderIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement.setName("sprite-gender-icon-element"); this.genderIconElement.setScale(0.675); this.genderIconElement.setOrigin(0.0, 0.0); this.genderLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel.setName("text-gender-label"); - this.abilityIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement.setName("sprite-ability-icon-element"); this.abilityIconElement.setScale(0.675); this.abilityIconElement.setOrigin(0.0, 0.0); this.abilityLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.abilityLabel.setName("text-ability-label"); - this.natureIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement.setName("sprite-nature-icon-element"); this.natureIconElement.setScale(0.675); this.natureIconElement.setOrigin(0.0, 0.0); this.natureLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.natureLabel.setName("text-nature-label"); - this.variantIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement.setName("sprite-variant-icon-element"); this.variantIconElement.setScale(0.675); this.variantIconElement.setOrigin(0.0, 0.0); this.variantLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.variantLabel.setName("text-variant-label"); this.hideInstructions(); @@ -880,6 +900,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { && starterData.valueReduction < 2; } + /** + * Determines if an same species egg can be baught for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = this.scene.gameData.starterData[speciesId]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarters[speciesId]); + } + /** * Sets a bounce animation if enabled and the Pokemon has an upgrade * @param icon {@linkcode Phaser.GameObjects.GameObject} to animate @@ -1311,9 +1343,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name})`, handler: () => { - if (candyCount >= passiveCost) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; - starterData.candyCount -= passiveCost; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= passiveCost; + } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { if (!success) { @@ -1346,9 +1380,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, handler: () => { - if (candyCount >= reductionCost) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { starterData.valueReduction++; - starterData.candyCount -= reductionCost; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= reductionCost; + } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { if (!success) { @@ -1379,6 +1415,49 @@ export default class StarterSelectUiHandler extends MessageUiHandler { itemArgs: starterColors[this.lastSpecies.speciesId] }); } + + // Same species egg menu option. Only visible if passive is bought + if (passiveAttr & PassiveAttr.UNLOCKED) { + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= sameSpeciesEggCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG}); + egg.addEggToGameData(this.scene); + + this.scene.gameData.saveSystem().then(success => { + if (!success) { + return this.scene.reset(true); + } + }); + ui.setMode(Mode.STARTER_SELECT); + this.scene.playSound("buy"); + + // If the notification setting is set to 'On', update the candy upgrade display + // if (this.scene.candyUpgradeNotification === 2) { + // if (this.isUpgradeIconEnabled() ) { + // this.setUpgradeIcon(this.cursor); + // } + // if (this.isUpgradeAnimationEnabled()) { + // const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; + // this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); + // } + // } + + return true; + } + return false; + }, + item: "candy", + itemArgs: starterColors[this.lastSpecies.speciesId] + }); + } options.push({ label: i18next.t("menu:cancel"), handler: () => { diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 11154bd700b..b4e799bafc0 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -26,7 +26,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { } setup() { - this.setName("container-stats"); + this.setName("stats"); const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); diff --git a/src/ui/text.ts b/src/ui/text.ts index b74742fef74..dd1ac57523a 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -89,7 +89,7 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio const defaultFontSize = 96; let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { - fontFamily: "emerald, unifont", + fontFamily: "emerald", fontSize: 96, color: getTextColor(style, false, uiTheme), padding: { @@ -198,10 +198,10 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui case TextStyle.PARTY_RED: return !shadow ? "#f89890" : "#984038"; case TextStyle.SUMMARY: - return !shadow ? "#ffffff" : "#636363"; + return !shadow ? "#f8f8f8" : "#636363"; case TextStyle.SUMMARY_ALT: if (uiTheme) { - return !shadow ? "#ffffff" : "#636363"; + return !shadow ? "#f8f8f8" : "#636363"; } return !shadow ? "#484848" : "#d0d0c8"; case TextStyle.SUMMARY_RED: @@ -233,17 +233,17 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui export function getModifierTierTextTint(tier: ModifierTier): integer { switch (tier) { case ModifierTier.COMMON: - return 0xffffff; + return 0xf8f8f8; case ModifierTier.GREAT: - return 0x3890f8; + return 0x4998f8; case ModifierTier.ULTRA: return 0xf8d038; case ModifierTier.ROGUE: - return 0xd52929; + return 0xdb4343; case ModifierTier.MASTER: - return 0xe020c0; + return 0xe331c5; case ModifierTier.LUXURY: - return 0xe64a18; + return 0xe74c18; } } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 54c478a7ad7..4036e0b9922 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,22 +1,20 @@ import BattleScene from "../battle-scene"; -import { DailyRunScoreboard } from "./daily-run-scoreboard"; import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; +import { TimedEventDisplay } from "#app/timed-event-manager.js"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; - private dailyRunScoreboard: DailyRunScoreboard; private playerCountLabel: Phaser.GameObjects.Text; private splashMessage: string; private splashMessageText: Phaser.GameObjects.Text; - private eventTimerText: Phaser.GameObjects.Text; + private eventDisplay: TimedEventDisplay; private titleStatsTimer: NodeJS.Timeout; - private eventTimer: NodeJS.Timeout; constructor(scene: BattleScene, mode: Mode = Mode.TITLE) { super(scene, mode); @@ -28,7 +26,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); this.titleContainer = this.scene.add.container(0, -(this.scene.game.canvas.height / 6)); - this.titleContainer.setName("container-title"); + this.titleContainer.setName("title"); this.titleContainer.setAlpha(0); ui.add(this.titleContainer); @@ -37,36 +35,9 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.add(logo); if (this.scene.eventManager.isEventActive()) { - const event = this.scene.eventManager.activeEvent(); - const banner = this.scene.add.image(29, 64, event.bannerFilename); - banner.setName("img-event-banner"); - banner.setOrigin(0, 0); - banner.setScale(0.07); - const bannerShadow = this.scene.add.rectangle( - banner.x - 2, - banner.y + 2, - banner.width, - banner.height, - 0x484848 - ); - bannerShadow.setName("rect-event-banner-shadow"); - bannerShadow.setScale(0.07); - bannerShadow.setAlpha(0.5); - bannerShadow.setOrigin(0,0); - this.eventTimerText = addTextObject( - this.scene, - banner.x + 8, - banner.y + 100, - this.timeToGo(event.endDate), - TextStyle.WINDOW - ); - this.eventTimerText.setName("text-event-timer"); - this.eventTimerText.setScale(0.15); - this.eventTimerText.setOrigin(0,0); - - this.titleContainer.add(bannerShadow); - this.titleContainer.add(banner); - this.titleContainer.add(this.eventTimerText); + this.eventDisplay = new TimedEventDisplay(this.scene, 0, 0, this.scene.eventManager.activeEvent()); + this.eventDisplay.setup(); + this.titleContainer.add(this.eventDisplay); } this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 109, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: "54px" }); @@ -89,33 +60,6 @@ export default class TitleUiHandler extends OptionSelectUiHandler { }); } - timeToGo(date: Date) { - - // Utility to add leading zero - function z(n) { - return (n < 10? "0" : "") + n; - } - const now = new Date(); - let diff = Math.abs(date.getTime() - now.getTime()); - - // Allow for previous times - diff = Math.abs(diff); - - // Get time components - const days = diff/8.64e7 | 0; - const hours = diff%8.64e7 / 3.6e6 | 0; - const mins = diff%3.6e6 / 6e4 | 0; - const secs = Math.round(diff%6e4 / 1e3); - - // Return formatted string - return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs)+ "s"; - } - - updateCountdown() { - const event = this.scene.eventManager.activeEvent(); - this.eventTimerText.setText(this.timeToGo(event.endDate)); - } - updateTitleStats(): void { Utils.apiFetch("game/titlestats") .then(request => request.json()) @@ -139,14 +83,8 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - // this.dailyRunScoreboard.update(); - if (this.scene.eventManager.isEventActive()) { - this.updateCountdown(); - - this.eventTimer = setInterval(() => { - this.updateCountdown(); - }, 1000); + this.eventDisplay.show(); } this.updateTitleStats(); @@ -171,8 +109,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - clearInterval(this.eventTimer); - this.eventTimer = null; + this.eventDisplay?.clear(); clearInterval(this.titleStatsTimer); this.titleStatsTimer = null; diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index b2992d049cb..58490e1c618 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -46,13 +46,25 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, null, width, height, borderSize, borderSize, borderSize, borderSize); window.setOrigin(0, 0); - if (mergeMaskTop || mergeMaskLeft) { - const maskRect = scene.make.graphics({}); + if (mergeMaskLeft || mergeMaskTop || maskOffsetX || maskOffsetY) { + /** + * x: left + * y: top + * width: right + * height: bottom + */ + const maskRect = new Phaser.GameObjects.Rectangle( + scene, + 6*(x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), + 6*(y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0)), + width - (mergeMaskLeft ? 2 : 0), + height - (mergeMaskTop ? 2 : 0), + 0xffffff + ); + maskRect.setOrigin(0); maskRect.setScale(6); - maskRect.fillStyle(0xFFFFFF); - maskRect.beginPath(); - maskRect.fillRect(window.x + (mergeMaskLeft ? 2 : 0) + (maskOffsetX || 0), window.y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0), window.width - (mergeMaskLeft ? 2 : 0), window.height - (mergeMaskTop ? 2 : 0)); - window.setMask(maskRect.createGeometryMask()); + const mask = maskRect.createGeometryMask(); + window.setMask(mask); } return window; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 75ccfc40f59..ce834a83645 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -45,6 +45,7 @@ import KeyboardBindingUiHandler from "#app/ui/settings/keyboard-binding-ui-handl import SettingsDisplayUiHandler from "./settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./settings/settings-audio-ui-handler"; import { PlayerGender } from "#enums/player-gender"; +import BgmBar from "#app/ui/bgm-bar"; export enum Mode { MESSAGE, @@ -127,6 +128,7 @@ export default class UI extends Phaser.GameObjects.Container { public handlers: UiHandler[]; private overlay: Phaser.GameObjects.Rectangle; public achvBar: AchvBar; + public bgmBar: BgmBar; public savingIcon: SavingIconHandler; private tooltipContainer: Phaser.GameObjects.Container; @@ -159,6 +161,7 @@ export default class UI extends Phaser.GameObjects.Container { new OptionSelectUiHandler(scene), new MenuUiHandler(scene), new OptionSelectUiHandler(scene, Mode.MENU_OPTION_SELECT), + // settings new SettingsUiHandler(scene), new SettingsDisplayUiHandler(scene), new SettingsAudioUiHandler(scene), @@ -182,11 +185,12 @@ export default class UI extends Phaser.GameObjects.Container { } setup(): void { - this.setName(`container-ui-${Mode[this.mode]}`); + this.setName(`ui-${Mode[this.mode]}`); for (const handler of this.handlers) { handler.setup(); } this.overlay = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0); + this.overlay.setName("rect-ui-overlay"); this.overlay.setOrigin(0, 0); (this.scene as BattleScene).uiContainer.add(this.overlay); this.overlay.setVisible(false); @@ -205,15 +209,19 @@ export default class UI extends Phaser.GameObjects.Container { private setupTooltip() { this.tooltipContainer = this.scene.add.container(0, 0); + this.tooltipContainer.setName("tooltip"); this.tooltipContainer.setVisible(false); this.tooltipBg = addWindow(this.scene as BattleScene, 0, 0, 128, 31); + this.tooltipBg.setName("window-tooltip-bg"); this.tooltipBg.setOrigin(0, 0); this.tooltipTitle = addTextObject(this.scene, 64, 4, "", TextStyle.TOOLTIP_TITLE); + this.tooltipTitle.setName("text-tooltip-title"); this.tooltipTitle.setOrigin(0.5, 0); this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT); + this.tooltipContent.setName("text-tooltip-content"); this.tooltipContent.setWordWrapWidth(696); this.tooltipContainer.add(this.tooltipBg); @@ -241,7 +249,6 @@ export default class UI extends Phaser.GameObjects.Container { battleScene?.processInfoButton(pressed); return true; } - battleScene?.processInfoButton(false); return true; } diff --git a/src/utils.ts b/src/utils.ts index 6667d2522f5..5a67df314d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -396,6 +396,20 @@ export function fixedInt(value: integer): integer { return new FixedInt(value) as unknown as integer; } +/** + * Formats a string to title case + * @param unformattedText Text to be formatted + * @returns the formatted string + */ +export function formatText(unformattedText: string): string { + const text = unformattedText.split("_"); + for (let i = 0; i < text.length; i++) { + text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); + } + + return text.join(" "); +} + export function rgbToHsv(r: integer, g: integer, b: integer) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); @@ -450,9 +464,9 @@ export function verifyLang(lang?: string): boolean { case "fr": case "de": case "it": - case "zh_CN": - case "zh_TW": - case "pt_BR": + case "zh-CN": + case "zh-TW": + case "pt-BR": case "ko": return true; default: