diff --git a/public/audio/bgm/battle_aether_boss.mp3 b/public/audio/bgm/battle_aether_boss.mp3 new file mode 100644 index 00000000000..7b776976777 Binary files /dev/null and b/public/audio/bgm/battle_aether_boss.mp3 differ diff --git a/public/audio/bgm/battle_aether_grunt.mp3 b/public/audio/bgm/battle_aether_grunt.mp3 new file mode 100644 index 00000000000..ede518c8c3f Binary files /dev/null and b/public/audio/bgm/battle_aether_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galactic_admin.mp3 b/public/audio/bgm/battle_galactic_admin.mp3 new file mode 100644 index 00000000000..69b6ea918dd Binary files /dev/null and b/public/audio/bgm/battle_galactic_admin.mp3 differ diff --git a/public/audio/bgm/battle_macro_boss.mp3 b/public/audio/bgm/battle_macro_boss.mp3 new file mode 100644 index 00000000000..b72d5238b4d Binary files /dev/null and b/public/audio/bgm/battle_macro_boss.mp3 differ diff --git a/public/audio/bgm/battle_macro_grunt.mp3 b/public/audio/bgm/battle_macro_grunt.mp3 new file mode 100644 index 00000000000..8a80bfb553b Binary files /dev/null and b/public/audio/bgm/battle_macro_grunt.mp3 differ diff --git a/public/audio/bgm/battle_oleana.mp3 b/public/audio/bgm/battle_oleana.mp3 new file mode 100644 index 00000000000..b75bdcb337e Binary files /dev/null and b/public/audio/bgm/battle_oleana.mp3 differ diff --git a/public/audio/bgm/battle_skull_admin.mp3 b/public/audio/bgm/battle_skull_admin.mp3 new file mode 100644 index 00000000000..a6ac5cf1bf7 Binary files /dev/null and b/public/audio/bgm/battle_skull_admin.mp3 differ diff --git a/public/audio/bgm/battle_skull_boss.mp3 b/public/audio/bgm/battle_skull_boss.mp3 new file mode 100644 index 00000000000..2fde7a5524a Binary files /dev/null and b/public/audio/bgm/battle_skull_boss.mp3 differ diff --git a/public/audio/bgm/battle_skull_grunt.mp3 b/public/audio/bgm/battle_skull_grunt.mp3 new file mode 100644 index 00000000000..b6f575fc2ad Binary files /dev/null and b/public/audio/bgm/battle_skull_grunt.mp3 differ diff --git a/public/images/mystery-encounters/chest_blue.json b/public/images/mystery-encounters/chest_blue.json index 9a386802e03..916afc3242c 100644 --- a/public/images/mystery-encounters/chest_blue.json +++ b/public/images/mystery-encounters/chest_blue.json @@ -4,198 +4,198 @@ "image": "chest_blue.png", "format": "RGBA8888", "size": { - "w": 58, - "h": 528 + "w": 54, + "h": 492 }, "scale": 1, "frames": [ { "filename": "0000.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 46, + "h": 39 }, "spriteSourceSize": { - "x": 14, - "y": 30, - "w": 48, - "h": 41 + "x": 0, + "y": 0, + "w": 46, + "h": 39 }, "frame": { - "x": 1, - "y": 1, - "w": 48, - "h": 41 + "x": 0, + "y": 0, + "w": 46, + "h": 39 } }, { "filename": "0001.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 47, + "h": 35 }, "spriteSourceSize": { - "x": 14, - "y": 34, - "w": 49, - "h": 37 + "x": 0, + "y": 0, + "w": 47, + "h": 35 }, "frame": { - "x": 1, - "y": 44, - "w": 49, - "h": 37 + "x": 0, + "y": 39, + "w": 47, + "h": 35 } }, { "filename": "0002.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 46, + "h": 39 }, "spriteSourceSize": { - "x": 14, - "y": 30, - "w": 48, - "h": 41 + "x": 0, + "y": 0, + "w": 46, + "h": 39 }, "frame": { - "x": 1, - "y": 83, - "w": 48, - "h": 41 + "x": 0, + "y": 74, + "w": 46, + "h": 39 } }, { "filename": "0003.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 46, + "h": 46 }, "spriteSourceSize": { - "x": 14, - "y": 23, - "w": 48, - "h": 48 + "x": 0, + "y": 0, + "w": 46, + "h": 46 }, "frame": { - "x": 1, - "y": 126, - "w": 48, - "h": 48 + "x": 0, + "y": 113, + "w": 46, + "h": 46 } }, { "filename": "0004.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 53, + "h": 65 }, "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 55, - "h": 67 + "x": 0, + "y": 0, + "w": 53, + "h": 65 }, "frame": { - "x": 1, - "y": 176, - "w": 55, - "h": 67 + "x": 0, + "y": 159, + "w": 53, + "h": 65 } }, { "filename": "0005.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 54, + "h": 67 }, "spriteSourceSize": { - "x": 15, - "y": 2, - "w": 56, - "h": 69 + "x": 0, + "y": 0, + "w": 54, + "h": 67 }, "frame": { - "x": 1, - "y": 245, - "w": 56, - "h": 69 + "x": 0, + "y": 224, + "w": 54, + "h": 67 } }, { "filename": "0006.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 54, + "h": 67 }, "spriteSourceSize": { - "x": 15, - "y": 2, - "w": 56, - "h": 69 + "x": 0, + "y": 0, + "w": 54, + "h": 67 }, "frame": { - "x": 1, - "y": 316, - "w": 56, - "h": 69 + "x": 0, + "y": 291, + "w": 54, + "h": 67 } }, { "filename": "0007.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 54, + "h": 67 }, "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 69 + "x": 0, + "y": 0, + "w": 54, + "h": 67 }, "frame": { - "x": 1, - "y": 387, - "w": 56, - "h": 69 + "x": 0, + "y": 358, + "w": 54, + "h": 67 } }, { "filename": "0008.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 75, - "h": 75 + "w": 54, + "h": 67 }, "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 69 + "x": 0, + "y": 0, + "w": 54, + "h": 67 }, "frame": { - "x": 1, - "y": 458, - "w": 56, - "h": 69 + "x": 0, + "y": 425, + "w": 54, + "h": 67 } } ] @@ -204,6 +204,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5f36000f6160ee6f397afe5a6fd60b73:cf6f4b08e23400447813583c322eb6c7:f4f3c064e6c93b8d1290f93bee927f60$" + "smartupdate": "$TexturePacker:SmartUpdate:017ecc2437e580a185f9843f97e80da5:f44ef1c27a4a17183a5bcf1f7fc8ce6a:f4f3c064e6c93b8d1290f93bee927f60$" } } diff --git a/public/images/mystery-encounters/chest_blue.png b/public/images/mystery-encounters/chest_blue.png index ac1039544e3..e67bdcafa04 100644 Binary files a/public/images/mystery-encounters/chest_blue.png and b/public/images/mystery-encounters/chest_blue.png differ diff --git a/public/images/mystery-encounters/chest_red.json b/public/images/mystery-encounters/chest_red.json index d808652a162..579cf7bda06 100644 --- a/public/images/mystery-encounters/chest_red.json +++ b/public/images/mystery-encounters/chest_red.json @@ -4,30 +4,198 @@ "image": "chest_red.png", "format": "RGBA8888", "size": { - "w": 76, - "h": 57 + "w": 54, + "h": 492 }, "scale": 1, "frames": [ + { + "filename": "0000.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 46, + "h": 39 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 46, + "h": 39 + }, + "frame": { + "x": 0, + "y": 0, + "w": 46, + "h": 39 + } + }, { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 76, - "h": 57 + "w": 47, + "h": 35 }, "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 56, - "h": 54 + "x": 0, + "y": 0, + "w": 47, + "h": 35 }, "frame": { - "x": 8, + "x": 0, + "y": 39, + "w": 47, + "h": 35 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 46, + "h": 39 + }, + "spriteSourceSize": { + "x": 0, "y": 0, - "w": 56, - "h": 54 + "w": 46, + "h": 39 + }, + "frame": { + "x": 0, + "y": 74, + "w": 46, + "h": 39 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 46, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 46, + "h": 46 + }, + "frame": { + "x": 0, + "y": 113, + "w": 46, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 65 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 65 + }, + "frame": { + "x": 0, + "y": 159, + "w": 53, + "h": 65 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 67 + }, + "frame": { + "x": 0, + "y": 224, + "w": 54, + "h": 67 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 67 + }, + "frame": { + "x": 0, + "y": 291, + "w": 54, + "h": 67 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 67 + }, + "frame": { + "x": 0, + "y": 358, + "w": 54, + "h": 67 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 67 + }, + "frame": { + "x": 0, + "y": 425, + "w": 54, + "h": 67 } } ] @@ -36,6 +204,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + "smartupdate": "$TexturePacker:SmartUpdate:2a0b6c93c5be115efa635d40780603f0:b5fde49f991c2ecc49afedd80cc8a544:a163d960e9966469ae4dde4b53c13496$" } } diff --git a/public/images/mystery-encounters/chest_red.png b/public/images/mystery-encounters/chest_red.png index e9ccfa2cfc6..c20a8218be6 100644 Binary files a/public/images/mystery-encounters/chest_red.png and b/public/images/mystery-encounters/chest_red.png differ diff --git a/public/images/pokemon/exp/back/shiny/745-midnight.png b/public/images/pokemon/exp/back/shiny/745-midnight.png index 94a9c328d01..a7d7e0497b5 100644 Binary files a/public/images/pokemon/exp/back/shiny/745-midnight.png and b/public/images/pokemon/exp/back/shiny/745-midnight.png differ diff --git a/public/images/pokemon/exp/shiny/4077.png b/public/images/pokemon/exp/shiny/4077.png index f2f5891883d..ab414e058e1 100644 Binary files a/public/images/pokemon/exp/shiny/4077.png and b/public/images/pokemon/exp/shiny/4077.png differ diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index ff28e68160e..87f80fd17c4 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -4312,6 +4312,11 @@ 1, 1 ], + "99-gigantamax": [ + 0, + 1, + 1 + ], "100": [ 0, 1, @@ -9940,12 +9945,12 @@ ], "672": [ 0, - 2, + 1, 1 ], "673": [ 0, - 2, + 1, 1 ], "677": [ @@ -10806,7 +10811,7 @@ "962": [ 1, 1, - 2 + 1 ], "967": [ 0, @@ -11095,4 +11100,4 @@ 1 ] } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/99-gigantamax.json b/public/images/pokemon/variant/back/99-gigantamax.json new file mode 100644 index 00000000000..31fa87f0e8d --- /dev/null +++ b/public/images/pokemon/variant/back/99-gigantamax.json @@ -0,0 +1,32 @@ +{ + "1": { + "c56a5a": "6232a9", + "f6c58b": "9f60d5", + "832908": "3b1c69", + "ee8b4a": "8853bf", + "101010": "101010", + "735210": "534681", + "fdfdfd": "ffdbdb", + "e1d0db": "d5869b", + "ffe6b4": "c3d6ff", + "eebd8b": "9ba3d9", + "b47b5a": "7c72b6", + "b5a6b5": "b65782", + "9a859a": "872d65" + }, + "2": { + "c56a5a": "2d6f9e", + "f6c58b": "75e0e8", + "832908": "22447d", + "ee8b4a": "43adc4", + "101010": "101010", + "735210": "1e1743", + "fdfdfd": "b1f1cf", + "e1d0db": "73c1c2", + "ffe6b4": "464d89", + "eebd8b": "31296f", + "b47b5a": "231b4e", + "b5a6b5": "44778a", + "9a859a": "2f4c6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/672.json b/public/images/pokemon/variant/exp/back/672.json index 8ee91469917..7282ef5e693 100644 --- a/public/images/pokemon/variant/exp/back/672.json +++ b/public/images/pokemon/variant/exp/back/672.json @@ -1,4 +1,20 @@ { + "1": { + "3d3128": "69112a", + "000000": "000000", + "67615b": "9e2c3d", + "615140": "89431b", + "7e6d5a": "b3743e", + "554538": "642509", + "efeded": "f8e2b7", + "beb8b6": "e3a378", + "0e5d58": "8c6859", + "09a77c": "f8f0e2", + "0d8374": "d2af94", + "c16a3f": "321512", + "c6b379": "552d30", + "a8905c": "4b2525" + }, "2": { "3d3128": "161526", "000000": "000000", @@ -15,4 +31,4 @@ "c6b379": "9f5f9b", "a8905c": "854d87" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/672_2.json b/public/images/pokemon/variant/exp/back/672_2.json deleted file mode 100644 index 216c213bc12..00000000000 --- a/public/images/pokemon/variant/exp/back/672_2.json +++ /dev/null @@ -1,965 +0,0 @@ -{ - "textures": [ - { - "image": "672_2.png", - "format": "RGBA8888", - "size": { - "w": 282, - "h": 282 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 168, - "w": 41, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 205, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b36f1de558a8fa8ac8b56a9ba43a0dfd:5fe84a3f522e543bfbbfe0837355266b:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/672_2.png b/public/images/pokemon/variant/exp/back/672_2.png deleted file mode 100644 index a51b8cba11f..00000000000 Binary files a/public/images/pokemon/variant/exp/back/672_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/673.json b/public/images/pokemon/variant/exp/back/673.json index be9d3af3965..7e5bc69976d 100644 --- a/public/images/pokemon/variant/exp/back/673.json +++ b/public/images/pokemon/variant/exp/back/673.json @@ -1,4 +1,20 @@ { + "1": { + "3d3128": "5a0e24", + "000000": "000000", + "554538": "471405", + "67615b": "8f2837", + "0d835a": "d2af94", + "0e5d58": "8c6352", + "74593a": "61240a", + "09a766": "f8f0e2", + "cabfbb": "e3a378", + "efeded": "f8e2b7", + "a8905c": "9e4e21", + "c6b379": "ce8648", + "ae492a": "321512", + "c16a3f": "552d30" + }, "2": { "3d3128": "121123", "000000": "000000", @@ -15,4 +31,4 @@ "ae492a": "612c6b", "c16a3f": "9f5f9b" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/673_2.json b/public/images/pokemon/variant/exp/back/673_2.json deleted file mode 100644 index b9c2b2d54e7..00000000000 --- a/public/images/pokemon/variant/exp/back/673_2.json +++ /dev/null @@ -1,965 +0,0 @@ -{ - "textures": [ - { - "image": "673_2.png", - "format": "RGBA8888", - "size": { - "w": 384, - "h": 384 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 124, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 186, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 248, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 248, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 310, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 65, - "w": 62, - "h": 65 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 65, - "w": 62, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - }, - "frame": { - "x": 124, - "y": 65, - "w": 61, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - }, - "frame": { - "x": 124, - "y": 65, - "w": 61, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 185, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 245, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 305, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 0, - "y": 130, - "w": 60, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 60, - "h": 62 - }, - "frame": { - "x": 60, - "y": 130, - "w": 60, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 0, - "y": 195, - "w": 59, - "h": 65 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 179, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 130, - "w": 58, - "h": 64 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 130, - "w": 58, - "h": 64 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 194, - "w": 58, - "h": 64 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 59, - "y": 257, - "w": 58, - "h": 64 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 0, - "y": 260, - "w": 58, - "h": 64 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 117, - "y": 257, - "w": 58, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 58, - "h": 62 - }, - "frame": { - "x": 119, - "y": 195, - "w": 58, - "h": 62 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 57, - "h": 64 - }, - "frame": { - "x": 175, - "y": 257, - "w": 57, - "h": 64 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 58, - "h": 62 - }, - "frame": { - "x": 177, - "y": 195, - "w": 58, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 232, - "y": 258, - "w": 57, - "h": 63 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 289, - "y": 258, - "w": 57, - "h": 63 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 296, - "y": 130, - "w": 57, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 296, - "y": 193, - "w": 57, - "h": 63 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 56, - "h": 63 - }, - "frame": { - "x": 58, - "y": 321, - "w": 56, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 56, - "h": 63 - }, - "frame": { - "x": 114, - "y": 321, - "w": 56, - "h": 63 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 62 - }, - "frame": { - "x": 170, - "y": 321, - "w": 56, - "h": 62 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 62 - }, - "frame": { - "x": 226, - "y": 321, - "w": 56, - "h": 62 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:05149e465b79b92adcb764d8f903ce8d:523fbed3890bc743f1863e6db3150ddb:5d92dd5d09b0875a1d8f3606df775958$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/673_2.png b/public/images/pokemon/variant/exp/back/673_2.png deleted file mode 100644 index be4e73acce4..00000000000 Binary files a/public/images/pokemon/variant/exp/back/673_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/962.json b/public/images/pokemon/variant/exp/back/962.json index 860c4515df7..118a0f26768 100644 --- a/public/images/pokemon/variant/exp/back/962.json +++ b/public/images/pokemon/variant/exp/back/962.json @@ -28,5 +28,20 @@ "fffbff": "edf8e6", "7b827b": "6a856a", "a7aba7": "98a798" + }, + "2": { + "342930": "754156", + "0f0f0f": "0f0f0f", + "4a3942": "a5777f", + "937d85": "2f2655", + "b9aaaf": "453863", + "665b60": "211f45", + "efe3e1": "67548a", + "a7aba7": "ddac84", + "fffbff": "f7e5d0", + "e64c62": "aba7a8", + "993e49": "797877", + "501d25": "545151", + "7b827b": "a96c4b" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/962_3.json b/public/images/pokemon/variant/exp/back/962_3.json deleted file mode 100644 index 397453d3274..00000000000 --- a/public/images/pokemon/variant/exp/back/962_3.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "textures": [ - { - "image": "962_3.png", - "format": "RGBA8888", - "size": { - "w": 224, - "h": 224 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 82, - "h": 86 - }, - "frame": { - "x": 0, - "y": 0, - "w": 82, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 87, - "h": 79 - }, - "frame": { - "x": 0, - "y": 86, - "w": 87, - "h": 79 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 92, - "h": 74 - }, - "frame": { - "x": 82, - "y": 0, - "w": 92, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 38, - "w": 91, - "h": 59 - }, - "frame": { - "x": 0, - "y": 165, - "w": 91, - "h": 59 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 36, - "w": 91, - "h": 60 - }, - "frame": { - "x": 87, - "y": 74, - "w": 91, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 0, - "y": 41, - "w": 101, - "h": 41 - }, - "frame": { - "x": 91, - "y": 134, - "w": 101, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 0, - "y": 40, - "w": 100, - "h": 38 - }, - "frame": { - "x": 91, - "y": 175, - "w": 100, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ee54d59ae73a6775b5d1d9b10f273445:828dff0b1dc45966e927a7a1419412f2:1e70eb3d02dd5c47565da4b5d26e2400$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/962_3.png b/public/images/pokemon/variant/exp/back/962_3.png deleted file mode 100644 index 9356040a0e9..00000000000 Binary files a/public/images/pokemon/variant/exp/back/962_3.png and /dev/null differ diff --git a/public/images/trainer/aether_grunt_f.json b/public/images/trainer/aether_grunt_f.json new file mode 100644 index 00000000000..c43bdae9b2e --- /dev/null +++ b/public/images/trainer/aether_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aether_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 69, + "h": 69 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 23, + "y": 10, + "w": 35, + "h": 69 + }, + "frame": { + "x": 0, + "y": 0, + "w": 35, + "h": 69 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:0c9e77856d3b434e719021572bcb93de:f9c45dc5d67009b134dd1bbc5593f6ec:a694f8828aff21c718e5161e2fd63ade$" + } +} diff --git a/public/images/trainer/aether_grunt_f.png b/public/images/trainer/aether_grunt_f.png new file mode 100644 index 00000000000..b43c5e71a51 Binary files /dev/null and b/public/images/trainer/aether_grunt_f.png differ diff --git a/public/images/trainer/aether_grunt_m.json b/public/images/trainer/aether_grunt_m.json new file mode 100644 index 00000000000..eba00096f8d --- /dev/null +++ b/public/images/trainer/aether_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aether_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 65, + "h": 65 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 14, + "w": 47, + "h": 65 + }, + "frame": { + "x": 0, + "y": 0, + "w": 47, + "h": 65 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:963887cf29549ad3c123b8055cb4d701:68004c4a6e04c93bd21c26a6f8921f0c:d2241fc11d0fc31b26ecbedae6da74f4$" + } +} diff --git a/public/images/trainer/aether_grunt_m.png b/public/images/trainer/aether_grunt_m.png new file mode 100644 index 00000000000..f4df26ef007 Binary files /dev/null and b/public/images/trainer/aether_grunt_m.png differ diff --git a/public/images/trainer/faba.json b/public/images/trainer/faba.json new file mode 100644 index 00000000000..0e9544e2529 --- /dev/null +++ b/public/images/trainer/faba.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "faba.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 25, + "y": 5, + "w": 31, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:47622708d99a504998950bd9c389a504:fe1c51be191dd9fafb5b6f309c08ae1a:8d64db18930325b8b513740c1d83ce4c$" + } +} diff --git a/public/images/trainer/faba.png b/public/images/trainer/faba.png new file mode 100644 index 00000000000..a7fa0fb4879 Binary files /dev/null and b/public/images/trainer/faba.png differ diff --git a/public/images/trainer/guzma.json b/public/images/trainer/guzma.json new file mode 100644 index 00000000000..c278d68be24 --- /dev/null +++ b/public/images/trainer/guzma.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "guzma.png", + "format": "RGBA8888", + "size": { + "w": 58, + "h": 58 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 20, + "w": 37, + "h": 58 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 58 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c3b08a562a2882d1ca8b5e031e245da9:72a8305e547f091d15abccd2b142e401:3b302c7f9eb6ea81b65bcaeead4a95a9$" + } +} diff --git a/public/images/trainer/guzma.png b/public/images/trainer/guzma.png new file mode 100644 index 00000000000..97dadfbe6fd Binary files /dev/null and b/public/images/trainer/guzma.png differ diff --git a/public/images/trainer/lusamine.json b/public/images/trainer/lusamine.json new file mode 100644 index 00000000000..55a711a21fb --- /dev/null +++ b/public/images/trainer/lusamine.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "lusamine.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 36, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:41da3a1299e3831be70016dc91e49313:2413ba06767fb10fdc6fde8cc736c51c:4012333084c529872232c8d052561dc1$" + } +} diff --git a/public/images/trainer/lusamine.png b/public/images/trainer/lusamine.png new file mode 100644 index 00000000000..8b835a2d0be Binary files /dev/null and b/public/images/trainer/lusamine.png differ diff --git a/public/images/trainer/macro_grunt_f.json b/public/images/trainer/macro_grunt_f.json new file mode 100644 index 00000000000..04b30ec4ca5 --- /dev/null +++ b/public/images/trainer/macro_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "macro_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 74, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 24, + "y": 5, + "w": 31, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a015c43d80f8fd1932758e0e2cfcec61:59fc8205ea5ca04295831b4a2eb623ec:30df2ea8e9dac9e95f70534ec43d5ecd$" + } +} diff --git a/public/images/trainer/macro_grunt_f.png b/public/images/trainer/macro_grunt_f.png new file mode 100644 index 00000000000..892299d701e Binary files /dev/null and b/public/images/trainer/macro_grunt_f.png differ diff --git a/public/images/trainer/macro_grunt_m.json b/public/images/trainer/macro_grunt_m.json new file mode 100644 index 00000000000..5357fdb0767 --- /dev/null +++ b/public/images/trainer/macro_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "macro_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 75, + "h": 75 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 4, + "w": 48, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 48, + "h": 75 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:52fccff2a0675b4e10139ddb7067d4cf:10d254175d2d8a9111cce096ffb55fa3:d57016467aa07cafdfaf13e0ff643c1b$" + } +} diff --git a/public/images/trainer/macro_grunt_m.png b/public/images/trainer/macro_grunt_m.png new file mode 100644 index 00000000000..aa6b3607a87 Binary files /dev/null and b/public/images/trainer/macro_grunt_m.png differ diff --git a/public/images/trainer/oleana.json b/public/images/trainer/oleana.json new file mode 100644 index 00000000000..7219b640c38 --- /dev/null +++ b/public/images/trainer/oleana.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "oleana.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 53, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:30987a671771127a38491a588c465964:38b28effcfd5c6cbc0f358912a775af3:82e2a1f8afed29be57f6c2473f4c5be2$" + } +} diff --git a/public/images/trainer/oleana.png b/public/images/trainer/oleana.png new file mode 100644 index 00000000000..3252c67ab8e Binary files /dev/null and b/public/images/trainer/oleana.png differ diff --git a/public/images/trainer/plumeria.json b/public/images/trainer/plumeria.json new file mode 100644 index 00000000000..936a8766750 --- /dev/null +++ b/public/images/trainer/plumeria.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "plumeria.png", + "format": "RGBA8888", + "size": { + "w": 72, + "h": 72 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 23, + "y": 7, + "w": 36, + "h": 72 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 72 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:5527e7b646932d429928b53f055e9d27:c0640510780d2974f9b74a7f8e6b29aa:7bfec029bae78c9d483f59c35b73afad$" + } +} diff --git a/public/images/trainer/plumeria.png b/public/images/trainer/plumeria.png new file mode 100644 index 00000000000..b7382f6afde Binary files /dev/null and b/public/images/trainer/plumeria.png differ diff --git a/public/images/trainer/rose.json b/public/images/trainer/rose.json new file mode 100644 index 00000000000..86869257b63 --- /dev/null +++ b/public/images/trainer/rose.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rose.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 1, + "w": 52, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 52, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2b4ccaff7255c7d72661eac13de83ff8:72ee3660cdf470bd67375d355307e19d:8d35b104fc841baa4443581e6cea979e$" + } +} diff --git a/public/images/trainer/rose.png b/public/images/trainer/rose.png new file mode 100644 index 00000000000..a79a754e21b Binary files /dev/null and b/public/images/trainer/rose.png differ diff --git a/public/images/trainer/skull_grunt_f.json b/public/images/trainer/skull_grunt_f.json new file mode 100644 index 00000000000..4aa3dc313cd --- /dev/null +++ b/public/images/trainer/skull_grunt_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "skull_grunt_f.png", + "format": "RGBA8888", + "size": { + "w": 69, + "h": 69 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 27, + "y": 9, + "w": 29, + "h": 69 + }, + "frame": { + "x": 0, + "y": 0, + "w": 29, + "h": 69 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2e44c39efe8e78ec75d9119731b9b1cb:4923b5197ea74a9ed0b861e2408f595b:9035f560a0ab0d45bcc084aba7172990$" + } +} diff --git a/public/images/trainer/skull_grunt_f.png b/public/images/trainer/skull_grunt_f.png new file mode 100644 index 00000000000..e0ab67a33d7 Binary files /dev/null and b/public/images/trainer/skull_grunt_f.png differ diff --git a/public/images/trainer/skull_grunt_m.json b/public/images/trainer/skull_grunt_m.json new file mode 100644 index 00000000000..09d1a528c13 --- /dev/null +++ b/public/images/trainer/skull_grunt_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "skull_grunt_m.png", + "format": "RGBA8888", + "size": { + "w": 67, + "h": 67 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 28, + "y": 11, + "w": 26, + "h": 67 + }, + "frame": { + "x": 0, + "y": 0, + "w": 26, + "h": 67 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:688a83ff13a77c6923f038db8c7e5e84:d0ece3ab82602eb0c5003bacc26dbd9f:1ff10b395daf6ebfa377680a6404f816$" + } +} diff --git a/public/images/trainer/skull_grunt_m.png b/public/images/trainer/skull_grunt_m.png new file mode 100644 index 00000000000..4ceba3dad4f Binary files /dev/null and b/public/images/trainer/skull_grunt_m.png differ diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a8cffa1d9cd..88195a99137 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -22,7 +22,7 @@ import { getModifierPoolForType, getModifierType, getPartyLuckValue, - modifierTypes + modifierTypes, PokemonHeldItemModifierType } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; @@ -143,6 +143,7 @@ export default class BattleScene extends SceneBase { public bgmVolume: number = 1; public fieldVolume: number = 1; public seVolume: number = 1; + public uiVolume: number = 1; public gameSpeed: integer = 1; public damageNumbersMode: integer = 0; public reroll: boolean = false; @@ -863,14 +864,13 @@ export default class BattleScene extends SceneBase { if (Overrides.OPP_SPECIES_OVERRIDE) { species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); } - const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); + if (Overrides.OPP_LEVEL_OVERRIDE !== 0) { - pokemon.level = Overrides.OPP_LEVEL_OVERRIDE; + level = Overrides.OPP_LEVEL_OVERRIDE; } - if (Overrides.OPP_GENDER_OVERRIDE !== null) { - pokemon.gender = Overrides.OPP_GENDER_OVERRIDE; - } + const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); + overrideModifiers(this, false); overrideHeldItems(this, pokemon, false); if (boss && !dataSource) { @@ -1834,6 +1834,7 @@ export default class BattleScene extends SceneBase { } else { const soundDetails = sound.key.split("/"); switch (soundDetails[0]) { + case "battle_anims": case "cry": if (soundDetails[1].startsWith("PRSFX- ")) { @@ -1870,17 +1871,29 @@ export default class BattleScene extends SceneBase { try { const keyDetails = key.split("/"); switch (keyDetails[0]) { + case "level_up_fanfare": + case "item_fanfare": + case "minor_fanfare": + case "heal": + case "evolution": + case "evolution_fanfare": + // These sounds are loaded in as BGM, but played as sound effects + // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() + config["volume"] = this.masterVolume * this.bgmVolume; + break; case "battle_anims": case "cry": config["volume"] = this.masterVolume * this.fieldVolume; //PRSFX sound files are unusually loud - if (key.startsWith("PRSFX- ")) { + if (keyDetails[1].startsWith("PRSFX- ")) { config["volume"] *= 0.5; } break; - case "se": case "ui": - default: + //As of, right now this applies to the "select", "menu_open", "error" sound effects + config["volume"] = this.masterVolume * this.uiVolume; + break; + case "se": config["volume"] = this.masterVolume * this.seVolume; break; } @@ -2069,6 +2082,18 @@ export default class BattleScene extends SceneBase { return 12.974; case "battle_flare_grunt": //XY Team Flare Battle return 4.228; + case "battle_aether_grunt": // SM Aether Foundation Battle + return 16.00; + case "battle_skull_grunt": // SM Team Skull Battle + return 20.87; + case "battle_macro_grunt": // SWSH Trainer Battle + return 11.56; + case "battle_galactic_admin": //BDSP Team Galactic Admin Battle + return 11.997; + case "battle_skull_admin": //SM Team Skull Admin Battle + return 15.463; + case "battle_oleana": //SWSH Oleana Battle + return 14.110; case "battle_rocket_boss": //USUM Giovanni Battle return 9.115; case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle @@ -2079,6 +2104,12 @@ export default class BattleScene extends SceneBase { return 25.624; case "battle_flare_boss": //XY Lysandre Battle return 8.085; + case "battle_aether_boss": //SM Lusamine Battle + return 11.33; + case "battle_skull_boss": //SM Guzma Battle + return 13.13; + case "battle_macro_boss": //SWSH Rose Battle + return 11.42; } return 0; @@ -2521,13 +2552,19 @@ export default class BattleScene extends SceneBase { party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i] && heldModifiersConfigs[i].length > 0) { heldModifiersConfigs[i].forEach(mt => { - const stackCount = mt.stackCount ?? 1; - // const isTransferable = mt.isTransferable ?? true; - const modifier = mt.modifierType.newModifier(enemyPokemon); - modifier.stackCount = stackCount; - // TODO: set isTransferable - // modifier.setIsTransferable(isTransferable); - this.addEnemyModifier(modifier, true); + if (mt.modifier instanceof PokemonHeldItemModifierType) { + const stackCount = mt.stackCount ?? 1; + // const isTransferable = mt.isTransferable ?? true; + const modifier = mt.modifier.newModifier(enemyPokemon); + modifier.stackCount = stackCount; + // TODO: set isTransferable + // modifier.setIsTransferable(isTransferable); + this.addEnemyModifier(modifier, true); + } else { + const modifier = mt.modifier as PokemonHeldItemModifier; + modifier.pokemonId = enemyPokemon.id; + this.addEnemyModifier(modifier, true); + } }); } else { const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); diff --git a/src/battle.ts b/src/battle.ts index 75077a1c4cb..1068057cdcc 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -499,27 +499,27 @@ export const classicFixedBattles: FixedBattleConfigs = { [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ] ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA ], true)), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT ], true)), [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ] ], true, 1)), + .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA ], true, 1)), [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 ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE ])), [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 ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_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/battle-anims.ts b/src/data/battle-anims.ts index ebd37c33bae..acb5320b301 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1107,12 +1107,13 @@ export abstract class BattleAnim { let r = anim!.frames.length; let f = 0; - const existingFieldSprites = [...scene.field.getAll()]; + let existingFieldSprites = scene.field.getAll().slice(0); scene.tweens.addCounter({ duration: Utils.getFrameMs(3) * frameTimeMult, repeat: anim!.frames.length, onRepeat: () => { + existingFieldSprites = scene.field.getAll().slice(0); const spriteFrames = anim!.frames[f]; const frameData = this.getGraphicFrameDataWithoutTarget(anim!.frames[f], targetInitialX, targetInitialY); const u = 0; @@ -1139,7 +1140,8 @@ export abstract class BattleAnim { const setSpritePriority = (priority: integer) => { if (existingFieldSprites.length > priority) { // Move to specified priority index - scene.field.moveTo(moveSprite, scene.field.getIndex(existingFieldSprites[priority])); + const index = scene.field.getIndex(existingFieldSprites[priority]); + scene.field.moveTo(moveSprite, index); } else { // Move to top of scene scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index b875877f99e..0a02defe052 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -49,7 +49,8 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[] const costSpecies = Object.keys(speciesStarters) .map(s => parseInt(s) as Species) .filter(s => speciesStarters[s] === cost); - const starterSpecies = getPokemonSpecies(getPokemonSpecies(Utils.randSeedItem(costSpecies)).getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); + const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); + const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); } }, 0, seed); diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 6c178f10e1e..4b99be597b0 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -753,6 +753,98 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.AETHER_GRUNT]: [ + { + encounter: [ + "dialogue:aether_grunt.encounter.1", + "dialogue:aether_grunt.encounter.2", + "dialogue:aether_grunt.encounter.3", + "dialogue:aether_grunt.encounter.4", + "dialogue:aether_grunt.encounter.5", + ], + victory: [ + "dialogue:aether_grunt.victory.1", + "dialogue:aether_grunt.victory.2", + "dialogue:aether_grunt.victory.3", + "dialogue:aether_grunt.victory.4", + "dialogue:aether_grunt.victory.5", + ] + } + ], + [TrainerType.FABA]: [ + { + encounter: [ + "dialogue:faba.encounter.1", + "dialogue:faba.encounter.2", + "dialogue:faba.encounter.3", + ], + victory: [ + "dialogue:faba.victory.1", + "dialogue:faba.victory.2", + "dialogue:faba.victory.3", + ] + } + ], + [TrainerType.SKULL_GRUNT]: [ + { + encounter: [ + "dialogue:skull_grunt.encounter.1", + "dialogue:skull_grunt.encounter.2", + "dialogue:skull_grunt.encounter.3", + "dialogue:skull_grunt.encounter.4", + "dialogue:skull_grunt.encounter.5", + ], + victory: [ + "dialogue:skull_grunt.victory.1", + "dialogue:skull_grunt.victory.2", + "dialogue:skull_grunt.victory.3", + "dialogue:skull_grunt.victory.4", + "dialogue:skull_grunt.victory.5", + ] + } + ], + [TrainerType.PLUMERIA]: [ + { + encounter: [ + "dialogue:plumeria.encounter.1", + "dialogue:plumeria.encounter.2", + "dialogue:plumeria.encounter.3", + ], + victory: [ + "dialogue:plumeria.victory.1", + "dialogue:plumeria.victory.2", + "dialogue:plumeria.victory.3", + ] + } + ], + [TrainerType.MACRO_GRUNT]: [ + { + encounter: [ + "dialogue:macro_grunt.encounter.1", + "dialogue:macro_grunt.encounter.2", + "dialogue:macro_grunt.encounter.3", + ], + victory: [ + "dialogue:macro_grunt.victory.1", + "dialogue:macro_grunt.victory.2", + "dialogue:macro_grunt.victory.3", + ] + } + ], + [TrainerType.OLEANA]: [ + { + encounter: [ + "dialogue:oleana.encounter.1", + "dialogue:oleana.encounter.2", + "dialogue:oleana.encounter.3", + ], + victory: [ + "dialogue:oleana.victory.1", + "dialogue:oleana.victory.2", + "dialogue:oleana.victory.3", + ] + } + ], [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ { encounter: [ @@ -909,6 +1001,84 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.LUSAMINE]: [ + { + encounter: [ + "dialogue:aether_boss_lusamine_1.encounter.1" + ], + victory: [ + "dialogue:aether_boss_lusamine_1.victory.1" + ], + defeat: [ + "dialogue:aether_boss_lusamine_1.defeat.1" + ] + } + ], + [TrainerType.LUSAMINE_2]: [ + { + encounter: [ + "dialogue:aether_boss_lusamine_2.encounter.1" + ], + victory: [ + "dialogue:aether_boss_lusamine_2.victory.1" + ], + defeat: [ + "dialogue:aether_boss_lusamine_2.defeat.1" + ] + } + ], + [TrainerType.GUZMA]: [ + { + encounter: [ + "dialogue:skull_boss_guzma_1.encounter.1" + ], + victory: [ + "dialogue:skull_boss_guzma_1.victory.1" + ], + defeat: [ + "dialogue:skull_boss_guzma_1.defeat.1" + ] + } + ], + [TrainerType.GUZMA_2]: [ + { + encounter: [ + "dialogue:skull_boss_guzma_2.encounter.1" + ], + victory: [ + "dialogue:skull_boss_guzma_2.victory.1" + ], + defeat: [ + "dialogue:skull_boss_guzma_2.defeat.1" + ] + } + ], + [TrainerType.ROSE]: [ + { + encounter: [ + "dialogue:macro_boss_rose_1.encounter.1" + ], + victory: [ + "dialogue:macro_boss_rose_1.victory.1" + ], + defeat: [ + "dialogue:macro_boss_rose_1.defeat.1" + ] + } + ], + [TrainerType.ROSE_2]: [ + { + encounter: [ + "dialogue:macro_boss_rose_2.encounter.1" + ], + victory: [ + "dialogue:macro_boss_rose_2.victory.1" + ], + defeat: [ + "dialogue:macro_boss_rose_2.defeat.1" + ] + } + ], [TrainerType.BUCK]: [ { encounter: [ diff --git a/src/data/move.ts b/src/data/move.ts index f20d19723a8..40016b26ab7 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -601,11 +601,13 @@ export default class Move implements Localizable { return true; } } + break; case MoveFlags.IGNORE_PROTECT: if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) && this.checkFlag(MoveFlags.MAKES_CONTACT, user, target)) { return true; } + break; } return !!(this.flags & flag); @@ -8568,7 +8570,8 @@ export function initMoves() { new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(DefAtkAttr), new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8) - .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2), + .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2) + .ignoresProtect(), new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.SPD, -1) .makesContact(false), diff --git a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts index 9ff861fc5b1..147c998eb4d 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -13,6 +13,8 @@ import { IEggOptions } from "#app/data/egg"; import { EggSourceType } from "#enums/egg-source-types"; import { EggTier } from "#enums/egg-type"; import { PartyHealPhase } from "#app/phases/party-heal-phase"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { modifierTypes } from "#app/modifier/modifier-type"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:aTrainersTest"; @@ -136,7 +138,7 @@ export const ATrainersTestEncounter: MysteryEncounter = }, async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn standard trainer battle with memory mushroom reward + // Battle the stat trainer for an Egg and great rewards const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; await transitionMysteryEncounterIntroVisuals(scene); @@ -149,7 +151,7 @@ export const ATrainersTestEncounter: MysteryEncounter = tier: EggTier.ULTRA }; encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.epic`)); - setEncounterRewards(scene, { fillRemaining: true }, [eggOptions]); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.SACRED_ASH], guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA], fillRemaining: true }, [eggOptions]); return initBattleWithEnemyConfig(scene, config); } diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 29873486399..59469ecd0b5 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -175,7 +175,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter!; - scene.loadSe("PRSFX- Bug Bite", "battle_anims"); + scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); scene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); // Get all player berry items, remove from party, and store reference @@ -199,7 +199,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = // Overflow berries will be "lost" on the boss, but it's un-catchable anyway for (let i = 0; i < berryMod.stackCount; i++) { const modifierType = generateModifierType(scene, modifierTypes.BERRY, [berryMod.berryType]) as PokemonHeldItemModifierType; - bossModifierConfigs.push({ modifierType }); + bossModifierConfigs.push({ modifier: modifierType }); } scene.removeModifier(berryMod); @@ -351,7 +351,7 @@ function doGreedentSpriteSteal(scene: BattleScene) { const greedentSprites = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1); - scene.playSound("battle-anims/Follow Me"); + scene.playSound("battle_anims/Follow Me"); scene.tweens.chain({ targets: greedentSprites, tweens: [ diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 18a77b63e34..56ed3e66a97 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -131,7 +131,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const doBerryRewards = async () => { const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); // Generate a random berry and give it to the first Pokemon with room for it @@ -182,7 +182,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const doBerryRewards = async () => { const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); // Generate a random berry and give it to the first Pokemon with room for it @@ -208,7 +208,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const doFasterBerryRewards = async () => { const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index 3d89e4531d8..f73b2d0265e 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -1,5 +1,5 @@ import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; @@ -88,7 +88,7 @@ export const DancingLessonsEncounter: MysteryEncounter = .withAutoHideIntroVisuals(false) .withCatchAllowed(true) .withOnVisualsStart((scene: BattleScene) => { - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getPlayerPokemon()); + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getParty()[0]); danceAnim.play(scene); return true; @@ -105,7 +105,8 @@ export const DancingLessonsEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter!; const species = getPokemonSpecies(Species.ORICORIO); - const enemyPokemon = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels![0], TrainerSlot.NONE, false); + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const enemyPokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, false); if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { if (enemyPokemon.moveset.length < 4) { enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); @@ -130,10 +131,11 @@ export const DancingLessonsEncounter: MysteryEncounter = } const oricorioData = new PokemonData(enemyPokemon); + const oricorio = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels![0], TrainerSlot.NONE, false, oricorioData); // Adds a real Pokemon sprite to the field (required for the animation) - scene.currentBattle.enemyParty[0] = enemyPokemon; - scene.field.add(enemyPokemon); + scene.currentBattle.enemyParty[0] = oricorio; + scene.field.add(oricorio); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, @@ -141,11 +143,11 @@ export const DancingLessonsEncounter: MysteryEncounter = species: species, dataSource: oricorioData, isBoss: true, - // Gets +1 to all stats on battle start + // Gets +1 to all stats except SPD on battle start tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { queueEncounterMessage(pokemon.scene, `${namespace}.option.1.boss_enraged`); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF], 1)); } }], }; diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index eaa3c94d129..89c14b0228c 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -12,6 +12,7 @@ import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; +import { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:darkDeal"; @@ -125,25 +126,27 @@ export const DarkDealEncounter: MysteryEncounter = // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens // Will never return last battle able mon and instead pick fainted/unable to battle const removedPokemon = getRandomPlayerPokemon(scene, false, true); + // Get all the pokemon's held items + const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); scene.removePokemonFromPlayerParty(removedPokemon); const encounter = scene.currentBattle.mysteryEncounter!; encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); // Store removed pokemon types - encounter.misc = [ - removedPokemon.species.type1, - ]; - if (removedPokemon.species.type2) { - encounter.misc.push(removedPokemon.species.type2); - } + encounter.misc = { + removedTypes: removedPokemon.getTypes(), + modifiers + }; }) .withOptionPhase(async (scene: BattleScene) => { // Give the player 5 Rogue Balls + const encounter = scene.currentBattle.mysteryEncounter!; scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ROGUE_BALL)); // Start encounter with random legendary (7-10 starter strength) that has level additive - const bossTypes = scene.currentBattle.mysteryEncounter!.misc as Type[]; + const bossTypes: Type[] = encounter.misc.removedTypes; + const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ const roll = randSeedInt(100); const starterTier: number | [number, number] = @@ -152,6 +155,11 @@ export const DarkDealEncounter: MysteryEncounter = const pokemonConfig: EnemyPokemonConfig = { species: bossSpecies, isBoss: true, + modifierConfigs: bossModifiers.map(m => { + return { + modifier: m + }; + }) }; if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { pokemonConfig.formIndex = 0; diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index f0faa5cefda..493f5364e0b 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -115,7 +115,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); @@ -190,7 +190,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); @@ -203,7 +203,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); @@ -283,7 +283,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); diff --git a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts index f754ef33944..5d410b6e3d7 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -6,7 +6,7 @@ import { setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import { EnemyPokemon } from "#app/field/pokemon"; +import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { getPartyLuckValue, @@ -24,6 +24,10 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { TrainerSlot } from "#app/data/trainer-config"; import { getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { StatChangePhase } from "#app/phases/stat-change-phase"; +import { randSeedInt } from "#app/utils"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fightOrFlight"; @@ -58,13 +62,19 @@ export const FightOrFlightEncounter: MysteryEncounter = level: level, species: bossSpecies, dataSource: new PokemonData(bossPokemon), - isBoss: true + isBoss: true, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.option.1.stat_boost`); + // Randomly boost 1 stat 2 stages + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [randSeedInt(8)], 2)); + } }], }; encounter.enemyPartyConfigs = [config]; // Calculate item - // 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER + // Waves 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER @@ -122,6 +132,7 @@ export const FightOrFlightEncounter: MysteryEncounter = }, async (scene: BattleScene) => { // Pick battle + // Pokemon will randomly boost 1 stat by 2 stages const item = scene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 60df1f87b0f..4c9f2b94dd6 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -21,18 +21,27 @@ const namespace = "mysteryEncounter:mysteriousChest"; export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withAutoHideIntroVisuals(false) .withIntroSpriteConfigs([ { spriteKey: "chest_blue", fileRoot: "mystery-encounters", hasShadow: true, - x: 4, - y: 10, - yShadow: 3, + y: 8, + yShadow: 6, + alpha: 1, disableAnimation: true, // Re-enabled after option select }, + { + spriteKey: "chest_red", + fileRoot: "mystery-encounters", + hasShadow: false, + y: 8, + yShadow: 6, + alpha: 0, + disableAnimation: true, // Re-enabled after option select + } ]) .withIntroDialogue([ { @@ -56,14 +65,30 @@ export const MysteriousChestEncounter: MysteryEncounter = }) .withPreOptionPhase(async (scene: BattleScene) => { // Play animation - const introVisuals = - scene.currentBattle.mysteryEncounter!.introVisuals!; + const encounter = scene.currentBattle.mysteryEncounter!; + const introVisuals = encounter.introVisuals!; + + // Determine roll first + const roll = randSeedInt(100); + encounter.misc = { + roll + }; + + if (roll <= 35) { + // Chest is springing trap, change to red chest sprite + const blueChestSprites = introVisuals.getSpriteAtIndex(0); + const redChestSprites = introVisuals.getSpriteAtIndex(1); + redChestSprites[0].setAlpha(1); + blueChestSprites[0].setAlpha(0.001); + } introVisuals.spriteConfigs[0].disableAnimation = false; + introVisuals.spriteConfigs[1].disableAnimation = false; introVisuals.playAnim(); }) .withOptionPhase(async (scene: BattleScene) => { // Open the chest - const roll = randSeedInt(100); + const encounter = scene.currentBattle.mysteryEncounter!; + const roll = encounter.misc.roll; if (roll > 60) { // Choose between 2 COMMON / 2 GREAT tier items (40%) setEncounterRewards(scene, { @@ -106,14 +131,14 @@ export const MysteriousChestEncounter: MysteryEncounter = queueEncounterMessage(scene, `${namespace}.option.1.amazing`); leaveEncounterWithoutBattle(scene); } else { - // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) + // Your highest level unfainted Pokemon gets OHKO. Progress with no rewards (35%) const highestLevelPokemon = getHighestLevelPlayerPokemon( scene, true ); koPlayerPokemon(scene, highestLevelPokemon); - scene.currentBattle.mysteryEncounter!.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); + encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message await showEncounterText(scene, `${namespace}.option.1.bad`); diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index e2cbcade004..c07d952579c 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -24,6 +24,8 @@ const namespace = "mysteryEncounter:safariZone"; const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; +const SAFARI_MONEY_MULTIPLIER = 2.75; + /** * Safari Zone encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3800 | GitHub Issue #3800} @@ -33,7 +35,7 @@ export const SafariZoneEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) - .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive + .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive .withIntroSpriteConfigs([ { spriteKey: "safari_zone", @@ -53,7 +55,7 @@ export const SafariZoneEncounter: MysteryEncounter = .withQuery(`${namespace}.query`) .withOption(MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive + .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive .withDialogue({ buttonLabel: `${namespace}.option.1.label`, buttonTooltip: `${namespace}.option.1.tooltip`, @@ -72,9 +74,9 @@ export const SafariZoneEncounter: MysteryEncounter = }; updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); // Load bait/mud assets - scene.loadSe("PRSFX- Bug Bite", "battle_anims"); - scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims"); - scene.loadSe("PRSFX- Taunt2", "battle_anims"); + scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); + scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims", "PRSFX- Sludge Bomb2.wav"); + scene.loadSe("PRSFX- Taunt2", "battle_anims", "PRSFX- Taunt2.wav"); scene.loadAtlas("bait", "mystery-encounters"); scene.loadAtlas("mud", "mystery-encounters"); await summonSafariPokemon(scene); @@ -351,12 +353,12 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.playSound("battle-anims/PRSFX- Bug Bite"); + scene.playSound("battle_anims/PRSFX- Bug Bite"); bait.setFrame("0002.png"); }, onLoop: () => { if (index % 2 === 0) { - scene.playSound("battle-anims/PRSFX- Bug Bite"); + scene.playSound("battle_anims/PRSFX- Bug Bite"); } if (index === 4) { bait.setFrame("0003.png"); @@ -407,7 +409,7 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { // Mud frame 2 - scene.playSound("battle-anims/PRSFX- Sludge Bomb2"); + scene.playSound("battle_anims/PRSFX- Sludge Bomb2"); mud.setFrame("0002.png"); // Mud splat scene.time.delayedCall(200, () => { @@ -433,10 +435,10 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.playSound("battle-anims/PRSFX- Taunt2"); + scene.playSound("battle_anims/PRSFX- Taunt2"); }, onLoop: () => { - scene.playSound("battle-anims/PRSFX- Taunt2"); + scene.playSound("battle_anims/PRSFX- Taunt2"); }, onComplete: () => { resolve(true); diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index 9c20a511bdc..7646a3c2438 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -6,7 +6,7 @@ import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter" import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; import { Nature } from "#app/data/nature"; -import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { Moves } from "#enums/moves"; @@ -30,6 +30,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withScenePartySizeRequirement(3, 6) // Must have at least 3 pokemon in party .withHideWildIntroMessage(true) .withAutoHideIntroVisuals(false) .withIntroSpriteConfigs([ @@ -76,16 +77,16 @@ export const TheStrongStuffEncounter: MysteryEncounter = moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2 } ], @@ -124,35 +125,21 @@ export const TheStrongStuffEncounter: MysteryEncounter = transitionMysteryEncounterIntroVisuals(scene, true, true, 50); }); - // -20 to all base stats of highest BST, +10 to all base stats of rest of party - // Get highest BST mon - const party = scene.getParty(); - let highestBst: PlayerPokemon | null = null; - let statTotal = 0; - for (const pokemon of party) { - if (!highestBst) { - highestBst = pokemon; - statTotal = pokemon.getSpeciesForm().getBaseStatTotal(); - continue; - } - - const total = pokemon.getSpeciesForm().getBaseStatTotal(); - if (total > statTotal) { - highestBst = pokemon; - statTotal = total; - } - } - - if (!highestBst) { - highestBst = party[0]; - } - - modifyPlayerPokemonBST(highestBst, -20); - for (const pokemon of party) { - if (highestBst.id === pokemon.id) { - continue; - } + // -15 to all base stats of highest BST (halved for HP), +10 to all base stats of rest of party (halved for HP) + // Sort party by bst (inverted to pop 2 highest off end) + const sortedParty = scene.getParty().slice(0) + .sort((pokemon1, pokemon2) => { + const pokemon1Bst = pokemon1.calculateBaseStats().reduce((a, b) => a + b, 0); + const pokemon2Bst = pokemon2.calculateBaseStats().reduce((a, b) => a + b, 0); + return pokemon1Bst - pokemon2Bst; + }); + const highestBst = sortedParty.pop()!; + const highestBst2 = sortedParty.pop()!; + modifyPlayerPokemonBST(highestBst, -15); + modifyPlayerPokemonBST(highestBst2, -15); + // +10 for the rest + for (const pokemon of sortedParty) { modifyPlayerPokemonBST(pokemon, 10); } diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index d7ffdb78dae..841d2e6c90a 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -32,7 +32,7 @@ const namespace = "mysteryEncounter:theWinstrateChallenge"; export const TheWinstrateChallengeEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_WINSTRATE_CHALLENGE) .withEncounterTier(MysteryEncounterTier.ROGUE) - .withSceneWaveRangeRequirement(80, 180) + .withSceneWaveRangeRequirement(100, 180) .withIntroSpriteConfigs([ { spriteKey: "vito", @@ -221,11 +221,11 @@ function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, isTransferable: false }, { - modifierType: generateModifierType(scene, modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false }, @@ -239,11 +239,11 @@ function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, isTransferable: false }, { - modifierType: generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false } @@ -265,11 +265,11 @@ function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, isTransferable: false }, { - modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false } @@ -283,12 +283,12 @@ function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.PSYCHIC]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.PSYCHIC]) as PokemonHeldItemModifierType, stackCount: 1, isTransferable: false }, { - modifierType: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FAIRY]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FAIRY]) as PokemonHeldItemModifierType, stackCount: 1, isTransferable: false } @@ -310,12 +310,12 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false }, { - modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, stackCount: 4, isTransferable: false } @@ -329,12 +329,12 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, stackCount: 4, isTransferable: false }, { - modifierType: generateModifierType(scene, modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, isTransferable: false } ] @@ -347,7 +347,7 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 3, isTransferable: false }, @@ -369,7 +369,7 @@ function getVickyTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, isTransferable: false } ] @@ -390,7 +390,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false } @@ -404,47 +404,47 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType, stackCount: 2, } ] @@ -457,7 +457,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false } @@ -471,7 +471,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false }, @@ -485,7 +485,7 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], modifierConfigs: [ { - modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 2, isTransferable: false }, diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 4ffe60e29bd..f640af4a14e 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -4,7 +4,7 @@ import { getNatureName, Nature } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; import { getStatName } from "#app/data/pokemon-stat"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import { AbilityAttr } from "#app/system/game-data"; import PokemonData from "#app/system/pokemon-data"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; @@ -247,9 +247,10 @@ export const TrainingSessionEncounter: MysteryEncounter = playerPokemon.setNature(encounter.misc.chosenNature); scene.gameData.setPokemonCaught(playerPokemon, false); - // Add pokemon and mods back + // Add pokemon and modifiers back scene.getParty().push(playerPokemon); for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); @@ -385,10 +386,10 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segmen playerPokemon.resetSummonData(); // Passes modifiers by reference - modifiers.value = scene.findModifiers((m) => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id) as PokemonHeldItemModifier[]; + modifiers.value = playerPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); const modifierConfigs = modifiers.value.map((mod) => { return { - modifierType: mod.type + modifier: mod }; }) as HeldModifierConfig[]; diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index da76922a5ef..6724b144f62 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -31,7 +31,7 @@ const SOUND_EFFECT_WAIT_TIME = 700; export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE) .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(10, 180) + .withSceneWaveRangeRequirement(60, 180) .withMaxAllowedEncounters(1) .withIntroSpriteConfigs([ { @@ -177,7 +177,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } } - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), undefined, true); // First Shell bell @@ -204,17 +204,17 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } } - scene.playSound("bgm/item_fanfare"); + scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), undefined, true); } async function doGarbageDig(scene: BattleScene) { - scene.playSound("battle-anims/PRSFX- Dig2"); + scene.playSound("battle_anims/PRSFX- Dig2"); scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => { - scene.playSound("battle-anims/PRSFX- Dig2"); - scene.playSound("battle-anims/PRSFX- Venom Drench", { volume: 2 }); + scene.playSound("battle_anims/PRSFX- Dig2"); + scene.playSound("battle_anims/PRSFX- Venom Drench", { volume: 2 }); }); scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => { - scene.playSound("battle-anims/PRSFX- Dig2"); + scene.playSound("battle_anims/PRSFX- Dig2"); }); } diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts new file mode 100644 index 00000000000..7563e2d756e --- /dev/null +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -0,0 +1,265 @@ +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import Pokemon, { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; +import { getPartyLuckValue } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MoveRequirement, PersistentModifierRequirement } from "../mystery-encounter-requirements"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import PokemonData from "#app/system/pokemon-data"; +import { speciesEggMoves } from "#app/data/egg-moves"; +import { isNullOrUndefined, randSeedInt } from "#app/utils"; +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { SelfStatusMove } from "#app/data/move"; +import { PokeballType } from "#enums/pokeball"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { StatChangePhase } from "#app/phases/stat-change-phase"; +import { BattleStat } from "#app/data/battle-stat"; +import { BerryModifier } from "#app/modifier/modifier"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:uncommonBreed"; + +/** + * Uncommon Breed encounter. + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3811 | GitHub Issue #3811} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const UncommonBreedEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.UNCOMMON_BREED) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter!; + + // Calculate boss mon + // Level equal to 2 below highest party member + const level = getHighestLevelPlayerPokemon(scene).level - 2; + const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true); + const speciesRootForm = pokemon.species.getRootSpeciesId(); + encounter.misc = { + pokemon + }; + + // Pokemon will always have one of its egg moves in its moveset + if (speciesEggMoves.hasOwnProperty(speciesRootForm)) { + const eggMoves: Moves[] = speciesEggMoves[speciesRootForm]; + const eggMoveIndex = randSeedInt(4); + const randomEggMove: Moves = eggMoves[eggMoveIndex]; + encounter.misc.eggMove = randomEggMove; + if (pokemon.moveset.length < 4) { + pokemon.moveset.push(new PokemonMove(randomEggMove)); + } else { + pokemon.moveset[0] = new PokemonMove(randomEggMove); + } + } + + const config: EnemyPartyConfig = { + pokemonConfigs: [{ + level: level, + species: species, + dataSource: new PokemonData(pokemon), + isBoss: false, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.option.1.stat_boost`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + } + }], + }; + encounter.enemyPartyConfigs = [config]; + + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); + encounter.spriteConfigs = [ + { + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + x: -5, + repeat: true, + isPokemon: true + }, + ]; + + encounter.setDialogueToken("enemyPokemon", pokemon.getNameToRender()); + scene.loadSe("PRSFX- Spotlight2", "battle_anims", "PRSFX- Spotlight2.wav"); + return true; + }) + .withOnVisualsStart((scene: BattleScene) => { + // Animate the pokemon + const encounter = scene.currentBattle.mysteryEncounter!; + const pokemonSprite = encounter.introVisuals!.getSprites(); + + scene.tweens.add({ // Bounce at the end + targets: pokemonSprite, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: "-=20", + loop: 1, + }); + + scene.time.delayedCall(500, () => scene.playSound("battle_anims/PRSFX- Spotlight2")); + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter!; + + const eggMove = encounter.misc.eggMove; + if (!isNullOrUndefined(eggMove)) { + // Check what type of move the egg move is to determine target + const pokemonMove = new PokemonMove(eggMove); + const move = pokemonMove.getMove(); + const target = move instanceof SelfStatusMove ? BattlerIndex.ENEMY : BattlerIndex.PLAYER; + + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [target], + move: pokemonMove, + ignorePp: true + }); + } + + setEncounterRewards(scene, { fillRemaining: true }); + await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); + } + ) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected` + } + ] + }) + .withOptionPhase(async (scene: BattleScene) => { + // Give it some food + + // Remove 4 random berries from player's party + // Get all player berry items, remove from party, and store reference + let berryItems: BerryModifier[] = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + for (let i = 0; i < 4; i++) { + berryItems = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + const randBerry = berryItems[randSeedInt(berryItems.length)]; + randBerry.stackCount--; + if (randBerry.stackCount === 0) { + scene.removeModifier(randBerry); + } + scene.updateModifiers(true, true); + } + + // Pokemon joins the team, with 2 egg moves + const encounter = scene.currentBattle.mysteryEncounter!; + const pokemon = encounter.misc.pokemon; + + // Give 1 additional egg move + const previousEggMove = encounter.misc.eggMove; + const speciesRootForm = pokemon.species.getRootSpeciesId(); + if (speciesEggMoves.hasOwnProperty(speciesRootForm)) { + const eggMoves: Moves[] = speciesEggMoves[speciesRootForm]; + let randomEggMove: Moves = eggMoves[randSeedInt(4)]; + while (randomEggMove === previousEggMove) { + randomEggMove = eggMoves[randSeedInt(4)]; + } + if (pokemon.moveset.length < 4) { + pokemon.moveset.push(new PokemonMove(randomEggMove)); + } else { + pokemon.moveset[1] = new PokemonMove(randomEggMove); + } + } + + await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false); + setEncounterRewards(scene, { fillRemaining: true }); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected` + } + ] + }) + .withOptionPhase(async (scene: BattleScene) => { + // Attract the pokemon with a move + // Pokemon joins the team, with 2 egg moves and IVs rolled an additional time + const encounter = scene.currentBattle.mysteryEncounter!; + const pokemon = encounter.misc.pokemon; + + // Give 1 additional egg move + const previousEggMove = encounter.misc.eggMove; + const speciesRootForm = pokemon.species.getRootSpeciesId(); + if (speciesEggMoves.hasOwnProperty(speciesRootForm)) { + const eggMoves: Moves[] = speciesEggMoves[speciesRootForm]; + let randomEggMove: Moves = eggMoves[randSeedInt(4)]; + while (randomEggMove === previousEggMove) { + randomEggMove = eggMoves[randSeedInt(4)]; + } + if (pokemon.moveset.length < 4) { + pokemon.moveset.push(new PokemonMove(randomEggMove)); + } else { + pokemon.moveset[1] = new PokemonMove(randomEggMove); + } + } + + // Roll IVs a second time + pokemon.ivs = pokemon.ivs.map(iv => { + const newValue = randSeedInt(31); + return newValue > iv ? newValue : iv; + }); + + await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false); + if (encounter.selectedOption?.primaryPokemon?.id) { + setEncounterExp(scene, encounter.selectedOption.primaryPokemon.id, pokemon.getExpValue(), false); + } + setEncounterRewards(scene, { fillRemaining: true }); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index d3ddafb0194..34138ce9c27 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -94,6 +94,7 @@ const STANDARD_BST_TRANSFORM_BASE_VALUES = [40, 50]; export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) .withEncounterTier(MysteryEncounterTier.ROGUE) + .withSceneWaveRangeRequirement(10, 180) .withIntroSpriteConfigs([ { spriteKey: "girawitch", @@ -111,7 +112,6 @@ export const WeirdDreamEncounter: MysteryEncounter = text: `${namespace}.intro_dialogue`, }, ]) - .withSceneWaveRangeRequirement(10, 180) .withTitle(`${namespace}.title`) .withDescription(`${namespace}.description`) .withQuery(`${namespace}.query`) diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 595d9b578d4..1a842568e85 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -29,6 +29,7 @@ import { TheWinstrateChallengeEncounter } from "#app/data/mystery-encounters/enc import { TeleportingHijinksEncounter } from "#app/data/mystery-encounters/encounters/teleporting-hijinks-encounter"; import { BugTypeSuperfanEncounter } from "#app/data/mystery-encounters/encounters/bug-type-superfan-encounter"; import { FunAndGamesEncounter } from "#app/data/mystery-encounters/encounters/fun-and-games-encounter"; +import { UncommonBreedEncounter } from "#app/data/mystery-encounters/encounters/uncommon-breed-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -175,7 +176,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.CLOWNING_AROUND, MysteryEncounterType.WEIRD_DREAM, MysteryEncounterType.TELEPORTING_HIJINKS, - MysteryEncounterType.BUG_TYPE_SUPERFAN + MysteryEncounterType.BUG_TYPE_SUPERFAN, + MysteryEncounterType.UNCOMMON_BREED ]; /** @@ -282,6 +284,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.TELEPORTING_HIJINKS] = TeleportingHijinksEncounter; allMysteryEncounters[MysteryEncounterType.BUG_TYPE_SUPERFAN] = BugTypeSuperfanEncounter; allMysteryEncounters[MysteryEncounterType.FUN_AND_GAMES] = FunAndGamesEncounter; + allMysteryEncounters[MysteryEncounterType.UNCOMMON_BREED] = UncommonBreedEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index fb793a6f45a..7fc21cb4653 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -886,7 +886,7 @@ export function handleMysteryEncounterBattleStartEffects(scene: BattleScene) { /** * Can queue extra phases or logic during {@link TurnInitPhase} - * Mostly useful for allowing MysteryEncounter enemies to "cheat" and use moves before the first turn + * Should mostly just be used for injecting custom phases into the battle system on turn start * @param scene * @return boolean - if true, will skip the remainder of the {@link TurnInitPhase} */ diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 0c91263f1f3..315e75e53e1 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1582,7 +1582,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) ], [Species.PICHU]: [ - new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT) + new SpeciesFormEvolution(Species.PIKACHU, "spiky", "partner", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), + new SpeciesFormEvolution(Species.PIKACHU, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), ], [Species.CLEFFA]: [ new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index db4f0a555ac..f728a69c5cd 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1,24 +1,21 @@ - +import { Localizable } from "#app/interfaces/locales"; +import { Abilities } from "#enums/abilities"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import { Species } from "#enums/species"; +import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; +import i18next from "i18next"; import BattleScene, { AnySound } from "../battle-scene"; -import { Variant, variantColorCache } from "./variant"; -import { variantData } from "./variant"; +import { GameMode } from "../game-mode"; +import { StarterMoveset } from "../system/game-data"; +import * as Utils from "../utils"; +import { uncatchableSpecies } from "./biomes"; +import { speciesEggMoves } from "./egg-moves"; import { GrowthRate } from "./exp"; import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; import { Type } from "./type"; import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; -import { uncatchableSpecies } from "./biomes"; -import * as Utils from "../utils"; -import { StarterMoveset } from "../system/game-data"; -import { speciesEggMoves } from "./egg-moves"; -import { GameMode } from "../game-mode"; -import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; -import { VariantSet } from "./variant"; -import i18next from "i18next"; -import { Localizable } from "#app/interfaces/locales"; import { Stat } from "./pokemon-stat"; -import { Abilities } from "#enums/abilities"; -import { PartyMemberStrength } from "#enums/party-member-strength"; -import { Species } from "#enums/species"; +import { Variant, VariantSet, variantColorCache, variantData } from "./variant"; export enum Region { NORMAL, @@ -28,7 +25,15 @@ export enum Region { PALDEA } -export function getPokemonSpecies(species: Species | Species[]): PokemonSpecies { +/** + * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given + * @param species The species to fetch + * @returns The associated {@linkcode PokemonSpecies} object + */ +export function getPokemonSpecies(species: Species | Species[] | undefined): PokemonSpecies { + if (!species) { + throw new Error("`species` must not be undefined in `getPokemonSpecies()`"); + } // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block if (Array.isArray(species)) { // Pick a random species from the list @@ -309,7 +314,7 @@ export abstract class PokemonSpeciesForm { let variantDataIndex: integer | string = this.speciesId; const species = getPokemonSpecies(this.speciesId); if (species.forms.length > 0 && formIndex !== undefined) { - formkey = species.forms[formIndex]?.formSpriteKey; + formkey = species.forms[formIndex]?.getFormSpriteKey(formIndex); if (formkey) { variantDataIndex = `${this.speciesId}-${formkey}`; } @@ -656,8 +661,8 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); } - getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength): Species { - return this.getSpeciesForLevel(level, allowEvolving, true, strength); + getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { + return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave); } private getStrengthLevelDiff(strength: PartyMemberStrength): integer { @@ -677,7 +682,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER): Species { + getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -738,6 +743,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); } } + /* (Most) Trainers shouldn't be using unevolved Pokemon by the third gym leader / wave 80. Exceptions to this include Breeders, whose large teams are balanced by the use of weaker pokemon */ + if (currentWave >= 80 && forTrainer && strength > PartyMemberStrength.WEAKER) { + evolutionChance = 1; + noEvolutionChance = 0; + } if (evolutionChance > 0) { if (isRegionalEvolution) { @@ -762,7 +772,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const weight of evolutionPool.keys()) { if (randValue < weight) { - return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel(level, true, forTrainer, strength); // TODO: is the bang correct? + return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); } } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 892627f8f7e..23ea5ab91fa 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -16,6 +16,7 @@ import {Moves} from "#enums/moves"; import {PartyMemberStrength} from "#enums/party-member-strength"; import {Species} from "#enums/species"; import {TrainerType} from "#enums/trainer-type"; +import {Gender} from "./gender"; export enum TrainerPoolTier { COMMON, @@ -142,7 +143,7 @@ export const trainerPartyTemplates = { FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), - SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), @@ -323,6 +324,15 @@ export class TrainerConfig { case TrainerType.LYSANDRE_2: trainerType = TrainerType.LYSANDRE; break; + case TrainerType.LUSAMINE_2: + trainerType = TrainerType.LUSAMINE; + break; + case TrainerType.GUZMA_2: + trainerType = TrainerType.GUZMA; + break; + case TrainerType.ROSE_2: + trainerType = TrainerType.ROSE; + break; case TrainerType.MARNIE_ELITE: trainerType = TrainerType.MARNIE; break; @@ -553,9 +563,9 @@ export class TrainerConfig { } case "magma": { return { - [TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR], [TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR], - [TrainerPoolTier.RARE]: [Species.TURTONATOR, Species.CHARCADET] + [TrainerPoolTier.RARE]: [Species.CAPSAKID, Species.CHARCADET] }; } case "aqua": { @@ -586,6 +596,27 @@ export class TrainerConfig { [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON] }; } + case "aether": { + return { + [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU], + [TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWKING, Species.MEDITITE, Species.BELDUM, Species.ORANGURU, Species.HATTERENE, Species.INKAY, Species.RALTS], + [TrainerPoolTier.RARE]: [Species.ARMAROUGE, Species.GIRAFARIG, Species.PORYGON] + }; + } + case "skull": { + return { + [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.LURANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING], + [TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWBRO, Species.SKORUPI, Species.PALDEA_WOOPER, Species.NIDORAN_F, Species.CROAGUNK, Species.MANDIBUZZ], + [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.HISUI_SNEASEL] + }; + } + case "macro": { + return { + [TrainerPoolTier.COMMON]: [ Species.HATTERENE, Species.MILOTIC, Species.TSAREENA, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS], + [TrainerPoolTier.UNCOMMON]: [Species.MANDIBUZZ, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.SINISTEA, Species.APPLIN], + [TrainerPoolTier.RARE]: [Species.TINKATINK, Species.HISUI_LILLIGANT] + }; + } } console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`); @@ -1060,7 +1091,7 @@ function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSl return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); if (!ignoreEvolution) { - species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); + species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex); } return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); }; @@ -1070,7 +1101,7 @@ function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilt const originalSpeciesFilter = speciesFilter; speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { - const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess); + const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex)), level, trainerSlot, undefined, undefined, postProcess); return ret; }; } @@ -1404,9 +1435,9 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], - [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR], [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], - [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] + [TrainerPoolTier.SUPER_RARE]: [Species.CAPSAKID, Species.CHARCADET] }), [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), @@ -1426,10 +1457,9 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] }), - - [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").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, Species.SANDILE, Species.TRUBBISH], @@ -1439,7 +1469,6 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.SWOOBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").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, Species.SCRAFTY, Species.CROAGUNK], @@ -1449,6 +1478,31 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.BOUNSWEET, Species.LILLIPUP, Species.ALOLA_MAROWAK], + [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ALOLA_EXEGGUTOR, Species.CRABRAWLER, Species.CUTIEFLY, Species.ALOLA_RAICHU, Species.ORICORIO, Species.MUDBRAY], + [TrainerPoolTier.RARE]: [ Species.ORANGURU, Species.PASSIMIAN, Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA], + [TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON] + }), + [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH], + [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.ALOLA_MAROWAK, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY], + [TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.GASTLY, Species.WISHIWASHI], + [TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER] + }), + [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED], + [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU], + [TrainerPoolTier.RARE]: [Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA], + [TrainerPoolTier.SUPER_RARE]: [Species.DURALUDON, Species.DREEPY] + }), + [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1825,7 +1879,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); })), [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.KINGDRA, Species.LUDICOLO], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.EMPOLEON, Species.LUDICOLO], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -1838,9 +1892,9 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Swift Swim })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HUNTAIL, Species.GOREBYSS], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Swift Swim + p.abilityIndex = 1; // Swift Swim })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1855,11 +1909,11 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.MASTER_BALL; })), [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])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.AZELF, Species.UXIE, Species.MESPRIT])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; @@ -1905,15 +1959,20 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })), [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 => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GENESECT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.pokeball = PokeballType.MASTER_BALL; + p.formIndex = Utils.randSeedInt(5); })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.DURANT])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.DARMANITAN, Species.GALAR_DARMANITAN])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.KINGAMBIT])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HYDREIGON, Species.IRON_JUGULIS], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.formIndex = 1; + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.SLITHER_WING ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -1924,12 +1983,15 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.MASTER_BALL; })), [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])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MILOTIC])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.HELIOLISK])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CLAWITZER, Species.DRAGALGE ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK, Species.MALAMAR ])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -1942,10 +2004,13 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GHOLDENGO, Species.AEGISLASH])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.PYROAR])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOODRA, Species.HISUI_GOODRA])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.IRON_MOTH ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -1957,7 +2022,113 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - // TODO: use signature species? + [TrainerType.LUSAMINE]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", []).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LILLIGANT, Species.HISUI_LILLIGANT ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BEWEAR ])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + })), + [TrainerType.LUSAMINE_2]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", [], true).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PHEROMOSA ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.STAKATAKA, Species.CELESTEELA, Species.GUZZLORD ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NECROZMA ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.generateName(); + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + })), + [TrainerType.GUZMA_2]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", [], true).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; //Anticipation + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; //Sharpness, Adaptability + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.generateName(); + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.FERROTHORN, Species.ESCAVALIER ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PERRSERKER, Species.KLINKLANG ])) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.generateName(); + })), + [TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; //Strong Jaw, Hustle + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.generateName(); + })), [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index d48bab3076b..1cb314c4ef7 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -26,5 +26,6 @@ export enum MysteryEncounterType { THE_WINSTRATE_CHALLENGE, TELEPORTING_HIJINKS, BUG_TYPE_SUPERFAN, - FUN_AND_GAMES + FUN_AND_GAMES, + UNCOMMON_BREED } diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index 9ca634ae1f2..cfc52b70eb0 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -72,6 +72,12 @@ export enum TrainerType { FLARE_GRUNT, BRYONY, XEROSIC, + AETHER_GRUNT, + FABA, + SKULL_GRUNT, + PLUMERIA, + MACRO_GRUNT, + OLEANA, ROCKET_BOSS_GIOVANNI_1, ROCKET_BOSS_GIOVANNI_2, MAXIE, @@ -84,6 +90,12 @@ export enum TrainerType { GHETSIS_2, LYSANDRE, LYSANDRE_2, + LUSAMINE, + LUSAMINE_2, + GUZMA, + GUZMA_2, + ROSE, + ROSE_2, BUCK, CHERYL, MARLEY, diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 0bcb4725f4c..ccb82ebbb2e 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -10,7 +10,7 @@ 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 { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier } from "../modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, PokemonBaseStatFlatModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; @@ -778,19 +778,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.stats) { this.stats = [ 0, 0, 0, 0, 0, 0 ]; } - const baseStats = this.getSpeciesForm().baseStats.slice(0); - this.scene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats); - if (this.fusionSpecies) { - const fusionBaseStats = this.getFusionSpeciesForm().baseStats; - for (let s = 0; s < this.stats.length; s++) { - baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); - } - } else if (this.scene.gameMode.isSplicedOnly) { - for (let s = 0; s < this.stats.length; s++) { - baseStats[s] = Math.ceil(baseStats[s] / 2); - } - } - this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats); + const baseStats = this.calculateBaseStats(); const stats = Utils.getEnumValues(Stat); for (const s of stats) { const isHp = s === Stat.HP; @@ -822,6 +810,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, this.stats); } + calculateBaseStats(): number[] { + const baseStats = this.getSpeciesForm().baseStats.slice(0); + // Shuckle Juice + this.scene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats); + // Old Gateau + this.scene.applyModifiers(PokemonBaseStatFlatModifier, this.isPlayer(), this, baseStats); + if (this.fusionSpecies) { + const fusionBaseStats = this.getFusionSpeciesForm().baseStats; + for (let s = 0; s < this.stats.length; s++) { + baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); + } + } else if (this.scene.gameMode.isSplicedOnly) { + for (let s = 0; s < this.stats.length; s++) { + baseStats[s] = Math.ceil(baseStats[s] / 2); + } + } + // Vitamins + this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats); + return baseStats; + } + getNature(): Nature { return this.natureOverride !== -1 ? this.natureOverride : this.nature; } @@ -2679,7 +2688,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } private fusionFaintCry(callback: Function): void { - const key = this.getSpeciesForm().getCryKey(this.formIndex); + const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`; let i = 0; let rate = 0.85; const cry = this.scene.playSound(key, { rate: rate }) as AnySound; @@ -2687,7 +2696,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const tintSprite = this.getTintSprite(); let duration = cry.totalDuration * 1000; - let fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), { rate: rate }) as AnySound; + const fusionCryKey = `cry/${this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex)}`; + let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound; fusionCry.stop(); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); @@ -2731,7 +2741,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (i === transitionIndex) { SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2))); - fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); + fusionCry = this.scene.playSound(fusionCryKey, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0); } rate *= 0.99; @@ -3795,6 +3805,18 @@ export class EnemyPokemon extends Pokemon { this.status = new Status(Overrides.OPP_STATUS_OVERRIDE); } + if (Overrides.OPP_GENDER_OVERRIDE) { + this.gender = Overrides.OPP_GENDER_OVERRIDE; + } + + const speciesId = this.species.speciesId; + + if (speciesId in Overrides.OPP_FORM_OVERRIDES + && Overrides.OPP_FORM_OVERRIDES[speciesId] + && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]]) { + this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0; + } + if (!dataSource) { this.generateAndPopulateMoveset(); diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 52bbd063ba4..02825e1262b 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -364,12 +364,12 @@ export default class Trainer extends Phaser.GameObjects.Container { let species = useNewSpeciesPool ? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)]) : template.isSameSpecies(index) && index > offset - ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset))) + ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex)) : this.genNewPartyMemberSpecies(level, strength); // If the species is from newSpeciesPool, we need to adjust it based on the level and strength if (newSpeciesPool) { - species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength)); + species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength, this.scene.currentBattle.waveIndex)); } ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); @@ -398,7 +398,7 @@ export default class Trainer extends Phaser.GameObjects.Container { species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); } - let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); + let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); let retry = false; console.log(ret.getName()); @@ -417,7 +417,7 @@ export default class Trainer extends Phaser.GameObjects.Container { console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { - ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); + ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); console.log(ret.name); if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { retry = false; diff --git a/src/interfaces/held-modifier-config.ts b/src/interfaces/held-modifier-config.ts index 304de72f01b..2285babdbfd 100644 --- a/src/interfaces/held-modifier-config.ts +++ b/src/interfaces/held-modifier-config.ts @@ -1,7 +1,8 @@ import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; export default interface HeldModifierConfig { - modifierType: PokemonHeldItemModifierType; + modifier: PokemonHeldItemModifierType | PokemonHeldItemModifier; stackCount?: number; isTransferable?: boolean; } diff --git a/src/locales/de/battle.json b/src/locales/de/battle.json index 9e97a4d5b17..762b5848439 100644 --- a/src/locales/de/battle.json +++ b/src/locales/de/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}} hat {{moveName}} nicht erlernt.", "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?", "learnMoveForgetSuccess": "{{pokemonName}} hat {{moveName}} vergessen.", - "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!", + "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}schwupp!", "learnMoveAnd": "Und…", "levelCapUp": "Die Levelbeschränkung wurde auf {{levelCap}} erhöht!", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", diff --git a/src/locales/de/bgm-name.json b/src/locales/de/bgm-name.json index 2d2a5bfbab3..1eab276a70a 100644 --- a/src/locales/de/bgm-name.json +++ b/src/locales/de/bgm-name.json @@ -80,11 +80,21 @@ "battle_galactic_grunt": "BDSP Vs. Team Galaktik Rüpel", "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", "battle_flare_grunt": "XY Vs. Team Flare Rüpel", + "battle_aether_grunt": "SM Vs. Æther Foundation", + "battle_skull_grunt": "SM Vs. Team Skull Rüpel", + "battle_macro_grunt": "SWSH Vs. Trainer", + "battle_galactic_admin": "BDSP Vs. Team Galactic Commander", + "battle_skull_admin": "SM Vs. Team Skull Vorstand", + "battle_oleana": "SWSH Vs. Oleana", "battle_rocket_boss": "USUM Vs. Giovanni", "battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss", "battle_galactic_boss": "BDSP Vs. Zyrus", "battle_plasma_boss": "S2W2 Vs. G-Cis", "battle_flare_boss": "XY Vs. Flordelis", + "battle_aether_boss": "SM Vs. Samantha", + "battle_skull_boss": "SM Vs. Bromley", + "battle_macro_boss": "SWSH Vs. Rose", + "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", "badlands": "PMD Erkundungsteam Himmel Kargtal", "beach": "PMD Erkundungsteam Himmel Feuchtklippe", diff --git a/src/locales/de/dialogue-female.json b/src/locales/de/dialogue-female.json index e71e03453a7..2f80fc09eba 100644 --- a/src/locales/de/dialogue-female.json +++ b/src/locales/de/dialogue-female.json @@ -355,6 +355,30 @@ "1": "Ich werde für das nächste Rennen tunen." } }, + "firebreather": { + "encounter": { + "1": "Meine Flammen werden dich verschlingen!", + "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", + "3": "Komm näher und sieh dir meine Flammen an!" + }, + "victory": { + "1": "Verbrannt bis zur Asche...", + "2": "Yow! Das ist heiß!", + "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" + } + }, + "sailor": { + "encounter": { + "1": "Matrose, du gehst über Bord, wenn du verlierst!", + "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", + "3": "Ahoj! Bist du seekrank?" + }, + "victory": { + "1": "Argh! Von einem Kind besiegt!", + "2": "Dein Geist hat mich versenkt!", + "3": "Ich glaube, ich bin der der seekrank ist..." + } + }, "archer": { "encounter": { "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!", @@ -417,7 +441,7 @@ }, "courtney": { "encounter": { - "1": "Das Ding... Das Ding, das du hältst... Das ist es, was...\n$Das ist es, wonach wir von Team Magma suchen...", + "1": "Stellt euch...Mir NICHT...IN DEN WEEEG...!!", "2": "... Nun dann... Auslöschen...", "3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..." }, @@ -446,7 +470,7 @@ "3": "Was machst du hier? Bist du uns gefolgt?" }, "victory": { - "1": "Na gut, bis der Boss Zeit für dich hat, werde ich dein Gegner sein!", + "1": "Bwaarharharharhar!! Ich hab zwar verloren, aber das hat Spaß gemacht!", "2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...", "3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!" } @@ -535,30 +559,6 @@ "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert." } }, - "firebreather": { - "encounter": { - "1": "Meine Flammen werden dich verschlingen!", - "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", - "3": "Komm näher und sieh dir meine Flammen an!" - }, - "victory": { - "1": "Verbrannt bis zur Asche...", - "2": "Yow! Das ist heiß!", - "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" - } - }, - "sailor": { - "encounter": { - "1": "Matrose, du gehst über Bord, wenn du verlierst!", - "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", - "3": "Ahoj! Bist du seekrank?" - }, - "victory": { - "1": "Argh! Von einem Kind besiegt!", - "2": "Dein Geist hat mich versenkt!", - "3": "Ich glaube, ich bin der der seekrank ist..." - } - }, "rocket_grunt": { "encounter": { "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!", @@ -655,6 +655,86 @@ "5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen." } }, + "aether_grunt": { + "encounter": { + "1": "Ich werde dich mit allem, was ich habe, bekämpfen. Ich werde dich auslöschen!", + "2": "Mir ist egal, ob du ein simpler Trainer bist oder nicht.\n$Ich werde dich hochkant rauswerfen, wenn du uns bedrohst!", + "3": "Mir wurde gesagt, Trainer abzuweisen, egal wer sie sind!", + "4": "Ich zeige dir die Macht des Æther-Paradies", + "5": "Jetzt da du die Wahre Natur des Æther-Paradies kennst, müssen wir dich leider beseitigen!" + }, + "victory": { + "1": "Hmph! Du scheinst ziemlich geschickt zu sein.", + "2": "Was hat das zu bedeuten? Was hat das zu bedeuten!", + "3": "Hey, du bist so stark, dass ich dich nicht abweisen kann!", + "4": "Hmm... Es scheint, als hätte ich verloren.", + "5": "Ich hätte das Blitzdings benutzen sollen..." + } + }, + "faba": { + "encounter": { + "1": "Ich bin Regionalleiter Fabian und ich werde dir zeigen, wie hart die Welt sein kann!", + "2": "Die letzte Verteidigungslinie des Æther-Paradieses kämpft gegen einen simplen Trainer?", + "3": "Ich Fabian, bin der Regionalleiter der Æther Foundation.\n$Der einzige auf der Welt, ich bin unersetzlich." + }, + "victory": { + "1": "Aiyee!", + "2": "W-w-wie kann das sein?! Wie konnte dieser Trainer...", + "3": "Das ist der Grund... warum ich andere Menschen nicht ausstehen kann." + } + }, + "skull_grunt": { + "encounter": { + "1": "Wir sind nicht böse, wir sind einfach nur nicht nett!", + "2": "Willst du Stress, oder was? Das ist unsere Art, Hallo zu sagen! Tschüss, du Punk!", + "3": "Wir sind nur ein paar Typen und Mädels mit großem Interesse an den Pokémon anderer Leute!", + "4": "Wieso machst du einen auf hart, wenn wir schon hart wie Knochen sind, Homie?", + "5": "Yo, platz hier nich’ rein, ♪ wie’n wildes Kleinstein! ♪ Wenn du meinst, dass Team Skull ♪\n$an nix denkt als Krawall, ♪ hast du leider ’nen Knall, ♪ denn das is’ nich’ der Fall! ♪\n$Wir woll’n hier nur gammeln ♪ und gechillt Staub ansammeln! ♪" + }, + "victory": { + "1": "Wie jetzt? Schon vorbei?", + "2": "Woah, lass uns lieber die Kurve kratzen, yo! Kein Bock, hier meinen Schädel zu riskieren...", + "3": "Wir brauchen deine schwachen Pokémon eh nicht!", + "4": "Was? Deine Stärke spür ich bis in die Knochen...", + "5": "Mein Homie und ich sind also weniger wert als Pokémon? Willste uns dissen, oder was?" + } + }, + "plumeria": { + "encounter": { + "1": "..Hmph. Du siehst nicht so aus, als wärst du etwas Besonderes.", + "2": "Die blöden Rüpel brauchen viel zu lange, um mit euch gewöhnlichen Trainern fertig zu werden...", + "3": "Lege dich mit irgendjemandem in Team Skull an, und ich zeige dir, wie ernst ich werden kann." + }, + "victory": { + "1": "Du bist ziemlich stark. Das muss ich zugeben.", + "2": "Jetzt versteh ich, warum meine Rüpel so viel Zeit damit verschwenden...", + "3": "Ich denke, ich muss diese Niederlage einfach hinnehmen." + } + }, + "macro_grunt": { + "encounter": { + "1": "Achtung hier ist Endstation für dich!", + "2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.", + "3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?" + }, + "victory": { + "1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.", + "2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...", + "3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine." + } + }, + "oleana": { + "encounter": { + "1": "Ich werde keine Störung von Präsident Roses Plänen zulassen!", + "2": "Du hast es also durch die Mitarbeiter der Tochterunternehmen geschafft,\n$die ich beauftragt habe, um dich aufzuhalten. Ich hätte nichts anderes erwartet.", + "3": "Für den Präsidenten! Ich werde nicht verlieren! \n$Mach dich bereit mit Macro Cosmos Airlines nach Hause zu fliegen!" + }, + "victory": { + "1": "Ich habe es nicht geschafft... Olivia... du bist wirklich eine hoffnungslose Frau.", + "2": "Arghhh! Das ist unentschuldbar... Was habe ich mir dabei gedacht...\n$Jeder Trainer, der es so weit geschafft hat, muss ein harter Brocken sein...", + "3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?" + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!" @@ -787,6 +867,72 @@ "1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "Du wirst mein süßes Biest erschrecken! Wie kannst du nur? Ultra-Besiten sind so niedlich!\n$Es sieht so aus, als müsste ich dich zuerst zum Schweigen bringen." + }, + "victory": { + "1": "Wie kann eine Person nur so grausam sein?!" + }, + "defeat": { + "1": "Und jetzt, mein süßes Biest, komm zu Mama!" + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "Wieso musst du mich weiterhin belästigen?! Ich habe die Nase voll von dir.\n$Du machst mich krank! Genug mit diesem nutzlosen Gerede... \n$Mit der Kraft von Anego, von uns als UB-01 Schmarotzer klassifiziert,\n$werde ich dir zeigen, wie falsch du warst, hierher zu kommen!" + }, + "victory": { + "1": "Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "Alles, was ich will, ist mein kostbares Biest! Der Rest von euch ist mir egal!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "Kein Erbarmen! Keine Gnade! Ich bin dein schlimmster Alptraum! \n$Oh yeah, ich bin der große, böse Bromley!" + }, + "victory": { + "1": "Irgendwann mach ich dich platt! Ich hab noch ein Ass im Ärmel. Du wirst schon sehen." + }, + "defeat": { + "1": "Du hast den langen Weg hierher DAFÜR aufgenommen? Pah!" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "Mir ist egal, wer du bist. Ich mach dich platt!! Das schreibt mir mein Ego vor. Ich bin Bromley!" + }, + "victory": { + "1": "Bromley!!! Was ist falsch mit dir?!" + }, + "defeat": { + "1": "Ihr seid wirklich selten dämlich." + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "Mein Name ist Rose. Ich bin der Präsident der Galar Pokémon-Liga und Geschäftsführer von Macro Cosmos\n$Ich habe eine Aufgabe, eine Berufung! Ich muss die Galar-Region mit unbegrenzter Energie versorgen,\n$damit sie sich bis in alle Ewigkeit in Frieden fortentwickeln kann!" + }, + "victory": { + "1": "Du versteht es einfach nicht...So können wir die Geschichte nicht verändern!" + }, + "defeat": { + "1": "Ohne deine Einmischung kann ich jetzt endlich weiterarbeiten!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "Ich bin fest entschlossen, das Energieproblem in der Galar-Region\n$und natürlich auf der ganzen Welt zu lösen.\n$Meine Erfahrungen und Erfolge, die Macro Cosmos zu einem Erfolg gemacht haben,\n$sind der Beweis, dass meine Methoden funktionieren.\n$Ich habe nicht vor, meine Meinung zu ändern, selbst wenn ich verliere." + }, + "victory": { + "1": "Ich hatte vergessen, wie großartig Pokémon-Kämpfe sind! Es ist so lange her, dass ich gekämpft habe...\n$Das war wirklich befriedigend, ich akzeptiere die Niederlage für diesen Kampf." + }, + "defeat": { + "1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten." + } + }, "brock": { "encounter": { "1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!", @@ -2455,7 +2601,7 @@ "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!" }, "victory": { - "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf und genieße das Event!" + "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!" } }, "rival_2_female": { @@ -2463,7 +2609,7 @@ "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!" }, "victory": { - "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark und genieße das Event!" + "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark!" }, "defeat": { "1": "Es ist Ok manchmal zu verlieren…" @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}Ich… Ich denke ich habe meine Aufgabe erfüllt.\n$@c{smile_eclosed}Versprich mir… Nachdem du die Welt geheilt hast… Komm bitte sicher nach Hause. \n$@c{smile_ehalf}…Danke." } } -} \ No newline at end of file +} diff --git a/src/locales/de/dialogue-male.json b/src/locales/de/dialogue-male.json index 0f8e0122c8c..2f80fc09eba 100644 --- a/src/locales/de/dialogue-male.json +++ b/src/locales/de/dialogue-male.json @@ -355,6 +355,30 @@ "1": "Ich werde für das nächste Rennen tunen." } }, + "firebreather": { + "encounter": { + "1": "Meine Flammen werden dich verschlingen!", + "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", + "3": "Komm näher und sieh dir meine Flammen an!" + }, + "victory": { + "1": "Verbrannt bis zur Asche...", + "2": "Yow! Das ist heiß!", + "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" + } + }, + "sailor": { + "encounter": { + "1": "Matrose, du gehst über Bord, wenn du verlierst!", + "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", + "3": "Ahoj! Bist du seekrank?" + }, + "victory": { + "1": "Argh! Von einem Kind besiegt!", + "2": "Dein Geist hat mich versenkt!", + "3": "Ich glaube, ich bin der der seekrank ist..." + } + }, "archer": { "encounter": { "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!", @@ -417,7 +441,7 @@ }, "courtney": { "encounter": { - "1": "Das Ding... Das Ding, das du hältst... Das ist es, was...\n$Das ist es, wonach wir von Team Magma suchen...", + "1": "Stellt euch...Mir NICHT...IN DEN WEEEG...!!", "2": "... Nun dann... Auslöschen...", "3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..." }, @@ -446,7 +470,7 @@ "3": "Was machst du hier? Bist du uns gefolgt?" }, "victory": { - "1": "Na gut, bis der Boss Zeit für dich hat, werde ich dein Gegner sein!", + "1": "Bwaarharharharhar!! Ich hab zwar verloren, aber das hat Spaß gemacht!", "2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...", "3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!" } @@ -535,30 +559,6 @@ "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert." } }, - "firebreather": { - "encounter": { - "1": "Meine Flammen werden dich verschlingen!", - "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", - "3": "Komm näher und sieh dir meine Flammen an!" - }, - "victory": { - "1": "Verbrannt bis zur Asche...", - "2": "Yow! Das ist heiß!", - "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" - } - }, - "sailor": { - "encounter": { - "1": "Matrose, du gehst über Bord, wenn du verlierst!", - "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", - "3": "Ahoj! Bist du seekrank?" - }, - "victory": { - "1": "Argh! Von einem Kind besiegt!", - "2": "Dein Geist hat mich versenkt!", - "3": "Ich glaube, ich bin der der seekrank ist..." - } - }, "rocket_grunt": { "encounter": { "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!", @@ -655,6 +655,86 @@ "5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen." } }, + "aether_grunt": { + "encounter": { + "1": "Ich werde dich mit allem, was ich habe, bekämpfen. Ich werde dich auslöschen!", + "2": "Mir ist egal, ob du ein simpler Trainer bist oder nicht.\n$Ich werde dich hochkant rauswerfen, wenn du uns bedrohst!", + "3": "Mir wurde gesagt, Trainer abzuweisen, egal wer sie sind!", + "4": "Ich zeige dir die Macht des Æther-Paradies", + "5": "Jetzt da du die Wahre Natur des Æther-Paradies kennst, müssen wir dich leider beseitigen!" + }, + "victory": { + "1": "Hmph! Du scheinst ziemlich geschickt zu sein.", + "2": "Was hat das zu bedeuten? Was hat das zu bedeuten!", + "3": "Hey, du bist so stark, dass ich dich nicht abweisen kann!", + "4": "Hmm... Es scheint, als hätte ich verloren.", + "5": "Ich hätte das Blitzdings benutzen sollen..." + } + }, + "faba": { + "encounter": { + "1": "Ich bin Regionalleiter Fabian und ich werde dir zeigen, wie hart die Welt sein kann!", + "2": "Die letzte Verteidigungslinie des Æther-Paradieses kämpft gegen einen simplen Trainer?", + "3": "Ich Fabian, bin der Regionalleiter der Æther Foundation.\n$Der einzige auf der Welt, ich bin unersetzlich." + }, + "victory": { + "1": "Aiyee!", + "2": "W-w-wie kann das sein?! Wie konnte dieser Trainer...", + "3": "Das ist der Grund... warum ich andere Menschen nicht ausstehen kann." + } + }, + "skull_grunt": { + "encounter": { + "1": "Wir sind nicht böse, wir sind einfach nur nicht nett!", + "2": "Willst du Stress, oder was? Das ist unsere Art, Hallo zu sagen! Tschüss, du Punk!", + "3": "Wir sind nur ein paar Typen und Mädels mit großem Interesse an den Pokémon anderer Leute!", + "4": "Wieso machst du einen auf hart, wenn wir schon hart wie Knochen sind, Homie?", + "5": "Yo, platz hier nich’ rein, ♪ wie’n wildes Kleinstein! ♪ Wenn du meinst, dass Team Skull ♪\n$an nix denkt als Krawall, ♪ hast du leider ’nen Knall, ♪ denn das is’ nich’ der Fall! ♪\n$Wir woll’n hier nur gammeln ♪ und gechillt Staub ansammeln! ♪" + }, + "victory": { + "1": "Wie jetzt? Schon vorbei?", + "2": "Woah, lass uns lieber die Kurve kratzen, yo! Kein Bock, hier meinen Schädel zu riskieren...", + "3": "Wir brauchen deine schwachen Pokémon eh nicht!", + "4": "Was? Deine Stärke spür ich bis in die Knochen...", + "5": "Mein Homie und ich sind also weniger wert als Pokémon? Willste uns dissen, oder was?" + } + }, + "plumeria": { + "encounter": { + "1": "..Hmph. Du siehst nicht so aus, als wärst du etwas Besonderes.", + "2": "Die blöden Rüpel brauchen viel zu lange, um mit euch gewöhnlichen Trainern fertig zu werden...", + "3": "Lege dich mit irgendjemandem in Team Skull an, und ich zeige dir, wie ernst ich werden kann." + }, + "victory": { + "1": "Du bist ziemlich stark. Das muss ich zugeben.", + "2": "Jetzt versteh ich, warum meine Rüpel so viel Zeit damit verschwenden...", + "3": "Ich denke, ich muss diese Niederlage einfach hinnehmen." + } + }, + "macro_grunt": { + "encounter": { + "1": "Achtung hier ist Endstation für dich!", + "2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.", + "3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?" + }, + "victory": { + "1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.", + "2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...", + "3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine." + } + }, + "oleana": { + "encounter": { + "1": "Ich werde keine Störung von Präsident Roses Plänen zulassen!", + "2": "Du hast es also durch die Mitarbeiter der Tochterunternehmen geschafft,\n$die ich beauftragt habe, um dich aufzuhalten. Ich hätte nichts anderes erwartet.", + "3": "Für den Präsidenten! Ich werde nicht verlieren! \n$Mach dich bereit mit Macro Cosmos Airlines nach Hause zu fliegen!" + }, + "victory": { + "1": "Ich habe es nicht geschafft... Olivia... du bist wirklich eine hoffnungslose Frau.", + "2": "Arghhh! Das ist unentschuldbar... Was habe ich mir dabei gedacht...\n$Jeder Trainer, der es so weit geschafft hat, muss ein harter Brocken sein...", + "3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?" + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!" @@ -787,6 +867,72 @@ "1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "Du wirst mein süßes Biest erschrecken! Wie kannst du nur? Ultra-Besiten sind so niedlich!\n$Es sieht so aus, als müsste ich dich zuerst zum Schweigen bringen." + }, + "victory": { + "1": "Wie kann eine Person nur so grausam sein?!" + }, + "defeat": { + "1": "Und jetzt, mein süßes Biest, komm zu Mama!" + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "Wieso musst du mich weiterhin belästigen?! Ich habe die Nase voll von dir.\n$Du machst mich krank! Genug mit diesem nutzlosen Gerede... \n$Mit der Kraft von Anego, von uns als UB-01 Schmarotzer klassifiziert,\n$werde ich dir zeigen, wie falsch du warst, hierher zu kommen!" + }, + "victory": { + "1": "Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "Alles, was ich will, ist mein kostbares Biest! Der Rest von euch ist mir egal!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "Kein Erbarmen! Keine Gnade! Ich bin dein schlimmster Alptraum! \n$Oh yeah, ich bin der große, böse Bromley!" + }, + "victory": { + "1": "Irgendwann mach ich dich platt! Ich hab noch ein Ass im Ärmel. Du wirst schon sehen." + }, + "defeat": { + "1": "Du hast den langen Weg hierher DAFÜR aufgenommen? Pah!" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "Mir ist egal, wer du bist. Ich mach dich platt!! Das schreibt mir mein Ego vor. Ich bin Bromley!" + }, + "victory": { + "1": "Bromley!!! Was ist falsch mit dir?!" + }, + "defeat": { + "1": "Ihr seid wirklich selten dämlich." + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "Mein Name ist Rose. Ich bin der Präsident der Galar Pokémon-Liga und Geschäftsführer von Macro Cosmos\n$Ich habe eine Aufgabe, eine Berufung! Ich muss die Galar-Region mit unbegrenzter Energie versorgen,\n$damit sie sich bis in alle Ewigkeit in Frieden fortentwickeln kann!" + }, + "victory": { + "1": "Du versteht es einfach nicht...So können wir die Geschichte nicht verändern!" + }, + "defeat": { + "1": "Ohne deine Einmischung kann ich jetzt endlich weiterarbeiten!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "Ich bin fest entschlossen, das Energieproblem in der Galar-Region\n$und natürlich auf der ganzen Welt zu lösen.\n$Meine Erfahrungen und Erfolge, die Macro Cosmos zu einem Erfolg gemacht haben,\n$sind der Beweis, dass meine Methoden funktionieren.\n$Ich habe nicht vor, meine Meinung zu ändern, selbst wenn ich verliere." + }, + "victory": { + "1": "Ich hatte vergessen, wie großartig Pokémon-Kämpfe sind! Es ist so lange her, dass ich gekämpft habe...\n$Das war wirklich befriedigend, ich akzeptiere die Niederlage für diesen Kampf." + }, + "defeat": { + "1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten." + } + }, "brock": { "encounter": { "1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!", @@ -2439,7 +2585,7 @@ "1": "@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen,\n$aber hättest ja wenigstens Tschüss sagen können...\n$@c{smile_eclosed}Du verfolgst also wirklich deinen Traum?\nIch kann es kaum glauben.\n$@c{serious_smile_fists}Da wir schon einmal hier sind, wie wäre es mit einem Kampf?\nImmerhin muss ich doch sicherstellen, dass du bereit bist.\n$@c{serious_mopen_fists}Halte dich nicht zurück, zeig mir alles was du hast!" }, "victory": { - "1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!\n$@c{smile}Oh-und genieße das Event!" + "1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!" } }, "rival_female": { @@ -2447,7 +2593,7 @@ "1": "@c{smile_wave}Da bist du! Ich habe schon überall nach dir gesucht!\n@c{angry_mopen}Hast du etwas vergessen\n$deiner besten Freundin Tschüss zu sagen?\n$@c{smile_ehalf}Du folgst deinem Traum, oder?\nDas ist wirklich heute…\n$@c{smile}Naja, ich vergeben dir, dass du mich vergessen hast, aber nur unter einer Bedingung. @c{smile_wave_wink}Du musst gegen mich kämpfen!\n$@c{angry_mopen}Gib alles! Wir wollen doch nicht, dass dein Abenteuer endet bevor es begonnen hat, richtig?" }, "victory": { - "1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!\n$@c{smile}Oh-und genieße das Event!" + "1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!" } }, "rival_2": { @@ -2455,7 +2601,7 @@ "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!" }, "victory": { - "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf und genieße das Event!" + "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!" } }, "rival_2_female": { @@ -2463,7 +2609,7 @@ "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!" }, "victory": { - "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark und genieße das Event!" + "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark!" }, "defeat": { "1": "Es ist Ok manchmal zu verlieren…" @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}Ich… Ich denke ich habe meine Aufgabe erfüllt.\n$@c{smile_eclosed}Versprich mir… Nachdem du die Welt geheilt hast… Komm bitte sicher nach Hause. \n$@c{smile_ehalf}…Danke." } } -} \ No newline at end of file +} diff --git a/src/locales/de/pokemon-summary.json b/src/locales/de/pokemon-summary.json index deb4a69f248..1790c6878b9 100644 --- a/src/locales/de/pokemon-summary.json +++ b/src/locales/de/pokemon-summary.json @@ -13,5 +13,32 @@ "metFragment": { "normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.", "apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten." + }, + "natureFragment": { + "Hardy": "{{nature}}", + "Lonely": "{{nature}}", + "Brave": "{{nature}}", + "Adamant": "{{nature}}", + "Naughty": "{{nature}}", + "Bold": "{{nature}}", + "Docile": "{{nature}}", + "Relaxed": "{{nature}}", + "Impish": "{{nature}}", + "Lax": "{{nature}}", + "Timid": "{{nature}}", + "Hasty": "{{nature}}", + "Serious": "{{nature}}", + "Jolly": "{{nature}}", + "Naive": "{{nature}}", + "Modest": "{{nature}}", + "Mild": "{{nature}}", + "Quiet": "{{nature}}", + "Bashful": "{{nature}}", + "Rash": "{{nature}}", + "Calm": "{{nature}}", + "Gentle": "{{nature}}", + "Sassy": "{{nature}}", + "Careful": "{{nature}}", + "Quirky": "{{nature}}" } -} \ No newline at end of file +} diff --git a/src/locales/de/settings.json b/src/locales/de/settings.json index f3c4ba5b40e..d72a026cf5a 100644 --- a/src/locales/de/settings.json +++ b/src/locales/de/settings.json @@ -63,6 +63,7 @@ "bgmVolume": "Hintergrundmusik", "fieldVolume": "Rufe & Attacken", "seVolume": "Spezialeffekte", + "uiVolume": "Benutzeroberfläche", "musicPreference": "Musik Präferenz", "mixed": "Gemischt", "gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.", diff --git a/src/locales/de/trainer-classes.json b/src/locales/de/trainer-classes.json index 96382dcc3db..45826fcd310 100644 --- a/src/locales/de/trainer-classes.json +++ b/src/locales/de/trainer-classes.json @@ -117,5 +117,14 @@ "plasma_grunts": "Rüpel von Team Plasma", "flare_grunt": "Rüpel von Team Flare", "flare_grunt_female": "Rüpel von Team Flare", - "flare_grunts": "Rüpel von Team Flare" -} \ No newline at end of file + "flare_grunts": "Rüpel von Team Flare", + "aether_grunt": "Æther Foundation Personal", + "aether_grunt_female": "Æther Foundation Personal", + "aether_grunts": "Æther Foundation Personal", + "skull_grunt": "Rüpel von Team Skull", + "skull_grunt_female": "Rüpel von Team Skull", + "skull_grunts": "Rüpel von Team Skull", + "macro_grunt": "Angestellter von Macro Cosmos", + "macro_grunt_female": "Angestellte von Macro Cosmos", + "macro_grunts": "Angestellte von Macro Cosmos" +} diff --git a/src/locales/de/trainer-names.json b/src/locales/de/trainer-names.json index 013613fd399..ffbb772234c 100644 --- a/src/locales/de/trainer-names.json +++ b/src/locales/de/trainer-names.json @@ -139,12 +139,18 @@ "rood": "Rubius", "xerosic": "Xeros", "bryony": "Begonia", + "faba": "Fabian", + "plumeria": "Fran", + "oleana": "Olivia", "maxie": "Marc", "archie": "Adrian", "cyrus": "Zyrus", "ghetsis": "G-Cis", "lysandre": "Flordelis", + "lusamine": "Samantha", + "guzma": "Bromley", + "rose": "Rose", "blue_red_double": "Blau & Rot", "red_blue_double": "Rot & Blau", @@ -156,4 +162,4 @@ "iris_alder_double": "Lilia & Lauro", "piers_marnie_double": "Nezz & Mary", "marnie_piers_double": "Mary & Nezz" -} \ No newline at end of file +} diff --git a/src/locales/de/trainer-titles.json b/src/locales/de/trainer-titles.json index 25618c1b8f6..21a4b2fa7b6 100644 --- a/src/locales/de/trainer-titles.json +++ b/src/locales/de/trainer-titles.json @@ -16,6 +16,9 @@ "galactic_boss": "Galaktik-Boss", "plasma_boss": "Weiser von Team Plasma", "flare_boss": "Flare-Boss", + "aether_boss": "Æther-Präsidentin", + "skull_boss": "Skull-Boss", + "macro_boss": "Geschäftsführer von Macro Cosmos", "rocket_admin": "Team Rocket Vorstand", "rocket_admin_female": "Team Rocket Vorstand", "magma_admin": "Team Magma Vorstand", @@ -27,5 +30,9 @@ "plasma_sage": "Weiser von Team Plasma", "plasma_admin": "Team Plasma Vorstand", "flare_admin": "Team Flare Vorstand", - "flare_admin_female": "Team Flare Vorstand" -} \ No newline at end of file + "flare_admin_female": "Team Flare Vorstand", + "aether_admin": "Æther-Regionalleiter", + "skull_admin": "Team Skull Vorstand", + "macro_admin": "Vizepräsidentin von Macro Cosmos" + +} diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json index 80116faf5e7..71bc194e364 100644 --- a/src/locales/en/battle.json +++ b/src/locales/en/battle.json @@ -42,7 +42,7 @@ "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", "learnMoveForgetQuestion": "Which move should be forgotten?", "learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!", + "countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Poof!", "learnMoveAnd": "And…", "levelCapUp": "The level cap\nhas increased to {{levelCap}}!", "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", diff --git a/src/locales/en/bgm-name.json b/src/locales/en/bgm-name.json index d35b9f2b917..8838942c8a6 100644 --- a/src/locales/en/bgm-name.json +++ b/src/locales/en/bgm-name.json @@ -80,11 +80,21 @@ "battle_galactic_grunt": "BDSP Team Galactic Battle", "battle_plasma_grunt": "BW Team Plasma Battle", "battle_flare_grunt": "XY Team Flare Battle", + "battle_aether_grunt": "SM Aether Foundation Battle", + "battle_skull_grunt": "SM Team Skull Battle", + "battle_macro_grunt": "SWSH Trainer Battle", + "battle_galactic_admin": "BDSP Team Galactic Admin Battle", + "battle_skull_admin": "SM Team Skull Admin Battle", + "battle_oleana": "SWSH Oleana Battle", "battle_rocket_boss": "USUM Giovanni Battle", "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", "battle_galactic_boss": "BDSP Cyrus Battle", "battle_plasma_boss": "B2W2 Ghetsis Battle", "battle_flare_boss": "XY Lysandre Battle", + "battle_aether_boss": "SM Lusamine Battle", + "battle_skull_boss": "SM Guzma Battle", + "battle_macro_boss": "SWSH Rose Battle", + "abyss": "PMD EoS Dark Crater", "badlands": "PMD EoS Barren Valley", "beach": "PMD EoS Drenched Bluff", @@ -137,4 +147,4 @@ "heal": "BW Pokémon Heal", "menu": "PMD EoS Welcome to the World of Pokémon!", "title": "PMD EoS Top Menu Theme" -} \ No newline at end of file +} diff --git a/src/locales/en/dialogue-female.json b/src/locales/en/dialogue-female.json index 6faf53d86e1..1965c124dc9 100644 --- a/src/locales/en/dialogue-female.json +++ b/src/locales/en/dialogue-female.json @@ -655,6 +655,86 @@ "5": "You may have beaten me, but when I lose, I go out in style!" } }, + "aether_grunt": { + "encounter": { + "1": "I'll fight you with all I have to wipe you out!", + "2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!", + "3": "I was told to turn away Trainers, whomever they might be!", + "4": "I'll show you the power of Aether Paradise!", + "5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!" + }, + "victory": { + "1": "Hmph! You seem to have a lot of skill.", + "2": "What does this mean? What does this mean!", + "3": "Hey! You're so strong that there's no way I can turn you away!", + "4": "Hmm... It seems as though I may have lost.", + "5": "Here's an impression for you: Aiyee!" + } + }, + "faba": { + "encounter": { + "1": "I, Branch Chief Faba, shall show you the harshness of the real world!", + "2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?", + "3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable." + }, + "victory": { + "1": "Aiyee!", + "2": "H-h-how can this be?! How could this child...", + "3": "This is why... This is why I can't bring myself to like children." + } + }, + "skull_grunt": { + "encounter": { + "1": "We're not bad-we're just hard!", + "2": "You want some? That's how we say hello! Nice knowing you, punks!", + "3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!", + "4": "Why you trying to act hard when we're already hard as bones out here, homie?", + "5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!" + }, + "victory": { + "1": "Huh? Is it over already?", + "2": "Time for us to break out, yo! Gotta tell y'all peace out, yo!", + "3": "We don't need your wack Pokémon anyway!", + "4": "Wha-?! This kid's way too strong-no bones about it!", + "5": "So, what? I'm lower than a Pokémon?! I already got self-esteem issues, man." + } + }, + "plumeria": { + "encounter": { + "1": " ...Hmph. You don't look like anything special to me.", + "2": "It takes these dumb Grunts way too long to deal with you kids...", + "3": "Mess with anyone in Team Skull, and I'll show you how serious I can get." + }, + "victory": { + "1": "Hmmph! You're pretty strong. I'll give you that.", + "2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.", + "3": "Hmmph! I guess I just have to hold that loss." + } + }, + "macro_grunt": { + "encounter": { + "1": "It looks like this is the end of the line for you!", + "2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.", + "3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?" + }, + "victory": { + "1": "I have little choice but to respectfully retreat.", + "2": "Having to give up my pocket money... Losing means I'm back in the red...", + "3": "Nobody can beat Macro Cosmos when it comes to our dedication to our work!" + } + }, + "oleana": { + "encounter": { + "1": "I won't let anyone interfere with Mr. Rose's plan!", + "2": "So, you got through all of the special staff that I had ordered to stop you. I would expect nothing less.", + "3": "For the chairman! I won't lose!" + }, + "victory": { + "1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.", + "2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..", + "3": "*sigh* I am one tired Oleana..." + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "So! I must say, I am impressed you got here!" @@ -787,6 +867,72 @@ "1": "Fools with no vision will continue to befoul this beautiful world." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "You're going to startle my sweet beast! It looks like I'll need to silence you first." + }, + "victory": { + "1": "How... how can you be so awful!" + }, + "defeat": { + "1": "Hmph..." + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "Why must you continue to pester me?! I am sick of you. Sick through and through!\n$Enough with this useless talk.. with Nihilego's power I will show you how wrong you were to come here!" + }, + "victory": { + "1": "Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "All that I want is my precious beast! I don't care about any of the rest of you!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "The hated boss who beats you down and beats you down and never lets up...\n$Yeah. Big bad Guzma is here!" + }, + "victory": { + "1": "Tch. I'm gonna beat you down one of these days!" + }, + "defeat": { + "1": "And you came all the way out here just for that, huh?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "Doesn't matter who I'm up against, I'm gonna beat them down!\n$That's what big bad Guzma is all about!" + }, + "victory": { + "1": "Guzma!!! What is wrong with you?!" + }, + "defeat": { + "1": "Y'all are stupid!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "I must provide limitless energy to ensure everlasting prosperity for everyone...\n$It is my purpose, my duty, my destiny!" + }, + "victory": { + "1": "You still don't understand, trainer...\n$We... No, I am going to change the course of history!" + }, + "defeat": { + "1": "You still don't understand a thing!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "I'm committed to solving the energy problem in the Galar region—and, of course, around the world.\n$My experience and accomplishments that made Macro Cosmos a success are proof my methods work.\n$I don't intend to change my mind, even if I lose." + }, + "victory": { + "1": "I'd forgotten how great Pokémon battles are! It's been so long since I battled...\n$That sure was satisfying, I accept defeat for this battle." + }, + "defeat": { + "1": "I suppose it must seem that I am doing something terrible. I don't expect you to understand.\n$But I must provide the Galar region with limitless energy to ensure everlasting prosperity." + } + }, "stat_trainer_buck": { "encounter": { "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", @@ -2642,4 +2788,4 @@ "1": "@c{smile_ehalf}I… I think I fulfilled my purpose…\n$@c{smile_eclosed}Promise me… After you heal the world… Please… come home safe.\n$@c{smile_ehalf}…Thank you." } } -} \ No newline at end of file +} diff --git a/src/locales/en/dialogue-male.json b/src/locales/en/dialogue-male.json index 410cfd9c3cf..dd4fc4ca55a 100644 --- a/src/locales/en/dialogue-male.json +++ b/src/locales/en/dialogue-male.json @@ -655,6 +655,86 @@ "5": "You may have beaten me, but when I lose, I go out in style!" } }, + "aether_grunt": { + "encounter": { + "1": "I'll fight you with all I have to wipe you out!", + "2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!", + "3": "I was told to turn away Trainers, whomever they might be!", + "4": "I'll show you the power of Aether Paradise!", + "5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!" + }, + "victory": { + "1": "Hmph! You seem to have a lot of skill.", + "2": "What does this mean? What does this mean!", + "3": "Hey! You're so strong that there's no way I can turn you away!", + "4": "Hmm... It seems as though I may have lost.", + "5": "Here's an impression for you: Aiyee!" + } + }, + "faba": { + "encounter": { + "1": "I, Branch Chief Faba, shall show you the harshness of the real world!", + "2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?", + "3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable." + }, + "victory": { + "1": "Aiyee!", + "2": "H-h-how can this be?! How could this child...", + "3": "This is why... This is why I can't bring myself to like children." + } + }, + "skull_grunt": { + "encounter": { + "1": "We're not bad-we're just hard!", + "2": "You want some? That's how we say hello! Nice knowing you, punks!", + "3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!", + "4": "Why you trying to act hard when we're already hard as bones out here, homie?", + "5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!" + }, + "victory": { + "1": "Huh? Is it over already?", + "2": "Time for us to break out, yo! Gotta tell y'all peace out, yo!", + "3": "We don't need your wack Pokémon anyway!", + "4": "Wha-?! This kid's way too strong-no bones about it!", + "5": "So, what? I'm lower than a Pokémon?! I already got self-esteem issues, man." + } + }, + "plumeria": { + "encounter": { + "1": " ...Hmph. You don't look like anything special to me.", + "2": "It takes these dumb Grunts way too long to deal with you kids..", + "3": "Mess with anyone in Team Skull, and I'll show you how serious I can get." + }, + "victory": { + "1": "Hmmph! You're pretty strong. I'll give you that.", + "2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.", + "3": "Hmmph! I guess I just have to hold that loss." + } + }, + "macro_grunt": { + "encounter": { + "1": "It looks like this is the end of the line for you!", + "2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.", + "3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?" + }, + "victory": { + "1": "I have little choice but to respectfully retreat.", + "2": "Having to give up my pocket money... Losing means I'm back in the red...", + "3": "Nobody can beat Macro Cosmos when it comes to our dedication to our work!" + } + }, + "oleana": { + "encounter": { + "1": "I won't let anyone interfere with Mr. Rose's plan!", + "2": "So, you got through all of the special staff that I had ordered to stop you. I would expect nothing less.", + "3": "For the chairman! I won't lose!" + }, + "victory": { + "1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.", + "2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..", + "3": "*sigh* I am one tired Oleana..." + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "So! I must say, I am impressed you got here!" @@ -787,6 +867,72 @@ "1": "Fools with no vision will continue to befoul this beautiful world." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "You're going to startle my sweet beast! It looks like I'll need to silence you first." + }, + "victory": { + "1": "How... how can you be so awful!" + }, + "defeat": { + "1": "Hmph..." + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "Why must you continue to pester me?! I am sick of you. Sick through and through!\n$Enough with this useless talk.. with Nihilego's power I will show you how wrong you were to come here!" + }, + "victory": { + "1": "Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "All that I want is my precious beast! I don't care about any of the rest of you!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "The hated boss who beats you down and beats you down and never lets up...\n$Yeah. Big bad Guzma is here!" + }, + "victory": { + "1": "Tch. I'm gonna beat you down one of these days!" + }, + "defeat": { + "1": "And you came all the way out here just for that, huh?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "Doesn't matter who I'm up against, I'm gonna beat them down!\n$That's what big bad Guzma is all about!" + }, + "victory": { + "1": "Guzma!!! What is wrong with you?!" + }, + "defeat": { + "1": "Y'all are stupid!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "I must provide limitless energy to ensure everlasting prosperity for everyone...\n$It is my purpose, my duty, my destiny!" + }, + "victory": { + "1": "You still don't understand, trainer...\n$We... No, I am going to change the course of history!" + }, + "defeat": { + "1": "You still don't understand a thing!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "I'm committed to solving the energy problem in the Galar region—and, of course, around the world.\n$My experience and accomplishments that made Macro Cosmos a success are proof my methods work.\n$I don't intend to change my mind, even if I lose." + }, + "victory": { + "1": "I'd forgotten how great Pokémon battles are! It's been so long since I battled...\n$That sure was satisfying, I accept defeat for this battle." + }, + "defeat": { + "1": "I suppose it must seem that I am doing something terrible. I don't expect you to understand.\n$But I must provide the Galar region with limitless energy to ensure everlasting prosperity." + } + }, "stat_trainer_buck": { "encounter": { "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", @@ -2642,4 +2788,4 @@ "1": "@c{smile_ehalf}I… I think I fulfilled my purpose…\n$@c{smile_eclosed}Promise me… After you heal the world… Please… come home safe.\n$@c{smile_ehalf}…Thank you." } } -} \ No newline at end of file +} diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 95f472d5b0c..0bc6c277077 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,31 +1,32 @@ -import lostAtSeaDialogue from "./mystery-encounters/lost-at-sea-dialogue.json"; -import mysteriousChestDialogue from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue.json"; -import mysteriousChallengersDialogue from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue.json"; -import darkDealDialogue from "#app/locales/en/mystery-encounters/dark-deal-dialogue.json"; -import departmentStoreSaleDialogue from "#app/locales/en/mystery-encounters/department-store-sale-dialogue.json"; -import fieldTripDialogue from "#app/locales/en/mystery-encounters/field-trip-dialogue.json"; -import fieryFalloutDialogue from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue.json"; -import fightOrFlightDialogue from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue.json"; -import safariZoneDialogue from "#app/locales/en/mystery-encounters/safari-zone-dialogue.json"; -import shadyVitaminDealerDialogue from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json"; -import slumberingSnorlaxDialogue from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json"; -import trainingSessionDialogue from "#app/locales/en/mystery-encounters/training-session-dialogue.json"; -import theStrongStuffDialogue from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue.json"; -import thePokemonSalesmanDialogue from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json"; -import anOfferYouCantRefuseDialogue from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json"; -import delibirdyDialogue from "#app/locales/en/mystery-encounters/delibirdy-dialogue.json"; -import absoluteAvariceDialogue from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue.json"; -import aTrainersTestDialogue from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue.json"; -import trashToTreasureDialogue from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue.json"; -import berriesAboundDialogue from "#app/locales/en/mystery-encounters/berries-abound-dialogue.json"; -import clowningAroundDialogue from "#app/locales/en/mystery-encounters/clowning-around-dialogue.json"; -import partTimerDialogue from "#app/locales/en/mystery-encounters/part-timer-dialogue.json"; -import dancingLessonsDialogue from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue.json"; -import weirdDreamDialogue from "#app/locales/en/mystery-encounters/weird-dream-dialogue.json"; -import theWinstrateChallengeDialogue from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json"; -import teleportingHijinksDialogue from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json"; -import bugTypeSuperfanDialogue from "#app/locales/en/mystery-encounters/bug-type-superfan-dialogue.json"; -import funAndGamesDialogue from "#app/locales/en/mystery-encounters/fun-and-games-dialogue.json"; +import lostAtSea from "./mystery-encounters/lost-at-sea-dialogue.json"; +import mysteriousChest from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue.json"; +import mysteriousChallengers from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue.json"; +import darkDeal from "#app/locales/en/mystery-encounters/dark-deal-dialogue.json"; +import departmentStoreSale from "#app/locales/en/mystery-encounters/department-store-sale-dialogue.json"; +import fieldTrip from "#app/locales/en/mystery-encounters/field-trip-dialogue.json"; +import fieryFallout from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue.json"; +import fightOrFlight from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue.json"; +import safariZone from "#app/locales/en/mystery-encounters/safari-zone-dialogue.json"; +import shadyVitaminDealer from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json"; +import slumberingSnorlax from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json"; +import trainingSession from "#app/locales/en/mystery-encounters/training-session-dialogue.json"; +import theStrongStuff from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue.json"; +import pokemonSalesman from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json"; +import offerYouCantRefuse from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json"; +import delibirdy from "#app/locales/en/mystery-encounters/delibirdy-dialogue.json"; +import absoluteAvarice from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue.json"; +import aTrainersTest from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue.json"; +import trashToTreasure from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue.json"; +import berriesAbound from "#app/locales/en/mystery-encounters/berries-abound-dialogue.json"; +import clowningAround from "#app/locales/en/mystery-encounters/clowning-around-dialogue.json"; +import partTimer from "#app/locales/en/mystery-encounters/part-timer-dialogue.json"; +import dancingLessons from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue.json"; +import weirdDream from "#app/locales/en/mystery-encounters/weird-dream-dialogue.json"; +import theWinstrateChallenge from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json"; +import teleportingHijinks from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json"; +import bugTypeSuperfan from "#app/locales/en/mystery-encounters/bug-type-superfan-dialogue.json"; +import funAndGames from "#app/locales/en/mystery-encounters/fun-and-games-dialogue.json"; +import uncommonBreed from "#app/locales/en/mystery-encounters/uncommon-breed-dialogue.json"; /** * Injection patterns that can be used: @@ -46,32 +47,33 @@ export const mysteryEncounter = { // DO NOT REMOVE "unit_test_dialogue": "{{test}}{{test}} {{test{{test}}}} {{test1}} {{test\}} {{test\\}} {{test\\\}} {test}}", - mysteriousChallengers: mysteriousChallengersDialogue, - mysteriousChest: mysteriousChestDialogue, - darkDeal: darkDealDialogue, - fightOrFlight: fightOrFlightDialogue, - slumberingSnorlax: slumberingSnorlaxDialogue, - trainingSession: trainingSessionDialogue, - departmentStoreSale: departmentStoreSaleDialogue, - shadyVitaminDealer: shadyVitaminDealerDialogue, - fieldTrip: fieldTripDialogue, - safariZone: safariZoneDialogue, - lostAtSea: lostAtSeaDialogue, - fieryFallout: fieryFalloutDialogue, - theStrongStuff: theStrongStuffDialogue, - pokemonSalesman: thePokemonSalesmanDialogue, - offerYouCantRefuse: anOfferYouCantRefuseDialogue, - delibirdy: delibirdyDialogue, - absoluteAvarice: absoluteAvariceDialogue, - aTrainersTest: aTrainersTestDialogue, - trashToTreasure: trashToTreasureDialogue, - berriesAbound: berriesAboundDialogue, - clowningAround: clowningAroundDialogue, - partTimer: partTimerDialogue, - dancingLessons: dancingLessonsDialogue, - weirdDream: weirdDreamDialogue, - theWinstrateChallenge: theWinstrateChallengeDialogue, - teleportingHijinks: teleportingHijinksDialogue, - bugTypeSuperfan: bugTypeSuperfanDialogue, - funAndGames: funAndGamesDialogue + mysteriousChallengers, + mysteriousChest, + darkDeal, + fightOrFlight, + slumberingSnorlax, + trainingSession, + departmentStoreSale, + shadyVitaminDealer, + fieldTrip, + safariZone, + lostAtSea, + fieryFallout, + theStrongStuff, + pokemonSalesman, + offerYouCantRefuse, + delibirdy, + absoluteAvarice, + aTrainersTest, + trashToTreasure, + berriesAbound, + clowningAround, + partTimer, + dancingLessons, + weirdDream, + theWinstrateChallenge, + teleportingHijinks, + bugTypeSuperfan, + funAndGames, + uncommonBreed, } as const; diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json index 2a82287327c..24453746abe 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json @@ -7,7 +7,8 @@ "1": { "label": "Battle the Pokémon", "tooltip": "(-) Hard Battle\n(+) New Item", - "selected": "You approach the\nPokémon without fear." + "selected": "You approach the\nPokémon without fear.", + "stat_boost": "The {{enemyPokemon}} latent strength boosted one of its stats!" }, "2": { "label": "Steal the Item", diff --git a/src/locales/en/mystery-encounters/uncommon-breed-dialogue.json b/src/locales/en/mystery-encounters/uncommon-breed-dialogue.json new file mode 100644 index 00000000000..a1fef9a0001 --- /dev/null +++ b/src/locales/en/mystery-encounters/uncommon-breed-dialogue.json @@ -0,0 +1,26 @@ +{ + "intro": "That isn't just an ordinary Pokémon!", + "title": "Uncommon Breed", + "description": "That {{enemyPokemon}} looks special compared to others of its kind. @[TOOLTIP_TITLE]{Perhaps it knows a special move?} You could battle and catch it outright, but there might also be a way to befriend it.", + "query": "What will you do?", + "option": { + "1": { + "label": "Battle the Pokémon", + "tooltip": "(-) Tricky Battle\n(+) Strong Catchable Foe", + "selected": "You approach the\n{{enemyPokemon}} without fear.", + "stat_boost": "The {{enemyPokemon}} heightened abilities boost its stats!" + }, + "2": { + "label": "Give It Food", + "disabled_tooltip": "You need 4 berry items to choose this", + "tooltip": "(-) Give 4 Berries\n(+) The {{enemyPokemon}} Likes You", + "selected": "You toss the berries at the {{enemyPokemon}}!$It eats them happily!$The {{enemyPokemon}} wants to join your party!" + }, + "3": { + "label": "Befriend It", + "disabled_tooltip": "Your Pokémon need to know certain moves to choose this", + "tooltip": "(+) {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) The {{enemyPokemon}} Likes You", + "selected": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}} to charm the {{enemyPokemon}}!$The {{enemyPokemon}} wants to join your party!" + } + } +} \ No newline at end of file diff --git a/src/locales/en/pokemon-summary.json b/src/locales/en/pokemon-summary.json index 8d266999084..80e0cdab010 100644 --- a/src/locales/en/pokemon-summary.json +++ b/src/locales/en/pokemon-summary.json @@ -13,5 +13,32 @@ "metFragment": { "normal": "met at Lv{{level}},\n{{biome}}.", "apparently": "apparently met at Lv{{level}},\n{{biome}}." + }, + "natureFragment": { + "Hardy": "{{nature}}", + "Lonely": "{{nature}}", + "Brave": "{{nature}}", + "Adamant": "{{nature}}", + "Naughty": "{{nature}}", + "Bold": "{{nature}}", + "Docile": "{{nature}}", + "Relaxed": "{{nature}}", + "Impish": "{{nature}}", + "Lax": "{{nature}}", + "Timid": "{{nature}}", + "Hasty": "{{nature}}", + "Serious": "{{nature}}", + "Jolly": "{{nature}}", + "Naive": "{{nature}}", + "Modest": "{{nature}}", + "Mild": "{{nature}}", + "Quiet": "{{nature}}", + "Bashful": "{{nature}}", + "Rash": "{{nature}}", + "Calm": "{{nature}}", + "Gentle": "{{nature}}", + "Sassy": "{{nature}}", + "Careful": "{{nature}}", + "Quirky": "{{nature}}" } } \ No newline at end of file diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 947dfe98bb4..6528f0368fe 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -63,6 +63,7 @@ "bgmVolume": "BGM Volume", "fieldVolume": "Field Volume", "seVolume": "SE Volume", + "uiVolume": "UI Volume", "musicPreference": "Music Preference", "mixed": "Mixed", "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", diff --git a/src/locales/en/trainer-classes.json b/src/locales/en/trainer-classes.json index 1b827281a6a..9e30915dee6 100644 --- a/src/locales/en/trainer-classes.json +++ b/src/locales/en/trainer-classes.json @@ -117,5 +117,14 @@ "plasma_grunts": "Plasma Grunts", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", - "flare_grunts": "Flare Grunts" -} \ No newline at end of file + "flare_grunts": "Flare Grunts", + "aether_grunt": "Aether Foundation Employee", + "aether_grunt_female": "Aether Foundation Employee", + "aether_grunts": "Aether Foundation Employees", + "skull_grunt": "Team Skull Grunt", + "skull_grunt_female": "Team Skull Grunt", + "skull_grunts": "Team Skull Grunts", + "macro_grunt": "Macro Cosmos Trainer", + "macro_grunt_female": "Macro Cosmos Trainer", + "macro_grunts": "Macro Cosmos Trainers" +} diff --git a/src/locales/en/trainer-names.json b/src/locales/en/trainer-names.json index 077e7068512..0719d3cdad9 100644 --- a/src/locales/en/trainer-names.json +++ b/src/locales/en/trainer-names.json @@ -138,11 +138,19 @@ "rood": "Rood", "xerosic": "Xerosic", "bryony": "Bryony", + "faba": "Faba", + "plumeria": "Plumeria", + "oleana": "Oleana", + "maxie": "Maxie", "archie": "Archie", "cyrus": "Cyrus", "ghetsis": "Ghetsis", "lysandre": "Lysandre", + "lusamine": "Lusamine", + "guzma": "Guzma", + "rose": "Rose", + "blue_red_double": "Blue & Red", "red_blue_double": "Red & Blue", "tate_liza_double": "Tate & Liza", @@ -164,4 +172,4 @@ "vicky": "Vicky", "vito": "Vito", "bug_type_superfan": "Bug-Type Superfan" -} \ No newline at end of file +} diff --git a/src/locales/en/trainer-titles.json b/src/locales/en/trainer-titles.json index 888b3780b8d..b9c919022be 100644 --- a/src/locales/en/trainer-titles.json +++ b/src/locales/en/trainer-titles.json @@ -16,6 +16,10 @@ "galactic_boss": "Team Galactic Boss", "plasma_boss": "Team Plasma Boss", "flare_boss": "Team Flare Boss", + "aether_boss": "Aether President", + "skull_boss": "Team Skull Boss", + "macro_boss": "Macro Cosmos President", + "rocket_admin": "Team Rocket Admin", "rocket_admin_female": "Team Rocket Admin", "magma_admin": "Team Magma Admin", @@ -27,5 +31,8 @@ "plasma_sage": "Team Plasma Sage", "plasma_admin": "Team Plasma Admin", "flare_admin": "Team Flare Admin", - "flare_admin_female": "Team Flare Admin" -} \ No newline at end of file + "flare_admin_female": "Team Flare Admin", + "aether_admin": "Aether Foundation Admin", + "skull_admin": "Team Skull Admin", + "macro_admin": "Macro Cosmos" +} diff --git a/src/locales/es/ability-trigger.json b/src/locales/es/ability-trigger.json index f49b0a784db..8bbcc80662c 100644 --- a/src/locales/es/ability-trigger.json +++ b/src/locales/es/ability-trigger.json @@ -1,11 +1,62 @@ { "blockRecoilDamage": "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", "badDreams": "¡{{pokemonName}} está atormentado!", + "costar": "¡{{pokemonName}} copió los cambios de características de {{allyName}}!", "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "perishBody": "¡{{abilityName}} de {{pokemonName}} debilitará a ambos Pokémon en 3 turnos!", + "poisonHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", "trace": "¡{{pokemonName}} ha copiado la habilidad {{abilityName}} \nde {{targetName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", "quickDraw": "¡{{pokemonName}} ataca primero gracias a la habilidad Mano Rápida!", "disguiseAvoidedDamage": "¡El disfraz de {{pokemonNameWithAffix}} se ha roto!", - "preventBerryUse": "{{pokemonNameWithAffix}} está muy nervioso y no puede comer bayas!", - "weatherEffectDisappeared": "El tiempo atmosférico ya no ejerce ninguna influencia." -} \ No newline at end of file + "blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!", + "typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!", + "moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!", + "reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!", + "postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!", + "postDefendContactDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} ha herido a su atacante!", + "postDefendAbilitySwap": "¡{{pokemonNameWithAffix}} intercambió su habilidad con su objetivo!", + "postDefendAbilityGive": "¡{{pokemonNameWithAffix}} cambió la habilidad del objetivo por {{abilityName}}!", + "postDefendMoveDisable": "¡{{moveName}} de {{pokemonNameWithAffix}} ha sido anulado!", + "pokemonTypeChange": "¡{{pokemonNameWithAffix}} ha cambiado a tipo {{moveType}}!", + "postAttackStealHeldItem": "¡{{pokemonNameWithAffix}} robó {{stolenItemType}} de {{defenderName}}!", + "postDefendStealHeldItem": "¡{{pokemonNameWithAffix}} robó {{stolenItemType}} de {{attackerName}}!", + "copyFaintedAllyAbility": "¡{{abilityName}} de {{pokemonNameWithAffix}} fue copiada!", + "intimidateImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita que sea intimidado!", + "postSummonAllyHeal": "¡{{pokemonNameWithAffix}} se ha bebido el té que ha preparado {{pokemonName}}!", + "postSummonClearAllyStats": "¡Los cambios de características de {{pokemonNameWithAffix}} fueron eliminados!", + "postSummonTransform": "¡{{pokemonNameWithAffix}} se transformó en {{targetName}}!", + "protectStat": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita que baje su {{statName}}!", + "statusEffectImmunityWithName": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita {{statusEffectName}}!", + "statusEffectImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita los problemas de estado!", + "battlerTagImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} previene {{battlerTagName}}!", + "forewarn": "¡{{pokemonNameWithAffix}} ha detectado el movimiento {{moveName}}!", + "frisk": "¡{{pokemonNameWithAffix}} ha cacheado {{opponentAbilityName}} de {{opponentName}}!", + "postWeatherLapseHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "postWeatherLapseDamage": "¡{{pokemonNameWithAffix}} se hizo daño por su {{abilityName}}!", + "postTurnLootCreateEatenBerry": "¡{{pokemonNameWithAffix}} recogió una {{berryName}}!", + "postTurnHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "fetchBall": "¡{{pokemonNameWithAffix}} encontró {{pokeballName}}!", + "healFromBerryUse": "¡{{pokemonNameWithAffix}} se curó gracias a {{abilityName}}!", + "arenaTrap": "¡{{pokemonNameWithAffix}} impide el cambio con {{abilityName}}!", + "postBattleLoot": "¡{{pokemonNameWithAffix}} recogió {{itemName}}!", + "postFaintContactDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} hizo daño a su atacante!", + "postFaintHpDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} hizo daño a su atacante!", + "postSummonPressure": "¡{{pokemonNameWithAffix}} ejerce Presión!", + "weatherEffectDisappeared": "El tiempo atmosférico ya no ejerce ninguna influencia.", + "postSummonMoldBreaker": "¡{{pokemonNameWithAffix}} rompió el molde!", + "postSummonAnticipation": "¡{{pokemonNameWithAffix}} se anticipó!", + "postSummonTurboblaze": "¡{{pokemonNameWithAffix}} irradia un aura llameante!", + "postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!", + "postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!", + "postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!", + "postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!", + "postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", + "postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", + "postSummonVesselOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Caldero Debacle!", + "postSummonSwordOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Espada Debacle!", + "postSummonTabletsOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Tablilla Debacle!", + "postSummonBeadsOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Abalorio Debacle!", + "preventBerryUse": "{{pokemonNameWithAffix}} está muy nervioso y no puede comer bayas!" +} diff --git a/src/locales/es/battle.json b/src/locales/es/battle.json index 648f738b179..8573f74a94e 100644 --- a/src/locales/es/battle.json +++ b/src/locales/es/battle.json @@ -36,7 +36,7 @@ "learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.", "learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?", "learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}y@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}¡Puf!", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}y@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}¡Puf!", "learnMoveAnd": "Y…", "levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!", "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", diff --git a/src/locales/es/bgm-name.json b/src/locales/es/bgm-name.json index 9aa09da3704..be617b79567 100644 --- a/src/locales/es/bgm-name.json +++ b/src/locales/es/bgm-name.json @@ -78,11 +78,18 @@ "battle_galactic_grunt": "BDSP Team Galactic Battle", "battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!", "battle_flare_grunt": "XY Team Flare Battle", + "battle_aether_grunt": "SM Aether Foundation Battle", + "battle_skull_grunt": "SM Team Skull Battle", + "battle_macro_grunt": "SWSH Trainer Battle", + "battle_galactic_admin": "BDSP Team Galactic Admin Battle", + "battle_skull_admin": "SM Team Skull Admin Battle", + "battle_oleana": "SWSH Oleana 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", + "abyss": "PMD EoS - Cráter Oscuro", "badlands": "PMD EoS - Valle Desolado", "beach": "PMD EoS - Risco Calado", @@ -135,4 +142,4 @@ "heal": "BW - Cura Pokémon", "menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!", "title": "PMD EoS - Tema del menú principal" -} \ No newline at end of file +} diff --git a/src/locales/es/dialogue-female.json b/src/locales/es/dialogue-female.json index 9e26dfeeb6e..cbd7dbf39ad 100644 --- a/src/locales/es/dialogue-female.json +++ b/src/locales/es/dialogue-female.json @@ -1 +1,52 @@ -{} \ No newline at end of file +{ + "aether_grunt": { + "encounter": { + "1": "¡Lucharé con toda mi fuerza para detenerte!", + "2": "Me da igual que seas un crío. Eres una amenaza y debes irte.", + "3": "Me dijeron que mandara a todos los entrenadores por donde venían, ¡sin excepciones!", + "4": "¡Te mostraré el poder del Paraíso Æther!", + "5": "Ahora que conoces la oscuridad en lo profundo del Paraíso Æther, es hora de que vayas desapareciendo..." + }, + "victory": { + "1": "¡Vaya! Demuestras habilidad.", + "2": "¿Qué quiere decir esto? ¿Eh?", + "3": "¡Vaya! Con esa fuerza, ¡no creo que pueda detenerte!", + "4": "Vaya... parece que puede que haya perdido.", + "5": "¡Mira, te hago una mueca!: ¡Aiyee!" + } + }, + "faba": { + "encounter": { + "1": "¡Yo, Subdirector Fabio, te mostraré la cruda realidad del mundo!", + "2": "¿Yo, la última línea de defensa de Æther, battallando a un mero crío?", + "3": "Yo, Fabio, soy el Subdirector de la Fundación Æther. Soy el único en el mundo, soy irremplazable." + }, + "victory": { + "1": "¡Aaaah!", + "2": "¿C-c-cómo puede ser? Eres tan solo un niño...", + "3": "Este... este es el motivo por el que odio a los niños." + } + }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "¡Vas a asustar a mi pobre criatura! Parece que tendré que silenciarte cuanto antes." + }, + "victory": { + "1": "¿Cómo?¿Cómo puedes ser tan terrible?" + }, + "defeat": { + "1": "Buff." + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "¡¿Por qué me sigues molestando?! Estoy cansada de ti. ¡Hasta las narices!\n$Se acabó esta charla innecesaria. Este es el poder de Nihilego, ¡te demostraré cuánto te equivocas al venir aquí!" + }, + "victory": { + "1": "¡¡¡Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "¡Todo lo que quiero es a esta preciosa criatura! ¡Los demás no me importáis!" + } + } +} diff --git a/src/locales/es/dialogue-male.json b/src/locales/es/dialogue-male.json index 9e26dfeeb6e..cbd7dbf39ad 100644 --- a/src/locales/es/dialogue-male.json +++ b/src/locales/es/dialogue-male.json @@ -1 +1,52 @@ -{} \ No newline at end of file +{ + "aether_grunt": { + "encounter": { + "1": "¡Lucharé con toda mi fuerza para detenerte!", + "2": "Me da igual que seas un crío. Eres una amenaza y debes irte.", + "3": "Me dijeron que mandara a todos los entrenadores por donde venían, ¡sin excepciones!", + "4": "¡Te mostraré el poder del Paraíso Æther!", + "5": "Ahora que conoces la oscuridad en lo profundo del Paraíso Æther, es hora de que vayas desapareciendo..." + }, + "victory": { + "1": "¡Vaya! Demuestras habilidad.", + "2": "¿Qué quiere decir esto? ¿Eh?", + "3": "¡Vaya! Con esa fuerza, ¡no creo que pueda detenerte!", + "4": "Vaya... parece que puede que haya perdido.", + "5": "¡Mira, te hago una mueca!: ¡Aiyee!" + } + }, + "faba": { + "encounter": { + "1": "¡Yo, Subdirector Fabio, te mostraré la cruda realidad del mundo!", + "2": "¿Yo, la última línea de defensa de Æther, battallando a un mero crío?", + "3": "Yo, Fabio, soy el Subdirector de la Fundación Æther. Soy el único en el mundo, soy irremplazable." + }, + "victory": { + "1": "¡Aaaah!", + "2": "¿C-c-cómo puede ser? Eres tan solo un niño...", + "3": "Este... este es el motivo por el que odio a los niños." + } + }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "¡Vas a asustar a mi pobre criatura! Parece que tendré que silenciarte cuanto antes." + }, + "victory": { + "1": "¿Cómo?¿Cómo puedes ser tan terrible?" + }, + "defeat": { + "1": "Buff." + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "¡¿Por qué me sigues molestando?! Estoy cansada de ti. ¡Hasta las narices!\n$Se acabó esta charla innecesaria. Este es el poder de Nihilego, ¡te demostraré cuánto te equivocas al venir aquí!" + }, + "victory": { + "1": "¡¡¡Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "¡Todo lo que quiero es a esta preciosa criatura! ¡Los demás no me importáis!" + } + } +} diff --git a/src/locales/es/settings.json b/src/locales/es/settings.json index 2351abf04ae..9c16fbb0fd6 100644 --- a/src/locales/es/settings.json +++ b/src/locales/es/settings.json @@ -2,6 +2,106 @@ "boy": "Chico", "girl": "Chica", "general": "General", + "display": "Pantalla", "audio": "Audio", - "shopOverlayOpacity": "Opacidad de la fase de compra" + "gamepad": "Mando", + "keyboard": "Teclado", + "gameSpeed": "Veloc. del juego", + "hpBarSpeed": "Veloc. barra PS", + "expGainsSpeed": "Veloc. de EXP", + "expPartyDisplay": "Mostrar EXP del Equipo", + "skipSeenDialogues": "Saltar diálogos leídos", + "battleStyle": "Estilo de lucha", + "enableRetries": "Activar reintento", + "hideIvs": "Ocultar escáner de IVs", + "tutorials": "Tutoriales", + "touchControls": "Control táctil", + "vibrations": "Vibración", + "normal": "Normal", + "fast": "+1", + "faster": "+2", + "skip": "Saltar", + "levelUpNotifications": "Aumentos de nivel", + "on": "Sí", + "off": "No", + "switch": "Cambiar", + "set": "Mantener", + "auto": "Auto.", + "disabled": "Desact.", + "language": "Idioma", + "change": "Cambiar", + "uiTheme": "Color UI", + "default": "Predet.", + "legacy": "Clásico", + "windowType": "Ventana", + "moneyFormat": "Formato dinero", + "damageNumbers": "Cifras de daño", + "simple": "Simple", + "fancy": "Elegante", + "abbreviated": "Abreviado", + "moveAnimations": "Animación de movs.", + "showStatsOnLevelUp": "Estadísticas al aum. nivel", + "candyUpgradeNotification": "Aviso de caramelos", + "passivesOnly": "Solo pasivas", + "candyUpgradeDisplay": "Muestra de caramelos", + "icon": "Icono", + "animation": "Animación", + "moveInfo": "Info. de movimientos", + "showMovesetFlyout": "Descripción de movimientos", + "showArenaFlyout": "Descripción de escenarios", + "showTimeOfDayWidget": "Mostrar hora del día", + "timeOfDayAnimation": "Animación hora del día", + "bounce": "Rebote", + "timeOfDay_back": "Vuelta", + "spriteSet": "Set de sprites", + "consistent": "Consistente", + "mixedAnimated": "Mixto", + "fusionPaletteSwaps": "Colores de fusión", + "playerGender": "Género del jugador", + "typeHints": "Pistas de tipos", + "masterVolume": "Volumen total", + "bgmVolume": "Volumen música", + "fieldVolume": "Volumen escenario", + "seVolume": "Volumen efectos", + "uiVolume": "Volumen sistema", + "musicPreference": "Preferencia musical", + "mixed": "Mixta", + "gamepadPleasePlug": "Conecta un mando o pulsa un botón", + "delete": "Eliminar", + "keyboardPleasePress": "Pulsa una tecla de tu teclado", + "reset": "Restablecer", + "requireReload": "Requiere reinicio", + "action": "Acción", + "back": "Atrás", + "pressToBind": "Pulsa para vincular", + "pressButton": "Pulsa un botón...", + "buttonUp": "Arriba", + "buttonDown": "Abajo", + "buttonLeft": "Izquierda", + "buttonRight": "Derecha", + "buttonAction": "Acción", + "buttonMenu": "Menú", + "buttonSubmit": "Confirmar", + "buttonCancel": "Cancelar", + "buttonStats": "Estadísticas", + "buttonCycleForm": "Cambiar forma", + "buttonCycleShiny": "Cambiar shiny", + "buttonCycleGender": "Cambiar género", + "buttonCycleAbility": "Cambiar habilidad", + "buttonCycleNature": "Cambiar naturaleza", + "buttonCycleVariant": "Cambiar variante", + "buttonSpeedUp": "Acelerar", + "buttonSlowDown": "Ralentizar", + "alt": " (Alt.)", + "mute": "Silenciar", + "controller": "Mando", + "gamepadSupport": "Soporte de mando", + "showBgmBar": "Mostrar título de canción", + "moveTouchControls": "Controles táctiles", + "shopOverlayOpacity": "Opacidad de la fase de compra", + "shopCursorTarget": "Cursor de la tienda", + "items": "Objetos", + "reroll": "Actualizar", + "shop": "Tienda", + "checkTeam": "Ver equipo" } diff --git a/src/locales/es/trainer-classes.json b/src/locales/es/trainer-classes.json index ac36d0c2b83..0677193e4f8 100644 --- a/src/locales/es/trainer-classes.json +++ b/src/locales/es/trainer-classes.json @@ -95,5 +95,8 @@ "worker": "Operario", "worker_female": "Operaria", "workers": "Operarios", - "youngster": "Joven" -} \ No newline at end of file + "youngster": "Joven", + "aether_grunt": "Empleado de la Fundación Æther", + "aether_grunt_female": "Empleada de la Fundación Æther", + "aether_grunts": "Empleados de la Fundación Æther" +} diff --git a/src/locales/es/trainer-names.json b/src/locales/es/trainer-names.json index 515a62d252a..c6758366db7 100644 --- a/src/locales/es/trainer-names.json +++ b/src/locales/es/trainer-names.json @@ -138,11 +138,15 @@ "rood": "Rood", "xerosic": "Xerosic", "bryony": "Bryony", + "faba": "Fabio", + "maxie": "Maxie", "archie": "Archie", "cyrus": "Cyrus", "ghetsis": "Ghetsis", "lysandre": "Lysandre", + "lusamine": "Samina", + "blue_red_double": "Azul y Rojo", "red_blue_double": "Rojo y Azul", "tate_liza_double": "Vito y Leti", @@ -153,4 +157,4 @@ "iris_alder_double": "Iris y Mirto", "marnie_piers_double": "Roxy y Nerio", "piers_marnie_double": "Nerio y Roxy" -} \ No newline at end of file +} diff --git a/src/locales/es/trainer-titles.json b/src/locales/es/trainer-titles.json index d352e404500..5bee9fc8c51 100644 --- a/src/locales/es/trainer-titles.json +++ b/src/locales/es/trainer-titles.json @@ -16,6 +16,8 @@ "galactic_boss": "Team Galactic Boss", "plasma_boss": "Team Plasma Boss", "flare_boss": "Team Flare Boss", + "aether_boss": "Presidente Æther", + "rocket_admin": "Team Rocket Admin", "rocket_admin_female": "Team Rocket Admin", "magma_admin": "Team Magma Admin", @@ -27,5 +29,6 @@ "plasma_sage": "Team Plasma Sage", "plasma_admin": "Team Plasma Admin", "flare_admin": "Team Flare Admin", - "flare_admin_female": "Team Flare Admin" -} \ No newline at end of file + "flare_admin_female": "Team Flare Admin", + "aether_admin": "Director de la Fundación Æther" +} diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json index bc8c02c07d8..1c108c89ded 100644 --- a/src/locales/fr/battle.json +++ b/src/locales/fr/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.", "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Tadaaa !", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !", "learnMoveAnd": "Et…", "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", "moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.", diff --git a/src/locales/fr/bgm-name.json b/src/locales/fr/bgm-name.json index f97523e109b..ecf0075e79d 100644 --- a/src/locales/fr/bgm-name.json +++ b/src/locales/fr/bgm-name.json @@ -45,6 +45,7 @@ "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_origin_forme": "LPA - Vs. Dialga/Palkia Originel", "battle_legendary_giratina": "ROSA - Vs. Giratina", "battle_legendary_arceus": "HGSS - Vs. Arceus", "battle_legendary_unova": "NB - Vs. Légendaire d’Unys", @@ -59,6 +60,7 @@ "battle_legendary_zac_zam": "ÉB - Vs. Zacian/Zamazenta", "battle_legendary_glas_spec": "ÉB - Vs. Blizzeval/Spectreval", "battle_legendary_calyrex": "ÉB - Vs. Sylveroy", + "battle_legendary_riders": "ÉB - Vs. Sylveroy Cavalier du Froid/d’Effroi", "battle_legendary_birds_galar": "ÉB - Vs. Oiseaux Légendaires de Galar", "battle_legendary_ruinous": "ÉV - Vs. Trésors du fléau", "battle_legendary_kor_mir": "ÉV - Profondeurs de la Zone Zéro (Combat)", @@ -78,11 +80,21 @@ "battle_galactic_grunt": "DÉPS Vs. Team Galaxie", "battle_plasma_grunt": "NB - Vs. Team Plasma", "battle_flare_grunt": "XY - Vs. Team Flare", + "battle_aether_grunt": "SL - Vs. Fondation Æther", + "battle_skull_grunt": "SL - Vs. Team Skull", + "battle_macro_grunt": "ÉB - Vs. Macro Cosmos", + "battle_galactic_admin": "DÉPS - Vs. Admin Team Galaxie", + "battle_skull_admin": "SL - Vs. Admin Team Skull", + "battle_oleana": "ÉB - Vs. Liv", "battle_rocket_boss": "USUL - Vs. Giovanni", "battle_aqua_magma_boss": "ROSA - Vs. Arthur/Max", "battle_galactic_boss": "DÉPS - Vs. Hélio", "battle_plasma_boss": "N2B2 - Vs. Ghetis", "battle_flare_boss": "XY - Vs. Lysandre", + "battle_aether_boss": "SL - Vs. Elsa-Mina", + "battle_skull_boss": "SL - Vs. Guzma", + "battle_macro_boss": "ÉB - Vs. Shehroz", + "abyss": "PDM EdC - Cratère Obscur", "badlands": "PDM EdC - Vallée Stérile", "beach": "PDM EdC - Falaise Trempée", diff --git a/src/locales/fr/settings.json b/src/locales/fr/settings.json index 3b0794c502d..181a593cc99 100644 --- a/src/locales/fr/settings.json +++ b/src/locales/fr/settings.json @@ -63,6 +63,7 @@ "bgmVolume": "Vol. musique", "fieldVolume": "Vol. combats", "seVolume": "Vol. effets", + "uiVolume": "Vol. menus", "musicPreference": "Préf. musicale", "mixed": "Mixte", "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton.", diff --git a/src/locales/fr/trainer-classes.json b/src/locales/fr/trainer-classes.json index 55ad0a3db8b..cebdadf09e9 100644 --- a/src/locales/fr/trainer-classes.json +++ b/src/locales/fr/trainer-classes.json @@ -117,5 +117,13 @@ "plasma_grunts": "Sbires de la Team Plasma", "flare_grunt": "Sbire de la Team Flare", "flare_grunt_female": "Sbire de la Team Flare", - "flare_grunts": "Sbires de la Team Flare" + "flare_grunts": "Sbires de la Team Flare", + "aether_grunt": "Employé de la Fondation Æther", + "aether_grunt_female": "Employée de la Fondation Æther", + "aether_grunts": "Employés de la Fondation Æther", + "skull_grunt": "Sbire de la Team Skull", + "skull_grunt_female": "Sbire de la Team Skull", + "macro_grunt": "Employé de Macro Cosmos", + "macro_grunt_female": "Employée de Macro Cosmos", + "macro_grunts": "Employés de Macro Cosmos" } diff --git a/src/locales/fr/trainer-names.json b/src/locales/fr/trainer-names.json index 4444a530df8..5864976cc34 100644 --- a/src/locales/fr/trainer-names.json +++ b/src/locales/fr/trainer-names.json @@ -138,11 +138,19 @@ "rood": "Carmine", "xerosic": "Xanthin", "bryony": "Brasénie", + "faba": "Saubohne", + "plumeria": "Apocyne", + "oleana": "Liv", + "maxie": "Max", "archie": "Arthur", "cyrus": "Hélio", "ghetsis": "Ghetis", "lysandre": "Lysandre", + "lusamine": "Elsa-Mina", + "guzma": "Guzma", + "rose": "Shehroz", + "blue_red_double": "Blue & Red", "red_blue_double": "Red & Blue", "tate_liza_double": "Lévy & Tatia", diff --git a/src/locales/fr/trainer-titles.json b/src/locales/fr/trainer-titles.json index f53c5be7445..6d966bbd9ec 100644 --- a/src/locales/fr/trainer-titles.json +++ b/src/locales/fr/trainer-titles.json @@ -16,6 +16,10 @@ "galactic_boss": "Leader de la Team Galaxie", "plasma_boss": "Leader de la Team Plasma", "flare_boss": "Leader de la Team Flare", + "aether_boss": "Présidente d’Æther", + "skull_boss": "Boss de la Team Skull", + "macro_boss": "Président de Macro Cosmos", + "rocket_admin": "Admin Team Rocket", "rocket_admin_female": "Admin Team Rocket", "magma_admin": "Admin Team Magma", @@ -27,5 +31,8 @@ "plasma_sage": "Sage Plasma", "plasma_admin": "Admin Team Plasma", "flare_admin": "Manager de la Team Flare", - "flare_admin_female": "Manageuse de la Team Flare" -} \ No newline at end of file + "flare_admin_female": "Manageuse de la Team Flare", + "aether_admin": "Directeur d’Æther", + "skull_admin": "Admin Team Skull", + "macro_admin": "Macro Cosmos" +} diff --git a/src/locales/it/battle.json b/src/locales/it/battle.json index 3fd255353d3..f0339f761c7 100644 --- a/src/locales/it/battle.json +++ b/src/locales/it/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.", "learnMoveForgetQuestion": "Quale mossa deve dimenticare?", "learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}ta-daaaa!", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}ta-daaaa!", "learnMoveAnd": "E…", "levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!", "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", diff --git a/src/locales/it/pokemon-info.json b/src/locales/it/pokemon-info.json index 015cbd77ad0..4b655dbe1ce 100644 --- a/src/locales/it/pokemon-info.json +++ b/src/locales/it/pokemon-info.json @@ -13,7 +13,8 @@ "SPD": "Velocità", "SPDshortened": "Vel", "ACC": "Precisione", - "EVA": "Elusione" + "EVA": "Elusione", + "HPStat": "PS" }, "Type": { "UNKNOWN": "Sconosciuto", @@ -37,4 +38,4 @@ "FAIRY": "Folletto", "STELLAR": "Astrale" } -} \ No newline at end of file +} diff --git a/src/locales/it/settings.json b/src/locales/it/settings.json index 002ea6ad4db..381503f21bd 100644 --- a/src/locales/it/settings.json +++ b/src/locales/it/settings.json @@ -2,9 +2,9 @@ "boy": "Ragazzo", "girl": "Ragazza", "general": "Generale", + "uiVolume": "Volume UI ", "gamepadSupport": "Supporto Gamepad", "showBgmBar": "Mostra Nomi Musica", - "fieldVolume": "Volume Campo", "moveTouchControls": "Move Touch Controls", "shopOverlayOpacity": "Opacità Finestra Negozio", "shopCursorTarget": "Target Cursore Negozio", diff --git a/src/locales/it/trainer-classes.json b/src/locales/it/trainer-classes.json index 854975859ce..205a7c59d42 100644 --- a/src/locales/it/trainer-classes.json +++ b/src/locales/it/trainer-classes.json @@ -117,5 +117,14 @@ "plasma_grunts": "Seguaci Plasma", "flare_grunt": "Recluta Team Flare", "flare_grunt_female": "Recluta Team Flare", - "flare_grunts": "Reclute Team Flare" -} \ No newline at end of file + "flare_grunts": "Reclute Team Flare", + "aether_grunt": "Dipendente (Fondazione Æther)", + "aether_grunt_female": "Dipendente (Fondazione Æther)", + "aether_grunts": "Dipendenti (Fondazione Æther)", + "skull_grunt": "Recluta Team Skull", + "skull_grunt_female": "Recluta Team Skull", + "skull_grunts": "Reclute Team Skull", + "macro_grunt": "Impiegato Macro Cosmos", + "macro_grunt_female": "Impiegata Macro Cosmos", + "macro_grunts": "Impiegati Macro Cosmos" +} diff --git a/src/locales/it/trainer-names.json b/src/locales/it/trainer-names.json index bd66fbae647..6d1373c0bb3 100644 --- a/src/locales/it/trainer-names.json +++ b/src/locales/it/trainer-names.json @@ -138,11 +138,15 @@ "rood": "Ross", "xerosic": "Xante", "bryony": "Bromelia", + "faba": "Vicio", + "maxie": "Max", "archie": "Ivan", "cyrus": "Cyrus", "ghetsis": "Ghecis", "lysandre": "Elisio", + "lusamine": "Samina", + "guzma": "Guzman", "blue_red_double": "Blu & Rosso", "red_blue_double": "Rosso & Blu", "tate_liza_double": "Tell & Pat", @@ -153,4 +157,4 @@ "iris_alder_double": "Iris & Nardo", "marnie_piers_double": "Mary & Ginepro", "piers_marnie_double": "Ginepro & Mary" -} \ No newline at end of file +} diff --git a/src/locales/it/trainer-titles.json b/src/locales/it/trainer-titles.json index f8132d2b817..eff152795cd 100644 --- a/src/locales/it/trainer-titles.json +++ b/src/locales/it/trainer-titles.json @@ -16,6 +16,10 @@ "galactic_boss": "Capo Galassia", "plasma_boss": "Capo Plasma", "flare_boss": "Capo Flare", + "aether_boss": "Direttrice Æther", + "skull_boss": "Capo Team Skull", + "macro_boss": "Presidente Macro Cosmos", + "rocket_admin": "Tenente Team Rocket", "rocket_admin_female": "Tenente Team Rocket", "magma_admin": "Magmatenente", @@ -27,5 +31,9 @@ "plasma_sage": "Saggio Team Plasma", "plasma_admin": "Tenente Team Plasma", "flare_admin": "Ufficiale Team Flare", - "flare_admin_female": "Ufficiale Team Flare" -} \ No newline at end of file + "flare_admin_female": "Ufficiale Team Flare", + "aether_admin": "Capo Filiale Æther", + "skull_admin": "Ufficiale Team Skull", + "macro_admin": "Vicepresidente Macro Cosmos" +} + diff --git a/src/locales/ja/battle-info.json b/src/locales/ja/battle-info.json index 9e26dfeeb6e..2959cdda332 100644 --- a/src/locales/ja/battle-info.json +++ b/src/locales/ja/battle-info.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "generation": "{{generation}}世代" +} diff --git a/src/locales/ja/battle.json b/src/locales/ja/battle.json index f75365a648e..f3f1d134d16 100644 --- a/src/locales/ja/battle.json +++ b/src/locales/ja/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}}は {{moveName}}を\n覚えずに 終わった!", "learnMoveForgetQuestion": "どの 技を\n忘れさせたい?", "learnMoveForgetSuccess": "{{pokemonName}}は {{moveName}}の\n使い方を きれいに 忘れた!", - "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{se/pb_bounce_1}ポカン!", "learnMoveAnd": "そして…", "levelCapUp": "レベルキャップの\n{{levelCap}}に 上がった!", "moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。", diff --git a/src/locales/ja/game-stats-ui-handler.json b/src/locales/ja/game-stats-ui-handler.json index 9e26dfeeb6e..25bb21f701a 100644 --- a/src/locales/ja/game-stats-ui-handler.json +++ b/src/locales/ja/game-stats-ui-handler.json @@ -1 +1,42 @@ -{} \ No newline at end of file +{ + "stats": "統計", + "playTime": "プレー時間", + "totalBattles": "合計バトル数", + "starters": "スターター数", + "shinyStarters": "色違いスターター数", + "speciesSeen": "合計発見数", + "speciesCaught": "合計捕獲数", + "ribbonsOwned": "リボン数", + "classicRuns": "クラシックラン", + "classicWins": "クラシック勝利", + "dailyRunAttempts": "デイリーラン", + "dailyRunWins": "デイリーラン勝利", + "endlessRuns": "エンドレスラン", + "highestWaveEndless": "エンドレス最高ウェーブ", + "highestMoney": "最大貯金", + "highestDamage": "最大ダメージ", + "highestHPHealed": "最大HP回復", + "pokemonEncountered": "遭遇したポケモン", + "pokemonDefeated": "倒したポケモン", + "pokemonCaught": "捕まえたポケモン", + "eggsHatched": "ふかしたタマゴ", + "subLegendsSeen": "見つけた順伝説", + "subLegendsCaught": "捕まえた順伝説", + "subLegendsHatched": "ふかした順伝説", + "legendsSeen": "見つけた伝説", + "legendsCaught": "捕まえた伝説", + "legendsHatched": "ふかした伝説", + "mythicalsSeen": "見つけた幻ポケモン", + "mythicalsCaught": "捕まえた幻ポケモン", + "mythicalsHatched": "ふかした幻ポケモン", + "shiniesSeen": "見つけた色違い", + "shiniesCaught": "捕まえた色違い", + "shiniesHatched": "ふかした色違い", + "pokemonFused": "合体したポケモン", + "trainersDefeated": "倒したトレーナー", + "eggsPulled": "引いたタマゴ", + "rareEggsPulled": "引いたレアタマゴ", + "epicEggsPulled": "引いた超レアタマゴ", + "legendaryEggsPulled": "引いた伝説タマゴ", + "manaphyEggsPulled": "引いたマナフィタマゴ" +} \ No newline at end of file diff --git a/src/locales/ja/menu-ui-handler.json b/src/locales/ja/menu-ui-handler.json index e9bec2cf0ae..beb014b84a9 100644 --- a/src/locales/ja/menu-ui-handler.json +++ b/src/locales/ja/menu-ui-handler.json @@ -1,19 +1,26 @@ { - "GAME_SETTINGS": "せってい", - "ACHIEVEMENTS": "じっせき", - "STATS": "とうけい", - "RUN_HISTORY":"ラン履歴", + "GAME_SETTINGS": "設定", + "ACHIEVEMENTS": "実績", + "STATS": "統計", "EGG_LIST": "タマゴリスト", "EGG_GACHA": "タマゴガチャ", - "MANAGE_DATA": "データかんり", + "MANAGE_DATA": "データ管理", "COMMUNITY": "コミュニティ", + "SAVE_AND_QUIT": "保存して終了", "LOG_OUT": "ログアウト", "slot": "スロット {{slotNumber}}", "importSession": "セッションのインポート", + "importSlotSelect": "インポート先の スロットを 選んでください", "exportSession": "セッションのエクスポート", - "importRunHistory":"ラン履歴インポート", - "exportRunHistory":"ラン履歴エクスポート", + "exportSlotSelect": "エクスポート元の スロットを 選んでください", "importData": "データのインポート", "exportData": "データのエクスポート", - "cancel": "キャンセル" + "consentPreferences": "同意設定", + "linkDiscord": "Discord連携", + "unlinkDiscord": "Discord連携解除", + "linkGoogle": "Google連携", + "unlinkGoogle": "Google連携解除", + "cancel": "キャンセル", + "losingProgressionWarning": "戦闘開始からの データが 保存されません。\nよろしいですか?", + "noEggs": "現在 タマゴを ふかしていません!" } \ No newline at end of file diff --git a/src/locales/ja/modifier-select-ui-handler.json b/src/locales/ja/modifier-select-ui-handler.json index 9e26dfeeb6e..9370f01491e 100644 --- a/src/locales/ja/modifier-select-ui-handler.json +++ b/src/locales/ja/modifier-select-ui-handler.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "transfer": "アイテム移行", + "reroll": "選択肢変更", + "lockRarities": "レア度の固定", + "checkTeam": "チームを確認", + "transferDesc": "ポケモンの 手持ちアイテムを 移行する", + "rerollDesc": "お金を 使って アイテムの 選択肢を 変更する", + "lockRaritiesDesc": "選択肢を 変更するときの レア度を 固定する\n(選択肢変更金額を影響する)", + "checkTeamDesc": "チームの 状態を 確認する\nフォルムチェンジアイテムを 有効・無効にする", + "rerollCost": "{{formattedMoney}}円", + "itemCost": "{{formattedMoney}}円" +} diff --git a/src/locales/ja/pokemon-form-battle.json b/src/locales/ja/pokemon-form-battle.json index 9e26dfeeb6e..adbc7b4b3da 100644 --- a/src/locales/ja/pokemon-form-battle.json +++ b/src/locales/ja/pokemon-form-battle.json @@ -1 +1,14 @@ -{} \ No newline at end of file +{ + "mega": "メガ{{pokemonName}}", + "mega-x": "メガ{{pokemonName}}X", + "mega-y": "メガ{{pokemonName}}Y", + "primal": "ゲンシ{{pokemonName}}", + "gigantamax": "キョダイ{{pokemonName}}", + "eternamax": "E・{{pokemonName}}", + "megaChange": "{{preName}}は\nメガ{{pokemonName}}に メガシンカした!", + "gigantamaxChange": "{{preName}}は\nキョダイマックスした!", + "eternamaxChange": "{{preName}}は\nムゲンダイマックスした!", + "revertChange": "{{pokemonName}}は\n元の姿に 戻った!", + "formChange": "{{preName}}は\n姿を 変えた!", + "disguiseChange": "ばけのかわが みがわりに なった!" +} diff --git a/src/locales/ja/pokemon-form.json b/src/locales/ja/pokemon-form.json index 9e26dfeeb6e..76124904456 100644 --- a/src/locales/ja/pokemon-form.json +++ b/src/locales/ja/pokemon-form.json @@ -1 +1,170 @@ -{} \ No newline at end of file +{ + "pikachuCosplay": "コスプレ", + "pikachuCoolCosplay": "クールなコスプレ", + "pikachuBeautyCosplay": "きれいなコスプレ", + "pikachuCuteCosplay": "かわいいコスプレ", + "pikachuSmartCosplay": "かしこいコスプレ", + "pikachuToughCosplay": "パワフルなコスプレ", + "pikachuPartner": "パートナー", + "eeveePartner": "パートナー", + "pichuSpiky": "ギザみみ", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "たいよう", + "castformRainy": "あまみず", + "castformSnowy": "ゆきぐも", + "deoxysNormal": "ノーマル", + "burmyPlant": "くさき", + "burmySandy": "すなち", + "burmyTrash": "ゴミ", + "shellosEast": "ひがし", + "shellosWest": "にし", + "rotomHeat": "ヒート", + "rotomWash": "ウォッシュ", + "rotomFrost": "フロスト", + "rotomFan": "スピン", + "rotomMow": "カット", + "giratinaAltered": "アナザー", + "shayminLand": "ランド", + "basculinRedStriped": "赤筋", + "basculinBlueStriped": "青筋", + "basculinWhiteStriped": "白筋", + "deerlingSpring": "春", + "deerlingSummer": "夏", + "deerlingAutumn": "秋", + "deerlingWinter": "冬", + "tornadusIncarnate": "けしん", + "thundurusIncarnate": "けしん", + "landorusIncarnate": "けしん", + "keldeoOrdinary": "いつも", + "meloettaAria": "ボイス", + "meloettaPirouette": "ステップ", + "froakieBattleBond": "きずなへんげ", + "scatterbugMeadow": "はなぞの", + "scatterbugIcySnow": "ひょうせつ", + "scatterbugPolar": "ゆきぐに", + "scatterbugTundra": "せつげん", + "scatterbugContinental": "たいりく", + "scatterbugGarden": "ていえん", + "scatterbugElegant": "みやび", + "scatterbugModern": "モダン", + "scatterbugMarine": "マリン", + "scatterbugArchipelago": "ぐんとう", + "scatterbugHighPlains": "こうや", + "scatterbugSandstorm": "さじん", + "scatterbugRiver": "たいが", + "scatterbugMonsoon": "スコール", + "scatterbugSavanna": "サバンナ", + "scatterbugSun": "たいよう", + "scatterbugOcean": "オーシャン", + "scatterbugJungle": "ジャングル", + "scatterbugFancy": "ファンシー", + "scatterbugPokeBall": "ボール", + "flabebeRed": "赤", + "flabebeYellow": "黄", + "flabebeOrange": "オレンジ", + "flabebeBlue": "青", + "flabebeWhite": "白", + "furfrouHeart": "ハート", + "furfrouStar": "スター", + "furfrouDiamond": "ダイア", + "furfrouDebutante": "レディ", + "furfrouMatron": "マダム", + "furfrouDandy": "ジェントル", + "furfrouLaReine": "クイーン", + "furfrouKabuki": "カブキ", + "furfrouPharaoh": "キングダム", + "pumpkabooSmall": "ちいさい", + "pumpkabooLarge": "おおきい", + "pumpkabooSuper": "とくだい", + "xerneasNeutral": "リラックス", + "xerneasActive": "アクティブ", + "zygarde50": "50%フォルム", + "zygarde10": "10%フォルム", + "zygarde50Pc": "50%フォルム スワームチェンジ", + "zygarde10Pc": "10%フォルム スワームチェンジ", + "zygardeComplete": "パーフェクトフォルム", + "oricorioBaile": "めらめら", + "oricorioPompom": "ぱちぱち", + "oricorioPau": "ふらふら", + "oricorioSensu": "まいまい", + "rockruffOwnTempo": "マイペース", + "miniorRedMeteor": "赤 りゅうせい", + "miniorOrangeMeteor": "オレンジ りゅうせい", + "miniorYellowMeteor": "黄 りゅうせい", + "miniorGreenMeteor": "緑 りゅうせい", + "miniorBlueMeteor": "水色 りゅうせい", + "miniorIndigoMeteor": "青 りゅうせい", + "miniorVioletMeteor": "紫 りゅうせい", + "miniorRed": "赤", + "miniorOrange": "オレンジ", + "miniorYellow": "黄", + "miniorGreen": "緑", + "miniorBlue": "水色", + "miniorIndigo": "青", + "miniorViolet": "紫", + "mimikyuDisguised": "ばけたすがた", + "mimikyuBusted": "ばれたすがた", + "magearnaOriginal": "500ねんまえ", + "marshadowZenith": "Zパワー", + "sinisteaPhony": "がんさく", + "sinisteaAntique": "しんさく", + "eiscueNoIce": "ナイスなし", + "indeedeeMale": "オス", + "indeedeeFemale": "メス", + "morpekoFullBelly": "まんぷく", + "zacianHeroOfManyBattles": "れきせんのゆうしゃ", + "zamazentaHeroOfManyBattles": "れきせんのゆうしゃ", + "zarudeDada": "とうちゃん", + "enamorusIncarnate": "けしん", + "squawkabillyGreenPlumage": "グリーンフェザー", + "squawkabillyBluePlumage": "ブルーフェザー", + "squawkabillyYellowPlumage": "イエローフェザー", + "squawkabillyWhitePlumage": "ホワイトフェザー", + "tatsugiriCurly": "そったすがた", + "tatsugiriDroopy": "たれたすがた", + "tatsugiriStretchy": "のびたすがた", + "gimmighoulChest": "はこ", + "gimmighoulRoaming": "とほ", + "koraidonApexBuild": "かんぜんけいたい", + "koraidonLimitedBuild":"せいげんけいたい", + "koraidonSprintingBuild":"しっそうけいたい", + "koraidonSwimmingBuild":"ゆうえいけいたい", + "koraidonGlidingBuild":"かっくうけいたい", + "miraidonUltimateMode":"コンプリートモード", + "miraidonLowPowerMode":"リミテッドモード", + "miraidonDriveMode":"ドライブモード", + "miraidonAquaticMode":"フロートモード", + "miraidonGlideMode":"グライドモード", + "poltchageistCounterfeit": "マガイモノ", + "poltchageistArtisan": "タカイモノ", + "paldeaTaurosCombat": "コンバット", + "paldeaTaurosBlaze": "ブレイズ", + "paldeaTaurosAqua": "ウォーター" +} \ No newline at end of file diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json index 954ff84b4c9..001720e4e5c 100644 --- a/src/locales/ko/battle.json +++ b/src/locales/ko/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}}[[는]] {{moveName}}[[를]]\n결국 배우지 않았다!", "learnMoveForgetQuestion": "어느 기술을 잊게 하고싶은가?", "learnMoveForgetSuccess": "{{pokemonName}}[[는]] {{moveName}}[[를]] 깨끗이 잊었다!", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}… @d{15}… @d{30}@s{pb_bounce_1}짠!", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}… @d{15}… @d{30}@s{se/pb_bounce_1}짠!", "learnMoveAnd": "그리고…", "levelCapUp": "레벨의 최대치가\n{{levelCap}}까지 상승했다!", "moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…", diff --git a/src/locales/ko/bgm-name.json b/src/locales/ko/bgm-name.json index 7b66c136cbd..5295e2d8708 100644 --- a/src/locales/ko/bgm-name.json +++ b/src/locales/ko/bgm-name.json @@ -80,11 +80,20 @@ "battle_galactic_grunt": "BDSP 갤럭시단 배틀", "battle_plasma_grunt": "BW 플라스마단 배틀", "battle_flare_grunt": "XY 플레어단 배틀", + "battle_aether_grunt": "SM 에테르재단 배틀", + "battle_skull_grunt": "SM 스컬단 배틀", + "battle_macro_grunt": "SWSH 트레이너 배틀", + "battle_galactic_admin": "BDSP 갤럭시단 간부 배틀", + "battle_skull_admin": "SM 스컬단 간부 배틀", + "battle_oleana": "SWSH 올리브 배틀", "battle_rocket_boss": "USUM 비주기 배틀", "battle_aqua_magma_boss": "ORAS 아강 & 마적 배틀", "battle_galactic_boss": "BDSP 태홍 배틀", "battle_plasma_boss": "B2W2 게치스 배틀", "battle_flare_boss": "XY 플라드리 배틀", + "battle_aether_boss": "SM 루자미네 배틀", + "battle_skull_boss": "SM 구즈마 배틀", + "battle_macro_boss": "SWSH 로즈 배틀", "abyss": "불가사의 던전 하늘의 탐험대 어둠의 화구", "badlands": "불가사의 던전 하늘의 탐험대 불모의 계곡", "beach": "불가사의 던전 하늘의 탐험대 축축한 암반", diff --git a/src/locales/ko/dialogue-female.json b/src/locales/ko/dialogue-female.json index 693b0704512..1fdbfe7dfba 100644 --- a/src/locales/ko/dialogue-female.json +++ b/src/locales/ko/dialogue-female.json @@ -1,4 +1,4 @@ -{ +{ "youngster": { "encounter": { "1": "거기 너! 나와 배틀 어때?", @@ -655,6 +655,86 @@ "5": "네가 이긴 것 같네. 그렇지만 졌어도, 난 우아하게 퇴장할 거니까!" } }, + "aether_grunt": { + "encounter": { + "1": "죽을 각오로 퇴치하겠습니다!", + "2": "소중한 연구라고! 애라도 가만두지 않겠어!", + "3": "어떤 트레이너든 물리치라고 들었다고!", + "4": "에테르파라다이스의 파워를 보여드리겠습니다!", + "5": "에테르파라다이스 중심의 어둠을 알아내다니. 이제 사라져 주셔야겠습니다!" + }, + "victory": { + "1": "흥! 실력이 대단하시군요.", + "2": "이게 뭐하는 상황이지? 무슨 결과냐고!", + "3": "이런! 넌 너무 강해서 물리칠 방법도 없다고!", + "4": "으음… 제가 진 것처럼 보이네요.", + "5": "이 느낌을 한마디로 하면. 게에이~힝!!" + } + }, + "faba": { + "encounter": { + "1": "나, 에테르재단의 자우보! 꼬맹이 녀석에게 현실을 보여주겠어요!", + "2": "에테르파라다이스 마지막 보루라고 불리는, 이 자우보에게 애를 상대하라고요?", + "3": "에테르재단의 지부장이라면 세계에 단 한 명… 이 자우보뿐입니다." + }, + "victory": { + "1": "게에이~힝!!", + "2": "뭐 뭐뭐뭐 뭐가 어떻게 된 거죠? 내가 애를 상대로…", + "3": "이래서 애는… 좋아할 수가 없어요." + } + }, + "skull_grunt": { + "encounter": { + "1": "나쁜 짓 안해-그냥 사는 게 힘들 뿐스컬!", + "2": "껌 하나 드실? 이게 우리가 인사하는 방식YO! 만나서 반갑스컬!", + "3": "우린 그냥 다른 사람의 포켓몬에 관심이 많을 뿐임다!", + "4": "어이 어이! 잘난 체하는 녀석한테 무시당하고 있잖스컬!!", + "5": "우리는 리프리젠트 땡땡이 스컬-! 집세는 못 내겠지만-! 정말 즐거웠지만, 청춘을 날려YO!" + }, + "victory": { + "1": "엥? 벌써 끝났슴까?", + "2": "미는 엑시트! 유는 피쓰풀!", + "3": "꼬마 녀석의 이상한 포켓몬엔 관심 없어!", + "4": "뭐야-?! 너무 강해서 뼈도 못 추리겠어!", + "5": "우리가 포켓몬보다 아래야!? 소중히 대해주면 안 돼? 으응!?" + } + }, + "plumeria": { + "encounter": { + "1": "…아무것도 느껴지지 않는 평~범한 애로 보이는데!", + "2": "워낙 애들 상대로 우물쭈물 하길래 오래 걸릴 줄 알았지…", + "3": "누구라도 스컬단 또 방해하면, 정말로 혼내줄 테니까!" + }, + "victory": { + "1": "흥! 대단하군.", + "2": "흐음, 너 참 대단하군. 애들을 상대로 질질 끈 이유가 이해될 정도로 강해.", + "3": "흠. 이 손실은 그냥 안고 가야겠어." + } + }, + "macro_grunt": { + "encounter": { + "1": "당신은 여기서 끝날 것 같네요!", + "2": "당신은 트레이너 맞죠? 하지만 우리를 방해하는 건 용납 못 합니다!", + "3": "매크로코스모스 생명입니다! 가입하신 실비보험은 있으신가요?" + }, + "victory": { + "1": "순순히 물러나는 것 말고는 선택지가 없군요.", + "2": "용돈을 뺏기다니… 패배는 적자로 이어지는구나…", + "3": "매크로코스모스 생명에 관한 일이라면 누구에게도 지지 않을 텐데…" + } + }, + "oleana": { + "encounter": { + "1": "로즈님을 방해하는 것은 절대로 용서할 수 없으니까요!", + "2": "저의 지시를 따르는 특별한 스태프들을 아무렇지도 않게 쓰러뜨리다니. …더 기대되는 것도 없네요.", + "3": "로즈님을 위해서라면! 질 수 없습니다!" + }, + "victory": { + "1": "아아… 이기지 못하다니… 올리브… 넌 정말 구제 불능이구나.", + "2": "하아아…! 이런 실수를 하다니… 승리를 거듭한 트레이너의 실력을 너무 얕잡아봤던 모양이네요.", + "3": "아아… 이 올리브님 조금 지쳤어…" + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "그래서! 여기까지 오다니, 감탄이 절로 나오는군!" @@ -787,6 +867,72 @@ "1": "우매한 자들이 이 아름다운 세상을 계속 더럽히고 있군." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "비스트가 놀라잖아! …우선은 너를 조용히 시켜야겠어." + }, + "victory": { + "1": "……너무해!" + }, + "defeat": { + "1": "흐음…" + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "그렇게 말했는데도! …왜 이리 끈질긴 거야! 정말 진절머리가 나.\n$더 말해봐야 소용 없겠지… 텅비드의 힘으로 네가 여기까지 온 걸 후회하게 해줄게!" + }, + "victory": { + "1": "………아아아웃!!" + }, + "defeat": { + "1": "나는 비스트만 있으면 돼! 너희가 어떻게 되든 상관없어!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "박살 내고 박살 내도 절대 봐주지 않아…\n$모두가 싫어하는 구즈마가 여기 있다!" + }, + "victory": { + "1": "쯧. 너는 내가 박살 내주겠어!" + }, + "defeat": { + "1": "겨우 그걸 위해서 일부러 온 거야?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "누구든지 박살 낸다!\n$그것이 구즈마님의 아이덴티티!!" + }, + "victory": { + "1": "구즈마!!! 뭐 하고 있는 거야?!" + }, + "defeat": { + "1": "너희들 바보군!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "내게는 모든 사람이 영원히 마음을 놓고 발전할 수 있도록…\n$무한한 에너지를 가져다 줘야 한다는 신념과 사명이 있단다!" + }, + "victory": { + "1": "아직 무르군… 트레이너.\n$역사는 바뀔 것이네! 이 나의 손에 의해서 말이지" + }, + "defeat": { + "1": "자네는 여전히 깨닫지 못했군!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "나는 가라르를 포함한— 전 세계의 에너지 문제를 해결하기 위해 최선을 다하고 있어.\n$매크로코스모스를 성공으로 이끈 경험과 성과는 내 방식이 효율적이라는 증거란다.\n$생각을 바꿀 마음은 없어. 내가 지더라도." + }, + "victory": { + "1": "포켓몬 승부는 좋군! 오랜만에 싸워보니 만족스러워…\n$제법 괜찮군. 패배를 인정하지." + }, + "defeat": { + "1": "너희가 보기에는 내가 끔찍한 짓을 벌이고 있는 것처럼 보이겠지? 조금도 이해가 가지 않을 거야.\n$하지만 난 가라르지방의 영원한 번영을 위해서 무한한 에너지를 가져다줘야 해." + } + }, "brock": { "encounter": { "1": "내 전문인 바위 타입 포켓몬으로 널 쓰러뜨려줄게! 덤벼!", @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}나… 내 소임을 다 한 기분이야…\n$@c{smile_eclosed}약속해 줘… 세상을 원래대로 되돌리고서… \n집으로… 무사히 돌아오는 거야.\n$@c{smile_ehalf}…고마워." } } -} \ No newline at end of file +} diff --git a/src/locales/ko/dialogue-male.json b/src/locales/ko/dialogue-male.json index 693b0704512..11194ab6398 100644 --- a/src/locales/ko/dialogue-male.json +++ b/src/locales/ko/dialogue-male.json @@ -655,6 +655,86 @@ "5": "네가 이긴 것 같네. 그렇지만 졌어도, 난 우아하게 퇴장할 거니까!" } }, + "aether_grunt": { + "encounter": { + "1": "죽을 각오로 퇴치하겠습니다!", + "2": "소중한 연구라고! 애라도 가만두지 않겠어!", + "3": "어떤 트레이너든 물리치라고 들었다고!", + "4": "에테르파라다이스의 파워를 보여드리겠습니다!", + "5": "에테르파라다이스 중심의 어둠을 알아내다니. 이제 사라져 주셔야겠습니다!" + }, + "victory": { + "1": "흥! 실력이 대단하시군요.", + "2": "이게 뭐하는 상황이지? 무슨 결과냐고!", + "3": "이런! 넌 너무 강해서 물리칠 방법도 없다고!", + "4": "으음… 제가 진 것처럼 보이네요.", + "5": "이 느낌을 한마디로 하면. 게에이~힝!!" + } + }, + "faba": { + "encounter": { + "1": "나, 에테르재단의 자우보! 꼬맹이 녀석에게 현실을 보여주겠어요!", + "2": "에테르파라다이스 마지막 보루라고 불리는, 이 자우보에게 애를 상대하라고요?", + "3": "에테르재단의 지부장이라면 세계에 단 한 명… 이 자우보뿐입니다." + }, + "victory": { + "1": "게에이~힝!!", + "2": "뭐 뭐뭐뭐 뭐가 어떻게 된 거죠? 내가 애를 상대로…", + "3": "이래서 애는… 좋아할 수가 없어요." + } + }, + "skull_grunt": { + "encounter": { + "1": "나쁜 짓 안해-그냥 사는 게 힘들 뿐스컬!", + "2": "껌 하나 드실? 이게 우리가 인사하는 방식YO! 만나서 반갑스컬!", + "3": "우린 그냥 다른 사람의 포켓몬에 관심이 많을 뿐임다!", + "4": "어이 어이! 잘난 체하는 녀석한테 무시당하고 있잖스컬!!", + "5": "우리는 리프리젠트 땡땡이 스컬-! 집세는 못 내겠지만-! 정말 즐거웠지만, 청춘을 날려YO!" + }, + "victory": { + "1": "엥? 벌써 끝났슴까?", + "2": "미는 엑시트! 유는 피쓰풀!", + "3": "꼬마 녀석의 이상한 포켓몬엔 관심 없어!", + "4": "뭐야-?! 너무 강해서 뼈도 못 추리겠어!", + "5": "우리가 포켓몬보다 아래야!? 소중히 대해주면 안 돼? 으응!?" + } + }, + "plumeria": { + "encounter": { + "1": "…아무것도 느껴지지 않는 평~범한 애로 보이는데!", + "2": "워낙 애들 상대로 우물쭈물 하길래 오래 걸릴 줄 알았지…", + "3": "누구라도 스컬단 또 방해하면, 정말로 혼내줄 테니까!" + }, + "victory": { + "1": "흥! 대단하군.", + "2": "흐음, 너 참 대단하군. 애들을 상대로 질질 끈 이유가 이해될 정도로 강해.", + "3": "흠. 이 손실은 그냥 안고 가야겠어." + } + }, + "macro_grunt": { + "encounter": { + "1": "당신은 여기서 끝날 것 같네요!", + "2": "당신은 트레이너 맞죠? 하지만 우리를 방해하는 건 용납 못 합니다!", + "3": "매크로코스모스 생명입니다! 가입하신 실비보험은 있으신가요?" + }, + "victory": { + "1": "순순히 물러나는 것 말고는 선택지가 없군요.", + "2": "용돈을 뺏기다니… 패배는 적자로 이어지는구나…", + "3": "매크로코스모스 생명에 관한 일이라면 누구에게도 지지 않을 텐데…" + } + }, + "oleana": { + "encounter": { + "1": "로즈님을 방해하는 것은 절대로 용서할 수 없으니까요!", + "2": "저의 지시를 따르는 특별한 스태프들을 아무렇지도 않게 쓰러뜨리다니. …더 기대되는 것도 없네요.", + "3": "로즈님을 위해서라면! 질 수 없습니다!" + }, + "victory": { + "1": "아아… 이기지 못하다니… 올리브… 넌 정말 구제 불능이구나.", + "2": "하아아…! 이런 실수를 하다니… 승리를 거듭한 트레이너의 실력을 너무 얕잡아봤던 모양이네요.", + "3": "아아… 이 올리브님 조금 지쳤어…" + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "그래서! 여기까지 오다니, 감탄이 절로 나오는군!" @@ -787,6 +867,72 @@ "1": "우매한 자들이 이 아름다운 세상을 계속 더럽히고 있군." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "비스트가 놀라잖아! …우선은 너를 조용히 시켜야겠어." + }, + "victory": { + "1": "……너무해!" + }, + "defeat": { + "1": "흐음…" + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "그렇게 말했는데도! …왜 이리 끈질긴 거야! 정말 진절머리가 나.\n$더 말해봐야 소용 없겠지… 텅비드의 힘으로 네가 여기까지 온 걸 후회하게 해줄게!" + }, + "victory": { + "1": "………아아아웃!!" + }, + "defeat": { + "1": "나는 비스트만 있으면 돼! 너희가 어떻게 되든 상관없어!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "박살 내고 박살 내도 절대 봐주지 않아…\n$모두가 싫어하는 구즈마가 여기 있다!" + }, + "victory": { + "1": "쯧. 너는 내가 박살 내주겠어!" + }, + "defeat": { + "1": "겨우 그걸 위해서 일부러 온 거야?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "누구든지 박살 낸다!\n$그것이 구즈마님의 아이덴티티!!" + }, + "victory": { + "1": "구즈마!!! 뭐 하고 있는 거야?!" + }, + "defeat": { + "1": "너희들 바보군!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "내게는 모든 사람이 영원히 마음을 놓고 발전할 수 있도록…\n$무한한 에너지를 가져다 줘야 한다는 신념과 사명이 있단다!" + }, + "victory": { + "1": "아직 무르군… 트레이너.\n$역사는 바뀔 것이네! 이 나의 손에 의해서 말이지" + }, + "defeat": { + "1": "자네는 여전히 깨닫지 못했군!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "나는 가라르를 포함한— 전 세계의 에너지 문제를 해결하기 위해 최선을 다하고 있어.\n$매크로코스모스를 성공으로 이끈 경험과 성과는 내 방식이 효율적이라는 증거란다.\n$생각을 바꿀 마음은 없어. 내가 지더라도." + }, + "victory": { + "1": "포켓몬 승부는 좋군! 오랜만에 싸워보니 만족스러워…\n$제법 괜찮군. 패배를 인정하지." + }, + "defeat": { + "1": "너희가 보기에는 내가 끔찍한 짓을 벌이고 있는 것처럼 보이겠지? 조금도 이해가 가지 않을 거야.\n$하지만 난 가라르지방의 영원한 번영을 위해서 무한한 에너지를 가져다줘야 해." + } + }, "brock": { "encounter": { "1": "내 전문인 바위 타입 포켓몬으로 널 쓰러뜨려줄게! 덤벼!", @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}나… 내 소임을 다 한 기분이야…\n$@c{smile_eclosed}약속해 줘… 세상을 원래대로 되돌리고서… \n집으로… 무사히 돌아오는 거야.\n$@c{smile_ehalf}…고마워." } } -} \ No newline at end of file +} diff --git a/src/locales/ko/pokemon-summary.json b/src/locales/ko/pokemon-summary.json index 5742058e45c..d9119623662 100644 --- a/src/locales/ko/pokemon-summary.json +++ b/src/locales/ko/pokemon-summary.json @@ -11,8 +11,8 @@ "cancel": "그만둔다", "memoString": "{{natureFragment}}.\n{{metFragment}}", "metFragment": { - "normal": "{{biome}}에서\nLv{{level}}일 때 만났다.", - "apparently": "{{biome}}에서\nLv{{level}}일 때 만난 것 같다." + "normal": "{{biome}}에서\n레벨 {{level}}일 때 만났다.", + "apparently": "{{biome}}에서\n레벨 {{level}}일 때 만난 것 같다." }, "natureFragment": { "Hardy": "{{nature}}하는 성격", @@ -41,4 +41,4 @@ "Careful": "{{nature}}한 성격", "Quirky": "{{nature}}스러운 성격" } -} \ No newline at end of file +} diff --git a/src/locales/ko/settings.json b/src/locales/ko/settings.json index d867d86a91a..b7fc01cb148 100644 --- a/src/locales/ko/settings.json +++ b/src/locales/ko/settings.json @@ -59,10 +59,11 @@ "fusionPaletteSwaps": "셰이더 적용", "playerGender": "플레이어 성별", "typeHints": "상성 힌트", - "masterVolume": "전체 볼륨", - "bgmVolume": "배경음악 볼륨", + "masterVolume": "마스터 볼륨", + "bgmVolume": "BGM 볼륨", "fieldVolume": "전투효과 볼륨", - "seVolume": "조작 볼륨", + "seVolume": "SE 볼륨", + "uiVolume": "UI 볼륨", "musicPreference": "음악 설정", "mixed": "믹스", "gamepadPleasePlug": "게임패드를 연결하거나 버튼을 입력하세요", diff --git a/src/locales/ko/trainer-classes.json b/src/locales/ko/trainer-classes.json index 555e487b4a3..da6c6f4aceb 100644 --- a/src/locales/ko/trainer-classes.json +++ b/src/locales/ko/trainer-classes.json @@ -117,5 +117,14 @@ "plasma_grunts": "플라스마단 조무래기들", "flare_grunt": "플레어단 조무래기", "flare_grunt_female": "플레어단 조무래기", - "flare_grunts": "플레어단 조무래기들" -} \ No newline at end of file + "flare_grunts": "플레어단 조무래기들", + "aether_grunt": "에테르재단 직원", + "aether_grunt_female": "에테르재단 직원", + "aether_grunts": "에테르재단 직원들", + "skull_grunt": "스컬단 조무래기", + "skull_grunt_female": "스컬단 조무래기", + "skull_grunts": "스컬단 조무래기들", + "macro_grunt": "매크로코스모스 직원", + "macro_grunt_female": "매크로코스모스 직원", + "macro_grunts": "매크로코스모스 직원들" +} diff --git a/src/locales/ko/trainer-names.json b/src/locales/ko/trainer-names.json index bc24d0f3183..f1357a428ba 100644 --- a/src/locales/ko/trainer-names.json +++ b/src/locales/ko/trainer-names.json @@ -138,11 +138,19 @@ "rood": "로트", "xerosic": "크세로시키", "bryony": "바라", + "faba": "자우보", + "plumeria": "플루메리", + "oleana": "올리브", + "maxie": "마적", "archie": "아강", "cyrus": "태홍", "ghetsis": "게치스", "lysandre": "플라드리", + "lusamine": "루자미네", + "guzma": "구즈마", + "rose": "로즈", + "blue_red_double": "그린 & 레드", "red_blue_double": "레드 & 그린", "tate_liza_double": "풍 & 란", @@ -153,4 +161,4 @@ "iris_alder_double": "아이리스 & 노간주", "marnie_piers_double": "마리 & 두송", "piers_marnie_double": "두송 & 마리" -} \ No newline at end of file +} diff --git a/src/locales/ko/trainer-titles.json b/src/locales/ko/trainer-titles.json index 4e627392e0b..7cff2207817 100644 --- a/src/locales/ko/trainer-titles.json +++ b/src/locales/ko/trainer-titles.json @@ -16,6 +16,10 @@ "galactic_boss": "갤럭시단 보스", "plasma_boss": "플라스마단 보스", "flare_boss": "플레어단 보스", + "aether_boss": "에테르재단 대표", + "skull_boss": "스컬단 보스", + "macro_boss": "매크로코스모스 사장", + "rocket_admin": "로켓단 간부", "rocket_admin_female": "로켓단 간부", "magma_admin": "마그마단 간부", @@ -27,5 +31,8 @@ "plasma_sage": "플라스마단 현인", "plasma_admin": "플라스마단 간부", "flare_admin": "플레어단 간부", - "flare_admin_female": "플레어단 간부" -} \ No newline at end of file + "flare_admin_female": "플레어단 간부", + "aether_admin": "에테르재단 지부장", + "skull_admin": "스컬단 간부", + "macro_admin": "매크로코스모스 간부" +} diff --git a/src/locales/pt_BR/ability.json b/src/locales/pt_BR/ability.json index 5b885504bd1..c4180ff01dd 100644 --- a/src/locales/pt_BR/ability.json +++ b/src/locales/pt_BR/ability.json @@ -257,7 +257,7 @@ }, "overgrow": { "name": "Overgrow", - "description": "Fortalece os movimentos do tipo Planta quando o Pokémon está com poucos PS." + "description": "Fortalece os movimentos do tipo Grama quando o Pokémon está com poucos PS." }, "blaze": { "name": "Blaze", @@ -625,7 +625,7 @@ }, "sapSipper": { "name": "Sap Sipper", - "description": "Se for atingido por um movimento do tipo Planta, ao invés de receber dano, aumenta seu Ataque." + "description": "Se for atingido por um movimento do tipo Grama, ao invés de receber dano, aumenta seu Ataque." }, "prankster": { "name": "Prankster", @@ -661,7 +661,7 @@ }, "flowerVeil": { "name": "Flower Veil", - "description": "Pokémon aliados do tipo Planta são protegidos de mudanças de estado e diminuição de seus atributos." + "description": "Pokémon aliados do tipo Grama são protegidos de mudanças de estado e diminuição de seus atributos." }, "cheekPouch": { "name": "Cheek Pouch", @@ -927,6 +927,10 @@ "name": "Prism Armor", "description": "Reduz o dano recebido por movimentos supereficazes." }, + "neuroforce": { + "name": "Neuroforce", + "description": "Fortalece movimentos supereficazes." + }, "intrepidSword": { "name": "Intrepid Sword", "description": "Aumenta o atributo de Ataque ao entrar em batalha." @@ -1055,9 +1059,9 @@ "name": "Grim Neigh", "description": "Quando o Pokémon derrota um alvo, emite um relincho assustador que aumenta seu Ataque Esp." }, - "asOneGlacier": { + "asOneGlastrier": { "name": "As One", - "description": "Essa Habilidade combina os efeitos das Habilidades Enervar de Calyrex e Relincho Branco de Glastrier." + "description": "Esta habilidade combina os efeitos da habilidade Unnerve de Calyrex e da habilidade Chilling Neigh de Glastrier." }, "asOneSpectrier": { "name": "As One", @@ -1235,4 +1239,4 @@ "name": "Poison Puppeteer", "description": "Pokémon envenenados pelos movimentos de Pecharunt também ficarão confusos." } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/arena-flyout.json b/src/locales/pt_BR/arena-flyout.json index 7ef11bea17f..e221fa6c0a5 100644 --- a/src/locales/pt_BR/arena-flyout.json +++ b/src/locales/pt_BR/arena-flyout.json @@ -15,5 +15,26 @@ "misty": "Terreno Enevoado", "electric": "Terreno Elétrico", "grassy": "Terreno de Planta", - "psychic": "Terreno Psíquico" -} \ No newline at end of file + "psychic": "Terreno Psíquico", + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "happyHour": "Happy Hour" +} diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json index b48d97ef4e9..e34ce8efdca 100644 --- a/src/locales/pt_BR/battle.json +++ b/src/locales/pt_BR/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}} não aprendeu {{moveName}}.", "learnMoveForgetQuestion": "Qual movimento quer esquecer?", "learnMoveForgetSuccess": "{{pokemonName}} esqueceu como usar {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Puf!", + "countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Puf!", "learnMoveAnd": "E…", "levelCapUp": "O nível máximo aumentou\npara {{levelCap}}!", "moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.", diff --git a/src/locales/pt_BR/bgm-name.json b/src/locales/pt_BR/bgm-name.json index bfce77e3a69..86d8ce3e790 100644 --- a/src/locales/pt_BR/bgm-name.json +++ b/src/locales/pt_BR/bgm-name.json @@ -45,6 +45,7 @@ "battle_legendary_lake_trio": "ORAS Batalha do Trio dos Lagos", "battle_legendary_sinnoh": "ORAS Batalha dos Lendários de Sinnoh", "battle_legendary_dia_pal": "ORAS Batalha do Dialga & Palkia", + "battle_legendary_origin_forme": "LA Origin Batalha com Dialga & Palkia", "battle_legendary_giratina": "ORAS Batalha do Giratina", "battle_legendary_arceus": "HGSS Batalha do Arceus", "battle_legendary_unova": "BW Batalha dos Lendários de Unova", @@ -59,6 +60,7 @@ "battle_legendary_zac_zam": "SWSH Batalha do Zacian & Zamazenta", "battle_legendary_glas_spec": "SWSH Batalha do Glastrier & Spectrier", "battle_legendary_calyrex": "SWSH Batalha do Calyrex", + "battle_legendary_riders": "SWSH Batalha com Ice & Shadow Rider Calyrex", "battle_legendary_birds_galar": "SWSH Batalha dos Pássaros Lendários de Galar", "battle_legendary_ruinous": "SV Batalha dos Lendários Ruinosos", "battle_legendary_kor_mir": "SV Batalha das Cavernas da Área Zero", @@ -78,11 +80,21 @@ "battle_galactic_grunt": "BDSP Batalha da Equipe Galáctica", "battle_plasma_grunt": "BW Batalha da Equipe Plasma", "battle_flare_grunt": "XY Batalha da Equipe Flare", + "battle_aether_grunt": "SM Batalha da Fundação Aether", + "battle_skull_grunt": "SM Batalha da Equipe Skull", + "battle_macro_grunt": "SWSH Batalha de Treinador", + "battle_galactic_admin": "BDSP Batalha com Admin da Equipe Galáctica", + "battle_skull_admin": "SM Batalha com Admin da Euipe Skull", + "battle_oleana": "SWSH Batalha da Oleana", "battle_rocket_boss": "USUM Batalha do Giovanni", "battle_aqua_magma_boss": "ORAS Batalha do Maxie & Archie", "battle_galactic_boss": "BDSP Batalha do Cyrus", "battle_plasma_boss": "B2W2 Batalha do Ghetsis", "battle_flare_boss": "XY Batalha do Lysandre", + "battle_aether_boss": "SM Batalha da Lusamine", + "battle_skull_boss": "SM Batalha do Guzma", + "battle_macro_boss": "SWSH Batalha do Rose", + "abyss": "PMD EoS Dark Crater", "badlands": "PMD EoS Barren Valley", "beach": "PMD EoS Drenched Bluff", @@ -135,4 +147,4 @@ "heal": "BW Centro Pokémon", "menu": "PMD EoS Bem-vindo ao Mundo dos Pokémon!", "title": "PMD EoS Menu Principal" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/dialogue-female.json b/src/locales/pt_BR/dialogue-female.json index 7f4dfe8865d..a25230117e3 100644 --- a/src/locales/pt_BR/dialogue-female.json +++ b/src/locales/pt_BR/dialogue-female.json @@ -655,6 +655,86 @@ "5": "Você pode ter me vencido, mas quando eu perco, eu saio com estilo!" } }, + "aether_grunt": { + "encounter": { + "1": "Eu vou lutar com tudo o que tenho para te eliminar!", + "2": "Eu não me importo se você é uma criança ou o que. Eu vou te mandar voando se você nos ameaçar!", + "3": "Me mandaram afastar Treinadores, não importa quem sejam!", + "4": "Eu vou te mostrar o poder do Paraíso Aether!", + "5": "Agora que você descobriu a escuridão no coração do Paraíso Aether, precisamos que você desapareça convenientemente!" + }, + "victory": { + "1": "Aff! Você parece ter muita habilidade.", + "2": "O que isso significa? O que isso significa!", + "3": "Ei! Você é tão forte que não há como eu te afastar!", + "4": "Hmm... Parece que eu posso ter perdido.", + "5": "Aqui está uma resposta para você: Aiyee!" + } + }, + "faba": { + "encounter": { + "1": "Eu, o Chefe de Ramo Faba, vou te mostrar a dureza do mundo real!", + "2": "O homem chamado de última linha de defesa do Paraíso Aether vai batalhar com uma mera criança?", + "3": "Eu, Faba, sou o Chefe de Ramo do Paraíso Aether. O único no mundo, eu sou insubstituível." + }, + "victory": { + "1": "Aiyee!", + "2": "C-c-como assim?! Como uma criança...", + "3": "Isso é por que... Isso é por que eu não consigo gostar de crianças." + } + }, + "skull_grunt": { + "encounter": { + "1": "Nós não somos maus, somos apenas durões!", + "2": "Quer um pouco de nós? É assim que dizemos olá! Prazer em conhecê-los, otários!", + "3": "Somos só um bando de caras e minas com um grande interesse nos Pokémon dos outros!", + "4": "Por que você está tentando agir durão quando já somos durões como ossos aqui fora, mano?", + "5": "Equipe Skull na área! Não podemos pagar o aluguel! Nos divertimos muito, mas nossa juventude foi desperdiçada!" + }, + "victory": { + "1": "Ahn? Já acabou?", + "2": "Hora de dar o fora, mano! Vamos ter que dizer tchau, mano!", + "3": "Nem precisamos dos seus Pokémon fracotes mesmo!", + "4": "Que?! Esse muleque é muito forte! Não tem como negar!", + "5": "Então, o que? Eu sou pior que um Pokémon?! Eu já tenho problemas de autoestima, cara." + } + }, + "plumeria": { + "encounter": { + "1": " ...Hmph. Você não parece nada especial para mim.", + "2": "Esses Capangas gastam muito tempo tentando lidar com crianças como você...", + "3": "Mexe com qualquer um da Equipe Skull, e eu vou te mostrar o quão séria eu posso ficar." + }, + "victory": { + "1": "Aff! Você é bem forte. Tenho que admitir.", + "2": "Aff! Você é bem forte. Agora eu entendi por que meus Capangas gastam tanto tempo batalhando com crianças.", + "3": "Aff! Acho que eu só tenho que aceitar essa derrota." + } + }, + "macro_grunt": { + "encounter": { + "1": "Parece que aqui é o fim da linha para você!", + "2": "Você é um treinador, não é? Temo que isso não lhe dê o direito de interferir em nosso trabalho.", + "3": "Sou da Macro Cosmos Seguros! Já tem um seguro de vida?" + }, + "victory": { + "1": "Eu não tenho muita escolha a não ser recuar respeitosamente.", + "2": "Ter que desistir do meu dinheiro... Perder significa que estou de volta no vermelho...", + "3": "Ninguém pode vencer a Macro Cosmos quando se trata de nossa dedicação ao trabalho!" + } + }, + "oleana": { + "encounter": { + "1": "Eu não vou deixar ninguém interferir no plano do Sr. Rose!", + "2": "Então, você passou por todo o pessoal especial que eu ordenei para te parar. Eu não esperaria nada menos.", + "3": "Pelo presidente! Eu não vou perder!" + }, + "victory": { + "1": "*suspiro* Eu não consegui vencer... Oleana... você realmente é uma mulher sem esperança.", + "2": "Aff! Isso é inaceitável... O que eu estava pensando... Qualquer treinador que chega tão longe não seria um fracote...", + "3": "*suspiro* Eu sou uma Oleana cansada..." + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "Tenho que admitir, estou impressionado que tenha chegado até aqui!" @@ -787,6 +867,72 @@ "1": "Tolos sem visão continuarão a poluir este belo mundo." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "Você vai assustar minha fera querida! Parece que eu vou precisar te silenciar primeiro." + }, + "victory": { + "1": "Como... como você pode ser tão terrível!" + }, + "defeat": { + "1": "Aff..." + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "Por que você continua a me incomodar?! Estou cansada de você. Cansada até a alma!\n$Chega de papo furado... Com o poder de Nihilego, vou mostrar o quão errado você estava em vir aqui!" + }, + "victory": { + "1": "Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "Tudo o que eu quero é minha fera preciosa! Eu não me importo com nenhum de vocês!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "O odiado chefe que te bate e te bate e nunca para...\n$É. O grande e mau Guzma está aqui!" + }, + "victory": { + "1": "Tss. Eu vou te bater um dia desses!" + }, + "defeat": { + "1": "E você veio até aqui só pra isso, né?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "Não importa contra quem eu esteja, eu vou derrotá-los!\n$Isso é o que o grande e mau Guzma é!" + }, + "victory": { + "1": "Guzma!!! O que há de errado com você?!" + }, + "defeat": { + "1": "Vocês são tudo uns idiotas!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "Devo fornecer energia ilimitada para garantir a prosperidade eterna para todos...\n$É meu propósito, meu dever, meu destino!" + }, + "victory": { + "1": "Você ainda não entendeu, treinador...\n$Nós... Não, eu vou mudar o rumo da história!" + }, + "defeat": { + "1": "Você ainda não entende nada!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "Estou comprometido em resolver o problema de energia na região de Galar e, claro, em todo o mundo.\n$Minha experiência e conquistas que fizeram da Macro Cosmos um sucesso são a prova de que meus métodos funcionam.\n$Não pretendo mudar de ideia, mesmo que eu perca." + }, + "victory": { + "1": "Eu esqueci o quão incríveis são as batalhas Pokémon! Faz tanto tempo desde que eu batalhei...\n$Isso foi realmente satisfatório, eu aceito a derrota para esta batalha." + }, + "defeat": { + "1": "Eu suponho que deve parecer que estou fazendo algo terrível. Eu não espero que você entenda.\n$Mas eu devo fornecer à região de Galar energia ilimitada para garantir prosperidade eterna." + } + }, "brock": { "encounter": { "1": "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", @@ -1218,6 +1364,40 @@ "3": "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos." } }, + "chili": { + "encounter": { + "1": "Yeeeeeooow! Hora de brincar com FOGO!! Eu sou o mais forte de nós irmãos!", + "2": "Tcharan! O escaldante Chili tipo Fogo (sou eu) será seu oponente!", + "3": "Vou te mostrar o que eu e meus ardentes tipo Fogo podemos fazer!" + }, + "victory": { + "1": "Você me pegou. Eu estou… queimado… esgotado…", + "2": "Uau! Você tá pegando fogo!", + "3": "Ai! Você me pegou!" + }, + "defeat": { + "1": "Estou pegando fogo! Brinque comigo e você vai se queimar!", + "2": "Quando você brinca com fogo, você se queima!", + "3": "Quero dizer, fala sério, seu oponente era eu! Você não teve chance!" + } + }, + "cilan": { + "encounter": { + "1": "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\n$Hum... Nós iremos batalhar, aconteça o que acontecer.", + "2": "Então, hum, se você estiver bem comigo, eu vou, hum, dar tudo o que tenho para ser, hum, você sabe, seu oponente.", + "3": "OK... Então, eu sou Cilan, eu gosto de Pokémon do tipo Grama." + }, + "victory": { + "1": "Er… Já acabou?", + "2": "…Que surpresa. Você é muito forte, não é? \n$Eu acho que meus irmãos também não conseguiriam derrotar você…", + "3": "…Huh. Parece que meu timing estava, hum, errado?" + }, + "defeat": { + "1": "Hein? Eu ganhei?", + "2": "Eu acho... \n$Eu acho que ganhei, porque eu estava competindo com meus irmãos Chili e Cress, e todos nós conseguimos ficar mais fortes.", + "3": "Foi… foi uma experiência bastante emocionante…" + } + }, "roark": { "encounter": { "1": "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!", @@ -2508,4 +2688,4 @@ "1": "@c{smile_ehalf}Eu… acho que cumpri meu propósito…\n$@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa.\n$@c{smile_ehalf}…Obrigada." } } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/dialogue-male.json b/src/locales/pt_BR/dialogue-male.json index 0316dda2524..2978bb9a6a5 100644 --- a/src/locales/pt_BR/dialogue-male.json +++ b/src/locales/pt_BR/dialogue-male.json @@ -655,6 +655,86 @@ "5": "Você pode ter me vencido, mas quando eu perco, eu saio com estilo!" } }, + "aether_grunt": { + "encounter": { + "1": "Eu vou lutar com tudo o que tenho para te eliminar!", + "2": "Eu não me importo se você é uma criança ou o que. Eu vou te mandar voando se você nos ameaçar!", + "3": "Me mandaram afastar Treinadores, não importa quem sejam!", + "4": "Eu vou te mostrar o poder do Paraíso Aether!", + "5": "Agora que você descobriu a escuridão no coração do Paraíso Aether, precisamos que você desapareça convenientemente!" + }, + "victory": { + "1": "Aff! Você parece ter muita habilidade.", + "2": "O que isso significa? O que isso significa!", + "3": "Ei! Você é tão forte que não há como eu te afastar!", + "4": "Hmm... Parece que eu posso ter perdido.", + "5": "Aqui está uma resposta para você: Aiyee!" + } + }, + "faba": { + "encounter": { + "1": "Eu, o Chefe de Ramo Faba, vou te mostrar a dureza do mundo real!", + "2": "O homem chamado de última linha de defesa do Paraíso Aether vai batalhar com uma mera criança?", + "3": "Eu, Faba, sou o Chefe de Ramo do Paraíso Aether. O único no mundo, eu sou insubstituível." + }, + "victory": { + "1": "Aiyee!", + "2": "C-c-como assim?! Como uma criança...", + "3": "Isso é por que... Isso é por que eu não consigo gostar de crianças." + } + }, + "skull_grunt": { + "encounter": { + "1": "Nós não somos maus, somos apenas durões!", + "2": "Quer um pouco de nós? É assim que dizemos olá! Prazer em conhecê-los, otários!", + "3": "Somos só um bando de caras e minas com um grande interesse nos Pokémon dos outros!", + "4": "Por que você está tentando agir durão quando já somos durões como ossos aqui fora, mano?", + "5": "Equipe Skull na área! Não podemos pagar o aluguel! Nos divertimos muito, mas nossa juventude foi desperdiçada!" + }, + "victory": { + "1": "Ahn? Já acabou?", + "2": "Hora de dar o fora, mano! Vamos ter que dizer tchau, mano!", + "3": "Nem precisamos dos seus Pokémon fracotes mesmo!", + "4": "Que?! Esse muleque é muito forte! Não tem como negar!", + "5": "Então, o que? Eu sou pior que um Pokémon?! Eu já tenho problemas de autoestima, cara." + } + }, + "plumeria": { + "encounter": { + "1": " ...Hmph. Você não parece nada especial para mim.", + "2": "Esses Capangas gastam muito tempo tentando lidar com crianças como você...", + "3": "Mexe com qualquer um da Equipe Skull, e eu vou te mostrar o quão séria eu posso ficar." + }, + "victory": { + "1": "Aff! Você é bem forte. Tenho que admitir.", + "2": "Aff! Você é bem forte. Agora eu entendi por que meus Capangas gastam tanto tempo batalhando com crianças.", + "3": "Aff! Acho que eu só tenho que aceitar essa derrota." + } + }, + "macro_grunt": { + "encounter": { + "1": "Parece que aqui é o fim da linha para você!", + "2": "Você é um treinador, não é? Temo que isso não lhe dê o direito de interferir em nosso trabalho.", + "3": "Sou da Macro Cosmos Seguros! Já tem um seguro de vida?" + }, + "victory": { + "1": "Eu não tenho muita escolha a não ser recuar respeitosamente.", + "2": "Ter que desistir do meu dinheiro... Perder significa que estou de volta no vermelho...", + "3": "Ninguém pode vencer a Macro Cosmos quando se trata de nossa dedicação ao trabalho!" + } + }, + "oleana": { + "encounter": { + "1": "Eu não vou deixar ninguém interferir no plano do Sr. Rose!", + "2": "Então, você passou por todo o pessoal especial que eu ordenei para te parar. Eu não esperaria nada menos.", + "3": "Pelo presidente! Eu não vou perder!" + }, + "victory": { + "1": "*suspiro* Eu não consegui vencer... Oleana... você realmente é uma mulher sem esperança.", + "2": "Aff! Isso é inaceitável... O que eu estava pensando... Qualquer treinador que chega tão longe não seria um fracote...", + "3": "*suspiro* Eu sou uma Oleana cansada..." + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "Tenho que admitir, estou impressionado que tenha chegado até aqui!" @@ -787,6 +867,72 @@ "1": "Tolos sem visão continuarão a poluir este belo mundo." } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "Você vai assustar minha fera querida! Parece que eu vou precisar te silenciar primeiro." + }, + "victory": { + "1": "Como... como você pode ser tão terrível!" + }, + "defeat": { + "1": "Aff..." + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "Por que você continua a me incomodar?! Estou cansada de você. Cansada até a alma!\n$Chega de papo furado... Com o poder de Nihilego, vou mostrar o quão errado você estava em vir aqui!" + }, + "victory": { + "1": "Aaauuuggghhhhhhhhh!!!" + }, + "defeat": { + "1": "Tudo o que eu quero é minha fera preciosa! Eu não me importo com nenhum de vocês!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "O odiado chefe que te bate e te bate e nunca para...\n$É. O grande e mau Guzma está aqui!" + }, + "victory": { + "1": "Tss. Eu vou te bater um dia desses!" + }, + "defeat": { + "1": "E você veio até aqui só pra isso, né?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "Não importa contra quem eu esteja, eu vou derrotá-los!\n$Isso é o que o grande e mau Guzma é!" + }, + "victory": { + "1": "Guzma!!! O que há de errado com você?!" + }, + "defeat": { + "1": "Vocês são tudo uns idiotas!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "Devo fornecer energia ilimitada para garantir a prosperidade eterna para todos...\n$É meu propósito, meu dever, meu destino!" + }, + "victory": { + "1": "Você ainda não entendeu, treinador...\n$Nós... Não, eu vou mudar o rumo da história!" + }, + "defeat": { + "1": "Você ainda não entende nada!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "Estou comprometido em resolver o problema de energia na região de Galar e, claro, em todo o mundo.\n$Minha experiência e conquistas que fizeram da Macro Cosmos um sucesso são a prova de que meus métodos funcionam.\n$Não pretendo mudar de ideia, mesmo que eu perca." + }, + "victory": { + "1": "Eu esqueci o quão incríveis são as batalhas Pokémon! Faz tanto tempo desde que eu batalhei...\n$Isso foi realmente satisfatório, eu aceito a derrota para esta batalha." + }, + "defeat": { + "1": "Eu suponho que deve parecer que estou fazendo algo terrível. Eu não espero que você entenda.\n$Mas eu devo fornecer à região de Galar energia ilimitada para garantir prosperidade eterna." + } + }, "brock": { "encounter": { "1": "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}Eu… acho que cumpri meu propósito…\n$@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa.\n$@c{smile_ehalf}…Obrigada." } } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json index 722da8d2dbf..1787360b51e 100644 --- a/src/locales/pt_BR/modifier-type.json +++ b/src/locales/pt_BR/modifier-type.json @@ -505,8 +505,8 @@ "BLASTOISINITE": "Blastoisinita", "BLAZIKENITE": "Blazikenita", "CAMERUPTITE": "Cameruptita", - "CHARIZARDITE X": "Charizardita X", - "CHARIZARDITE Y": "Charizardita Y", + "CHARIZARDITE_X": "Charizardita X", + "CHARIZARDITE_Y": "Charizardita Y", "DIANCITE": "Diancita", "GALLADITE": "Galladita", "GARCHOMPITE": "Garchompita", @@ -525,12 +525,12 @@ "MAWILITE": "Mawilita", "MEDICHAMITE": "Medichamita", "METAGROSSITE": "Metagrossita", - "MEWTWONITE X": "Mewtwonita X", - "MEWTWONITE Y": "Mewtwonita Y", + "MEWTWONITE_X": "Mewtwonita X", + "MEWTWONITE_Y": "Mewtwonita Y", "PIDGEOTITE": "Pidgeotita", "PINSIRITE": "Pinsirita", - "SABLENITE": "Sablenita", "RAYQUAZITE": "Rayquazita", + "SABLENITE": "Sablenita", "SALAMENCITE": "Salamencita", "SCEPTILITE": "Sceptilita", "SCIZORITE": "Scizorita", @@ -606,4 +606,4 @@ "FAIRY_MEMORY": "Memória de Fada", "BLANK_MEMORY": "Memória Vazia" } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/move.json b/src/locales/pt_BR/move.json index f3ba21a637d..c463665f1ad 100644 --- a/src/locales/pt_BR/move.json +++ b/src/locales/pt_BR/move.json @@ -39,9 +39,9 @@ "name": "Scratch", "effect": "Garras duras, pontiagudas e afiadas rasgam o alvo para causar dano." }, - "viceGrip": { - "name": "Vice Grip", - "effect": "O alvo é agarrado pelos lados e espremido." + "viseGrip": { + "name": "Vise Grip", + "effect": "O alvo é agarrado e espremido de ambos os lados para causar dano." }, "guillotine": { "name": "Guillotine", diff --git a/src/locales/pt_BR/pokemon-form.json b/src/locales/pt_BR/pokemon-form.json index fd418e2ada2..aa8f32a5d36 100644 --- a/src/locales/pt_BR/pokemon-form.json +++ b/src/locales/pt_BR/pokemon-form.json @@ -152,10 +152,19 @@ "tatsugiriStretchy": "Reto", "gimmighoulChest": "Baú", "gimmighoulRoaming": "Perambulante", - "koraidonGlidingBuild": "Gliding Build", + "koraidonApexBuild": "Forma Plena", + "koraidonLimitedBuild": "Forma Limitada", + "koraidonSprintingBuild": "Forma de Corrida", + "koraidonSwimmingBuild": "Forma de Nado", + "koraidonGlidingBuild": "Forma de Voo", + "miraidonUltimateMode": "Modo Pleno", + "miraidonLowPowerMode": "Modo Limitado", + "miraidonDriveMode": "Modo Terrestre", + "miraidonAquaticMode": "Modo Aquático", + "miraidonGlideMode": "Modo Aéreo", "poltchageistCounterfeit": "Imitação", "poltchageistArtisan": "Artesão", "paldeaTaurosCombat": "Combate", "paldeaTaurosBlaze": "Chamas", "paldeaTaurosAqua": "Aquático" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/pokemon-info.json b/src/locales/pt_BR/pokemon-info.json index 3d374f62bba..a7a46b7a24e 100644 --- a/src/locales/pt_BR/pokemon-info.json +++ b/src/locales/pt_BR/pokemon-info.json @@ -13,7 +13,8 @@ "SPD": "Veloc.", "SPDshortened": "Veloc.", "ACC": "Precisão", - "EVA": "Evasão" + "EVA": "Evasão", + "HPStat": "PS" }, "Type": { "UNKNOWN": "Desconhecido", @@ -37,4 +38,4 @@ "FAIRY": "Fada", "STELLAR": "Estelar" } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/pokemon.json b/src/locales/pt_BR/pokemon.json index 9e26dfeeb6e..f780d2accbd 100644 --- a/src/locales/pt_BR/pokemon.json +++ b/src/locales/pt_BR/pokemon.json @@ -1 +1,1084 @@ -{} \ No newline at end of file +{ + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Tipo Nulo", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Presa Grande", + "scream_tail": "Cauda Brado", + "brute_bonnet": "Capuz Bruto", + "flutter_mane": "Juba Sopro", + "slither_wing": "Asa Rasteira", + "sandy_shocks": "Choque Areia", + "iron_treads": "Trilho Férreo", + "iron_bundle": "Pacote Férreo", + "iron_hands": "Mãos Férreas", + "iron_jugulis": "Jugulares Férreas", + "iron_moth": "Mariposa Férrea", + "iron_thorns": "Espinhos Férreos", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Lua Estrondo", + "iron_valiant": "Valentia Férrea", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Onda Ando", + "iron_leaves": "Folhas Férreas", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Fogo Corrosão", + "raging_bolt": "Raio Fúria", + "iron_boulder": "Rocha Férrea", + "iron_crown": "Chifres Férreos", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna" +} \ No newline at end of file diff --git a/src/locales/pt_BR/settings.json b/src/locales/pt_BR/settings.json index e2fd6d5c8d2..58ccb45f86d 100644 --- a/src/locales/pt_BR/settings.json +++ b/src/locales/pt_BR/settings.json @@ -59,11 +59,12 @@ "fusionPaletteSwaps": "Cores da Paleta de Fusão", "playerGender": "Gênero do Jogador", "typeHints": "Dicas de Tipo", - "masterVolume": "Volume Geral", + "masterVolume": "Volume Mestre", "bgmVolume": "Músicas", "fieldVolume": "Ambiente", "seVolume": "Ef. Sonoros", - "musicPreference": "Estilo da Música", + "uiVolume": "Interface", + "musicPreference": "Preferência de Música", "mixed": "Misto", "gamepadPleasePlug": "Conecte um controle ou pressione um botão", "delete": "Deletar", @@ -96,11 +97,11 @@ "controller": "Controle", "gamepadSupport": "Suporte para Controle", "showBgmBar": "Exibir Nomes das Músicas", - "moveTouchControls": "Move Touch Controls", + "moveTouchControls": "Mover Controles de Toque", "shopOverlayOpacity": "Opacidade da Loja", "shopCursorTarget": "Alvo do Cursor da Loja", "items": "Itens", "reroll": "Atualizar", "shop": "Loja", "checkTeam": "Checar Time" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/trainer-classes.json b/src/locales/pt_BR/trainer-classes.json index 72742dccf82..482265d00c6 100644 --- a/src/locales/pt_BR/trainer-classes.json +++ b/src/locales/pt_BR/trainer-classes.json @@ -4,10 +4,10 @@ "ace_duo": "Dupla Ás", "artist": "Artista", "artist_female": "Artista", - "backpackers": "Mochileiros", "backers": "Torcedores", "backpacker": "Mochileiro", "backpacker_female": "Mochileira", + "backpackers": "Mochileiros", "baker": "Padeira", "battle_girl": "Lutadora", "beauty": "Modelo", @@ -30,8 +30,8 @@ "doctor": "Doutor", "doctor_female": "Doutora", "firebreather": "Cospe-Fogo", - "fishermen": "Pescador", - "fishermen_female": "Pescadora", + "fisherman": "Pescador", + "fisherman_female": "Pescadora", "gentleman": "Cavalheiro", "guitarist": "Guitarrista", "guitarist_female": "Guitarrista", @@ -101,8 +101,8 @@ "workers": "Operários", "youngster": "Jovem", "rocket_grunt": "Capanga da Equipe Rocket", - "rocket_grunt_female": "Capanga da Equipe Rocket", "rocket_grunts": "Capangas da Equipe Rocket", + "rocket_grunt_female": "Capanga da Equipe Rocket", "magma_grunt": "Capanga da Equipe Magma", "magma_grunt_female": "Capanga da Equipe Magma", "magma_grunts": "Capangas da Equipe Magma", @@ -117,5 +117,15 @@ "plasma_grunts": "Capangas da Equipe Plasma", "flare_grunt": "Capanga da Equipe Flare", "flare_grunt_female": "Capanga da Equipe Flare", - "flare_grunts": "Capangas da Equipe Flare" -} \ No newline at end of file + "flare_grunts": "Capangas da Equipe Flare", + "aether_grunt": "Funcionário da Fundação Aether", + "aether_grunt_female": "Funcionária da Fundação Aether", + "aether_grunts": "Funcionários da Fundação Aether", + "skull_grunt": "Capanga da Equipe Skull", + "skull_grunt_female": "Capanga da Equipe Skull", + "skull_grunts": "Capangas da Equipe Skull", + "macro_grunt": "Treinador da Macro Cosmos", + "macro_grunt_female": "Treinadora da Macro Cosmos", + "macro_grunts": "Treinadores da Macro Cosmos" + +} diff --git a/src/locales/pt_BR/trainer-names.json b/src/locales/pt_BR/trainer-names.json index fc4e48de040..5500e2ddb46 100644 --- a/src/locales/pt_BR/trainer-names.json +++ b/src/locales/pt_BR/trainer-names.json @@ -138,11 +138,17 @@ "rood": "Rood", "xerosic": "Xerosic", "bryony": "Bryony", + "faba": "Faba", + "plumeria": "Plumeria", + "oleana": "Oleana", "maxie": "Maxie", "archie": "Archie", "cyrus": "Cyrus", "ghetsis": "Ghetsis", "lysandre": "Lysandre", + "lusamine": "Lusamine", + "guzma": "Guzma", + "rose": "Rose", "blue_red_double": "Blue & Red", "red_blue_double": "Red & Blue", "tate_liza_double": "Tate & Liza", @@ -153,4 +159,4 @@ "iris_alder_double": "Iris & Alder", "marnie_piers_double": "Marnie & Piers", "piers_marnie_double": "Piers & Marnie" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/trainer-titles.json b/src/locales/pt_BR/trainer-titles.json index b38de9439c9..701c2e143fa 100644 --- a/src/locales/pt_BR/trainer-titles.json +++ b/src/locales/pt_BR/trainer-titles.json @@ -16,6 +16,10 @@ "galactic_boss": "Chefe da Equipe Galáctica", "plasma_boss": "Chefe da Equipe Plasma", "flare_boss": "Chefe da Equipe Flare", + "aether_boss": "Presidente Aether", + "skull_boss": "Chefe da Equipe Skull", + "macro_boss": "Presidente da Macro Cosmos", + "rocket_admin": "Admin da Equipe Rocket", "rocket_admin_female": "Admin da Equipe Rocket", "magma_admin": "Admin da Equipe Magma", @@ -27,5 +31,8 @@ "plasma_sage": "Sábio da Equipe Plasma", "plasma_admin": "Admin da Equipe Plasma", "flare_admin": "Admin da Equipe Flare", - "flare_admin_female": "Admin da Equipe Flare" -} \ No newline at end of file + "flare_admin_female": "Admin da Equipe Flare", + "aether_admin": "Admin da Fundação Aether", + "skull_admin": "Admin da Equipe Skull", + "macro_admin": "Macro Cosmos" +} diff --git a/src/locales/pt_BR/tutorial.json b/src/locales/pt_BR/tutorial.json index 7184f8538f1..e347ca6fbee 100644 --- a/src/locales/pt_BR/tutorial.json +++ b/src/locales/pt_BR/tutorial.json @@ -5,6 +5,6 @@ "starterSelect": "Aqui você pode escolher seus iniciais apertando a tecla Z ou\na Barra de Espaço.\n$Esses serão os primeiro Pokémon da sua equipe.\n$Cada inicial tem seu custo. Sua equipe pode ter até 6\nmembros, desde que a soma dos custos não ultrapasse 10. \n$Você pode escolher o gênero, a habilidade\ne até a forma do seu inicial.\n$Essas opções dependem das variantes dessa\nespécie que você já capturou ou chocou. \n$Os IVs de cada inicial são os melhores de todos os Pokémon\ndaquela espécie que você já capturou ou chocou.\n$Sempre capture vários Pokémon de várias espécies!", "pokerus": "Todo dia, 3 Pokémon iniciais ficam com uma borda roxa.\n$Caso veja um inicial que você possui com uma dessa, tente\nadicioná-lo a sua equipe. Lembre-se de olhar seu sumário!", "statChange": "As mudanças de atributos se mantém após a batalha desde que o Pokémon não seja trocado.\n$Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma.\n$Para ver as mudanças de atributos dos Pokémon em campo, mantena C ou Shift pressionado durante a batalha.", - "selectItem": "Após cada batalha, você pode escolher entre 3 itens aleatórios.\n$Você pode escolher apenas um deles.\n$Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes.\n$A maioria dos efeitos de itens não consumíveis podem ser acumulados.\n$Alguns itens só aparecerão se puderem ser usados, como os itens de evolução.\n$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção \"Transfer\".\n$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.\n$Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe.\n$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.", + "selectItem": "Após cada batalha, você pode escolher entre 3 itens aleatórios.\n$Você pode escolher apenas um deles.\n$Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes.\n$A maioria dos efeitos de itens não consumíveis podem ser acumulados.\n$Alguns itens só aparecerão se puderem ser usados, como os itens de evolução.\n$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção \"Alterar\".\n$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.\n$Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe.\n$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.", "eggGacha": "Aqui você pode trocar seus vouchers\npor ovos de Pokémon.\n$Ovos ficam mais próximos de chocar após cada batalha.\nOvos mais raros demoram mais para chocar.\n$Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais.\n$Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens.\n$Alguns Pokémon só podem ser obtidos através de seus ovos.\n$Temos 3 máquinas, cada uma com seu bônus específico,\nentão escolha a que mais lhe convém!" -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/battle.json b/src/locales/zh_CN/battle.json index f16b6fac77c..84f468a4a4b 100644 --- a/src/locales/zh_CN/battle.json +++ b/src/locales/zh_CN/battle.json @@ -38,7 +38,7 @@ "learnMoveNotLearned": "{{pokemonName}}没有学会{{moveName}}。", "learnMoveForgetQuestion": "要忘记哪个技能?", "learnMoveForgetSuccess": "{{pokemonName}}忘记了\n如何使用{{moveName}}。", - "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!", + "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}空!", "learnMoveAnd": "然后……", "levelCapUp": "等级上限提升到{{levelCap}}!", "moveNotImplemented": "{{moveName}}尚未实装,无法选择。", diff --git a/src/locales/zh_CN/bgm-name.json b/src/locales/zh_CN/bgm-name.json index 34ce16db00f..d0508a49661 100644 --- a/src/locales/zh_CN/bgm-name.json +++ b/src/locales/zh_CN/bgm-name.json @@ -78,11 +78,21 @@ "battle_galactic_grunt": "晶灿钻石·明亮珍珠「战斗!银河队」", "battle_plasma_grunt": "黑白「战斗!等离子团」", "battle_flare_grunt": "XY「战斗!闪焰队」", + "battle_aether_grunt": "日月「战斗!以太基金会」", + "battle_skull_grunt": "日月「战斗!骷髅队」", + "battle_macro_grunt": "剑盾「战斗!马洛科蒙集团」", + "battle_galactic_admin": "晶灿钻石·明亮珍珠「战斗!银河队干部」", + "battle_skull_admin": "日月「战斗!骷髅队干部」", + "battle_oleana": "剑盾「战斗!奥利薇」", "battle_rocket_boss": "究极日月「战斗!坂木」", "battle_aqua_magma_boss": "Ω红宝石α蓝宝石「战斗!水梧桐・赤焰松」", "battle_galactic_boss": "晶灿钻石·明亮珍珠「战斗!赤日」", "battle_plasma_boss": "黑2白2「战斗!魁奇思」", "battle_flare_boss": "XY「战斗!弗拉达利」", + "battle_aether_boss": "日月「战斗!露莎米奈」", + "battle_skull_boss": "日月「战斗!古兹马」", + "battle_macro_boss": "剑盾「战斗!洛兹」", + "abyss": "空之探险队「黑暗小丘」", "badlands": "空之探险队「枯竭之谷」", "beach": "空之探险队「潮湿岩地」", @@ -135,4 +145,4 @@ "heal": "黑白「宝可梦回复」", "menu": "空之探险队「欢迎来到宝可梦的世界」", "title": "空之探险队「主题曲」" -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/dialogue-female.json b/src/locales/zh_CN/dialogue-female.json index 09090f36d94..5a4615fac54 100644 --- a/src/locales/zh_CN/dialogue-female.json +++ b/src/locales/zh_CN/dialogue-female.json @@ -655,6 +655,86 @@ "5": "你虽然打败了我,但是我输的也这么潇洒!" } }, + "aether_grunt": { + "encounter": { + "1": "我会用尽全力消灭你!", + "2": "我才不管你是不是小孩!\n只要和我们作对,我就把你打飞!", + "3": "上头要我拦下所有训练师,无论是谁!", + "4": "给你展现一下以太乐园的力量!", + "5": "既然你已经触达到了以太基金会的黑暗,\n那我要请你就此消失了。" + }, + "victory": { + "1": "哼!看来你有点实力。", + "2": "这什么情况!什么情况!", + "3": "啊!你怎么这么强!我这下可没法阻止你!", + "4": "嗯……看来我输了……", + "5": "我惊掉大牙了……" + } + }, + "faba": { + "encounter": { + "1": "我,分部长扎奥博, \n给你见识下现实世界的残酷吧!", + "2": "堂堂以太乐园的最后防线,\n我扎奥博竟然要跟个毛头小子对战。", + "3": "我,扎奥博,以太基金会分部长。\n世上唯一,无可替代!" + }, + "victory": { + "1": "哎咿呀!", + "2": "怎……怎么可能!这孩子!", + "3": "这就是……这就是为啥我讨厌小孩子!" + } + }, + "skull_grunt": { + "encounter": { + "1": "我们并不坏,YO,我们是硬汉!", + "2": "YO!咋样!我们就这样打招呼!\n混个脸熟呗,崽子!", + "3": "咱们就是一帮对别人的宝可梦\n比较感兴趣的哥们和姐们!", + "4": "别装B了,你有我们拽吗,老弟?", + "5": "骷髅队在此!没钱住房子!\n天天找乐子!青春混到死!" + }, + "victory": { + "1": "哈?这就完了?", + "2": "该逃跑了YO!闪一边去YO!", + "3": "你这种弱鸡宝可梦反正我们也不要!", + "4": "啥!? 这小屁孩也太牛B了!", + "5": "MAN!我能说什么,\n我的人生比宝可梦还烂。" + } + }, + "plumeria": { + "encounter": { + "1": " …哼嗯,你看起来也没啥特别的。", + "2": "这帮呆子对付你也花了太长时间了吧……", + "3": "要是惹了骷髅队的人!我就不和你开玩笑了!" + }, + "victory": { + "1": "哼嗯!你很强,我承认。", + "2": "哼,你是挺强的。现在我知道\n为啥那帮手下要花那么久对付一个小孩了。", + "3": "哼嗯!看来我得承认我输了。" + } + }, + "macro_grunt": { + "encounter": { + "1": "你的对战生涯到此为止了。", + "2": "你是一名训练师吧\n你没有干涉我们工作的权力!", + "3": "我是马洛科蒙集团的,要买马洛科蒙人寿保险吗。" + }, + "victory": { + "1": "除了礼貌地撤退我似乎别无选择…", + "2": "没法留住我的零花钱了,我又要财政赤字了…", + "3": "没人能比马洛科蒙集团的我们工作更卷!" + } + }, + "oleana": { + "encounter": { + "1": "我不会让你方案洛兹先生的计划!", + "2": "看来你打倒了所有我安排的训练师,本身也没对他们有啥期待…", + "3": "为了总裁!我不会输的!" + }, + "victory": { + "1": "*叹气*我赢不了。\n奥利薇,你真是个没用的女人", + "2": "呃啊!不可饶恕...我在想什么。\n走到这里的训练师果然不会轻易屈服!", + "3": "*叹气*奥利薇累累了……" + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "我不得不说,能来到这里,你的确很不简单!" @@ -787,6 +867,72 @@ "1": "没有远见的蠢货会继续玷污这个美丽的世界。" } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "你吓到我可爱的异兽了!我要让你先闭嘴!" + }, + "victory": { + "1": "你…你怎么这么不听话!" + }, + "defeat": { + "1": "哼嗯…" + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "为什么你要一直妨碍我!\n我受够你了,完完全全受够了! \n$不用说废话了…有了虚吾伊德的力量。\n我会让你明白,你来这里是有多么错误!" + }, + "victory": { + "1": "呃呃啊啊啊啊呜呜呜啊啊!" + }, + "defeat": { + "1": "我只要和我可爱的异兽在一起就好了!你们怎么样都无所谓了!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "摧毁,摧毁,\n不管摧毁几次也从不手软\n$惹人厌的古兹马大爷在此。" + }, + "victory": { + "1": "切,我一定要找时间干掉你!" + }, + "defeat": { + "1": "大老远跑来就这,昂?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "不管谁与我作对,我都会干掉他们!\n$这就是大坏蛋古兹马的全部!" + }, + "victory": { + "1": "古兹马!!你在干什么啊!!!" + }, + "defeat": { + "1": "你们真够蠢的!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "我必须为所有人提供无限的能源,实现繁荣。$这是我的目的,我的责任,我的使命!" + }, + "victory": { + "1": "你还是没有明白,训练师\n$我们…不,我要推动历史的进程啊!" + }, + "defeat": { + "1": "你完全不理解!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "我致力于解决伽勒尔的能源问题\n——当然也是全世界的能源问题。\n$我的经验与成果,造就了马洛科蒙集团,证明了我的正确与成功!\n$就算输了,我也不会改变主意的……" + }, + "victory": { + "1": "我都忘记宝可梦对战的魅力了!我太久没有着手对战了…\n$这的确让人很满足,我接受我的失败!" + }, + "defeat": { + "1": "我承认我做的事情非常渗人,我也不指望你能理解。\n$但我必须为伽勒尔地区提供无限的能源,确保永久的繁荣。" + } + }, "brock": { "encounter": { "1": "我对岩石属性宝可梦的专精会击败你!来吧!", @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答应我……在你拯救世界之后\n……要……平安到家。$@c{smile_ehalf}……谢谢你。" } } -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/dialogue-male.json b/src/locales/zh_CN/dialogue-male.json index 09090f36d94..5a4615fac54 100644 --- a/src/locales/zh_CN/dialogue-male.json +++ b/src/locales/zh_CN/dialogue-male.json @@ -655,6 +655,86 @@ "5": "你虽然打败了我,但是我输的也这么潇洒!" } }, + "aether_grunt": { + "encounter": { + "1": "我会用尽全力消灭你!", + "2": "我才不管你是不是小孩!\n只要和我们作对,我就把你打飞!", + "3": "上头要我拦下所有训练师,无论是谁!", + "4": "给你展现一下以太乐园的力量!", + "5": "既然你已经触达到了以太基金会的黑暗,\n那我要请你就此消失了。" + }, + "victory": { + "1": "哼!看来你有点实力。", + "2": "这什么情况!什么情况!", + "3": "啊!你怎么这么强!我这下可没法阻止你!", + "4": "嗯……看来我输了……", + "5": "我惊掉大牙了……" + } + }, + "faba": { + "encounter": { + "1": "我,分部长扎奥博, \n给你见识下现实世界的残酷吧!", + "2": "堂堂以太乐园的最后防线,\n我扎奥博竟然要跟个毛头小子对战。", + "3": "我,扎奥博,以太基金会分部长。\n世上唯一,无可替代!" + }, + "victory": { + "1": "哎咿呀!", + "2": "怎……怎么可能!这孩子!", + "3": "这就是……这就是为啥我讨厌小孩子!" + } + }, + "skull_grunt": { + "encounter": { + "1": "我们并不坏,YO,我们是硬汉!", + "2": "YO!咋样!我们就这样打招呼!\n混个脸熟呗,崽子!", + "3": "咱们就是一帮对别人的宝可梦\n比较感兴趣的哥们和姐们!", + "4": "别装B了,你有我们拽吗,老弟?", + "5": "骷髅队在此!没钱住房子!\n天天找乐子!青春混到死!" + }, + "victory": { + "1": "哈?这就完了?", + "2": "该逃跑了YO!闪一边去YO!", + "3": "你这种弱鸡宝可梦反正我们也不要!", + "4": "啥!? 这小屁孩也太牛B了!", + "5": "MAN!我能说什么,\n我的人生比宝可梦还烂。" + } + }, + "plumeria": { + "encounter": { + "1": " …哼嗯,你看起来也没啥特别的。", + "2": "这帮呆子对付你也花了太长时间了吧……", + "3": "要是惹了骷髅队的人!我就不和你开玩笑了!" + }, + "victory": { + "1": "哼嗯!你很强,我承认。", + "2": "哼,你是挺强的。现在我知道\n为啥那帮手下要花那么久对付一个小孩了。", + "3": "哼嗯!看来我得承认我输了。" + } + }, + "macro_grunt": { + "encounter": { + "1": "你的对战生涯到此为止了。", + "2": "你是一名训练师吧\n你没有干涉我们工作的权力!", + "3": "我是马洛科蒙集团的,要买马洛科蒙人寿保险吗。" + }, + "victory": { + "1": "除了礼貌地撤退我似乎别无选择…", + "2": "没法留住我的零花钱了,我又要财政赤字了…", + "3": "没人能比马洛科蒙集团的我们工作更卷!" + } + }, + "oleana": { + "encounter": { + "1": "我不会让你方案洛兹先生的计划!", + "2": "看来你打倒了所有我安排的训练师,本身也没对他们有啥期待…", + "3": "为了总裁!我不会输的!" + }, + "victory": { + "1": "*叹气*我赢不了。\n奥利薇,你真是个没用的女人", + "2": "呃啊!不可饶恕...我在想什么。\n走到这里的训练师果然不会轻易屈服!", + "3": "*叹气*奥利薇累累了……" + } + }, "rocket_boss_giovanni_1": { "encounter": { "1": "我不得不说,能来到这里,你的确很不简单!" @@ -787,6 +867,72 @@ "1": "没有远见的蠢货会继续玷污这个美丽的世界。" } }, + "aether_boss_lusamine_1": { + "encounter": { + "1": "你吓到我可爱的异兽了!我要让你先闭嘴!" + }, + "victory": { + "1": "你…你怎么这么不听话!" + }, + "defeat": { + "1": "哼嗯…" + } + }, + "aether_boss_lusamine_2": { + "encounter": { + "1": "为什么你要一直妨碍我!\n我受够你了,完完全全受够了! \n$不用说废话了…有了虚吾伊德的力量。\n我会让你明白,你来这里是有多么错误!" + }, + "victory": { + "1": "呃呃啊啊啊啊呜呜呜啊啊!" + }, + "defeat": { + "1": "我只要和我可爱的异兽在一起就好了!你们怎么样都无所谓了!" + } + }, + "skull_boss_guzma_1": { + "encounter": { + "1": "摧毁,摧毁,\n不管摧毁几次也从不手软\n$惹人厌的古兹马大爷在此。" + }, + "victory": { + "1": "切,我一定要找时间干掉你!" + }, + "defeat": { + "1": "大老远跑来就这,昂?" + } + }, + "skull_boss_guzma_2": { + "encounter": { + "1": "不管谁与我作对,我都会干掉他们!\n$这就是大坏蛋古兹马的全部!" + }, + "victory": { + "1": "古兹马!!你在干什么啊!!!" + }, + "defeat": { + "1": "你们真够蠢的!" + } + }, + "macro_boss_rose_1": { + "encounter": { + "1": "我必须为所有人提供无限的能源,实现繁荣。$这是我的目的,我的责任,我的使命!" + }, + "victory": { + "1": "你还是没有明白,训练师\n$我们…不,我要推动历史的进程啊!" + }, + "defeat": { + "1": "你完全不理解!" + } + }, + "macro_boss_rose_2": { + "encounter": { + "1": "我致力于解决伽勒尔的能源问题\n——当然也是全世界的能源问题。\n$我的经验与成果,造就了马洛科蒙集团,证明了我的正确与成功!\n$就算输了,我也不会改变主意的……" + }, + "victory": { + "1": "我都忘记宝可梦对战的魅力了!我太久没有着手对战了…\n$这的确让人很满足,我接受我的失败!" + }, + "defeat": { + "1": "我承认我做的事情非常渗人,我也不指望你能理解。\n$但我必须为伽勒尔地区提供无限的能源,确保永久的繁荣。" + } + }, "brock": { "encounter": { "1": "我对岩石属性宝可梦的专精会击败你!来吧!", @@ -2542,4 +2688,4 @@ "1": "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答应我……在你拯救世界之后\n……要……平安到家。$@c{smile_ehalf}……谢谢你。" } } -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/trainer-classes.json b/src/locales/zh_CN/trainer-classes.json index fe5b9f43592..3a50acf5c01 100644 --- a/src/locales/zh_CN/trainer-classes.json +++ b/src/locales/zh_CN/trainer-classes.json @@ -117,5 +117,14 @@ "plasma_grunts": "等离子队手下们", "flare_grunt": "闪焰队手下", "flare_grunt_female": "闪焰队手下", - "flare_grunts": "闪焰队手下们" -} \ No newline at end of file + "flare_grunts": "闪焰队手下们", + "aether_grunt": "以太基金会职员", + "aether_grunt_female": "以太基金会职员", + "aether_grunts": "以太基金会职员", + "skull_grunt": "骷髅队手下", + "skull_grunt_female": "骷髅队手下", + "skull_grunts": "骷髅队手下", + "macro_grunt": "马洛科蒙训练师", + "macro_grunt_female": "马洛科蒙训练师", + "macro_grunts": "马洛科蒙训练师" +} diff --git a/src/locales/zh_CN/trainer-names.json b/src/locales/zh_CN/trainer-names.json index 74d97c22846..9e03a514ff7 100644 --- a/src/locales/zh_CN/trainer-names.json +++ b/src/locales/zh_CN/trainer-names.json @@ -30,6 +30,10 @@ "crasher_wake": "吉宪", "fantina": "梅丽莎", "byron": "东瓜", + "faba": "扎奥博", + "plumeria": "布尔美丽", + "oleana": "奥莉薇", + "candice": "小菘", "volkner": "电次", "cilan": "天桐", @@ -143,6 +147,10 @@ "cyrus": "赤日", "ghetsis": "魁奇思", "lysandre": "弗拉达利", + "lusamine": "露莎米奈", + "guzma": "古兹马", + "rose": "洛兹", + "blue_red_double": "青绿 & 赤红", "red_blue_double": "赤红 & 青绿", "tate_liza_double": "小枫 & 小南", @@ -153,4 +161,4 @@ "iris_alder_double": "艾莉丝 & 阿戴克", "marnie_piers_double": "玛俐 & 聂梓", "piers_marnie_double": "聂梓 & 玛俐" -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/trainer-titles.json b/src/locales/zh_CN/trainer-titles.json index 2961d65683c..07654ec8fc3 100644 --- a/src/locales/zh_CN/trainer-titles.json +++ b/src/locales/zh_CN/trainer-titles.json @@ -16,6 +16,10 @@ "galactic_boss": "银河队老大", "plasma_boss": "等离子队老大", "flare_boss": "闪焰队老大", + "aether_boss": "以太基金会理事长", + "skull_boss": "骷髅队老大", + "macro_boss": "马洛科蒙总裁", + "rocket_admin": "火箭队干部", "rocket_admin_female": "火箭队干部", "magma_admin": "熔岩队干部", @@ -27,5 +31,8 @@ "plasma_sage": "等离子队贤人", "plasma_admin": "等离子队干部", "flare_admin": "闪焰队干部", - "flare_admin_female": "闪焰队干部" -} \ No newline at end of file + "flare_admin_female": "闪焰队干部", + "aether_admin": "以太基金会干部", + "skull_admin": "骷髅队干部", + "macro_admin": "马洛科蒙干部" +} diff --git a/src/locales/zh_TW/battle.json b/src/locales/zh_TW/battle.json index ada85d4d9b0..97b85a9cd5a 100644 --- a/src/locales/zh_TW/battle.json +++ b/src/locales/zh_TW/battle.json @@ -34,7 +34,7 @@ "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", "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{se/pb_bounce_1}噗!", "learnMoveAnd": "然後…", "levelCapUp": "等級上限提升到 {{levelCap}}!", "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 8322c1ea63d..974a04503d9 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -57,7 +57,7 @@ export class ModifierType { this.localeKey = localeKey!; // TODO: is this bang correct? this.iconImage = iconImage!; // TODO: is this bang correct? this.group = group!; // TODO: is this bang correct? - this.soundName = soundName ?? "restore"; + this.soundName = soundName ?? "se/restore"; this.newModifierFunc = newModifierFunc; } @@ -176,7 +176,7 @@ export class AddPokeballModifierType extends ModifierType { private count: integer; constructor(iconImage: string, pokeballType: PokeballType, count: integer) { - super("", iconImage, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), "pb", "pb_bounce_1"); + super("", iconImage, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), "pb", "se/pb_bounce_1"); this.pokeballType = pokeballType; this.count = count; } @@ -727,7 +727,7 @@ export class MoneyRewardModifierType extends ModifierType { private moneyMultiplierDescriptorKey: string; constructor(localeKey: string, iconImage: string, moneyMultiplier: number, moneyMultiplierDescriptorKey: string) { - super(localeKey, iconImage, (_type, _args) => new Modifiers.MoneyRewardModifier(this, moneyMultiplier), "money", "buy"); + super(localeKey, iconImage, (_type, _args) => new Modifiers.MoneyRewardModifier(this, moneyMultiplier), "money", "se/buy"); this.moneyMultiplier = moneyMultiplier; this.moneyMultiplierDescriptorKey = moneyMultiplierDescriptorKey; @@ -841,10 +841,10 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge super("", EvolutionItem[evolutionItem].toLowerCase(), (_type, args) => new Modifiers.EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === pokemon.getFormKey())).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { return null; } else if (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === pokemon.getFusionFormKey())).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { return null; } @@ -879,7 +879,7 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G // Make sure the Pokemon has alternate forms if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) + && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) && (fc.preFormKey === pokemon.getFormKey())) // Returns true if any form changes match this item .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) .flat().flatMap(fc => fc.item).includes(this.formChangeItem) @@ -1103,7 +1103,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { const formChanges = pokemonFormChanges[p.species.speciesId]; let formChangeItemTriggers = formChanges.filter(fc => ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || party[0].scene.getModifiers(Modifiers.MegaEvolutionAccessModifier).length) && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || party[0].scene.getModifiers(Modifiers.GigantamaxAccessModifier).length) - && (!fc.conditions.length || fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)).length)) + && (!fc.conditions.length || fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)).length) + && (fc.preFormKey === p.getFormKey())) .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) .filter(t => t && t.active && !p.scene.findModifier(m => m instanceof Modifiers.PokemonFormChangeItemModifier && m.pokemonId === p.id && m.formChangeItem === t.item)); @@ -1511,7 +1512,7 @@ export const modifierTypes = { VOUCHER_PLUS: () => new AddVoucherModifierType(VoucherType.PLUS, 1), VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), - GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new Modifiers.ExtraModifierModifier(type), undefined, "pb_bounce_1"), + GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new Modifiers.ExtraModifierModifier(type), undefined, "se/pb_bounce_1"), ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new Modifiers.EnemyDamageBoosterModifier(type, 5)), ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new Modifiers.EnemyDamageReducerModifier(type, 2.5)), diff --git a/src/overrides.ts b/src/overrides.ts index cbde74314c6..b4b166de336 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -47,14 +47,14 @@ class DefaultOverrides { readonly SEED_OVERRIDE: string = ""; readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; readonly BATTLE_TYPE_OVERRIDE: "double" | "single" | null = null; - readonly STARTING_WAVE_OVERRIDE: integer = 0; + readonly STARTING_WAVE_OVERRIDE: number = 0; readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null; /** Multiplies XP gained by this value including 0. Set to null to ignore the override */ readonly XP_MULTIPLIER_OVERRIDE: number | null = null; readonly NEVER_CRIT_OVERRIDE: boolean = false; /** default 1000 */ - readonly STARTING_MONEY_OVERRIDE: integer = 0; + readonly STARTING_MONEY_OVERRIDE: number = 0; /** Sets all shop item prices to 0 */ readonly WAIVE_SHOP_FEES_OVERRIDE: boolean = false; /** Sets reroll price to 0 */ @@ -87,14 +87,14 @@ class DefaultOverrides { readonly STARTER_FORM_OVERRIDES: Partial> = {}; /** default 5 or 20 for Daily */ - readonly STARTING_LEVEL_OVERRIDE: integer = 0; + readonly STARTING_LEVEL_OVERRIDE: number = 0; /** * SPECIES OVERRIDE * will only apply to the first starter in your party or each enemy pokemon * default is 0 to not override * @example SPECIES_OVERRIDE = Species.Bulbasaur; */ - readonly STARTER_SPECIES_OVERRIDE: Species | integer = 0; + readonly STARTER_SPECIES_OVERRIDE: Species | number = 0; readonly ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; @@ -106,7 +106,7 @@ class DefaultOverrides { // -------------------------- // OPPONENT / ENEMY OVERRIDES // -------------------------- - readonly OPP_SPECIES_OVERRIDE: Species | integer = 0; + readonly OPP_SPECIES_OVERRIDE: Species | number = 0; readonly OPP_LEVEL_OVERRIDE: number = 0; readonly OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; @@ -115,7 +115,8 @@ class DefaultOverrides { readonly OPP_MOVESET_OVERRIDE: Array = []; readonly OPP_SHINY_OVERRIDE: boolean = false; readonly OPP_VARIANT_OVERRIDE: Variant = 0; - readonly OPP_IVS_OVERRIDE: integer | integer[] = []; + readonly OPP_IVS_OVERRIDE: number | number[] = []; + readonly OPP_FORM_OVERRIDES: Partial> = {}; // ------------- // EGG OVERRIDES diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index a42e8472952..78dd73057a1 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -1,19 +1,19 @@ -import { clientSessionId } from "#app/account.js"; -import BattleScene from "#app/battle-scene.js"; -import { BattleType } from "#app/battle.js"; -import { miscDialogue, getCharVariantFromDialogue } from "#app/data/dialogue.js"; -import { pokemonEvolutions } from "#app/data/pokemon-evolutions.js"; -import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species.js"; -import { trainerConfigs } from "#app/data/trainer-config.js"; -import { PlayerGender } from "#app/enums/player-gender.js"; -import { TrainerType } from "#app/enums/trainer-type.js"; -import Pokemon from "#app/field/pokemon.js"; -import { modifierTypes } from "#app/modifier/modifier-type.js"; -import { achvs, ChallengeAchv } from "#app/system/achv.js"; -import { Unlockables } from "#app/system/unlockables.js"; -import { Mode } from "#app/ui/ui.js"; +import { clientSessionId } from "#app/account"; +import BattleScene from "#app/battle-scene"; +import { BattleType } from "#app/battle"; +import { miscDialogue, getCharVariantFromDialogue } from "#app/data/dialogue"; +import { pokemonEvolutions } from "#app/data/pokemon-evolutions"; +import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import { trainerConfigs } from "#app/data/trainer-config"; +import { PlayerGender } from "#app/enums/player-gender"; +import { TrainerType } from "#app/enums/trainer-type"; +import Pokemon from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { achvs, ChallengeAchv } from "#app/system/achv"; +import { Unlockables } from "#app/system/unlockables"; +import { Mode } from "#app/ui/ui"; import i18next from "i18next"; -import * as Utils from "#app/utils.js"; +import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; import { CheckSwitchPhase } from "./check-switch-phase"; import { EncounterPhase } from "./encounter-phase"; @@ -23,6 +23,12 @@ import { SummonPhase } from "./summon-phase"; import { EndCardPhase } from "./end-card-phase"; import { PostGameOverPhase } from "./post-game-over-phase"; import { UnlockPhase } from "./unlock-phase"; +import { SessionSaveData } from "../system/game-data"; +import TrainerData from "../system/trainer-data"; +import PokemonData from "../system/pokemon-data"; +import PersistentModifierData from "../system/modifier-data"; +import ChallengeData from "../system/challenge-data"; +import ArenaData from "../system/arena-data"; export class GameOverPhase extends BattlePhase { private victory: boolean; @@ -98,13 +104,7 @@ export class GameOverPhase extends BattlePhase { this.scene.gameData.gameStats.dailyRunSessionsWon++; } } - this.scene.gameData.getSession(this.scene.sessionSlotId).then(sessionData => { - if (sessionData) { - this.scene.gameData.saveRunHistory(this.scene, sessionData, this.victory); - } - }).catch(err => { - console.error("Failed to save run to history.", err); - }); + this.scene.gameData.saveRunHistory(this.scene, this.getFinalSessionData(), this.victory); const fadeDuration = this.victory ? 10000 : 5000; this.scene.fadeOutBgm(fadeDuration, true); const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); @@ -207,4 +207,32 @@ export class GameOverPhase extends BattlePhase { this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter))); } } + + /** + * This function mirrors game-data.ts' getSessionSaveData() to update the session data to reflect any changes that occurred within the last wave + * This means that level ups, item usage, evolutions, etc. will all be accurately reflected. + * @returns {@linkCode SessionSaveData} an updated version of the wave's SessionSaveData that accurately reflects the events of the wave + */ + private getFinalSessionData(): SessionSaveData { + return { + seed: this.scene.seed, + playTime: this.scene.sessionPlayTime, + gameMode: this.scene.gameMode.modeId, + party: this.scene.getParty().map(p => new PokemonData(p)), + enemyParty: this.scene.getEnemyParty().map(p => new PokemonData(p)), + modifiers: this.scene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: this.scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), + arena: new ArenaData(this.scene.arena), + pokeballCounts: this.scene.pokeballCounts, + money: this.scene.money, + score: this.scene.score, + waveIndex: this.scene.currentBattle.waveIndex, + battleType: this.scene.currentBattle.battleType, + trainer: this.scene.currentBattle.battleType === BattleType.TRAINER ? new TrainerData(this.scene.currentBattle.trainer) : null, + gameVersion: this.scene.game.config.gameVersion, + timestamp: new Date().getTime(), + challenges: this.scene.gameMode.challenges.map(c => new ChallengeData(c)) + } as SessionSaveData; + } } + diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 87167893e3e..4d083a367a6 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -22,7 +22,7 @@ export class ModifierRewardPhase extends BattlePhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("bgm/item_fanfare"); + this.scene.playSound("item_fanfare"); this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); }); }); diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 6ba1f468440..e22f93d3206 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -22,6 +22,8 @@ import { ReturnPhase } from "#app/phases/return-phase"; import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { NewBattlePhase } from "#app/phases/new-battle-phase"; +import { GameOverPhase } from "#app/phases/game-over-phase"; +import { SwitchPhase } from "#app/phases/switch-phase"; /** * Will handle (in order): @@ -161,21 +163,22 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { this.onOptionSelect(this.scene).finally(() => { this.end(); }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset()); + }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset() * 500); }); } else { this.scene.executeWithSeedOffset(() => { this.onOptionSelect(this.scene).finally(() => { this.end(); }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset()); + }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset() * 500); } } } /** * Runs at the beginning of an Encounter's battle - * Will cleanup any residual flinches, Endure, etc. that are left over from startOfBattleEffects + * Will clean up any residual flinches, Endure, etc. that are left over from startOfBattleEffects + * Will also handle Game Overs, switches, etc. that could happen from handleMysteryEncounterBattleStartEffects * See [TurnEndPhase](../phases.ts) for more details */ export class MysteryEncounterBattleStartCleanupPhase extends Phase { @@ -196,6 +199,28 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { this.scene.tryRemovePhase(p => p instanceof PostTurnStatusEffectPhase); } + // The total number of Pokemon in the player's party that can legally fight + const legalPlayerPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); + // The total number of legal player Pokemon that aren't currently on the field + const legalPlayerPartyPokemon = legalPlayerPokemon.filter(p => !p.isActive(true)); + if (!legalPlayerPokemon.length) { + this.scene.unshiftPhase(new GameOverPhase(this.scene)); + } + + // Check for any KOd player mons and switch + // For each fainted mon on the field, if there is a legal replacement, summon it + const playerField = this.scene.getPlayerField(); + playerField.forEach((pokemon, i) => { + if (!pokemon.isAllowedInBattle() && legalPlayerPartyPokemon.length > i) { + this.scene.unshiftPhase(new SwitchPhase(this.scene, i, true, false)); + } + }); + + // THEN, if is a double battle, and player only has 1 summoned pokemon, center pokemon on field + if (this.scene.currentBattle.double && legalPlayerPokemon.length === 1 && legalPlayerPartyPokemon.length === 0) { + this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + } + super.end(); } } @@ -477,7 +502,7 @@ export class PostMysteryEncounterPhase extends Phase { this.continueEncounter(); } }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset()); + }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset() * 2000); } else { this.continueEncounter(); } diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index a7ad3f6697e..7b0fea95a98 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -119,6 +119,7 @@ export const SettingKeys = { BGM_Volume: "BGM_VOLUME", Field_Volume: "FIELD_VOLUME", SE_Volume: "SE_VOLUME", + UI_Volume: "UI_SOUND_EFFECTS", Music_Preference: "MUSIC_PREFERENCE", Show_BGM_Bar: "SHOW_BGM_BAR", Move_Touch_Controls: "MOVE_TOUCH_CONTROLS", @@ -556,6 +557,13 @@ export const Setting: Array = [ default: 10, type: SettingType.AUDIO }, + { + key: SettingKeys.UI_Volume, + label: i18next.t("settings:uiVolume"), + options: VOLUME_OPTIONS, + default: 10, + type: SettingType.AUDIO + }, { key: SettingKeys.Music_Preference, label: i18next.t("settings:musicPreference"), @@ -670,6 +678,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): scene.seVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; + case SettingKeys.UI_Volume: + scene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + break; case SettingKeys.Music_Preference: scene.musicPreference = value; break; diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index ac4128e80f9..2ebd2872d88 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -119,7 +119,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.ORICORIO); - expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 0, 0, 0]); const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts new file mode 100644 index 00000000000..e488eaa816f --- /dev/null +++ b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -0,0 +1,240 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { Biome } from "#app/enums/biome"; +import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; +import { Species } from "#app/enums/species"; +import GameManager from "#app/test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { Moves } from "#enums/moves"; +import BattleScene from "#app/battle-scene"; +import { PokemonMove } from "#app/field/pokemon"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { CommandPhase } from "#app/phases/command-phase"; +import { UncommonBreedEncounter } from "#app/data/mystery-encounters/encounters/uncommon-breed-encounter"; +import { MovePhase } from "#app/phases/move-phase"; +import { speciesEggMoves } from "#app/data/egg-moves"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { BerryType } from "#enums/berry-type"; + +const namespace = "mysteryEncounter:uncommonBreed"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Uncommon Breed - Mystery Encounter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + scene = game.scene; + game.override.mysteryEncounterChance(100); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.UNCOMMON_BREED]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); + + expect(UncommonBreedEncounter.encounterType).toBe(MysteryEncounterType.UNCOMMON_BREED); + expect(UncommonBreedEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(UncommonBreedEncounter.dialogue).toBeDefined(); + expect(UncommonBreedEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(UncommonBreedEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(UncommonBreedEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(UncommonBreedEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); + expect(UncommonBreedEncounter.options.length).toBe(3); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.UNCOMMON_BREED); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should initialize fully", async () => { + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = UncommonBreedEncounter; + + const { onInit } = UncommonBreedEncounter; + + expect(UncommonBreedEncounter.onInit).toBeDefined(); + + UncommonBreedEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit!(scene); + + const config = UncommonBreedEncounter.enemyPartyConfigs[0]; + expect(config).toBeDefined(); + expect(config.pokemonConfigs?.[0].isBoss).toBe(false); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Fight", () => { + it("should have the correct properties", () => { + const option = UncommonBreedEncounter.options[0]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should start a fight against the boss", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); + + const config = game.scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; + + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + + // Should have used its egg move pre-battle + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(1); + const eggMoves: Moves[] = speciesEggMoves[getPokemonSpecies(speciesToSpawn).getRootSpeciesId()]; + const usedMove = (movePhases[0] as MovePhase).move.moveId; + expect(eggMoves.includes(usedMove)).toBe(true); + }); + }); + + describe("Option 2 - Give it Food", () => { + it("should have the correct properties", () => { + const option = UncommonBreedEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + } + ], + }); + }); + + it("should NOT be selectable if the player doesn't have enough berries", async () => { + game.override.startingHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}]); + await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); + + await runSelectMysteryEncounterOption(game, 2); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); + }); + + it("Should skip fight when player meets requirements", async () => { + game.override.startingHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); + + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Use an Attracting Move", () => { + it("should have the correct properties", () => { + const option = UncommonBreedEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + } + ], + }); + }); + + it("should NOT be selectable if the player doesn't have an Attracting move", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); + scene.getParty().forEach(p => p.moveset = []); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); + + await runSelectMysteryEncounterOption(game, 3); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); + }); + + it("Should skip fight when player meets requirements", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); + // Mock moveset + scene.getParty()[0].moveset = [new PokemonMove(Moves.CHARM)]; + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index cf754dbc6e3..f8ea9529f24 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -1,6 +1,7 @@ import { updateUserInfo } from "#app/account"; import { BattlerIndex } from "#app/battle"; import BattleScene from "#app/battle-scene"; +import { BattleStyle } from "#app/enums/battle-style"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import Trainer from "#app/field/trainer"; import { GameModes, getGameMode } from "#app/game-mode"; @@ -208,6 +209,8 @@ export default class GameManager { } /** + * @deprecated Use `game.classicMode.startBattle()` or `game.dailyMode.startBattle()` instead + * * Transitions to the start of a battle. * @param species - Optional array of species to start the battle with. * @returns A promise that resolves when the battle is started. @@ -215,15 +218,17 @@ export default class GameManager { async startBattle(species?: Species[]) { await this.classicMode.runToSummon(species); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + if (this.scene.battleStyle === BattleStyle.SWITCH) { + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + } await this.phaseInterceptor.to(CommandPhase); console.log("==================[New Turn]=================="); diff --git a/src/test/utils/helpers/classicModeHelper.ts b/src/test/utils/helpers/classicModeHelper.ts index f41472303b4..55e995fc9dc 100644 --- a/src/test/utils/helpers/classicModeHelper.ts +++ b/src/test/utils/helpers/classicModeHelper.ts @@ -1,8 +1,11 @@ +import { BattleStyle } from "#app/enums/battle-style"; import { Species } from "#app/enums/species"; import { GameModes, getGameMode } from "#app/game-mode"; import overrides from "#app/overrides"; +import { CommandPhase } from "#app/phases/command-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { SelectStarterPhase } from "#app/phases/select-starter-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Mode } from "#app/ui/ui"; import { generateStarter } from "../gameManagerUtils"; import { GameManagerHelper } from "./gameManagerHelper"; @@ -33,4 +36,28 @@ export class ClassicModeHelper extends GameManagerHelper { this.game.removeEnemyHeldItems(); } } + + /** + * Transitions to the start of a battle. + * @param species - Optional array of species to start the battle with. + * @returns A promise that resolves when the battle is started. + */ + async startBattle(species?: Species[]) { + await this.runToSummon(species); + + if (this.game.scene.battleStyle === BattleStyle.SWITCH) { + this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + + this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + } + + await this.game.phaseInterceptor.to(CommandPhase); + console.log("==================[New Turn]=================="); + } } diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/src/test/utils/helpers/dailyModeHelper.ts index 8f60981f4d8..e40fada8ac7 100644 --- a/src/test/utils/helpers/dailyModeHelper.ts +++ b/src/test/utils/helpers/dailyModeHelper.ts @@ -1,7 +1,10 @@ +import { BattleStyle } from "#app/enums/battle-style"; import { Button } from "#app/enums/buttons"; import overrides from "#app/overrides"; +import { CommandPhase } from "#app/phases/command-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { TitlePhase } from "#app/phases/title-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; import SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { GameManagerHelper } from "./gameManagerHelper"; @@ -28,10 +31,33 @@ export class DailyModeHelper extends GameManagerHelper { uihandler.processInput(Button.ACTION); // select first slot. that's fine }); - await this.game.phaseInterceptor.run(EncounterPhase); + await this.game.phaseInterceptor.to(EncounterPhase); if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { this.game.removeEnemyHeldItems(); } } + + /** + * Transitions to the start of a battle. + * @returns A promise that resolves when the battle is started. + */ + async startBattle() { + await this.runToSummon(); + + if (this.game.scene.battleStyle === BattleStyle.SWITCH) { + this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + + this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + } + + await this.game.phaseInterceptor.to(CommandPhase); + console.log("==================[New Turn]=================="); + } } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 3c4ab03efd9..189305ce4c1 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -252,9 +252,8 @@ export default class BattleMessageUiHandler extends MessageUiHandler { textStyle = TextStyle.SUMMARY_GREEN; } } else { - textStyle = TextStyle.SUMMARY; + textStyle = TextStyle.WINDOW; } - //const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY; const color = getTextColor(textStyle, false, uiTheme); return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`; }; diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index a4a57e25924..9497dfe58c6 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -359,7 +359,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.scene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { this.scene.playSound("se/gacha_dispense"); this.scene.time.delayedCall(this.getDelayValue(750), () => { - this.scene.sound.stopByKey("gacha_running"); + this.scene.sound.stopByKey("se/gacha_running"); this.scene.tweens.add({ targets: egg, duration: this.getDelayValue(350), diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 9e82e7ea809..76b08f53f47 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -114,7 +114,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { this.scene.charSprite.setVariant(charVar); } if (charSound) { - this.scene.playSound(`se/${charSound}`); + this.scene.playSound(charSound); } if (callback && !this.textTimer?.repeatCount) { if (callbackDelay && !prompt) { diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts index 27ca7e35354..4a895fc3170 100644 --- a/src/ui/settings/settings-audio-ui-handler.ts +++ b/src/ui/settings/settings-audio-ui-handler.ts @@ -15,6 +15,6 @@ export default class SettingsAudioUiHandler extends AbstractSettingsUiHandler { super(scene, SettingType.AUDIO, mode); this.title = "Audio"; this.localStorageKey = "settings"; - this.rowsToDisplay = 5; + this.rowsToDisplay = 6; } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5c9ce61979f..f9b40dd96e6 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1701,7 +1701,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound("buy"); + this.scene.playSound("se/buy"); return true; } @@ -1753,7 +1753,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterAttributes.shiny = starterAttributes.shiny ? !starterAttributes.shiny : true; this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); if (starterAttributes.shiny) { - this.scene.playSound("sparkle"); + this.scene.playSound("se/sparkle"); // Set the variant label to the shiny tint const tint = getVariantTint(newVariant); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index e5def3a1961..ea7b798f2bf 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -825,10 +825,7 @@ export default class SummaryUiHandler extends UiHandler { biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? }), - natureFragment: - i18next.exists(`pokemonSummary:natureFragment.${rawNature}`) ? - i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) : - nature, + natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) }); const memoText = addBBCodeTextObject(this.scene, 7, 113, String(memoString), TextStyle.WINDOW_ALT);