diff --git a/README.md b/README.md index 0f9ed992352a..f3ec1c793bdd 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - Pokémon Sword/Shield - Pokémon Legends: Arceus - Pokémon Scarlet/Violet - - Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music) + - Firel (Custom Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music) - Lmz (Custom Jungle biome music) - Andr06 (Custom Slum and Sea biome music) diff --git a/index.css b/index.css index 1274f2fcead0..2ec106516d22 100644 --- a/index.css +++ b/index.css @@ -26,10 +26,36 @@ body { #app { display: flex; justify-content: center; + align-items: center; } #app > div:first-child { - transform-origin: top !important; + transform-origin: center !important; +} + +/* + Supports automatic vertical centering as suggested in PR#1114, but only via CSS + + Condition factorized to deduce CSS rules: + true if (isLandscape && !isMobile() && !hasTouchscreen() || (hasTouchscreen() && !isTouchControlsEnabled)) +*/ + +/* isLandscape && !isMobile() && !hasTouchscreen() */ +@media (orientation: landscape) and (pointer: fine) { + #app { + align-items: center; + } +} + +@media (pointer: coarse) { + /* hasTouchscreen() && !isTouchControlsEnabled */ + body:has(> #touchControls[class=visible]) #app { + align-items: start; + } + + body:has(> #touchControls[class=visible]) #app > div:first-child { + transform-origin: top !important; + } } #layout:fullscreen #dpad, #layout:fullscreen { diff --git a/public/audio/bgm/ice_cave.mp3 b/public/audio/bgm/ice_cave.mp3 index 5d1b9e9e3542..9d1c7c06bf02 100644 Binary files a/public/audio/bgm/ice_cave.mp3 and b/public/audio/bgm/ice_cave.mp3 differ diff --git a/public/audio/bgm/plains.mp3 b/public/audio/bgm/plains.mp3 index 6c7a008bce63..ff364600b4aa 100644 Binary files a/public/audio/bgm/plains.mp3 and b/public/audio/bgm/plains.mp3 differ diff --git a/public/audio/bgm/power_plant.mp3 b/public/audio/bgm/power_plant.mp3 index 9813ad40a111..152667fcba6f 100644 Binary files a/public/audio/bgm/power_plant.mp3 and b/public/audio/bgm/power_plant.mp3 differ diff --git a/public/audio/bgm/volcano.mp3 b/public/audio/bgm/volcano.mp3 index 093bb86813b2..a67bbd111ded 100644 Binary files a/public/audio/bgm/volcano.mp3 and b/public/audio/bgm/volcano.mp3 differ diff --git a/public/battle-anims/clanging-scales.json b/public/battle-anims/clanging-scales.json index de1a3d5248fe..e2135a1a9b4f 100644 --- a/public/battle-anims/clanging-scales.json +++ b/public/battle-anims/clanging-scales.json @@ -27,7 +27,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -115,7 +115,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -215,7 +215,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -315,7 +315,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -414,7 +414,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -538,7 +538,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 23, @@ -685,7 +685,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -19, @@ -784,7 +784,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 26, @@ -883,7 +883,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 23.5, @@ -994,7 +994,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 9, @@ -1069,7 +1069,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -18.5, @@ -1157,7 +1157,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 37.5, @@ -1221,7 +1221,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -1284,7 +1284,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -1348,7 +1348,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -1448,7 +1448,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -1548,7 +1548,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -1647,7 +1647,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 0, @@ -1759,7 +1759,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -25.5, @@ -1870,7 +1870,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 12, @@ -1957,7 +1957,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -27, @@ -2044,7 +2044,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -16, @@ -2143,7 +2143,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -26.5, @@ -2230,7 +2230,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 23, @@ -2306,7 +2306,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": 24, @@ -2346,7 +2346,7 @@ "opacity": 255, "locked": true, "priority": 1, - "focus": 2 + "focus": 1 }, { "x": -27, diff --git a/public/images/statuses_ca_ES.json b/public/images/statuses_ca_ES.json new file mode 100644 index 000000000000..be1b78e0e412 --- /dev/null +++ b/public/images/statuses_ca_ES.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_ca_ES.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_ca_ES.png b/public/images/statuses_ca_ES.png new file mode 100644 index 000000000000..d372b989be96 Binary files /dev/null and b/public/images/statuses_ca_ES.png differ diff --git a/public/images/statuses_de.json b/public/images/statuses_de.json new file mode 100644 index 000000000000..90840b8eeb10 --- /dev/null +++ b/public/images/statuses_de.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_de.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_de.png b/public/images/statuses_de.png new file mode 100644 index 000000000000..ab85384d5914 Binary files /dev/null and b/public/images/statuses_de.png differ diff --git a/public/images/statuses_es.json b/public/images/statuses_es.json new file mode 100644 index 000000000000..4b44aa117e43 --- /dev/null +++ b/public/images/statuses_es.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_es.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_es.png b/public/images/statuses_es.png new file mode 100644 index 000000000000..d372b989be96 Binary files /dev/null and b/public/images/statuses_es.png differ diff --git a/public/images/statuses_fr.json b/public/images/statuses_fr.json new file mode 100644 index 000000000000..78f78a0856c0 --- /dev/null +++ b/public/images/statuses_fr.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_fr.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_fr.png b/public/images/statuses_fr.png new file mode 100644 index 000000000000..95989cd5d97e Binary files /dev/null and b/public/images/statuses_fr.png differ diff --git a/public/images/statuses_it.json b/public/images/statuses_it.json new file mode 100644 index 000000000000..76fc9ae8b4b3 --- /dev/null +++ b/public/images/statuses_it.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_it.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_it.png b/public/images/statuses_it.png new file mode 100644 index 000000000000..d372b989be96 Binary files /dev/null and b/public/images/statuses_it.png differ diff --git a/public/images/statuses_ja.json b/public/images/statuses_ja.json new file mode 100644 index 000000000000..8de633e8e439 --- /dev/null +++ b/public/images/statuses_ja.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_ja.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_ja.png b/public/images/statuses_ja.png new file mode 100644 index 000000000000..305fbe9168c3 Binary files /dev/null and b/public/images/statuses_ja.png differ diff --git a/public/images/statuses_ko.json b/public/images/statuses_ko.json new file mode 100644 index 000000000000..7e1e2dd6cdac --- /dev/null +++ b/public/images/statuses_ko.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_ko.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_ko.png b/public/images/statuses_ko.png new file mode 100644 index 000000000000..d372b989be96 Binary files /dev/null and b/public/images/statuses_ko.png differ diff --git a/public/images/statuses_pt_BR.json b/public/images/statuses_pt_BR.json new file mode 100644 index 000000000000..b607991af8f0 --- /dev/null +++ b/public/images/statuses_pt_BR.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_pt_BR.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_pt_BR.png b/public/images/statuses_pt_BR.png new file mode 100644 index 000000000000..3073540e8a2a Binary files /dev/null and b/public/images/statuses_pt_BR.png differ diff --git a/public/images/statuses_zh_CN.json b/public/images/statuses_zh_CN.json new file mode 100644 index 000000000000..28760650ecd2 --- /dev/null +++ b/public/images/statuses_zh_CN.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_zh_CN.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_zh_CN.png b/public/images/statuses_zh_CN.png new file mode 100644 index 000000000000..d372b989be96 Binary files /dev/null and b/public/images/statuses_zh_CN.png differ diff --git a/public/images/statuses_zh_TW.json b/public/images/statuses_zh_TW.json new file mode 100644 index 000000000000..bf05b2ab0d5a --- /dev/null +++ b/public/images/statuses_zh_TW.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_zh_TW.png b/public/images/statuses_zh_TW.png new file mode 100644 index 000000000000..d372b989be96 Binary files /dev/null and b/public/images/statuses_zh_TW.png differ diff --git a/src/data/ability.ts b/src/data/ability.ts index 944ee10244a5..0edbc172ad58 100755 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2625,7 +2625,11 @@ export class PreStatStageChangeAbAttr extends AbAttr { } } +/** + * Protect one or all {@linkcode BattleStat} from reductions caused by other Pokémon's moves and Abilities + */ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { + /** {@linkcode BattleStat} to protect or `undefined` if **all** {@linkcode BattleStat} are protected */ private protectedStat?: BattleStat; constructor(protectedStat?: BattleStat) { @@ -2634,7 +2638,17 @@ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { this.protectedStat = protectedStat; } - applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean { + /** + * Apply the {@linkcode ProtectedStatAbAttr} to an interaction + * @param _pokemon + * @param _passive + * @param simulated + * @param stat the {@linkcode BattleStat} being affected + * @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true if the stat is protected + * @param _args + * @returns true if the stat is protected, false otherwise + */ + applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean { if (Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat) { cancelled.value = true; return true; @@ -3757,7 +3771,7 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { this.multiplier = multiplier; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.IntegerHolder).value *= this.multiplier; return true; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index f07d6cb24091..d972e48df7cd 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -488,14 +488,14 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { moveAnims.set(move, null); const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; - const moveName = Moves[move].toLowerCase().replace(/\_/g, "-"); + const fetchAnimAndResolve = (move: Moves) => { - scene.cachedFetch(`./battle-anims/${moveName}.json`) + scene.cachedFetch(`./battle-anims/${Utils.animationFileName(move)}.json`) .then(response => { const contentType = response.headers.get("content-type"); if (!response.ok || contentType?.indexOf("application/json") === -1) { - console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText); - populateMoveAnim(move, moveAnims.get(defaultMoveAnim)); + useDefaultAnim(move, defaultMoveAnim); + logMissingMoveAnim(move, response.status, response.statusText); return resolve(); } return response.json(); @@ -515,6 +515,11 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { resolve(); } + }) + .catch(error => { + useDefaultAnim(move, defaultMoveAnim); + logMissingMoveAnim(move, error); + return resolve(); }); }; fetchAnimAndResolve(move); @@ -522,6 +527,29 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { }); } +/** + * Populates the default animation for the given move. + * + * @param move the move to populate an animation for + * @param defaultMoveAnim the move to use as the default animation + */ +function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) { + populateMoveAnim(move, moveAnims.get(defaultMoveAnim)); +} + +/** + * Helper method for printing a warning to the console when a move animation is missing. + * + * @param move the move to populate an animation for + * @param optionalParams parameters to add to the error logging + * + * @remarks use {@linkcode useDefaultAnim} to use a default animation + */ +function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { + const moveName = Utils.animationFileName(move); + console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams); +} + /** * Fetches animation configs to be used in a Mystery Encounter * @param scene diff --git a/src/data/move.ts b/src/data/move.ts index 10c98e0a7f7f..1bfe20abc484 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3839,7 +3839,7 @@ export class StormAccuracyAttr extends VariableAccuracyAttr { * @extends VariableAccuracyAttr * @see {@linkcode apply} */ -export class MinimizeAccuracyAttr extends VariableAccuracyAttr { +export class AlwaysHitMinimizeAttr extends VariableAccuracyAttr { /** * @see {@linkcode apply} * @param user N/A @@ -4855,10 +4855,10 @@ export class RemoveAllSubstitutesAttr extends MoveEffectAttr { * Attribute used when a move hits a {@linkcode BattlerTagType} for double damage * @extends MoveAttr */ -export class HitsTagAttr extends MoveAttr { +export class DealsDoubleDamageToTagAttr extends MoveAttr { /** The {@linkcode BattlerTagType} this move hits */ public tagType: BattlerTagType; - /** Should this move deal double damage against {@linkcode HitsTagAttr.tagType}? */ + /** Should this move deal double damage against {@linkcode DealsDoubleDamageToTagAttr.tagType}? */ public doubleDamage: boolean; constructor(tagType: BattlerTagType, doubleDamage?: boolean) { @@ -6752,12 +6752,11 @@ export function initMoves() { new AttackMove(Moves.CUT, Type.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1) .slicingMove(), new AttackMove(Moves.GUST, Type.FLYING, MoveCategory.SPECIAL, 40, 100, 35, -1, 0, 1) - .attr(HitsTagAttr, BattlerTagType.FLYING, true) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, true) .windMove(), new AttackMove(Moves.WING_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1), new StatusMove(Moves.WHIRLWIND, Type.NORMAL, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr) - .attr(HitsTagAttr, BattlerTagType.FLYING, false) .ignoresSubstitute() .hidesTarget() .windMove(), @@ -6770,8 +6769,8 @@ export function initMoves() { new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) - .attr(MinimizeAccuracyAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) + .attr(AlwaysHitMinimizeAttr) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true) .attr(FlinchAttr), new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) .attr(MultiHitAttr, MultiHitType._2), @@ -6795,8 +6794,8 @@ export function initMoves() { .attr(OneHitKOAccuracyAttr), new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) - .attr(MinimizeAccuracyAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) + .attr(AlwaysHitMinimizeAttr) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.WRAP), @@ -6864,7 +6863,7 @@ export function initMoves() { new AttackMove(Moves.HYDRO_PUMP, Type.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1), new AttackMove(Moves.SURF, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1) .target(MoveTarget.ALL_NEAR_OTHERS) - .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERWATER, true) .attr(GulpMissileTagAttr), new AttackMove(Moves.ICE_BEAM, Type.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.FREEZE), @@ -6947,18 +6946,18 @@ export function initMoves() { new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) - .attr(HitsTagAttr, BattlerTagType.FLYING, false), + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false), new AttackMove(Moves.ROCK_THROW, Type.ROCK, MoveCategory.PHYSICAL, 50, 90, 15, -1, 0, 1) .makesContact(false), new AttackMove(Moves.EARTHQUAKE, Type.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1) - .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, true) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY ? 0.5 : 1) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERGROUND, true) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), new AttackMove(Moves.FISSURE, Type.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr) - .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, false) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERGROUND, false) .makesContact(false), new AttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, i18next.t("moveTriggers:dugAHole", {pokemonName: "{USER}"}), BattlerTagType.UNDERGROUND) @@ -7346,8 +7345,8 @@ export function initMoves() { new AttackMove(Moves.MAGNITUDE, Type.GROUND, MoveCategory.PHYSICAL, -1, 100, 30, -1, 0, 2) .attr(PreMoveMessageAttr, magnitudeMessageFunc) .attr(MagnitudePowerAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY ? 0.5 : 1) - .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, true) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERGROUND, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), new AttackMove(Moves.DYNAMIC_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 50, 5, 100, 0, 2) @@ -7403,7 +7402,7 @@ export function initMoves() { new AttackMove(Moves.CROSS_CHOP, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 2) .attr(HighCritAttr), new AttackMove(Moves.TWISTER, Type.DRAGON, MoveCategory.SPECIAL, 40, 100, 20, 20, 0, 2) - .attr(HitsTagAttr, BattlerTagType.FLYING, true) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, true) .attr(FlinchAttr) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -7435,7 +7434,7 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.DEF ], -1), new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) .attr(TrapAttr, BattlerTagType.WHIRLPOOL) - .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true), + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERWATER, true), new AttackMove(Moves.BEAT_UP, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2) .attr(MultiHitAttr, MultiHitType.BEAT_UP) .attr(BeatUpAttr) @@ -7658,7 +7657,7 @@ export function initMoves() { new AttackMove(Moves.EXTRASENSORY, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 20, 10, 0, 3) .attr(FlinchAttr), new AttackMove(Moves.SKY_UPPERCUT, Type.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3) - .attr(HitsTagAttr, BattlerTagType.FLYING) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING) .punchingMove(), new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) .attr(TrapAttr, BattlerTagType.SAND_TOMB) @@ -7889,8 +7888,8 @@ export function initMoves() { new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) .pulseMove(), new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) - .attr(MinimizeAccuracyAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) + .attr(AlwaysHitMinimizeAttr) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true) .attr(FlinchAttr), new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) @@ -8087,7 +8086,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) - .attr(HitsTagAttr, BattlerTagType.FLYING, false) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false) .makesContact(false), new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .attr(CritOnlyAttr), @@ -8100,9 +8099,9 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .danceMove(), new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) - .attr(MinimizeAccuracyAttr) + .attr(AlwaysHitMinimizeAttr) .attr(CompareWeightPowerAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true), + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true), new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) .target(MoveTarget.ALL_NEAR_OTHERS) .condition(unknownTypeCondition) @@ -8221,7 +8220,7 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.BULLDOZE, Type.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5) @@ -8253,12 +8252,14 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .slicingMove(), new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) - .attr(MinimizeAccuracyAttr) + .attr(AlwaysHitMinimizeAttr) .attr(CompareWeightPowerAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true), + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true), new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), new AttackMove(Moves.STEAMROLLER, Type.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5) + .attr(AlwaysHitMinimizeAttr) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true) .attr(FlinchAttr), new SelfStatusMove(Moves.COTTON_GUARD, Type.GRASS, -1, 10, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF ], 3, true), @@ -8271,7 +8272,7 @@ export function initMoves() { new AttackMove(Moves.HURRICANE, Type.FLYING, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 5) .attr(ThunderAccuracyAttr) .attr(ConfuseAttr) - .attr(HitsTagAttr, BattlerTagType.FLYING, false) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false) .windMove(), new AttackMove(Moves.HEAD_CHARGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 5) .attr(RecoilAttr) @@ -8325,9 +8326,9 @@ export function initMoves() { .attr(LastMoveDoublePowerAttr, Moves.FUSION_FLARE) .makesContact(false), new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) - .attr(MinimizeAccuracyAttr) + .attr(AlwaysHitMinimizeAttr) .attr(FlyingTypeMultiplierAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true) .condition(failOnGravityCondition), new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) .target(MoveTarget.USER_SIDE) @@ -8498,8 +8499,8 @@ export function initMoves() { new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) - .attr(HitsTagAttr, BattlerTagType.FLYING, false) - .attr(HitsTagAttr, BattlerTagType.MAGNET_RISEN, false) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MAGNET_RISEN, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .makesContact(false) @@ -8756,6 +8757,8 @@ export function initMoves() { .partial() .ignoresVirtual(), new AttackMove(Moves.MALICIOUS_MOONSAULT, Type.DARK, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + .attr(AlwaysHitMinimizeAttr) + .attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true) .partial() .ignoresVirtual(), new AttackMove(Moves.OCEANIC_OPERETTA, Type.WATER, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 4fc833939e45..a904f497b0f7 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -684,7 +684,7 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.GROUDON, "", SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.RED_ORB)) ], [Species.RAYQUAZA]: [ - new SpeciesFormChange(Species.RAYQUAZA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE), new SpeciesFormChangeMoveLearnedTrigger(Moves.DRAGON_ASCENT))) + new SpeciesFormChange(Species.RAYQUAZA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE)) ], [Species.DEOXYS]: [ new SpeciesFormChange(Species.DEOXYS, "normal", "attack", new SpeciesFormChangeItemTrigger(FormChangeItem.SHARP_METEORITE)), diff --git a/src/field/arena.ts b/src/field/arena.ts index 0466c01c82be..bf4075e5c1c7 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -746,7 +746,7 @@ export class Arena { case Biome.TOWN: return 7.288; case Biome.PLAINS: - return 7.693; + return 17.485; case Biome.GRASS: return 1.995; case Biome.TALL_GRASS: @@ -774,13 +774,13 @@ export class Arena { case Biome.DESERT: return 1.143; case Biome.ICE_CAVE: - return 15.010; + return 0.000; case Biome.MEADOW: return 3.891; case Biome.POWER_PLANT: - return 2.810; + return 9.447; case Biome.VOLCANO: - return 5.116; + return 17.637; case Biome.GRAVEYARD: return 3.232; case Biome.DOJO: diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 9c8c1e6ce46f..cdafc960382e 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,7 +3,7 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget } from "../data/move"; +import Move, { HighCritAttr, DealsDoubleDamageToTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "../utils"; @@ -95,6 +95,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public metLevel: integer; public metBiome: Biome | -1; public metSpecies: Species; + public metWave: number; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -194,6 +195,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.luck = dataSource.luck; this.metBiome = dataSource.metBiome; this.metSpecies = dataSource.metSpecies ?? (this.metBiome !== -1 ? this.species.speciesId : this.species.getRootSpeciesId(true)); + this.metWave = dataSource.metWave ?? (this.metBiome === -1 ? -1 : 0); this.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; this.evoCounter = dataSource.evoCounter ?? 0; @@ -240,6 +242,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; this.metSpecies = species.speciesId; + this.metWave = scene.currentBattle ? scene.currentBattle.waveIndex : -1; this.pokerus = false; if (level > 1) { @@ -1270,13 +1273,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param attrType {@linkcode AbAttr} The ability attribute to check for. * @param canApply {@linkcode Boolean} If false, it doesn't check whether the ability is currently active * @param ignoreOverride {@linkcode Boolean} If true, it ignores ability changing effects - * @returns {AbAttr[]} A list of all the ability attributes on this ability. + * @returns A list of all the ability attributes on this ability. */ - getAbilityAttrs(attrType: { new(...args: any[]): AbAttr }, canApply: boolean = true, ignoreOverride?: boolean): AbAttr[] { - const abilityAttrs: AbAttr[] = []; + getAbilityAttrs(attrType: { new(...args: any[]): T }, canApply: boolean = true, ignoreOverride?: boolean): T[] { + const abilityAttrs: T[] = []; if (!canApply || this.canApplyAbility()) { - abilityAttrs.push(...this.getAbility(ignoreOverride).getAttrs(attrType)); + abilityAttrs.push(...this.getAbility(ignoreOverride).getAttrs(attrType)); } if (!canApply || this.canApplyAbility(true)) { @@ -1510,7 +1513,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); for (const tag of immuneTags) { - if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { + if (move && !move.getAttrs(DealsDoubleDamageToTagAttr).some(attr => attr.tagType === tag.tagType)) { typeMultiplier.value = 0; break; } @@ -2486,13 +2489,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier); /** - * For each {@linkcode HitsTagAttr} the move has, doubles the damage of the move if: + * For each {@linkcode DealsDoubleDamageToTagAttr} the move has, doubles the damage of the move if: * The target has a {@linkcode BattlerTagType} that this move interacts with * AND * The move doubles damage when used against that tag */ const hitsTagMultiplier = new Utils.NumberHolder(1); - move.getAttrs(HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { + move.getAttrs(DealsDoubleDamageToTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { if (this.getTag(hta.tagType)) { hitsTagMultiplier.value *= 2; } @@ -4081,6 +4084,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.metLevel = this.metLevel; newPokemon.metBiome = this.metBiome; newPokemon.metSpecies = this.metSpecies; + newPokemon.metWave = this.metWave; newPokemon.fusionSpecies = this.fusionSpecies; newPokemon.fusionFormIndex = this.fusionFormIndex; newPokemon.fusionAbilityIndex = this.fusionAbilityIndex; @@ -4088,6 +4092,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; + newPokemon.usedTMs = this.usedTMs; this.scene.getParty().push(newPokemon); newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); @@ -4779,6 +4784,7 @@ export class EnemyPokemon extends Pokemon { this.pokeball = pokeballType; this.metLevel = this.level; this.metBiome = this.scene.arena.biomeType; + this.metWave = this.scene.currentBattle.waveIndex; this.metSpecies = this.species.speciesId; const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); diff --git a/src/loading-scene.ts b/src/loading-scene.ts index d0818aa1e194..c3cb494d4970 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -241,12 +241,15 @@ export class LoadingScene extends SceneBase { const lang = i18next.resolvedLanguage; if (lang !== "en") { if (Utils.verifyLang(lang)) { + this.loadAtlas(`statuses_${lang}`, ""); this.loadAtlas(`types_${lang}`, ""); } else { // Fallback to English + this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } } else { + this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"]; diff --git a/src/locales/de/bgm-name.json b/src/locales/de/bgm-name.json index 6355c33c49c2..b722bdba7d5d 100644 --- a/src/locales/de/bgm-name.json +++ b/src/locales/de/bgm-name.json @@ -77,18 +77,18 @@ "end_summit": "PMDDX Gipfel des Himmelturms", "battle_rocket_grunt": "HGSS Vs. Team Rocket Rüpel", "battle_aqua_magma_grunt": "ORAS Vs. Team Aqua & Magma", - "battle_galactic_grunt": "BDSP Vs. Team Galaktik Rüpel", + "battle_galactic_grunt": "SDLP 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_galactic_admin": "SDLP 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_galactic_boss": "SDLP Vs. Zyrus", "battle_plasma_boss": "S2W2 Vs. G-Cis", "battle_flare_boss": "XY Vs. Flordelis", "battle_aether_boss": "SM Vs. Samantha", @@ -149,7 +149,8 @@ "title": "PMD Erkundungsteam Himmel Top-Menü-Thema", "mystery_encounter_weird_dream": "PMD Erkundungsteam Himmel Zeitturmspitze", - "mystery_encounter_fun_and_games": "PMD Erkundungsteam Himmel Gildenmeister Knuddeluff\n", + "mystery_encounter_fun_and_games": "PMD Erkundungsteam Himmel Gildenmeister Knuddeluff", "mystery_encounter_gen_5_gts": "SW GTS", - "mystery_encounter_gen_6_gts": "XY GTS" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json index 94571efdfb6f..50413e24bc2b 100644 --- a/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json @@ -44,4 +44,4 @@ "legendary": "legendäres Ei" }, "outro": "{{statTrainerName}} gibt dir ein {{eggType}}!" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/de/mystery-encounters/bug-type-superfan-dialogue.json index b88be8ee9705..b298cff3dd77 100644 --- a/src/locales/de/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/de/mystery-encounters/bug-type-superfan-dialogue.json @@ -17,9 +17,9 @@ "disabled_tooltip": "Du brauchst mindestens 1 Käfer-Pokémon in deinem Team, um das auszuwählen.", "selected": "Du zeigst dem Trainer all deine Käfer-Pokémon...", "selected_0_to_1": "Huh? Du hast nur {{numBugTypes}} Käfer-Pokémon...$Ich verschwende hier meine Zeit...", - "selected_2_to_3": "Hey, du hast {{numBugTypes}} Käfer-Pokémon! Nicht schlecht.$Hier, das könnte dir auf deiner Reise helfen, mehr zu fangen!", - "selected_4_to_5": "Was? Du hast {{numBugTypes}} Käfer-Pokémon? Nicht schlecht!$Du bist noch nicht ganz auf meinem Level, aber ich kann mich in dir erkennen! $Nimm das, mein junger Padawan!", - "selected_6": "Wow! {{numBugTypes}} Käfer-Pokémon!$Du musst Käfer-Pokémon fast so sehr lieben wie ich!$Hier, nimm das als Zeichen unserer Kameradschaft!" + "selected_2_to_3": "Hey, du hast {{numBugTypes}}! Nicht schlecht.$Hier, das könnte dir auf deiner Reise helfen, mehr zu fangen!", + "selected_4_to_5": "Was? Du hast {{numBugTypes}}? Nicht schlecht!$Du bist noch nicht ganz auf meinem Level, aber ich kann mich in dir erkennen! $Nimm das, mein junger Padawan!", + "selected_6": "Wow! {{numBugTypes}}!$Du musst Käfer-Pokémon fast so sehr lieben wie ich!$Hier, nimm das als Zeichen unserer Kameradschaft!" }, "3": { "label": "Verschenke ein Käfer-Item", @@ -34,5 +34,7 @@ "battle_won": "Dein Wissen und Können waren perfekt, um unsere Schwächen auszunutzen!$Als Gegenleistung für die wertvolle Lektion, erlaube mir, einem deiner Pokémon eine Käfer-Attacke beizubringen!", "teach_move_prompt": "Wähle eine Attacke aus die du deinem Pokémon beibringen möchtest.", "confirm_no_teach": "Bist du sicher, dass du keine dieser großartigen Attacken lernen möchtest?", - "outro": "Ich sehe großartige Käfer-Pokémon in deiner Zukunft! Mögen sich unsere Wege wieder kreuzen!$Mach's gut!" + "outro": "Ich sehe großartige Käfer-Pokémon in deiner Zukunft! Mögen sich unsere Wege wieder kreuzen!$Mach's gut!", + "numBugTypes_one": "{{count}} Käfer-Pokémon", + "numBugTypes_other": "{{count}} Käfer-Pokémon" } diff --git a/src/locales/de/pokemon-summary.json b/src/locales/de/pokemon-summary.json index 1790c6878b92..3104fc10151c 100644 --- a/src/locales/de/pokemon-summary.json +++ b/src/locales/de/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Abbrechen", "memoString": "Wesen: {{natureFragment}}\n{{metFragment}}", "metFragment": { - "normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.", + "normal": "Herkunft: {{biome}} - Welle {{wave}}\nMit Lv. {{level}} erhalten.", "apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten." }, "natureFragment": { diff --git a/src/locales/en/bgm-name.json b/src/locales/en/bgm-name.json index c2babed4dffb..e13f580def69 100644 --- a/src/locales/en/bgm-name.json +++ b/src/locales/en/bgm-name.json @@ -108,7 +108,7 @@ "forest": "PMD EoS Dusk Forest", "grass": "PMD EoS Apple Woods", "graveyard": "PMD EoS Mystifying Forest", - "ice_cave": "PMD EoS Vast Ice Mountain", + "ice_cave": "Firel - -60F", "island": "PMD EoS Craggy Coast", "jungle": "Lmz - Jungle", "laboratory": "Firel - Laboratory", @@ -116,8 +116,8 @@ "meadow": "PMD EoS Sky Peak Forest", "metropolis": "Firel - Metropolis", "mountain": "PMD EoS Mt. Horn", - "plains": "PMD EoS Sky Peak Prairie", - "power_plant": "PMD EoS Far Amp Plains", + "plains": "Firel - Route 888", + "power_plant": "Firel - The Klink", "ruins": "PMD EoS Deep Sealed Ruin", "sea": "Andr06 - Marine Mystique", "seabed": "Firel - Seabed", @@ -128,7 +128,7 @@ "tall_grass": "PMD EoS Foggy Forest", "temple": "PMD EoS Aegis Cave", "town": "PMD EoS Random Dungeon Theme 3", - "volcano": "PMD EoS Steam Cave", + "volcano": "Firel - Twisturn Volcano", "wasteland": "PMD EoS Hidden Highland", "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", diff --git a/src/locales/en/pokemon-summary.json b/src/locales/en/pokemon-summary.json index 80e0cdab0100..458fad0efe0d 100644 --- a/src/locales/en/pokemon-summary.json +++ b/src/locales/en/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Cancel", "memoString": "{{natureFragment}} nature,\n{{metFragment}}", "metFragment": { - "normal": "met at Lv{{level}},\n{{biome}}.", + "normal": "met at Lv{{level}},\n{{biome}}, Wave {{wave}}.", "apparently": "apparently met at Lv{{level}},\n{{biome}}." }, "natureFragment": { diff --git a/src/locales/es/bgm-name.json b/src/locales/es/bgm-name.json index a8428c55f7ad..da4f899227ad 100644 --- a/src/locales/es/bgm-name.json +++ b/src/locales/es/bgm-name.json @@ -150,5 +150,6 @@ "mystery_encounter_weird_dream": "PMM EdC Pináculo del Tiempo", "mystery_encounter_fun_and_games": "PMM EdC Gran Bluff", "mystery_encounter_gen_5_gts": "BN GTS", - "mystery_encounter_gen_6_gts": "XY GTS" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/es/modifier-select-ui-handler.json b/src/locales/es/modifier-select-ui-handler.json index 7305eab84d11..1ad07d2316bb 100644 --- a/src/locales/es/modifier-select-ui-handler.json +++ b/src/locales/es/modifier-select-ui-handler.json @@ -9,6 +9,6 @@ "checkTeamDesc": "Revisa tu equipo o usa un objeto que cambia de forma.", "rerollCost": "{{formattedMoney}} ₽", "itemCost": "{{formattedMoney}} ₽", - "continueNextWaveButton": "Continue", - "continueNextWaveDescription": "Continue to the next wave" + "continueNextWaveButton": "Continuar", + "continueNextWaveDescription": "Continuar a la siguiente ronda" } diff --git a/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json index ec781abcd5a2..bc100f60454e 100644 --- a/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json @@ -44,4 +44,4 @@ "legendary": "un huevo Legendario " }, "outro": "{{statTrainerName}} te dio {{eggType}}!" -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json index 6b88fb767238..0fdc0995039e 100644 --- a/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json @@ -16,10 +16,10 @@ "tooltip": "(+) ¡Recibe un objeto de regalo!", "disabled_tooltip": "Necesitas al menos 1 Pokémon de tipo Bicho en tu equipo para seleccionar esto.", "selected": "Le muestras al entrenador todos tus Pokémon de tipo Bicho...", - "selected_0_to_1": "¿Eh? Solo tienes {{numBugTypes}}...$Supongo que estoy perdiendo el tiempo con alguien como tú...", - "selected_2_to_3": "¡Oye, tienes {{numBugTypes}} Pokémon de tipo Bicho! No está mal.$Aquí, esto podría ayudarte en tu viaje para atrapar más.", - "selected_4_to_5": "¿Qué? ¿Tienes {{numBugTypes}} Bug Types?\nNice!$No estás a mi nivel, pero puedo ver destellos de mí en ti.$¡Toma esto, mi joven aprendiz!", - "selected_6": "¡Vaya! {{numBugTypes}}Pokémon de tipo Bicho!$¡Debes amar a los Pokémon de tipo Bicho casi tanto como yo!$Aquí, toma esto como un símbolo de nuestra camaradería." + "selected_0_to_1": "¿Eh? Solo tienes {{numBugTypes}} tipo Bicho...$Supongo que estoy perdiendo el tiempo con alguien como tú...", + "selected_2_to_3": "¡Oye, tienes {{numBugTypes}}! No está mal.$Aquí, esto podría ayudarte en tu viaje para atrapar más.", + "selected_4_to_5": "¿Qué? ¿Tienes {{numBugTypes}}?\nNice!$No estás a mi nivel, pero puedo ver destellos de mí en ti.$¡Toma esto, mi joven aprendiz!", + "selected_6": "¡Vaya! {{numBugTypes}}!$¡Debes amar a los Pokémon de tipo Bicho casi tanto como yo!$Aquí, toma esto como un símbolo de nuestra camaradería." }, "3": { "label": "Regala un objeto de tipo Bicho", @@ -34,5 +34,7 @@ "battle_won": "¡Tu conocimiento y habilidad fueron perfectos para explotar nuestras debilidades!$A cambio de la valiosa lección, permíteme enseñarle a uno de tus Pokémon un movimiento de tipo Bicho.", "teach_move_prompt": "Selecciona un movimiento para enseñar a un Pokémon.", "confirm_no_teach": "¿Estás seguro de que no quieres aprender uno de estos excellentes movimientos?", - "outro": "¡Veo grandes Pokémon de tipo Bicho en tu futuro! ¡Que nuestros caminos se crucen de nuevo! ¡Bicho fuera!" + "outro": "¡Veo grandes Pokémon de tipo Bicho en tu futuro! ¡Que nuestros caminos se crucen de nuevo! ¡Bicho fuera!", + "numBugTypes_one": "{{count}} Pokémon de tipo Bicho", + "numBugTypes_other": "{{count}} Pokémon de tipo Bicho" } diff --git a/src/locales/es/mystery-encounters/delibirdy-dialogue.json b/src/locales/es/mystery-encounters/delibirdy-dialogue.json index ca1fefa3a39c..79e0b457b010 100644 --- a/src/locales/es/mystery-encounters/delibirdy-dialogue.json +++ b/src/locales/es/mystery-encounters/delibirdy-dialogue.json @@ -1,29 +1,29 @@ { - "intro": "A pack of {{delibirdName}} have appeared!", - "title": "Delibir-dy", - "description": "The {{delibirdName}}s are looking at you expectantly, as if they want something. Perhaps giving them an item or some money would satisfy them?", - "query": "What will you give them?", - "invalid_selection": "Pokémon doesn't have that kind of item.", + "intro": "¡Ha aparecido una bandada de {{delibirdName}}!", + "title": "Pajarradas", + "description": "Los {{delibirdName}} te miran expectantes, como si quisieran algo. Tal vez darles un objeto o algo de dinero los satisfaría.", + "query": "¿Qué les darás?", + "invalid_selection": "Pokémon no tienen ese tipo de objeto.", "option": { "1": { - "label": "Give Money", - "tooltip": "(-) Give the {{delibirdName}}s {{money, money}}\n(+) Receive a Gift Item", - "selected": "You toss the money to the {{delibirdName}}s,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" + "label": "Dar dinero", + "tooltip": "(-) Dar a los {{delibirdName}}s {{money, money}}\n(+) Recibe un objeto de regalo", + "selected": "Lanzas el dinero a los {{delibirdName}}s, \nque charlan emocionados entre ellos.$Luego se vuelven hacia ti y te dan un regalo con alegría." }, "2": { - "label": "Give Food", - "tooltip": "(-) Give the {{delibirdName}}s a Berry or Reviver Seed\n(+) Receive a Gift Item", - "select_prompt": "Select an item to give.", - "selected": "You toss the {{chosenItem}} to the {{delibirdName}}s,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" + "label": "Dar comida", + "tooltip": "(-) Dar a los {{delibirdName}}s una Baya o Semilla milagro\n(+) Recibe un objeto de regalo", + "select_prompt": "Selecciona un objeto para dar.", + "selected": "Lanzas el {{chosenItem}} a los {{delibirdName}},\nque charlan emocionados entre ellos.$Se vuelven hacia ti y te dan un regalo alegremente." }, "3": { - "label": "Give an Item", - "tooltip": "(-) Give the {{delibirdName}}s a Held Item\n(+) Receive a Gift Item", - "select_prompt": "Select an item to give.", - "selected": "You toss the {{chosenItem}} to the {{delibirdName}}s,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" + "label": "Dar objeto", + "tooltip": "(-) Dar a los {{delibirdName}}s un objeto equipado\n(+) Recibe un objeto de regalo", + "select_prompt": "Selecciona un objeto para dar.", + "selected": "Lanzas el {{chosenItem}} a los {{delibirdName}},\nque charlan emocionados entre ellos.$Se vuelven hacia ti y te dan un regalo alegremente." } }, - "outro": "The {{delibirdName}} pack happily waddles off into the distance.$What a curious little exchange!" -} \ No newline at end of file + "outro": "La bandada de {{delibirdName}} se aleja felizmente a lo lejos. ¡Qué intercambio tan curioso!" +} diff --git a/src/locales/es/mystery-encounters/department-store-sale-dialogue.json b/src/locales/es/mystery-encounters/department-store-sale-dialogue.json index d651f32665a1..e17d57b8c3c6 100644 --- a/src/locales/es/mystery-encounters/department-store-sale-dialogue.json +++ b/src/locales/es/mystery-encounters/department-store-sale-dialogue.json @@ -1,27 +1,27 @@ { - "intro": "It's a lady with a ton of shopping bags.", - "speaker": "Shopper", - "intro_dialogue": "Hello! Are you here for\nthe amazing sales too?$There's a special coupon that you can\nredeem for a free item during the sale!$I have an extra one. Here you go!", - "title": "Department Store Sale", - "description": "There is merchandise in every direction! It looks like there are 4 counters where you can redeem the coupon for various items. The possibilities are endless!", - "query": "Which counter will you go to?", + "intro": "Es una señora con un montón de bolsas de compras.", + "speaker": "Compradora", + "intro_dialogue": "¡Hola! ¿También estás aquí por las increíbles rebajas? Hay un cupón especial que puedes canjear por un artículo gratis durante la venta. ¡Tengo uno extra. ¡Aquí tienes!", + "title": "¡Rebajas en el Centro Comercial!", + "description": "¡Hay mercancía en todas direcciones! Parece que hay 4 mostradores donde puedes canjear el cupón por varios artículos. ¡Las posibilidades son infinitas!", + "query": "¿A qué mostrador irás?", "option": { "1": { - "label": "TM Counter", - "tooltip": "(+) TM Shop" + "label": "Mostrador de MTs", + "tooltip": "(+) Tienda de MTs" }, "2": { - "label": "Vitamin Counter", - "tooltip": "(+) Vitamin Shop" + "label": "Mostrador de Vitaminas", + "tooltip": "(+) Tienda de vitaminas" }, "3": { - "label": "Battle Item Counter", - "tooltip": "(+) X Item Shop" + "label": "Mostrador de objetos de batalla", + "tooltip": "(+) Tienda de objetos X" }, "4": { - "label": "Pokéball Counter", - "tooltip": "(+) Pokéball Shop" + "label": "Mostrador de Pokéballs ", + "tooltip": "(+) Tienda de Pokéballs" } }, - "outro": "What a deal! You should shop there more often." + "outro": "¡Qué chollo! Deberías comprar allí más a menudo." } \ No newline at end of file diff --git a/src/locales/es/mystery-encounters/field-trip-dialogue.json b/src/locales/es/mystery-encounters/field-trip-dialogue.json index 61900d56cd7c..be2554aba359 100644 --- a/src/locales/es/mystery-encounters/field-trip-dialogue.json +++ b/src/locales/es/mystery-encounters/field-trip-dialogue.json @@ -1,31 +1,31 @@ { - "intro": "It's a teacher and some school children!", - "speaker": "Teacher", - "intro_dialogue": "Hello, there! Would you be able to\nspare a minute for my students?$I'm teaching them about Pokémon moves\nand would love to show them a demonstration.$Would you mind showing us one of\nthe moves your Pokémon can use?", - "title": "Field Trip", - "description": "A teacher is requesting a move demonstration from a Pokémon. Depending on the move you choose, she might have something useful for you in exchange.", - "query": "Which move category will you show off?", + "intro": "¡Es un profesor y alugnos estudiantes parvulitos", + "speaker": "Profesor", + "intro_dialogue": "¡Hola! ¿Podrías dedicar un minuto a mis alumnos?$Les estoy enseñando sobre los movimientos de Pokémon\ny me encantaría mostrarles una demostración.$¿Te importaría mostrarnos uno de los movimientos\nque puede usar tu Pokémon?", + "title": "Excursión", + "description": "Una profesora está solicitando una demostración de un movimiento de un Pokémon. Dependiendo del movimiento que elijas, podría tener algo útil para ti a cambio.", + "query": "¿Qué categoría de movimiento mostrarás?", "option": { "1": { - "label": "A Physical Move", - "tooltip": "(+) Physical Item Rewards" + "label": "Un movimiento físico", + "tooltip": "(+) Recompensas de objetos para movimientos físicos" }, "2": { - "label": "A Special Move", - "tooltip": "(+) Special Item Rewards" + "label": "Un movimiento especial", + "tooltip": "(+) Recompensas de objetos para movimientos especiales" }, "3": { - "label": "A Status Move", - "tooltip": "(+) Status Item Rewards" + "label": "Un ataque de estado", + "tooltip": "(+) Recompensas de objetos de estado" }, - "selected": "{{pokeName}} shows off an awesome display of {{move}}!" + "selected": "¡{{pokeName}} muestra una increíble exhibición de {{move}}!" }, - "second_option_prompt": "Choose a move for your Pokémon to use.", - "incorrect": "...$That isn't a {{moveCategory}} move!\nI'm sorry, but I can't give you anything.$Come along children, we'll\nfind a better demonstration elsewhere.", - "incorrect_exp": "Looks like you learned a valuable lesson?$Your Pokémon also gained some experience.", - "correct": "Thank you so much for your kindness!\nI hope these items might be of use to you!", - "correct_exp": "{{pokeName}} also gained some valuable experience!", - "status": "Status", - "physical": "Physical", - "special": "Special" + "second_option_prompt": "Elige un movimiento para que tu Pokémon use.", + "incorrect": "...$¡Eso no es un movimiento {{moveCategory}}!\nLo siento, pero no puedo darte nada.$Vamos niños, encontraremos una mejor demostración en otro lugar.", + "incorrect_exp": "Parece que has aprendido una valiosa lección.$Tu Pokémon también ganó algo de experiencia.", + "correct": "¡Muchas gracias por tu amabilidad!\n¡Espero que estos objetos te sean de utilidad!", + "correct_exp": "{{pokeName}} también ganó una valiosa experiencia!", + "status": "Estado", + "physical": "Físico", + "special": "Especial" } \ No newline at end of file diff --git a/src/locales/es/mystery-encounters/fiery-fallout-dialogue.json b/src/locales/es/mystery-encounters/fiery-fallout-dialogue.json index a1644d89a3fb..272544cba9e5 100644 --- a/src/locales/es/mystery-encounters/fiery-fallout-dialogue.json +++ b/src/locales/es/mystery-encounters/fiery-fallout-dialogue.json @@ -1,26 +1,26 @@ { - "intro": "You encounter a blistering storm of smoke and ash!", - "title": "Fiery Fallout", - "description": "The whirling ash and embers have cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", - "query": "What will you do?", + "intro": "¡Te encuentras con una tormenta abrasadora de humo y ceniza!", + "title": "¡Pasión Ardiente!", + "description": "La ceniza y las brasas han reducido la visibilidad a casi cero. Parece que podría haber alguna… fuente que esté causando estas condiciones. Pero, ¿qué podría estar detrás de un fenómeno de esta magnitud?", + "query": "¿Qué harás?", "option": { "1": { - "label": "Find the Source", - "tooltip": "(?) Discover the source\n(-) Hard Battle", - "selected": "You push through the storm, and find two {{volcaronaName}}s in the middle of a mating dance!$They don't take kindly to the interruption and attack!" + "label": "Encontrar la causa", + "tooltip": "(?) Encunetra la causa\n(-) Batalla Difícil", + "selected": "¡Empujas a través de la tormenta y encuentras a dos {{volcaronaName}}s en medio de una danza de apareamiento!$¡No toman bien la interrupción y atacan!" }, "2": { - "label": "Hunker Down", - "tooltip": "(-) Suffer the effects of the weather", - "selected": "The weather effects cause significant\nharm as you struggle to find shelter!$Your party takes 20% Max HP damage!", - "target_burned": "Your {{burnedPokemon}} also became burned!" + "label": "Refugiarse", + "tooltip": "(-) Sufre los efectos del clima", + "selected": "Los efectos del clima causan un daño significativo mientras luchas por encontrar refugio. ¡Tu grupo pierde el 20% de su HP máximo!", + "target_burned": "¡Tu {{burnedPokemon}} también acabo quemándose!" }, "3": { - "label": "Your Fire Types Help", - "tooltip": "(+) End the conditions\n(+) Gain a Charcoal", - "disabled_tooltip": "You need at least 2 Fire Type Pokémon to choose this", - "selected": "Your {{option3PrimaryName}} and {{option3SecondaryName}} guide you to where two {{volcaronaName}}s are in the middle of a mating dance!$Thankfully, your Pokémon are able to calm them,\nand they depart without issue." + "label": "Tus tipos de fuego ayudan", + "tooltip": "(+) Paras las condiciones del clima\n(+) Obtén un Carbón", + "disabled_tooltip": "Necesitas al menos 2 Pokémon de tipo Fuego para elegir esto", + "selected": "Tus {{option3PrimaryName}} y {{option3SecondaryName}} te guían hasta donde dos {{volcaronaName}}s están en medio de una danza de apareamiento.$Afortunadamente, tus Pokémon logran calmarlos y se van sin problemas." } }, - "found_charcoal": "After the weather clears,\nyour {{leadPokemon}} spots something on the ground.$@s{item_fanfare}{{leadPokemon}} gained a Charcoal!" + "found_charcoal": "Después de que el clima se despeja,\ntu {{leadPokemon}} ve algo en el suelo. $¡@s{item_fanfare}{{leadPokemon}} obtuvo un Carbón!" } \ No newline at end of file diff --git a/src/locales/es/mystery-encounters/fight-or-flight-dialogue.json b/src/locales/es/mystery-encounters/fight-or-flight-dialogue.json index 3eb6cb87c165..33ccc09e1c60 100644 --- a/src/locales/es/mystery-encounters/fight-or-flight-dialogue.json +++ b/src/locales/es/mystery-encounters/fight-or-flight-dialogue.json @@ -1,25 +1,25 @@ { - "intro": "Something shiny is sparkling\non the ground near that Pokémon!", - "title": "Fight or Flight", - "description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but it looks strong. Perhaps you could steal the item, if you have the right Pokémon for the job.", - "query": "What will you do?", + "intro": "¡Algo brillante está reluciendo\nen el suelo cerca de ese Pokémon!", + "title": "Lucha o huye", + "description": "Parece que hay un Pokémon fuerte protegiendo un objeto. Lucharlo es el enfoque más directo, pero parece fuerte. Quizás podrías robar el objeto, si tienes el Pokémon adecuado para el trabajo.", + "query": "¿Qué harás?", "option": { "1": { - "label": "Battle the Pokémon", - "tooltip": "(-) Hard Battle\n(+) New Item", - "selected": "You approach the\nPokémon without fear.", - "stat_boost": "The {{enemyPokemon}}'s latent strength boosted one of its stats!" + "label": "Enfréntarse al Pokémon", + "tooltip": "(-) Batalla Difícil\n(+) Obtén un objeto", + "selected": "Te acercas al\nPokémon sin miedo.", + "stat_boost": "¡La fuerza latente de {{enemyPokemon}} aumentó una de sus estadísticas!" }, "2": { - "label": "Steal the Item", - "disabled_tooltip": "Your Pokémon need to know certain moves to choose this", - "tooltip": "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", - "selected": ".@d{32}.@d{32}.@d{32}$Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}!$You nabbed the item!" + "label": "Robar el objeto", + "disabled_tooltip": "Tus Pokémon necesitan conocer ciertos movimientos para elegir esto", + "tooltip": "(+) {{option2PrimaryName}} usa {{option2PrimaryMove}}", + "selected": ".@d{32}.@d{32}.@d{32}$Tu {{option2PrimaryName}} te ayuda y usa {{option2PrimaryMove}}!$¡Agarraste el obejto!" }, "3": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "You leave the strong Pokémon\nwith its prize and continue on." + "label": "Irse", + "tooltip": "(-) Ninguna recompensa", + "selected": "Dejas al Pokémon fuerte\ncon su premio y continúas." } } } \ No newline at end of file diff --git a/src/locales/es/pokemon-summary.json b/src/locales/es/pokemon-summary.json index e47335c83940..fe33c9418cc0 100644 --- a/src/locales/es/pokemon-summary.json +++ b/src/locales/es/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Salir", "memoString": "Naturaleza {{natureFragment}},\n{{metFragment}}", "metFragment": { - "normal": "encontrado al Nv. {{level}},\n{{biome}}.", + "normal": "encontrado al Nv. {{level}},\n{{biome}}, Oleada {{wave}}.", "apparently": "aparentemente encontrado al Nv. {{level}},\n{{biome}}." } -} \ No newline at end of file +} diff --git a/src/locales/es/status-effect.json b/src/locales/es/status-effect.json index eeb8c251e8a5..66534d11983f 100644 --- a/src/locales/es/status-effect.json +++ b/src/locales/es/status-effect.json @@ -40,7 +40,7 @@ "description": "dormir", "obtain": "¡{{pokemonNameWithAffix}}\nse ha dormido!", "obtainSource": "¡{{pokemonNameWithAffix}}\nse ha dormido\npor culpa de {{sourceText}}!", - "activation": "¡{{pokemonNameWithAffix}} está/ndormido como un tronco.", + "activation": "¡{{pokemonNameWithAffix}} está\ndormido como un tronco.", "overlap": "¡{{pokemonNameWithAffix}} ya\nestá dormido!", "heal": "¡{{pokemonNameWithAffix}} se despertó!" }, @@ -62,4 +62,4 @@ "overlap": "¡{{pokemonNameWithAffix}} ya\nestá quemado!", "heal": "¡{{pokemonNameWithAffix}} ya no\nestá quemado!" } -} \ No newline at end of file +} diff --git a/src/locales/fr/bgm-name.json b/src/locales/fr/bgm-name.json index e08b13347ebc..0ab2fa0e9db5 100644 --- a/src/locales/fr/bgm-name.json +++ b/src/locales/fr/bgm-name.json @@ -151,5 +151,6 @@ "mystery_encounter_weird_dream": "PDM EdC - Aiguille du Temps", "mystery_encounter_fun_and_games": "PDM EdC - Maitre Grodoudou", "mystery_encounter_gen_5_gts": "NB - GTS", - "mystery_encounter_gen_6_gts": "XY - GTS" + "mystery_encounter_gen_6_gts": "XY - GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json index aa7cfae1e315..d82af9b5ecac 100644 --- a/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json @@ -25,7 +25,7 @@ "accept": "Ce regard…\nBattons-nous.", "decline": "Je comprends, ton équpie m’a l’air lessivée.$Laisse-moi t’aider." }, - "title": "Épreuve de valeur", + "title": "Prouver sa valeur", "description": "Cette personne semble déterminée à vous donner un Œuf, qu’importe votre décision. Cependant, si vous parvenez à la battre, vous recevrez l’Œuf le plus rare.", "query": "Que voulez-vous faire ?", "option": { diff --git a/src/locales/fr/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/fr/mystery-encounters/bug-type-superfan-dialogue.json index fea70f893cb3..459f38917307 100644 --- a/src/locales/fr/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/fr/mystery-encounters/bug-type-superfan-dialogue.json @@ -16,10 +16,10 @@ "tooltip": "(+) Revecez un objet en cadeau", "disabled_tooltip": "Vous devez avoir au moins un Pokémon Insecte dans votre équipe pour choisir cette option.", "selected": "Vous lui montrez tous les types Insecte de votre équipe…", - "selected_0_to_1": "Oh ? T’en as que {{numBugTypes}}…$Pourquoi je gaspille ma salive à te parler…", - "selected_2_to_3": "Oh, t’as {{numBugTypes}} types Insecte !\nC’est pas si mal.$Tiens, voilà qui devrait t’aider dans ta quête pour en attraper encore plus !", - "selected_4_to_5": "Quoi ? T’as {{numBugTypes}} types Insecte ?\nSympa !$T’en est pas encore à mon niveau, mais je me reconnais un peu en toi !\n$Prends ça mon poulain, c’est cadeau !", - "selected_6": "Impressionnant ! {{numBugTypes}} types Insecte !\n$Tu dois vraiment les aimer presque autant que moi !$Tiens, accepte ceci en signe de notre camaraderie !" + "selected_0_to_1": "Oh ? T’as qu’{{numBugTypes}}…$Pourquoi je gaspille ma salive à te parler…", + "selected_2_to_3": "Oh, t’as {{numBugTypes}} !\nC’est pas si mal.$Tiens, voilà qui devrait t’aider dans ta quête pour en attraper encore plus !", + "selected_4_to_5": "Quoi ? T’as {{numBugTypes}} ?\nSympa !$T’en est pas encore à mon niveau, mais je me reconnais un peu en toi !\n$Prends ça mon poulain, c’est cadeau !", + "selected_6": "Impressionnant ! {{numBugTypes}} !\n$Tu dois vraiment les aimer presque autant que moi !$Tiens, accepte ceci en signe de notre camaraderie !" }, "3": { "label": "Donner un objet Insecte", @@ -34,5 +34,7 @@ "battle_won": "Tes connaissances et tes capacités ont totalement exploité nos faiblesses !$En remerciement de cette leçon, permets-moi\nd’apprendre une capacité Insecte à un de tes Pokémon !", "teach_move_prompt": "Sélectionnez une capacité à enseigner.", "confirm_no_teach": "T’es sûr·e de vouloir renoncer à une des ces incroyables capacités ?", - "outro": "Je te prédis un futur plein d’incroyables Insectes !\nJ’espère qu’on se reverra !$À plus !" + "outro": "Je te prédis un futur plein d’incroyables Insectes !\nJ’espère qu’on se reverra !$À plus !", + "numBugTypes_one": "{{count}} type Insecte", + "numBugTypes_other": "{{count}} types Insecte" } diff --git a/src/locales/fr/mystery-encounters/clowning-around-dialogue.json b/src/locales/fr/mystery-encounters/clowning-around-dialogue.json index cd606478fa31..c6ed0008eaf7 100644 --- a/src/locales/fr/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/fr/mystery-encounters/clowning-around-dialogue.json @@ -1,9 +1,9 @@ { "intro": "Mais c’est…@d{64} un clown ?", "speaker": "Clown", - "intro_dialogue": "T’as l’air clownesque, prépare-toi pour un combat magistral !$Je vais te montrer ce que sont les arts de la rue !", + "intro_dialogue": "Eh toi, tu m’as l’air clownesque !\nPrépare-toi pour un combat magistral !$Je vais te montrer ce que sont les arts de la rue !", "title": "Bouffonneries", - "description": "Quelque chose semble louche. Ce Clown a l’air très motivé de vous provoquer en combat, mais dans quel but ?\n\nLe {{blacephalonName}} est très étrange, comme s’il possédait @[TOOLTIP_TITLE]{des types et un talent inhabituels.}", + "description": "Quelque chose semble louche. Ce Clown a l’air très motivé de vous provoquer en combat, mais dans quel but ?\n\nSon {{blacephalonName}} est très étrange, comme s’il possédait @[TOOLTIP_TITLE]{des types et un talent inhabituels.}", "query": "Que voulez-vous faire ?", "option": { "1": { @@ -18,14 +18,14 @@ "2": { "label": "Rester de marbre", "tooltip": "(-) Agace le Clown\n(?) Affecte les objets de vos Pokémon", - "selected": "Ça se défile lâchement d’un duel exceptionnel ?\nTâte ma colère !", + "selected": "Ça se défile lâchement d’un duel exceptionnel ?\nDans ce cas, tâte à ma colère !", "selected_2": "Le {{blacephalonName}} du Clown utilise\nTour de Magie !$Tous les objets de {{switchPokemon}}\nsont échangés au hasard !", "selected_3": "Sombre imbécile, tombe dans mon piège !" }, "3": { "label": "Retouner les insultes", "tooltip": "(-) Agace le Clown\n(?) Affecte les types de vos Pokémon", - "selected": "Ça se défile lâchement d’un duel exceptionnel ?\nTâte ma colère !", + "selected": "Ça se défile lâchement d’un duel exceptionnel ?\nDans ce cas, tâte à ma colère !", "selected_2": "Le {{blacephalonName}} du Clown utilise\nune étrange capacité !$Tous les types de votre équipe\nsont échangés au hasard !", "selected_3": "Sombre imbécile, tombe dans mon piège !" } diff --git a/src/locales/fr/mystery-encounters/delibirdy-dialogue.json b/src/locales/fr/mystery-encounters/delibirdy-dialogue.json index 1404bd2b1acd..20c878db24f3 100644 --- a/src/locales/fr/mystery-encounters/delibirdy-dialogue.json +++ b/src/locales/fr/mystery-encounters/delibirdy-dialogue.json @@ -15,13 +15,13 @@ "2": { "label": "Donner de la nourriture", "tooltip": "(-) Donner une Baie ou une Résugraine aux {{delibirdName}}\n(+) Recevez un objet", - "select_prompt": "Sélectionner un objet à donner.", + "select_prompt": "Sélectionnez un objet à donner.", "selected": "Vous lancez la {{chosenItem}} aux {{delibirdName}},\nqui se lancent dans une grande délibération.$Ils reviennent ravis vers vous avec un cadeau !" }, "3": { "label": "Donner un objet", "tooltip": "(-) Donner un objet tenu aux {{delibirdName}}\n(+) Recevez un objet", - "select_prompt": "Sélectionner un objet à donner.", + "select_prompt": "Sélectionnez un objet à donner.", "selected": "Vous lancez l’objet {{chosenItem}} aux {{delibirdName}},\nqui se lancent dans une grande délibération.$Ils reviennent ravis vers vous avec un cadeau !" } }, diff --git a/src/locales/fr/mystery-encounters/department-store-sale-dialogue.json b/src/locales/fr/mystery-encounters/department-store-sale-dialogue.json index cb1763c6015e..fc06aa055823 100644 --- a/src/locales/fr/mystery-encounters/department-store-sale-dialogue.json +++ b/src/locales/fr/mystery-encounters/department-store-sale-dialogue.json @@ -1,26 +1,26 @@ { - "intro": "Il y a une dame avec des tas de sacs de courses.", + "intro": "Il y a une dame avec des tas de sacs de courses\nà ne savoir qu’en faire.", "speaker": "Cliente", "intro_dialogue": "Bonjour !\nToi aussi t’es là pour les incroyables promos ?$Il y a un coupon spécial que tu peux utiliser en échange\nd’un objet gratuit pendant toute la durée de la promo !$J’en ai un en trop.\nTiens, prends-le !", "title": "Promos au Centre Commercial", - "description": "Vous voyez des produits où que vous regardez ! Il y a 4 comptoirs auprès desquels vous pouvez dépenser ce coupon contre une grande variété d’objets. Que de choix !", + "description": "Tellement de choix que votre regard ne sait plus où se porter !\nIl y a 4 comptoirs auprès desquels vous pouvez dépenser ce coupon parmi une grande variété d’objets.", "query": "À quel comptoir se rendre ?", "option": { "1": { "label": "CT", - "tooltip": "(+) Boutique de CT" + "tooltip": "(+) CT dans la boutique" }, "2": { "label": "Accélérateurs", - "tooltip": "(+) Boutique d’Accélérateurs" + "tooltip": "(+) Accélérateurs dans la boutique" }, "3": { "label": "Objets de Combat", - "tooltip": "(+) Boutique d’objets de boost" + "tooltip": "(+) Objets de boost dans la boutique" }, "4": { "label": "Poké Balls", - "tooltip": "(+) Boutique de Poké Balls" + "tooltip": "(+) Poké Balls dans la boutique" } }, "outro": "Quelle affaire !\nVous devriez revenir y faire vos achats plus souvent." diff --git a/src/locales/fr/mystery-encounters/shady-vitamin-dealer-dialogue.json b/src/locales/fr/mystery-encounters/shady-vitamin-dealer-dialogue.json index 5c5972d7b1c3..95628cdfb847 100644 --- a/src/locales/fr/mystery-encounters/shady-vitamin-dealer-dialogue.json +++ b/src/locales/fr/mystery-encounters/shady-vitamin-dealer-dialogue.json @@ -2,18 +2,18 @@ "intro": "Un homme en manteau noir vous aborde.", "speaker": "Dealer", "intro_dialogue": ".@d{16}.@d{16}.@d{16}$J’ai de la bonne came pour toi, mais seulement\nsi t’as les thunes.$Assure-toi quand même que tes Pokémon\npuissent encaisser.", - "title": "Le Dealer d’Accélérateurs", - "description": "L’homme ouvre son manteau et vous laisse apercevoir des Accélérateurs pour Pokémon. Le tarif qu’il annonce semble être une bonne affaire. Peut-être même un peu trop belle…\nIl vous laisse le choix entre deux offres.", + "title": "Le Dealer d’accélérateurs", + "description": "L’homme ouvre son manteau et vous laisse apercevoir des accélérateurs pour Pokémon. Le tarif qu’il annonce semble être une bonne affaire. Peut-être même un peu trop belle…\nIl vous laisse le choix entre deux offres.", "query": "Laquelle choisissez-vous ?", "invalid_selection": "Le Pokémon doit être en bonne santé.", "option": { "1": { "label": "Offre douteuse", - "tooltip": "(-) Payer {{option1Money, money}}\n(-) Effets secondaires ?\n(+) Le Pokémon choisi gagne 2 Accélérateurs au hasard" + "tooltip": "(-) Payer {{option1Money, money}}\n(-) Effets secondaires ?\n(+) Le Pokémon choisi gagne 2 accélérateurs au hasard" }, "2": { "label": "Offre honnête", - "tooltip": "(-) Payer {{option2Money, money}}\n(+) Le Pokémon choisi gagne 2 Accélérateurs au hasard" + "tooltip": "(-) Payer {{option2Money, money}}\n(+) Le Pokémon choisi gagne 2 accélérateurs au hasard" }, "3": { "label": "Partir", diff --git a/src/locales/fr/pokemon-summary.json b/src/locales/fr/pokemon-summary.json index 01e712c84689..a038b3a51f94 100644 --- a/src/locales/fr/pokemon-summary.json +++ b/src/locales/fr/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Annuler", "memoString": "{{natureFragment}} de nature,\n{{metFragment}}", "metFragment": { - "normal": "rencontré au N.{{level}},\n{{biome}}.", + "normal": "rencontré au N.{{level}},\n{{biome}}, Vague {{wave}}.", "apparently": "apparemment rencontré au N.{{level}},\n{{biome}}." }, "natureFragment": { diff --git a/src/locales/it/bgm-name.json b/src/locales/it/bgm-name.json index 9cb9a60e2b94..5d943512d4bf 100644 --- a/src/locales/it/bgm-name.json +++ b/src/locales/it/bgm-name.json @@ -2,5 +2,6 @@ "mystery_encounter_weird_dream": "PMD EoS Temporal Spire", "mystery_encounter_fun_and_games": "PMD EoS Guildmaster Wigglytuff", "mystery_encounter_gen_5_gts": "BW GTS", - "mystery_encounter_gen_6_gts": "XY GTS" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/it/modifier-select-ui-handler.json b/src/locales/it/modifier-select-ui-handler.json index f9d93e9d9f03..627709998172 100644 --- a/src/locales/it/modifier-select-ui-handler.json +++ b/src/locales/it/modifier-select-ui-handler.json @@ -9,6 +9,6 @@ "checkTeamDesc": "Controlla la squadra Pokémon.", "rerollCost": "{{formattedMoney}}₽", "itemCost": "{{formattedMoney}}₽", - "continueNextWaveButton": "Continue", - "continueNextWaveDescription": "Continue to the next wave" + "continueNextWaveButton": "Continua", + "continueNextWaveDescription": "Continua alla onda successiva" } diff --git a/src/locales/it/mystery-encounter-messages.json b/src/locales/it/mystery-encounter-messages.json index 240eca57c5ad..4f8b528d18b6 100644 --- a/src/locales/it/mystery-encounter-messages.json +++ b/src/locales/it/mystery-encounter-messages.json @@ -3,5 +3,5 @@ "receive_money": "Hai ricevuto {{amount, number}}₽!", "affects_pokedex": "Influisce sul Pokédex", "cancel_option": "Torna alla scelta dell'incontro.", - "view_party_button": "View Party" + "view_party_button": "Info squadra" } diff --git a/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json index c96c0d5f3277..126d341a0959 100644 --- a/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json @@ -1,47 +1,47 @@ { - "intro": "An extremely strong trainer approaches you...", + "intro": "Un allenatore davvero forte ti si avvicina...", "buck": { - "intro_dialogue": "Yo, trainer! My name's Buck.$I have a super awesome proposal\nfor a strong trainer such as yourself!$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you can prove your strength as a trainer to me,\nI'll give you the rarer egg!", - "accept": "Whoooo, I'm getting fired up!", - "decline": "Darn, it looks like your\nteam isn't in peak condition.$Here, let me help with that." + "intro_dialogue": "Yo, allenatore! Sono Buck.$Ho una proposta super fantastica\nper allenatori forti come te!$Ho qui con me due uova Pokémon rare,\nma vorrei affidarne una a qualcuno.$Se mi darai prova delle tue doti di allenatore,\nti darò quella più rara!", + "accept": "Whoooo, comincio a scaldarmi!", + "decline": "Accidenti, pare che la tua\nsquadra non se la passi bene.$Lascia che ti aiuti." }, "cheryl": { - "intro_dialogue": "Hello, my name's Cheryl.$I have a particularly interesting request,\nfor a strong trainer such as yourself.$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you can prove your strength as a trainer to me,\nI'll give you the rarer Egg!", - "accept": "I hope you're ready!", - "decline": "I understand, it looks like your team\nisn't in the best condition at the moment.$Here, let me help with that." + "intro_dialogue": "Ciao, mi chiamo Cheryl.$Ho una particolare richiesta,\nmirata ad allenatori come te.$Ho qui con me due uova Pokémon rare,\nma vorrei affidarne una a qualcuno.$Se mi darai prova delle tue doti di allenatore,\nti darò quella più rara!", + "accept": "Spero tu sia pronto/a!", + "decline": "Capisco, mi sa che i tuoi Pokémon\nnon stanno benissimo al momento.$Ti do una mano." }, "marley": { - "intro_dialogue": "...@d{64} I'm Marley.$I have an offer for you...$I'm carrying two Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you're stronger than me,\nI'll give you the rarer Egg.", - "accept": "... I see.", - "decline": "... I see.$Your Pokémon look hurt...\nLet me help." + "intro_dialogue": "...@d{64} Sono Marley.$Ho da farti un'offerta...$Ho con me due uova Pokémon rare,\nma voglio regalarne una.$Se ti dimostri più forte di me,\nti darò la più rara tra le due.", + "accept": "... capisco.", + "decline": "...capisco.$I tuoi Pokémon hanno una brutta cera...\nLasciami aiutare." }, "mira": { - "intro_dialogue": "Hi! I'm Mira!$Mira has a request\nfor a strong trainer like you!$Mira has two rare Pokémon Eggs,\nbut Mira wants someone else to take one!$If you show Mira that you're strong,\nMira will give you the rarer Egg!", - "accept": "You'll battle Mira?\nYay!", - "decline": "Aww, no battle?\nThat's okay!$Here, Mira will heal your team!" + "intro_dialogue": "Ciaoo! Sono Mira!$Mira ha una richiesta\nper un allenatore forte come te!$Mira ha due uova Pokémon rare,\nma Mira vuole darne via una delle due!$Se dimostri a Mira che te la cavi,\nMira ti da la più rara!", + "accept": "Affronterai Mira?\nYuppi!", + "decline": "Aww, niente lotta?\nVa bene!$Ecco, ora Mira cura la tua squadra!" }, "riley": { - "intro_dialogue": "I'm Riley.$I have an odd proposal\nfor a strong trainer such as yourself.$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like to give one to another trainer.$If you can prove your strength to me,\nI'll give you the rarer Egg!", - "accept": "That look you have...\nLet's do this.", - "decline": "I understand, your team looks beat up.$Here, let me help with that." + "intro_dialogue": "Sono Riley.$Ho una strana proposta\nper gli allenatori forti.$Ho qui due uova Pokémon rare,\nma vorrei darne via una.$Dimostrami quanto vali,\ne ti darò la più rara!", + "accept": "Lo sguardo nei tuoi occhi...\nDiamoci dentro.", + "decline": "Capisco, la tua squadra non se la passa bene.$Lasciami rimediare." }, - "title": "A Trainer's Test", - "description": "It seems this trainer is willing to give you an Egg regardless of your decision. However, if you can manage to defeat this strong trainer, you'll receive a much rarer Egg.", - "query": "What will you do?", + "title": "La prova di un allenatore", + "description": "Pare che questo allenatore ti darà un uovo a prescindere dalla tua volontà. Tuttavia, sconfiggendolo, potrai riceverne uno nettamente più raro.", + "query": "Che cosa farai?", "option": { "1": { - "label": "Accept the Challenge", - "tooltip": "(-) Tough Battle\n(+) Gain a @[TOOLTIP_TITLE]{Very Rare Egg}" + "label": "Accetta la sfida", + "tooltip": "(-) Ardua lotta\n(+) Ottieni un @[TOOLTIP_TITLE]{Very Rare Egg}" }, "2": { - "label": "Refuse the Challenge", - "tooltip": "(+) Full Heal Party\n(+) Gain an @[TOOLTIP_TITLE]{Egg}" + "label": "Rifiuta la sfida", + "tooltip": "(+) Squadra completamente curata\n(+) Ottieni un @[TOOLTIP_TITLE]{Egg}" } }, "eggTypes": { - "rare": "a Rare Egg", - "epic": "an Epic Egg", - "legendary": "a Legendary Egg" + "rare": "un uovo raro", + "epic": "un uovo epico", + "legendary": "un uovo leggendario" }, - "outro": "{{statTrainerName}} gave you {{eggType}}!" -} \ No newline at end of file + "outro": "{{statTrainerName}} ti dona {{eggType}}!" +} diff --git a/src/locales/it/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/it/mystery-encounters/bug-type-superfan-dialogue.json index 5e4e8be90e79..2fdcd53e2959 100644 --- a/src/locales/it/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/it/mystery-encounters/bug-type-superfan-dialogue.json @@ -17,9 +17,9 @@ "disabled_tooltip": "You need at least 1 Bug Type Pokémon on your team to select this.", "selected": "You show the trainer all your Bug Type Pokémon...", "selected_0_to_1": "Huh? You only have {{numBugTypes}}...$Guess I'm wasting my breath on someone like you...", - "selected_2_to_3": "Hey, you've got {{numBugTypes}} Bug Types!\nNot bad.$Here, this might help you on your journey to catch more!", - "selected_4_to_5": "What? You have {{numBugTypes}} Bug Types?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", - "selected_6": "Whoa! {{numBugTypes}} Bug Types!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" + "selected_2_to_3": "Hey, you've got {{numBugTypes}}!\nNot bad.$Here, this might help you on your journey to catch more!", + "selected_4_to_5": "What? You have {{numBugTypes}}?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", + "selected_6": "Whoa! {{numBugTypes}}!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" }, "3": { "label": "Gift a Bug Item", @@ -34,5 +34,7 @@ "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", "teach_move_prompt": "Select a move to teach a Pokémon.", "confirm_no_teach": "You sure you don't want to learn one of these great moves?", - "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" + "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!", + "numBugTypes_one": "{{count}} Bug Type", + "numBugTypes_other": "{{count}} Bug Types" } diff --git a/src/locales/it/pokemon-summary.json b/src/locales/it/pokemon-summary.json index f6c9290f7832..81cd9a278b87 100644 --- a/src/locales/it/pokemon-summary.json +++ b/src/locales/it/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Annulla", "memoString": "Natura {{natureFragment}},\n{{metFragment}}", "metFragment": { - "normal": "incontrato al Lv.{{level}},\n{{biome}}.", + "normal": "incontrato al Lv.{{level}},\n{{biome}}, Onda {{wave}}.", "apparently": "apparentemente incontrato al Lv.{{level}},\n{{biome}}." } -} \ No newline at end of file +} diff --git a/src/locales/ja/bgm-name.json b/src/locales/ja/bgm-name.json index 9d9de665ad87..c0f454b692f7 100644 --- a/src/locales/ja/bgm-name.json +++ b/src/locales/ja/bgm-name.json @@ -151,5 +151,6 @@ "mystery_encounter_weird_dream": "ポケダン空 じげんのとう", "mystery_encounter_fun_and_games": "ポケダン空 おやかたプクリン", "mystery_encounter_gen_5_gts": "BW GTS", - "mystery_encounter_gen_6_gts": "XY GTS" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery! (デーリーデーリー!)" } diff --git a/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json index c96c0d5f3277..849e3a94cbbc 100644 --- a/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json @@ -44,4 +44,4 @@ "legendary": "a Legendary Egg" }, "outro": "{{statTrainerName}} gave you {{eggType}}!" -} \ No newline at end of file +} diff --git a/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json index 5e4e8be90e79..717587a22457 100644 --- a/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json @@ -17,8 +17,8 @@ "disabled_tooltip": "You need at least 1 Bug Type Pokémon on your team to select this.", "selected": "You show the trainer all your Bug Type Pokémon...", "selected_0_to_1": "Huh? You only have {{numBugTypes}}...$Guess I'm wasting my breath on someone like you...", - "selected_2_to_3": "Hey, you've got {{numBugTypes}} Bug Types!\nNot bad.$Here, this might help you on your journey to catch more!", - "selected_4_to_5": "What? You have {{numBugTypes}} Bug Types?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", + "selected_2_to_3": "Hey, you've got {{numBugTypes}}!\nNot bad.$Here, this might help you on your journey to catch more!", + "selected_4_to_5": "What? You have {{numBugTypes}}?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", "selected_6": "Whoa! {{numBugTypes}} Bug Types!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" }, "3": { @@ -34,5 +34,7 @@ "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", "teach_move_prompt": "Select a move to teach a Pokémon.", "confirm_no_teach": "You sure you don't want to learn one of these great moves?", - "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" + "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!", + "numBugTypes_one": "{{count}} Bug Type", + "numBugTypes_other": "{{count}} Bug Types" } diff --git a/src/locales/ja/pokemon-summary.json b/src/locales/ja/pokemon-summary.json index cf35befe6fd6..9465bcd346d8 100644 --- a/src/locales/ja/pokemon-summary.json +++ b/src/locales/ja/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "キャンセル", "memoString": "{{natureFragment}}な性格。\n{{metFragment}}", "metFragment": { - "normal": "{{biome}}で\nLv.{{level}}の時に出会った。", + "normal": "ラウンド{{wave}}に{{biome}}で\nLv.{{level}}の時に出会った。", "apparently": "{{biome}}で\nLv.{{level}}の時に出会ったようだ。" }, "natureFragment": { diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json index 6cf88cc4afce..987f816bbf67 100644 --- a/src/locales/ko/battle.json +++ b/src/locales/ko/battle.json @@ -105,5 +105,5 @@ "congratulations": "축하합니다!", "beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!", "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!", - "mysteryEncounterAppeared": "What's this?" + "mysteryEncounterAppeared": "어라?" } diff --git a/src/locales/ko/bgm-name.json b/src/locales/ko/bgm-name.json index b48c63db3416..9d97beca2a1c 100644 --- a/src/locales/ko/bgm-name.json +++ b/src/locales/ko/bgm-name.json @@ -147,8 +147,9 @@ "menu": "불가사의 던전 하늘의 탐험대 포켓몬 세계에 온 것을 환영한다!", "title": "불가사의 던전 하늘의 탐험대 메뉴 테마", - "mystery_encounter_weird_dream": "PMD EoS Temporal Spire", - "mystery_encounter_fun_and_games": "PMD EoS Guildmaster Wigglytuff", + "mystery_encounter_weird_dream": "불가사의 던전 하늘의 탐험대 시한의 탑 최상부", + "mystery_encounter_fun_and_games": "불가사의 던전 하늘의 탐험대 푸크린 길드", "mystery_encounter_gen_5_gts": "BW GTS", - "mystery_encounter_gen_6_gts": "XY GTS" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/ko/dialogue.json b/src/locales/ko/dialogue.json index ab9ed01bba2a..2665efe2517a 100644 --- a/src/locales/ko/dialogue.json +++ b/src/locales/ko/dialogue.json @@ -935,112 +935,112 @@ }, "stat_trainer_buck": { "encounter": { - "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", - "2": "I can feel my Pokémon shivering inside their Pokéballs!" + "1": "…말해두겠지만 나 강하다고!\n놀라기나 해라!", + "2": "몬스터볼 안에서 내 포켓몬들이 떨고 있다!\n이게 흥분해서 떨린다는 것이구나!" }, "victory": { - "1": "Heeheehee!\nSo hot, you!", - "2": "Heeheehee!\nSo hot, you!" + "1": "이히히!\n너 열정이 뜨거운걸!!", + "2": "이히히!\n너 열정이 뜨거운걸!!" }, "defeat": { - "1": "Whoa! You're all out of gas, I guess.", - "2": "Whoa! You're all out of gas, I guess." + "1": "우왓!\n연료가 다 떨어졌나 본데?", + "2": "우왓!\n연료가 다 떨어졌나 본데?" } }, "stat_trainer_cheryl": { "encounter": { - "1": "My Pokémon have been itching for a battle.", - "2": "I should warn you, my Pokémon can be quite rambunctious." + "1": "내 포켓몬들\n싸우고 싶어서 근질근질하고 있었어.", + "2": "내 포켓몬들\n꽤나 개구쟁이라니까." }, "victory": { - "1": "Striking the right balance of offense and defense... It's not easy to do.", - "2": "Striking the right balance of offense and defense... It's not easy to do." + "1": "공격하는 것과 방어하는 것\n그 밸런스 유지가 큰일이네.", + "2": "공격하는 것과 방어하는 것\n그 밸런스 유지가 큰일이네." }, "defeat": { - "1": "Do your Pokémon need any healing?", - "2": "Do your Pokémon need any healing?" + "1": "네 포켓몬들 다친 것 같은데?", + "2": "네 포켓몬들 다친 것 같은데?" } }, "stat_trainer_marley": { "encounter": { - "1": "... OK.\nI'll do my best.", - "2": "... OK.\nI... won't lose...!" + "1": "…좋아.\n최선을 다할게.", + "2": "…좋아.\n난…지지 않아…!" }, "victory": { - "1": "... Awww.", - "2": "... Awww." + "1": "…으윽.", + "2": "…으윽." }, "defeat": { - "1": "... Goodbye.", - "2": "... Goodbye." + "1": "…잘 가.", + "2": "…잘 가." } }, "stat_trainer_mira": { "encounter": { - "1": "You will be shocked by Mira!", - "2": "Mira will show you that Mira doesn't get lost anymore!" + "1": "너 깜짝 놀랄 거야!", + "2": "더는 헤매거나 하지 않는다는 것을 너에게 보여줄게!" }, "victory": { - "1": "Mira wonders if she can get very far in this land.", - "2": "Mira wonders if she can get very far in this land." + "1": "이거라면 이곳에서\n미루가 활약할 수 없을까.", + "2": "이거라면 이곳에서\n미루가 활약할 수 없을까." }, "defeat": { - "1": "Mira knew she would win!", - "2": "Mira knew she would win!" + "1": "미루가 이길 줄 알았어!", + "2": "미루가 이길 줄 알았어!" } }, "stat_trainer_riley": { "encounter": { - "1": "Battling is our way of greeting!", - "2": "We're pulling out all the stops to put your Pokémon down." + "1": "포켓몬 승부야말로\n우리들의 인사 방식이지!", + "2": "전력을 다해서\n네 포켓몬을 쓰러뜨리겠다." }, "victory": { - "1": "At times we battle, and sometimes we team up...$It's great how Trainers can interact.", - "2": "At times we battle, and sometimes we team up...$It's great how Trainers can interact." + "1": "싸우거나 편을 만들거나…\n트레이너들은 좋겠어.", + "2": "싸우거나 편을 만들거나…\n트레이너들은 좋겠어." }, "defeat": { - "1": "You put up quite the display.\nBetter luck next time.", - "2": "You put up quite the display.\nBetter luck next time." + "1": "꽤 인상적인 실력이었어.\n다음엔 더 잘해봐.", + "2": "꽤 인상적인 실력이었어.\n다음엔 더 잘해봐." } }, "winstrates_victor": { "encounter": { - "1": "That's the spirit! I like you!" + "1": "멋진 배짱이군! 마음에 들었다!" }, "victory": { - "1": "A-ha! You're stronger than I thought!" + "1": "아-앗! 생각보다 더 강하구나!" } }, "winstrates_victoria": { "encounter": { - "1": "My goodness! Aren't you young?$You must be quite the trainer to beat my husband, though.$Now I suppose it's my turn to battle!" + "1": "어머머! 생각보다 어리군요?!$우리 남편을 이기다니\n정말 굉장한 실력의 트레이너인가 보죠?$자 그럼 이번엔 저와 승부해요!" }, "victory": { - "1": "Uwah! Just how strong are you?!" + "1": "에구머니나!\n어쩜 그렇게 강하신가요?!" } }, "winstrates_vivi": { "encounter": { - "1": "You're stronger than Mom? Wow!$But I'm strong, too!\nReally! Honestly!" + "1": "엄마보다 강하다니 굉장하다!$하지만 나도 꽤 강하다고!\n진짜라니까?!" }, "victory": { - "1": "Huh? Did I really lose?\nSnivel... Grandmaaa!" + "1": "너무 분해…\n…훌쩍!$할머니이~이!!" } }, "winstrates_vicky": { "encounter": { - "1": "How dare you make my precious\ngranddaughter cry!$I see I need to teach you a lesson.\nPrepare to feel the sting of defeat!" + "1": "요 녀석~!\n우리 귀여운 손녀에게 무슨 짓을 한 게냐!$이렇게 된 이상 내가 직접\n네 포켓몬을 혼내줄 테니 각오해라잇!" }, "victory": { - "1": "Whoa! So strong!\nMy granddaughter wasn't lying." + "1": "에구! 정말 강하구나!\n우리 손녀 말이 진짜였구나." } }, "winstrates_vito": { "encounter": { - "1": "I trained together with my whole family,\nevery one of us!$I'm not losing to anyone!" + "1": "가족들끼리 포켓몬 수행을 했었어!\n누구에게도 지지 않는다고!" }, "victory": { - "1": "I was better than everyone in my family.\nI've never lost before..." + "1": "난 우리 가족 중에서도 제일 강했어.\n한 번도 져본 적이 없었는데…" } }, "brock": { @@ -2556,7 +2556,7 @@ }, "iono": { "encounter": { - "1": "자~ 오늘의 각오는~ 모야모야~?\n$...\n$그럼, 이제 시작해 볼까! \n$도전자님의 실력은 과연 과연~!?" + "1": "자~ 오늘의 각오는~ 모야모야~?\n$…\n$그럼, 이제 시작해 볼까! \n$도전자님의 실력은 과연 과연~!?" }, "victory": { "1": "너의 반짝임은 1000만볼트!" @@ -2676,7 +2676,7 @@ "1": "장하구나! 실로 견줄 자가 천하에 없도다!" }, "defeat": { - "1": "나의 마음에 상쾌한 바람이 지나갔다...\n$정말 대단한 노력이다!" + "1": "나의 마음에 상쾌한 바람이 지나갔다…\n$정말 대단한 노력이다!" } }, "kieran": { @@ -2684,7 +2684,7 @@ "1": "난 노력을 통해 강해지고 또 강해지지!\n$난 지지 않아." }, "victory": { - "1": "믿을 수 없어...\n$정말 재밌고 가슴 뛰는 배틀이었어!" + "1": "믿을 수 없어…\n$정말 재밌고 가슴 뛰는 배틀이었어!" }, "defeat": { "1": "세상에 마상에! 정말 멋진 배틀이었어!\n$네가 더 열심히 훈련할 시간이야." diff --git a/src/locales/ko/egg.json b/src/locales/ko/egg.json index a1c0739c97f5..b8550357dfa5 100644 --- a/src/locales/ko/egg.json +++ b/src/locales/ko/egg.json @@ -11,7 +11,7 @@ "gachaTypeLegendary": "레전더리 확률 업", "gachaTypeMove": "희귀 알 기술 확률 업", "gachaTypeShiny": "색이 다른 포켓몬 확률 업", - "eventType": "Mystery Event", + "eventType": "미스터리 이벤트", "selectMachine": "사용할 뽑기 기계를 골라주세요.", "notEnoughVouchers": "바우처가 충분하지 않습니다!", "tooManyEggs": "알을 너무 많이 갖고 있습니다!", diff --git a/src/locales/ko/modifier-select-ui-handler.json b/src/locales/ko/modifier-select-ui-handler.json index 89417c8c1ac6..ec9096622c50 100644 --- a/src/locales/ko/modifier-select-ui-handler.json +++ b/src/locales/ko/modifier-select-ui-handler.json @@ -9,6 +9,6 @@ "checkTeamDesc": "파티를 확인하거나 폼 변경 아이템을 사용합니다.", "rerollCost": "₽{{formattedMoney}}", "itemCost": "₽{{formattedMoney}}", - "continueNextWaveButton": "Continue", - "continueNextWaveDescription": "Continue to the next wave" + "continueNextWaveButton": "진행하기", + "continueNextWaveDescription": "다음 웨이브로 진행합니다." } diff --git a/src/locales/ko/modifier-type.json b/src/locales/ko/modifier-type.json index 15aaaf3a6d7e..f04dff7b1afb 100644 --- a/src/locales/ko/modifier-type.json +++ b/src/locales/ko/modifier-type.json @@ -66,21 +66,21 @@ "description": "자신의 모든 포켓몬의 레벨이 {{levels}}만큼 상승한다." }, "BaseStatBoosterModifierType": { - "description": "지니게 하면 {{stat}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다." + "description": "지니게 하면 {{stat}} 종족치를 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다." }, "PokemonBaseStatTotalModifierType": { - "name": "Shuckle Juice", - "description": "{{increaseDecrease}} all of the holder's base stats by {{statValue}}. You were {{blessCurse}} by the Shuckle.", + "name": "단단지주스", + "description": "모든 종족치를 {{statValue}}만큼 {{increaseDecrease}}. 단단지의 {{blessCurse}}[[를]] 받았다.", "extra": { - "increase": "Increases", - "decrease": "Decreases", - "blessed": "blessed", - "cursed": "cursed" + "increase": "올려준다", + "decrease": "떨어뜨린다", + "blessed": "축복", + "cursed": "저주" } }, "PokemonBaseStatFlatModifierType": { - "name": "Old Gateau", - "description": "Increases the holder's {{stats}} base stats by {{statValue}}. Found after a strange dream." + "name": "숲의양갱", + "description": "{{stats}} 종족치를 {{statValue}}만큼 올려준다. 이상한 꿈을 꾸고 얻었다." }, "AllPokemonFullHpRestoreModifierType": { "description": "자신의 포켓몬의 HP를 모두 회복한다." @@ -359,7 +359,7 @@ "description": "이 도구를 지닌 포켓몬은 턴이 끝나는 시점에 상태이상에 걸리지 않았다면 화상 상태가 된다." }, "BATON": { - "name": "바톤", + "name": "배턴", "description": "포켓몬을 교체할 때 효과를 넘겨줄 수 있으며, 함정의 영향을 받지 않게 함" }, "SHINY_CHARM": { @@ -417,11 +417,11 @@ "description": "야생 포켓몬이 합체되어 등장할 확률이 1% 추가된다." }, - "MYSTERY_ENCOUNTER_SHUCKLE_JUICE": { "name": "Shuckle Juice" }, - "MYSTERY_ENCOUNTER_BLACK_SLUDGE": { "name": "Black Sludge", "description": "The stench is so powerful that shops will only sell you items at a steep cost increase." }, - "MYSTERY_ENCOUNTER_MACHO_BRACE": { "name": "Macho Brace", "description": "Defeating a Pokémon grants the holder a Macho Brace stack. Each stack slightly boosts stats, with an extra bonus at max stacks." }, - "MYSTERY_ENCOUNTER_OLD_GATEAU": { "name": "Old Gateau", "description": "Increases the holder's {{stats}} stats by {{statValue}}." }, - "MYSTERY_ENCOUNTER_GOLDEN_BUG_NET": { "name": "Golden Bug Net", "description": "Imbues the owner with luck to find Bug Type Pokémon more often. Has a strange heft to it." } + "MYSTERY_ENCOUNTER_SHUCKLE_JUICE": { "name": "단단지주스" }, + "MYSTERY_ENCOUNTER_BLACK_SLUDGE": { "name": "검은진흙", "description": "악취가 너무 심한 나머지 상점 물건 가격이 크게 비싸진다." }, + "MYSTERY_ENCOUNTER_MACHO_BRACE": { "name": "교정깁스", "description": "포켓몬을 쓰러뜨리면 교정깁스 스택을 얻는다. 스택이 올라갈수록 능력치가 약간 올라가고, 최대 스택에서 추가 보너스를 얻는다." }, + "MYSTERY_ENCOUNTER_OLD_GATEAU": { "name": "숲의양갱", "description": "{{stats}} 종족치를 {{statValue}}만큼 올려준다." }, + "MYSTERY_ENCOUNTER_GOLDEN_BUG_NET": { "name": "황금잠자리채", "description": "벌레 타입 포켓몬을 더 자주 만날 수 있는 행운을 부여한다. 묘한 무게감이 든다." } }, "SpeciesBoosterItem": { "LIGHT_BALL": { diff --git a/src/locales/ko/mystery-encounter-messages.json b/src/locales/ko/mystery-encounter-messages.json index aeffe2d13fa7..8af1789090fd 100644 --- a/src/locales/ko/mystery-encounter-messages.json +++ b/src/locales/ko/mystery-encounter-messages.json @@ -1,7 +1,7 @@ { "paid_money": "₽{{amount, number}}[[를]] 를 지불했다.", "receive_money": "₽{{amount, number}}[[를]] 받았다!", - "affects_pokedex": "Affects Pokédex Data", - "cancel_option": "Return to encounter option select.", - "view_party_button": "View Party" + "affects_pokedex": "도감에 추가 가능", + "cancel_option": "조우 선택지로 돌아가기", + "view_party_button": "파티 확인" } diff --git a/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json index c96c0d5f3277..9b36aa0ff625 100644 --- a/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json @@ -1,47 +1,47 @@ { - "intro": "An extremely strong trainer approaches you...", + "intro": "무척 강해보이는 트레이너가 다가왔다…", "buck": { - "intro_dialogue": "Yo, trainer! My name's Buck.$I have a super awesome proposal\nfor a strong trainer such as yourself!$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you can prove your strength as a trainer to me,\nI'll give you the rarer egg!", - "accept": "Whoooo, I'm getting fired up!", - "decline": "Darn, it looks like your\nteam isn't in peak condition.$Here, let me help with that." + "intro_dialogue": "여-, 트레이너!\n나는 맥이라고해.$너처럼 강한 트레이너를 만난 김에\n엄청난 제안을 하나 할게!$희귀한 알을 두 개 가지고 있는데,\n하나를 누군가 맡아줬으면 하거든.$네가 나를 이긴다면,\n더 희귀한 알을 너한테 맡기도록 할게!", + "accept": "좋아, 불타오르는걸!", + "decline": "쳇, 아무래도 네 포켓몬들 컨디션이 별로인 거 같구나.$자, 내가 좀 도와줄게." }, "cheryl": { - "intro_dialogue": "Hello, my name's Cheryl.$I have a particularly interesting request,\nfor a strong trainer such as yourself.$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you can prove your strength as a trainer to me,\nI'll give you the rarer Egg!", - "accept": "I hope you're ready!", - "decline": "I understand, it looks like your team\nisn't in the best condition at the moment.$Here, let me help with that." + "intro_dialogue": "안녕, 내 이름은 모미야.$너처럼 강한 트레이너가\n관심 있을 만한 제안이 있어.$희귀한 알을 두 개 가지고 있는데,\n하나를 누가 맡아줬으면 해.$네가 승부에서 이긴다면,\n더 희귀한 알을 너한테 맡기도록 할게!", + "accept": "준비 됐겠지!", + "decline": "알았어.\n네 포켓몬들 좀 지쳐 보이네.$자, 내가 좀 도와줄게." }, "marley": { - "intro_dialogue": "...@d{64} I'm Marley.$I have an offer for you...$I'm carrying two Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you're stronger than me,\nI'll give you the rarer Egg.", - "accept": "... I see.", - "decline": "... I see.$Your Pokémon look hurt...\nLet me help." + "intro_dialogue": "…@d{64}난 미정이야.$제안이 있어…$알 두 개가 있는데,\n하나를 다른 사람이 맡아줬으면 해.$네가 나보다 강하다면,\n더 희귀한 알을 줄게.", + "accept": "…알겠어.", + "decline": "…알겠어.$네 포켓몬 좀 다쳤구나…\n내가 도와줄게." }, "mira": { - "intro_dialogue": "Hi! I'm Mira!$Mira has a request\nfor a strong trainer like you!$Mira has two rare Pokémon Eggs,\nbut Mira wants someone else to take one!$If you show Mira that you're strong,\nMira will give you the rarer Egg!", - "accept": "You'll battle Mira?\nYay!", - "decline": "Aww, no battle?\nThat's okay!$Here, Mira will heal your team!" + "intro_dialogue": "안녕!\n나는 미루!$너처럼 강한 트레이너에게\n미루가 제안이 있어!$미루가 지금 희귀한 알 두개가 있거든\n하나를 다른 사람이 맡아줬으면 좋겠어!$미루에게 네가 더 강하다는걸 보여주면,\n미루가 더 희귀한 알을 줄게!", + "accept": "승부하는 거지?\n야호!", + "decline": "어라, 승부 안 하는 거야?\n괜찮아!$미루가 네 포켓몬들을 치료해 줄게!" }, "riley": { - "intro_dialogue": "I'm Riley.$I have an odd proposal\nfor a strong trainer such as yourself.$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like to give one to another trainer.$If you can prove your strength to me,\nI'll give you the rarer Egg!", - "accept": "That look you have...\nLet's do this.", - "decline": "I understand, your team looks beat up.$Here, let me help with that." + "intro_dialogue": "나는 현이.$너처럼 강한 트레이너에게\n별난 제안을 하나 할게.$지금 두 개의 희귀한 알이 있는데,\n하나를 다른 트레이너에게 맡기고 싶어.$네가 승부에서 이긴다면,\n더 희귀한 알을 줄게!", + "accept": "그 얼굴…\n승부다.", + "decline": "알겠어, 네 포켓몬들 지쳐 보이는구나.$자, 내가 도와줄게." }, - "title": "A Trainer's Test", - "description": "It seems this trainer is willing to give you an Egg regardless of your decision. However, if you can manage to defeat this strong trainer, you'll receive a much rarer Egg.", - "query": "What will you do?", + "title": "선배 트레이너의 테스트", + "description": "이 트레이너는 승부를 받아들이든 거절하든 알을 줄 것 같습니다.\n하지만 이 강한 트레이너를 쓰러트린다면 훨씬 더 희귀한 알을 받을 수 있을 겁니다.", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Accept the Challenge", - "tooltip": "(-) Tough Battle\n(+) Gain a @[TOOLTIP_TITLE]{Very Rare Egg}" + "label": "승부한다", + "tooltip": "(-) 힘든 전투\n(+) @[TOOLTIP_TITLE]{매우 희귀한 알} 획득" }, "2": { - "label": "Refuse the Challenge", - "tooltip": "(+) Full Heal Party\n(+) Gain an @[TOOLTIP_TITLE]{Egg}" + "label": "승부를 거절한다", + "tooltip": "(+) 파티 전체 회복\n(+) @[TOOLTIP_TITLE]{알} 획득" } }, "eggTypes": { - "rare": "a Rare Egg", - "epic": "an Epic Egg", - "legendary": "a Legendary Egg" + "rare": "레어 알", + "epic": "에픽 알", + "legendary": "레전더리 알" }, - "outro": "{{statTrainerName}} gave you {{eggType}}!" -} \ No newline at end of file + "outro": "{{statTrainerName}}[[가]] {{eggType}}[[를]] 줬다!" +} diff --git a/src/locales/ko/mystery-encounters/absolute-avarice-dialogue.json b/src/locales/ko/mystery-encounters/absolute-avarice-dialogue.json index 1d675d936609..5e039af8f089 100644 --- a/src/locales/ko/mystery-encounters/absolute-avarice-dialogue.json +++ b/src/locales/ko/mystery-encounters/absolute-avarice-dialogue.json @@ -1,25 +1,25 @@ { - "intro": "A {{greedentName}} ambushes you\nand steals your party's berries!", - "title": "Absolute Avarice", - "description": "The {{greedentName}} has caught you totally off guard now all your berries are gone!\n\nThe {{greedentName}} looks like it's about to eat them when it pauses to look at you, interested.", - "query": "What will you do?", + "intro": "갑자기 나타난 {{greedentName}}[[가]]\n나무열매를 훔쳐갔다!", + "title": "끝없는 욕심", + "description": "당신이 방심한 틈에 {{greedentName}}[[가]] 나무열매를 모두 훔쳐 가버렸습니다!\n\n{{greedentName}}[[는]] 나무열매를 먹으려다가,\n잠시 멈춰서 당신을 재밌다는 듯 바라보고 있습니다.", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Battle It", - "tooltip": "(-) Tough Battle\n(+) Rewards from its Berry Hoard", - "selected": "The {{greedentName}} stuffs its cheeks\nand prepares for battle!", - "boss_enraged": "{{greedentName}}'s fierce love for food has it incensed!", - "food_stash": "It looks like the {{greedentName}} was guarding an enormous stash of food!$@s{item_fanfare}Each Pokémon in your party gains a {{foodReward}}!" + "label": "싸운다", + "tooltip": "(-) 어려운 배틀\n(+) 비축한 나무열매 획득", + "selected": "{{greedentName}}[[는]] 볼을 빵빵하게 채우고 덤벼들었다!", + "boss_enraged": "{{greedentName}}[[는]] 식탐으로 가득 차 있다!", + "food_stash": "{{greedentName}}[[는]] 많은 음식을 가지고 있는 것 같다!$@s{item_fanfare}모든 포켓몬이 각각 {{foodReward}}[[를]] 얻었다!" }, "2": { - "label": "Reason with It", - "tooltip": "(+) Regain Some Lost Berries", - "selected": "Your pleading strikes a chord with the {{greedentName}}.$It doesn't give all your berries back, but still tosses a few in your direction." + "label": "설득한다", + "tooltip": "(+) 나무열매 일부를 돌려받음", + "selected": "{{greedentName}}의 마음이 움직인 것 같다.$훔쳐간 나무열매 일부를 이쪽으로 던졌다." }, "3": { - "label": "Let It Have the Food", - "tooltip": "(-) Lose All Berries\n(?) The {{greedentName}} Will Like You", - "selected": "The {{greedentName}} devours the entire\nstash of berries in a flash!$Patting its stomach,\nit looks at you appreciatively.$Perhaps you could feed it\nmore berries on your adventure...$@s{level_up_fanfare}The {{greedentName}} wants to join your party!" + "label": "먹게 둔다", + "tooltip": "(-) 모든 나무열매를 잃음\n(?) {{greedentName}}[[가]] 매우 좋아함", + "selected": "{{greedentName}}[[가]] 눈 깜짝할 새에\n모든 나무열매를 먹어치웠다!$흡족하게 이쪽을 바라보면서\n빵빵해진 배를 두드렸다.$아마 앞으로 식비가 만만치 않을 것 같다…$@s{level_up_fanfare}{{greedentName}}[[는]] 동료가 되고 싶어하는 것 같다!" } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/an-offer-you-cant-refuse-dialogue.json b/src/locales/ko/mystery-encounters/an-offer-you-cant-refuse-dialogue.json index 6f2a39306e15..2eefd1641823 100644 --- a/src/locales/ko/mystery-encounters/an-offer-you-cant-refuse-dialogue.json +++ b/src/locales/ko/mystery-encounters/an-offer-you-cant-refuse-dialogue.json @@ -1,26 +1,26 @@ { - "intro": "You're stopped by a rich looking boy.", - "speaker": "Rich Boy", - "intro_dialogue": "Good day to you.$I can't help but notice that your\n{{strongestPokemon}} looks positively divine!$I've always wanted to have a Pokémon like that!$I'd pay you handsomely,\nand also give you this old bauble!", - "title": "An Offer You Can't Refuse", - "description": "You're being offered a @[TOOLTIP_TITLE]{Shiny Charm} and {{price, money}} for your {{strongestPokemon}}!\n\nIt's an extremely good deal, but can you really bear to part with such a strong team member?", - "query": "What will you do?", + "intro": "금수저 도련님에게 붙들렸다!", + "speaker": "금수저 도련님", + "intro_dialogue": "안녕하세요.$당신의 {{strongestPokemon}}[[가]] 정말 멋져서 그냥 지나칠 수가 없네요!$항상 저런 애완 포켓몬을 갖고 싶었거든요!$제가 오래된 장신구랑\n돈도 함께 섭섭지 않게 챙겨주도록 하죠!", + "title": "거절할 수 없는 제안", + "description": "{{strongestPokemon}}[[를]] 넘기는 대신\n@[TOOLTIP_TITLE]{빛나는부적}과 {{price, money}}을 준다고 합니다!\n\n매우 좋은 조건이지만,\n이렇게 든든한 동료를 보내줘야 할까요?", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Accept the Deal", - "tooltip": "(-) Lose {{strongestPokemon}}\n(+) Gain a @[TOOLTIP_TITLE]{Shiny Charm}\n(+) Gain {{price, money}}", - "selected": "Wonderful!@d{32} Come along, {{strongestPokemon}}!$It's time to show you off to everyone at the yacht club!$They'll be so jealous!" + "label": "제안을 받아들인다", + "tooltip": "(-) {{strongestPokemon}}[[를]] 보내줌\n(+) @[TOOLTIP_TITLE]{빛나는부적}[[를]] 획득\n(+) {{price, money}}[[를]] 획득", + "selected": "좋아요!@d{32} 이리와, {{strongestPokemon}}!$요트 클럽에 가서 다른 사람들에게 자랑해야겠어!$다들 엄청 부러워하겠는걸!" }, "2": { - "label": "Extort the Kid", - "tooltip": "(+) {{option2PrimaryName}} uses {{moveOrAbility}}\n(+) Gain {{price, money}}", - "tooltip_disabled": "Your Pokémon need to have certain moves or abilities to choose this", - "selected": "My word, we're being robbed, {{liepardName}}!$You'll be hearing from my lawyers for this!" + "label": "꼬마 녀석을 혼내준다", + "tooltip": "(+) {{option2PrimaryName}}의 {{moveOrAbility}} 사용\n(+) {{price, money}} 획득", + "tooltip_disabled": "이 선택지를 선택하려면 포켓몬이 특정 기술이나 능력을 가지고 있어야 한다.", + "selected": "말도 안 돼!\n{{liepardName}}, 우리 지금 삥 뜯긴 거야?!$너…!\n곧 우리 변호사 연락을 받게 될 거다!" }, "3": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "What a rotten day...$Ah, well. Let's return to the yacht club then, {{liepardName}}." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "재수 없는 날이네요....$뭐, 어때. 요트 클럽이나 가자, {{liepardName}}." } } } diff --git a/src/locales/ko/mystery-encounters/berries-abound-dialogue.json b/src/locales/ko/mystery-encounters/berries-abound-dialogue.json index 26eae2c6b880..debcfd6ac341 100644 --- a/src/locales/ko/mystery-encounters/berries-abound-dialogue.json +++ b/src/locales/ko/mystery-encounters/berries-abound-dialogue.json @@ -1,26 +1,26 @@ { - "intro": "There's a huge berry bush\nnear that Pokémon!", - "title": "Berries Abound", - "description": "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but it looks strong. Perhaps a fast Pokémon could grab some berries without getting caught?", - "query": "What will you do?", - "berries": "Berries!", + "intro": "포켓몬 근처에 열매가\n달린 거대한 나무가 있다!", + "title": "나무열매 풍년", + "description": "나무열매 덤불을 지키고 있는 강력한 포켓몬이 있는 것 같습니다.\n그냥 싸워 볼 수도 있겠지만, 조금 강해 보입니다.\n혹시 빠른 포켓몬이 있다면 잡히지 않고도 열매를 가져올 수 있지 않을까요?", + "query": "어떻게 하시겠습니까?", + "berries": "나무열매!", "option": { "1": { - "label": "Battle the Pokémon", - "tooltip": "(-) Hard Battle\n(+) Gain Berries", - "selected": "You approach the\nPokémon without fear." + "label": "싸운다", + "tooltip": "(-) 어려운 배틀\n(+) 나무열매 획득", + "selected": "용감하게 포켓몬에게 다가갔다." }, "2": { - "label": "Race to the Bush", - "tooltip": "(-) {{fastestPokemon}} Uses its Speed\n(+) Gain Berries", - "selected": "Your {{fastestPokemon}} races for the berry bush!$It manages to nab {{numBerries}} before the {{enemyPokemon}} can react!$You quickly retreat with your newfound prize.", - "selected_bad": "Your {{fastestPokemon}} races for the berry bush!$Oh no! The {{enemyPokemon}} was faster and blocked off the approach!", - "boss_enraged": "The opposing {{enemyPokemon}} has become enraged!" + "label": "덤불을 향해 뛴다", + "tooltip": "(-) {{fastestPokemon}}의 스피드를 활용\n(+) 나무열매 획득", + "selected": "{{fastestPokemon}}[[가]] 나무열매 덤불을 향해 달려간다!${{enemyPokemon}}[[가]] 반응하기 전에 나무열매 {{numBerries}}개를 낚아챘다!$빼앗은 열매를 들고 재빨리 도망쳤다.", + "selected_bad": "{{fastestPokemon}}[[가]] 나무열매 덤불을 향해 달려간다!$이런! {{enemyPokemon}}[[가]] 더 빨라서 가로막혔다!", + "boss_enraged": "상대 {{enemyPokemon}}[[는]] 분노했다!" }, "3": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "You leave the strong Pokémon\nwith its prize and continue on." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "강한 포켓몬과 열매를 남겨둔 채 계속 나아갔다." } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/ko/mystery-encounters/bug-type-superfan-dialogue.json index 5e4e8be90e79..aaeb2e4fc6ea 100644 --- a/src/locales/ko/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/ko/mystery-encounters/bug-type-superfan-dialogue.json @@ -1,38 +1,40 @@ { - "intro": "An unusual trainer with all kinds of Bug paraphernalia blocks your way!", - "intro_dialogue": "Hey, trainer! I'm on a mission to find the rarest Bug Pokémon in existence!$You must love Bug Pokémon too, right?\nEveryone loves Bug Pokémon!", - "title": "The Bug-Type Superfan", - "speaker": "Bug-Type Superfan", - "description": "The trainer prattles, not even waiting for a response...\n\nIt seems the only way to get out of this situation is by catching the trainer's attention!", - "query": "What will you do?", + "intro": "온갖 종류의 곤충채집 장비를 가진\n특이한 트레이너가 길을 막아섰다!", + "intro_dialogue": "거기, 트레이너!\n난 세상에서 가장 희귀한 벌레 포켓몬을 찾고 있어!$너도 벌레 타입 포켓몬 좋아하지?\n모두 벌레 타입 포켓몬을 좋아하니깐!", + "title": "벌레 타입 포켓몬 매니아", + "speaker": "벌레 타입 매니아", + "description": "이 트레이너는 대답할 틈도 없이 계속 떠들어대고 있습니다…\n\n이 상황에서 벗어나려면, 트레이너의 주의를 돌려야 할 것 같습니다!", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Offer to Battle", - "tooltip": "(-) Challenging Battle\n(+) Teach a Pokémon a Bug Type Move", - "selected": "A challenge, eh?\nMy bugs are more than ready for you!" + "label": "승부한다", + "tooltip": "(-) 포켓몬 배틀 도전\n(+) 벌레 타입 기술을 가르침", + "selected": "나한테 도전하겠다고?\n내 벌레 포켓몬들은 이미 준비됐어!" }, "2": { - "label": "Show Your Bug Types", - "tooltip": "(+) Receive a Gift Item", - "disabled_tooltip": "You need at least 1 Bug Type Pokémon on your team to select this.", - "selected": "You show the trainer all your Bug Type Pokémon...", - "selected_0_to_1": "Huh? You only have {{numBugTypes}}...$Guess I'm wasting my breath on someone like you...", - "selected_2_to_3": "Hey, you've got {{numBugTypes}} Bug Types!\nNot bad.$Here, this might help you on your journey to catch more!", - "selected_4_to_5": "What? You have {{numBugTypes}} Bug Types?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", - "selected_6": "Whoa! {{numBugTypes}} Bug Types!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" + "label": "벌레 포켓몬을 보여준다", + "tooltip": "(+) 아이템 획득", + "disabled_tooltip": "벌레 타입 포켓몬이 없다.", + "selected": "트레이너에게 가지고 있는 모든 벌레 포켓몬을 보여주었다...", + "selected_0_to_1": "응? 너 {{numBugTypes}}마리밖에 안 갖고 있구나...$너 같은 일반인한테 떠들었다니, 쓸데없이 입만 아팠네…", + "selected_2_to_3": "어라, 너 {{numBugTypes}}마리 갖고 있구나!\n나쁘지 않아.$내가 더 많이 잡는 데 도움이 될만한 걸 줄게!", + "selected_4_to_5": "뭐야? 너 벌레 타입을 {{numBugTypes}}마리나 갖고 있네?\n좋아!$아직 수준엔 못 미치지만, 너한테 내 옛날 모습이 보여!\n$이걸 받거라, 내 제자여…!", + "selected_6": "우와!\n{{numBugTypes}}마리 모두 벌레 타입!$너도 나만큼 벌레 타입을 사랑하는 거지?$이걸 가져가!\n동지의 증표로 나눠줄게!" }, "3": { - "label": "Gift a Bug Item", - "tooltip": "(-) Give the trainer a {{requiredBugItems}}\n(+) Receive a Gift Item", - "disabled_tooltip": "You need to have a {{requiredBugItems}} to select this.", - "select_prompt": "Select an item to give.", - "invalid_selection": "Pokémon doesn't have that kind of item.", - "selected": "You hand the trainer a {{selectedItem}}.", - "selected_dialogue": "Whoa! A {{selectedItem}}, for me?\nYou're not so bad, kid!$As a token of my appreciation,\nI want you to have this special gift!$It's been passed all through my family, and now I want you to have it!" + "label": "벌레 아이템을 준다", + "tooltip": "(-) 트레이너에게 {{requiredBugItems}}[[를]] 건네줌\n(+) 아이템 획득", + "disabled_tooltip": "{{requiredBugItems}}[[를]] 가지고 있어야 한다.", + "select_prompt": "건네줄 아이템을 선택하세요.", + "invalid_selection": "포켓몬이 해당하는 아이템을 갖고 있지 않다.", + "selected": "트레이너에게 {{selectedItem}}[[를]] 건넸다.", + "selected_dialogue": "우와! {{selectedItem}}, 나한테 주는 거야?\n너 꽤 괜찮은 꼬마구나!$고마우니깐,\n나도 너한테 특별한 선물을 줄게!$가보로 전해져 내려온 귀한 물건이지만\n너한테 주고 싶어!" } }, - "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", - "teach_move_prompt": "Select a move to teach a Pokémon.", - "confirm_no_teach": "You sure you don't want to learn one of these great moves?", - "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" + "battle_won": "너의 지식과 기술들이 우리 약점을 완벽하게 파고들었어.$귀중한 경험을 했으니,\n나도 벌레 타입 기술을 하나 가르쳐 줄게!", + "teach_move_prompt": "기술을 가르칠 포켓몬을 선택하세요.", + "confirm_no_teach": "너, 정말로 이 대단한 기술들이 필요없는 거야?", + "outro": "나중에 멋진 벌레 포켓몬을 만나길 바라며!\n다시 만날 때까지!$사사삭!", + "numBugTypes_one": "{{count}} Bug Type", + "numBugTypes_other": "{{count}} Bug Types" } diff --git a/src/locales/ko/mystery-encounters/clowning-around-dialogue.json b/src/locales/ko/mystery-encounters/clowning-around-dialogue.json index 177812408387..f1d8fed6fbf6 100644 --- a/src/locales/ko/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/ko/mystery-encounters/clowning-around-dialogue.json @@ -1,34 +1,34 @@ { - "intro": "It's...@d{64} a clown?", - "speaker": "Clown", - "intro_dialogue": "Bumbling buffoon, brace for a brilliant battle!\nYou'll be beaten by this brawling busker!", - "title": "Clowning Around", - "description": "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe {{blacephalonName}} is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", - "query": "What will you do?", + "intro": "어라...@d{64}어릿광대인 걸까?", + "speaker": "어릿광대", + "intro_dialogue": "거기 있는 어리버리한 바보씨, 화려한 배틀을 맞이할 각오를 하시길!\n이 싸움꾼 광대가 당신을 쓰러트리겠습니다!", + "title": "어릿광대의 장난", + "description": "이번 상대는 뭔가 이상합니다.\n어릿광대가 당신을 전투에 끌어들이고 싶어하는 것 같은데, 무슨 목적일까요?\n\n{{blacephalonName}}[[은]] 더욱 수상합니다.\n마치 @[TOOLTIP_TITLE]{이상한 타입과 능력}을 가진 것 같습니다.", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Battle the Clown", - "tooltip": "(-) Strange Battle\n(?) Affects Pokémon Abilities", - "selected": "Your pitiful Pokémon are poised for a pathetic performance!", - "apply_ability_dialogue": "A sensational showcase!\nYour savvy suits a sensational skill as spoils!", - "apply_ability_message": "The clown is offering to permanently Skill Swap one of your Pokémon's ability to {{ability}}!", - "ability_prompt": "Would you like to permanently teach a Pokémon the {{ability}} ability?", - "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}} gained the {{ability}} ability!" + "label": "어릿광대와 싸운다", + "tooltip": "(-) 이상한 배틀\n(?) 포켓몬의 특성 조정", + "selected": "당신의 불쌍한 포켓몬들이 한심한 공연을 할 준비가 된 것 같군요!", + "apply_ability_dialogue": "센세이셔널한 쇼였습니다!\n당신의 멋진 기지에는 이 센세이셔널한 보상이 잘 어울릴 것 같군요!", + "apply_ability_message": "어릿광대가 포켓몬 한 마리의 특성을 영구적으로 {{ability}}로 교환해 주겠다고 제안했다!", + "ability_prompt": "포켓몬의 특성을 영구적으로 {{ability}} 특성으로 바꾸시겠습니까?", + "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}}[[는]] {{ability}} 특성을 얻었다!" }, "2": { - "label": "Remain Unprovoked", - "tooltip": "(-) Upsets the Clown\n(?) Affects Pokémon Items", - "selected": "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - "selected_2": "The clown's {{blacephalonName}} uses Trick!\nAll of your {{switchPokemon}}'s items were randomly swapped!", - "selected_3": "Flustered fool, fall for my flawless deception!" + "label": "도발에 응하지 않는다", + "tooltip": "(-) 광대가 화를 냄\n(?) 포켓몬의 아이템 조정", + "selected": "한심한 겁쟁이로군요? 즐거운 배틀을 거부하다니!\n이러면 한 방 먹이고 싶어지잖습니까!", + "selected_2": "광대의 {{blacephalonName}}[[가]] 무언가 사용한 것 같다!\n{{switchPokemon}}의 모든 아이템이 랜덤하게 재조정된다!", + "selected_3": "당황한 바보같은 표정! 완벽한 저의 한 수를 즐겨주시길!" }, "3": { - "label": "Return the Insults", - "tooltip": "(-) Upsets the Clown\n(?) Affects Pokémon Types", - "selected": "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - "selected_2": "The clown's {{blacephalonName}} uses a strange move!\nAll of your team's types were randomly swapped!", - "selected_3": "Flustered fool, fall for my flawless deception!" + "label": "조롱을 되돌려준다", + "tooltip": "(-) 광대가 화를 냄\n(?) 포켓몬의 타입 조정", + "selected": "한심한 겁쟁이로군요? 즐거운 배틀을 거부하다니!\n이러면 한 방 먹이고 싶어지잖습니까!", + "selected_2": "광대의 {{blacephalonName}}[[가]] 무언가 사용한 것 같다!\n멤버 포켓몬들의 타입이 랜덤하게 재조정된다!", + "selected_3": "당황한 바보같은 표정! 완벽한 저의 한 수를 즐겨주시길!" } }, - "outro": "The clown and his cohorts\ndisappear in a puff of smoke." + "outro": "어릿광대는 동료 포켓몬과 함께 연기 속으로 사라져 버렸다." } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json index 8e2883ecb161..b96417274ff3 100644 --- a/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json @@ -1,27 +1,27 @@ { - "intro": "An {{oricorioName}} dances sadly alone, without a partner.", - "title": "Dancing Lessons", - "description": "The {{oricorioName}} doesn't seem aggressive, if anything it seems sad.\n\nMaybe it just wants someone to dance with...", - "query": "What will you do?", + "intro": "{{oricorioName}}[[가]] 외로이 혼자 춤을 추고 있다.\n주변에 파트너도 없는 것 같다!", + "title": "댄스 댄스 레볼루션", + "description": "{{oricorioName}}[[는]] 공격적이진 않아 보입니다.\n오히려 슬퍼 보이기까지 하네요.\n\n그저 함께 춤출 누군가를\n원하고 있는지도 모릅니다….", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Battle It", - "tooltip": "(-) Tough Battle\n(+) Gain a Baton", - "selected": "The {{oricorioName}} is distraught and moves to defend itself!", - "boss_enraged": "The {{oricorioName}}'s fear boosted its stats!" + "label": "싸운다", + "tooltip": "(-) 어려운 배틀\n(+) 배턴 획득", + "selected": "{{oricorioName}}[[는]] 혼란스러워하며 방어 태세를 갖췄다!", + "boss_enraged": "{{oricorioName}}[[는]] 겁에 질려 능력치가 상승했다!" }, "2": { - "label": "Learn Its Dance", - "tooltip": "(+) Teach a Pokémon Revelation Dance", - "selected": "You watch the {{oricorioName}} closely as it performs its dance...$@s{level_up_fanfare}Your {{selectedPokemon}} learned from the {{oricorioName}}!" + "label": "춤을 배운다", + "tooltip": "(+) 잠재댄스 기술을 배움", + "selected": "{{oricorioName}}가 춤을 추는 모습을 주의 깊게 지켜보았다….$@s{level_up_fanfare}{{selectedPokemon}}[[는]] {{oricorioName}}에게서 춤을 배웠다!" }, "3": { - "label": "Show It a Dance", - "tooltip": "(-) Teach the {{oricorioName}} a Dance Move\n(+) The {{oricorioName}} Will Like You", - "disabled_tooltip": "Your Pokémon need to know a Dance move for this.", - "select_prompt": "Select a Dance type move to use.", - "selected": "The {{oricorioName}} watches in fascination as\n{{selectedPokemon}} shows off {{selectedMove}}!$It loves the display!$@s{level_up_fanfare}The {{oricorioName}} wants to join your party!" + "label": "춤을 보여준다", + "tooltip": "(-) {{oricorioName}}에게 춤을 가르침\n(+) {{oricorioName}}[[가]] 매우 기뻐함", + "disabled_tooltip": "포켓몬이 춤 기술을 알고 있어야 한다.", + "select_prompt": "사용할 춤 기술을 선택한다.", + "selected": "{{oricorioName}}[[가]] {{selectedPokemon}}[[를]] 선보이는 모습을\n흥미진진하게 지켜본다!$마음에 들어하는 것 같다!$@s{level_up_fanfare}{{oricorioName}}[[가]] 동료가 되고 싶어 하는 것 같다!" } }, - "invalid_selection": "This Pokémon doesn't know a Dance move" + "invalid_selection": "이 포켓몬은 춤 기술을 모른다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/dark-deal-dialogue.json b/src/locales/ko/mystery-encounters/dark-deal-dialogue.json index 3086ebb0f9b7..c570bc8d5b45 100644 --- a/src/locales/ko/mystery-encounters/dark-deal-dialogue.json +++ b/src/locales/ko/mystery-encounters/dark-deal-dialogue.json @@ -1,24 +1,24 @@ { - "intro": "A strange man in a tattered coat\nstands in your way...", - "speaker": "Shady Guy", - "intro_dialogue": "Hey, you!$I've been working on a new device\nto bring out a Pokémon's latent power!$It completely rebinds the Pokémon's atoms\nat a molecular level into a far more powerful form.$Hehe...@d{64} I just need some sac-@d{32}\nErr, test subjects, to prove it works.", - "title": "Dark Deal", - "description": "The disturbing fellow holds up some Pokéballs.\n\"I'll make it worth your while! You can have these strong Pokéballs as payment, All I need is a Pokémon from your team! Hehe...\"", - "query": "What will you do?", + "intro": "너덜너덜한 외투를 입은\n이상한 남자가 길을 막았다….", + "speaker": "수상한 남자", + "intro_dialogue": "거기, 너!$난 포켓몬의 숨겨진 힘을 끌어낼 수 있는\n새로운 장치를 만드는 중이거든!$포켓몬을 분자 수준에서 재결합해서\n훨씬 더 강력한 형태로 만드는 거야.$히히…@d{64} 이걸 증명하려면 약간의 희ㅅ-\n음…@d{32} 실험 대상이 필요해.", + "title": "수상한 거래", + "description": "수상한 남자가\n몬스터볼을 여러 개 들고 있습니다.\n\"내가 보장할게! 네 포켓몬을 한 마리만 줘!\n대신 아주 좋은 몬스터볼을 줄 테니까. 히히…\"", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Accept", - "tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", - "selected_dialogue": "Let's see, that {{pokeName}} will do nicely!$Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...", - "selected_message": "The man hands you 5 Rogue Balls.${{pokeName}} hops into the strange machine...$Flashing lights and weird noises\nstart coming from the machine!$...@d{96} Something emerges\nfrom the device, raging wildly!" + "label": "승낙한다", + "tooltip": "(+) 5 로그볼\n(?) 포켓몬 1마리 랜덤 강화", + "selected_dialogue": "어디 보자, {{pokeName}}[[가]] 좋겠군!$명심해, 나쁜 일이 생겨도\n책임 못 지니까!@d{32} 히히…", + "selected_message": "남자는 로그볼 5개를 건넸다.${{pokeName}}[[는]] 이상한 기계에 들어갔다…$표시등이 깜빡이고 이상한 소리가\n기계에서 들려오기 시작했다!$…@d{96} 기계에서 뭔가가\n맹렬한 기세로 뛰쳐나왔다!" }, "2": { - "label": "Refuse", - "tooltip": "(-) No Rewards", - "selected": "Not gonna help a poor fellow out?\nPah!" + "label": "거절한다", + "tooltip": "(-) 보상 없음", + "selected": "불쌍한 사람을 그냥 지나칠거야?\n하!" } }, - "outro": "After the harrowing encounter,\nyou collect yourself and depart." + "outro": "꺼림직한 만남을 뒤로 하고\n침착하게 자리를 떠났다." } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/delibirdy-dialogue.json b/src/locales/ko/mystery-encounters/delibirdy-dialogue.json index ca1fefa3a39c..9b42742844cc 100644 --- a/src/locales/ko/mystery-encounters/delibirdy-dialogue.json +++ b/src/locales/ko/mystery-encounters/delibirdy-dialogue.json @@ -1,29 +1,29 @@ { - "intro": "A pack of {{delibirdName}} have appeared!", - "title": "Delibir-dy", - "description": "The {{delibirdName}}s are looking at you expectantly, as if they want something. Perhaps giving them an item or some money would satisfy them?", - "query": "What will you give them?", - "invalid_selection": "Pokémon doesn't have that kind of item.", + "intro": "{{delibirdName}} 무리가 나타났다!", + "title": "딜리버-디", + "description": "{{delibirdName}}들의 눈이 초롱초롱합니다.\n뭔가 바라는 게 있는 것 같습니다.\n혹시 아이템이나 돈을 원하는 걸까요?", + "query": "무언가 주시겠습니까?", + "invalid_selection": "포켓몬이 그런 종류의 아이템이 없다.", "option": { "1": { - "label": "Give Money", - "tooltip": "(-) Give the {{delibirdName}}s {{money, money}}\n(+) Receive a Gift Item", - "selected": "You toss the money to the {{delibirdName}}s,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" + "label": "돈을 준다", + "tooltip": "(-) {{delibirdName}}들에게 {{money, money}} 선물\n(+) 선물 아이템 획득", + "selected": "돈을 건네니,\n{{delibirdName}}들은 자기들끼리 신나서 떠들어댔다.$그리고 당신에게 돌아와 행복하게 선물을 건넨다!" }, "2": { - "label": "Give Food", - "tooltip": "(-) Give the {{delibirdName}}s a Berry or Reviver Seed\n(+) Receive a Gift Item", - "select_prompt": "Select an item to give.", - "selected": "You toss the {{chosenItem}} to the {{delibirdName}}s,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" + "label": "음식을 준다", + "tooltip": "(-) {{delibirdName}}들에게 나무열매나 기적의씨를 선물\n(+) 선물 아이템 획득", + "select_prompt": "건네줄 아이템을 선택하세요.", + "selected": "{{chosenItem}}}[[를]] 건네니,\n{{delibirdName}}들은 자기들끼리 신나서 떠들어댔다.$그리고 당신에게 돌아와 행복하게 선물을 건넨다!" }, "3": { - "label": "Give an Item", - "tooltip": "(-) Give the {{delibirdName}}s a Held Item\n(+) Receive a Gift Item", - "select_prompt": "Select an item to give.", - "selected": "You toss the {{chosenItem}} to the {{delibirdName}}s,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" + "label": "아이템을 준다", + "tooltip": "(-) {{delibirdName}}들에게 지니고 있는 아이템을 선물\n(+) 선물 아이템 획득", + "select_prompt": "건네줄 아이템을 선택하세요.", + "selected": "{{chosenItem}}}[[를]] 건네니,\n{{delibirdName}}들은 자기들끼리 신나서 떠들어댔다.$그리고 당신에게 돌아와 행복하게 선물을 건넨다!" } }, - "outro": "The {{delibirdName}} pack happily waddles off into the distance.$What a curious little exchange!" + "outro": "{{delibirdName}} 무리가 행복하게 뒤뚱거리며 저 멀리 날아간다…$정말 별난 선물교환이었다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/department-store-sale-dialogue.json b/src/locales/ko/mystery-encounters/department-store-sale-dialogue.json index d651f32665a1..96de06d8413b 100644 --- a/src/locales/ko/mystery-encounters/department-store-sale-dialogue.json +++ b/src/locales/ko/mystery-encounters/department-store-sale-dialogue.json @@ -1,27 +1,27 @@ { - "intro": "It's a lady with a ton of shopping bags.", - "speaker": "Shopper", - "intro_dialogue": "Hello! Are you here for\nthe amazing sales too?$There's a special coupon that you can\nredeem for a free item during the sale!$I have an extra one. Here you go!", - "title": "Department Store Sale", - "description": "There is merchandise in every direction! It looks like there are 4 counters where you can redeem the coupon for various items. The possibilities are endless!", - "query": "Which counter will you go to?", + "intro": "쇼핑백을 잔뜩 가진 여자가 있다!", + "speaker": "백화점 손님", + "intro_dialogue": "안녕!\n너도 대박 세일을 노리고 온 거지?$세일 기간 동안 무료로 아이템을 교환할 수 있는 특별한 쿠폰이 있어!$남는 쿠폰을 나눠줄게!", + "title": "백화점 세일", + "description": "사방에 상품이 가득합니다!\n쿠폰을 쓸 수 있는 교환 코너가 4개나 있는 것 같습니다.\n선택지가 너무 많네요!", + "query": "어디로 가시겠습니까?", "option": { "1": { - "label": "TM Counter", - "tooltip": "(+) TM Shop" + "label": "기술머신 코너", + "tooltip": "(+) 기술머신 상점" }, "2": { - "label": "Vitamin Counter", - "tooltip": "(+) Vitamin Shop" + "label": "영양제 코너", + "tooltip": "(+) 영양제 상점" }, "3": { - "label": "Battle Item Counter", - "tooltip": "(+) X Item Shop" + "label": "랭크업 도구 코너", + "tooltip": "(+) 랭크업 도구 상점" }, "4": { - "label": "Pokéball Counter", - "tooltip": "(+) Pokéball Shop" + "label": "몬스터볼 코너", + "tooltip": "(+) 몬스터볼 상점" } }, - "outro": "What a deal! You should shop there more often." + "outro": "대박이다!\n앞으로 자주 쇼핑하러 와야겠다." } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/field-trip-dialogue.json b/src/locales/ko/mystery-encounters/field-trip-dialogue.json index 61900d56cd7c..4f7f3797ac9a 100644 --- a/src/locales/ko/mystery-encounters/field-trip-dialogue.json +++ b/src/locales/ko/mystery-encounters/field-trip-dialogue.json @@ -1,31 +1,31 @@ { - "intro": "It's a teacher and some school children!", - "speaker": "Teacher", - "intro_dialogue": "Hello, there! Would you be able to\nspare a minute for my students?$I'm teaching them about Pokémon moves\nand would love to show them a demonstration.$Would you mind showing us one of\nthe moves your Pokémon can use?", - "title": "Field Trip", - "description": "A teacher is requesting a move demonstration from a Pokémon. Depending on the move you choose, she might have something useful for you in exchange.", - "query": "Which move category will you show off?", + "intro": "선생님과 어린 학생들이다!", + "speaker": "선생님", + "intro_dialogue": "안녕하세요!\n저희 학생들에게 잠시 시간 좀 내주실 수 있을까요?$포켓몬의 기술에 대해서 가르치고 있는데\n실제 기술을 보게 되면 좋아할 것 같아서요.$괜찮으시면 저희에게\n포켓몬이 배우고 있는 기술을 보여주실래요?", + "title": "현장 학습", + "description": "학교 선생님이 포켓몬의 기술 시연을 부탁했습니다.\n어떤 기술을 선택했는지에 따라 선생님이 뭔가 쓸 만한 걸 주실 수도 있을 것 같네요.", + "query": "어떤 형태의 기술을 보여주겠습니까?", "option": { "1": { - "label": "A Physical Move", - "tooltip": "(+) Physical Item Rewards" + "label": "물리 기술", + "tooltip": "(+) 물리 아이템 보상" }, "2": { - "label": "A Special Move", - "tooltip": "(+) Special Item Rewards" + "label": "특수 기술", + "tooltip": "(+) 특수 아이템 보상" }, "3": { - "label": "A Status Move", - "tooltip": "(+) Status Item Rewards" + "label": "상태 기술", + "tooltip": "(+) 상태 아이템 보상" }, - "selected": "{{pokeName}} shows off an awesome display of {{move}}!" + "selected": "{{pokeName}}[[는]] 멋지게 {{move}}[[를]] 보여줬다!" }, - "second_option_prompt": "Choose a move for your Pokémon to use.", - "incorrect": "...$That isn't a {{moveCategory}} move!\nI'm sorry, but I can't give you anything.$Come along children, we'll\nfind a better demonstration elsewhere.", - "incorrect_exp": "Looks like you learned a valuable lesson?$Your Pokémon also gained some experience.", - "correct": "Thank you so much for your kindness!\nI hope these items might be of use to you!", - "correct_exp": "{{pokeName}} also gained some valuable experience!", - "status": "Status", - "physical": "Physical", - "special": "Special" + "second_option_prompt": "포켓몬이 사용할 기술을 골라주세요.", + "incorrect": "…$이건 {{moveCategory}} 기술이 아닌데요!\n죄송하지만, 저희는 이만 가볼게요.$얘들아 이리 오렴.\n다른 곳에서는 제대로 된 기술 시연을 볼 수 있을 거야.", + "incorrect_exp": "좋은 경험(?)을 한 것 같다.$포켓몬도 약간의 경험치를 얻었다.", + "correct": "멋진 시연 감사합니다!\n이 아이템이 도움이 되시길 바랄게요!", + "correct_exp": "{{pokeName}}도 좋은 경험을 쌓았다!", + "status": "상태", + "physical": "물리", + "special": "특수" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/fiery-fallout-dialogue.json b/src/locales/ko/mystery-encounters/fiery-fallout-dialogue.json index a1644d89a3fb..a03f94360a90 100644 --- a/src/locales/ko/mystery-encounters/fiery-fallout-dialogue.json +++ b/src/locales/ko/mystery-encounters/fiery-fallout-dialogue.json @@ -1,26 +1,26 @@ { - "intro": "You encounter a blistering storm of smoke and ash!", - "title": "Fiery Fallout", - "description": "The whirling ash and embers have cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", - "query": "What will you do?", + "intro": "매캐한 연기와 화산재 폭풍을 맞닥뜨렸다!", + "title": "불타는 폴아웃", + "description": "소용돌이치는 화산재와 불씨로 인해 앞이 거의 보이질 않습니다.\n이런 일에는 무언가… 원인이 있는 것 같습니다.\n그렇지만 이 정도로 큰 규모라면 뒤에 도대체 뭐가 있는 걸까요?", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Find the Source", - "tooltip": "(?) Discover the source\n(-) Hard Battle", - "selected": "You push through the storm, and find two {{volcaronaName}}s in the middle of a mating dance!$They don't take kindly to the interruption and attack!" + "label": "원인을 찾는다", + "tooltip": "(?) 원인을 밝힘\n(-) 어려운 배틀", + "selected": "화산재 폭풍을 뚫고 나아가자,\n구애의 춤을 추고 있는 {{volcaronaName}} 두 마리를 발견했다!$방해받고 싶지 않았던 두 포켓몬이 싸움을 걸어왔다!" }, "2": { - "label": "Hunker Down", - "tooltip": "(-) Suffer the effects of the weather", - "selected": "The weather effects cause significant\nharm as you struggle to find shelter!$Your party takes 20% Max HP damage!", - "target_burned": "Your {{burnedPokemon}} also became burned!" + "label": "낮은 자세로 이동한다", + "tooltip": "(-) 날씨의 피해를 받음", + "selected": "셸터를 향해 고분고투하는 동안\n재와 불씨로 인해 심각한 피해를 입었다!$모든 포켓몬이 HP의 20% 피해를 받았다!", + "target_burned": "{{burnedPokemon}}도 화상을 입고 말았다!" }, "3": { - "label": "Your Fire Types Help", - "tooltip": "(+) End the conditions\n(+) Gain a Charcoal", - "disabled_tooltip": "You need at least 2 Fire Type Pokémon to choose this", - "selected": "Your {{option3PrimaryName}} and {{option3SecondaryName}} guide you to where two {{volcaronaName}}s are in the middle of a mating dance!$Thankfully, your Pokémon are able to calm them,\nand they depart without issue." + "label": "불꽃 포켓몬들의 도움", + "tooltip": "(+) 상황 해결\n(+) 목탄 획득", + "disabled_tooltip": "2마리 이상의 불꽃 타입 포켓몬이 필요하다.", + "selected": "{{option3PrimaryName}}[[과]] {{option3SecondaryName}}의 도움으로,\n구애의 춤을 추고 있는 {{volcaronaName}} 두 마리를 발견했다!$다행히 포켓몬들이 그 두 마리를 진정시키고,\n문제없이 신혼여행을 떠나보냈다." } }, - "found_charcoal": "After the weather clears,\nyour {{leadPokemon}} spots something on the ground.$@s{item_fanfare}{{leadPokemon}} gained a Charcoal!" + "found_charcoal": "날씨가 개자,\n{{leadPokemon}}[[는]] 바닥에서 무언가 발견했다.$@s{item_fanfare}{{leadPokemon}}[[는]] 목탄을 얻었다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/fight-or-flight-dialogue.json b/src/locales/ko/mystery-encounters/fight-or-flight-dialogue.json index 3eb6cb87c165..52fe92f2b633 100644 --- a/src/locales/ko/mystery-encounters/fight-or-flight-dialogue.json +++ b/src/locales/ko/mystery-encounters/fight-or-flight-dialogue.json @@ -1,25 +1,26 @@ { - "intro": "Something shiny is sparkling\non the ground near that Pokémon!", - "title": "Fight or Flight", - "description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but it looks strong. Perhaps you could steal the item, if you have the right Pokémon for the job.", - "query": "What will you do?", + "intro": "빛나는 무언가가 포켓몬 근처에서 반짝반짝 빛나고 있다!", + "title": "도망치거나 맞서 싸우거나", + "description": "강한 포켓몬이 아이템을 지키고 있는 것 같습니다.\n그냥 싸워볼 수도 있지만, 조금 강해보이네요.\n적합한 기술을 가진 포켓몬이 있다면,\n아이템을 빼앗을 수도 있을 것 같습니다.", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Battle the Pokémon", - "tooltip": "(-) Hard Battle\n(+) New Item", - "selected": "You approach the\nPokémon without fear.", - "stat_boost": "The {{enemyPokemon}}'s latent strength boosted one of its stats!" + "label": "포켓몬과 싸운다", + "tooltip": "(-) 어려운 배틀\n(+) 새 아이템", + "selected": "용감하게 포켓몬에게 다가갔다.", + "stat_boost": "{{enemyPokemon}}의 잠재력이 능력치 중 하나를 강화했다!" }, "2": { - "label": "Steal the Item", - "disabled_tooltip": "Your Pokémon need to know certain moves to choose this", - "tooltip": "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", - "selected": ".@d{32}.@d{32}.@d{32}$Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}!$You nabbed the item!" + "label": "아이템을 훔친다", + "disabled_tooltip": "이 선택지를 선택하려면 포켓몬이 특정 기술을 가지고 있어야 합니다.", + "tooltip": "(+) {{option2PrimaryName}}의 {{option2PrimaryMove}} 사용", + "selected": ".@d{32}.@d{32}.@d{32}${{option2PrimaryName}}[[가]] {{option2PrimaryMove}}[[를]] 사용했다!$아이템을 훔쳤다!" }, "3": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "You leave the strong Pokémon\nwith its prize and continue on." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "강한 포켓몬과 전리품을 남겨둔 채\n당신은 계속 나아간다." + } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/fun-and-games-dialogue.json b/src/locales/ko/mystery-encounters/fun-and-games-dialogue.json index f5d7d6e8ff8d..77b8c1343995 100644 --- a/src/locales/ko/mystery-encounters/fun-and-games-dialogue.json +++ b/src/locales/ko/mystery-encounters/fun-and-games-dialogue.json @@ -1,30 +1,30 @@ { - "intro_dialogue": "Step right up, folks! Try your luck\non the brand new {{wobbuffetName}} Whack-o-matic!", - "speaker": "Showman", - "title": "Fun And Games!", - "description": "You've encountered a traveling show with a prize game! You will have @[TOOLTIP_TITLE]{3 turns} to bring the {{wobbuffetName}} as close to @[TOOLTIP_TITLE]{1 HP} as possible @[TOOLTIP_TITLE]{without KOing it} so it can wind up a huge Counter on the bell-ringing machine.\nBut be careful! If you KO the {{wobbuffetName}}, you'll have to pay for the cost of reviving it!", - "query": "Would you like to play?", + "intro_dialogue": "자, 오세요 여러분!\n새로 나온 {{wobbuffetName}} 해머 게임에 도전해 보세요!", + "speaker": "진행자", + "title": "재밌는 놀이!", + "description": "상품이 걸린 게임이 진행 중입니다!\n@[TOOLTIP_TITLE]{3턴} 안에 {{wobbuffetName}}[[를]] @[TOOLTIP_TITLE]{기절시키지 않고 HP를 1}에 가깝게 만들어서, {{wobbuffetName}}이 해머기계에 최고로 강력한 카운터를 날리도록 해야합니다.\n하지만 조심하세요! 만약 {{wobbuffetName}}[[가]] 기절해버리면, 치료비를 내야 할테니까요!", + "query": "게임에 참가해 볼까요?", "option": { "1": { - "label": "Play the Game", - "tooltip": "(-) Pay {{option1Money, money}}\n(+) Play {{wobbuffetName}} Whack-o-matic", - "selected": "Time to test your luck!" + "label": "게임에 참가한다", + "tooltip": "(-) {{option1Money, money}} 지불\n(+) {{wobbuffetName}} 해머 게임 플레이", + "selected": "시작합니다!" }, "2": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "You hurry along your way,\nwith a slight feeling of regret." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "약간의 아쉬움을 안고, 서둘러 길을 떠났다." } }, - "ko": "Oh no! The {{wobbuffetName}} fainted!$You lose the game and\nhave to pay for the revive cost...", - "charging_continue": "The Wubboffet keeps charging its counter-swing!", - "turn_remaining_3": "Three turns remaining!", - "turn_remaining_2": "Two turns remaining!", - "turn_remaining_1": "One turn remaining!", - "end_game": "Time's up!$The {{wobbuffetName}} winds up to counter-swing and@d{16}.@d{16}.@d{16}.", - "best_result": "The {{wobbuffetName}} smacks the button so hard\nthe bell breaks off the top!$You win the grand prize!", - "great_result": "The {{wobbuffetName}} smacks the button, nearly hitting the bell!$So close!\nYou earn the second tier prize!", - "good_result": "The {{wobbuffetName}} hits the button hard enough to go midway up the scale!$You earn the third tier prize!", - "bad_result": "The {{wobbuffetName}} barely taps the button and nothing happens...$Oh no!\nYou don't win anything!", - "outro": "That was a fun little game!" + "ko": "안 돼! {{wobbuffetName}}[[가]] 기절해버렸다!$게임에 지고 {{wobbuffetName}}의 병원비까지 내야할 판이다…", + "charging_continue": "마자용은 카운터 한 방을 충전하고 있다!", + "turn_remaining_3": "세 턴 남았다!", + "turn_remaining_2": "두 턴 남았다!", + "turn_remaining_1": "남은 턴은 단 한 번!", + "end_game": "거기까지!${{wobbuffetName}}[[가]] 한껏 충전한 카운터를 날릴 준비를 한다@d{16}.@d{16}.@d{16}.", + "best_result": "{{wobbuffetName}}[[가]] 기계를 때려 부술 기세로 내리쳤다!!!$기계 맨 위에 달려 있던 벨이\n아예 박살나 날아가 버렸다!$최고 1등상을 얻었다!", + "great_result": "{{wobbuffetName}}[[가]] 버튼을 박살낼 듯 내려쳤다!!$벨에 닿을락 말락 하는 곳까지 올라갔다!\n아깝다!!$2등상을 받았다!", + "good_result": "{{wobbuffetName}}[[가]] 버튼을 내리쳤다!$거의 중간까지 올라갔다!$3등상을 받았다!", + "bad_result": "{{wobbuffetName}}[[는]] 힘차게 휘둘러 봤지만\n버튼을 살짝 건드렸을 뿐 아무일도 일어나지 않았다…$안 돼!\n본전도 못 건졌다!", + "outro": "재밌는 미니게임이었다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json b/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json index 1cc420355b75..a4e8c3a1dd13 100644 --- a/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json +++ b/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json @@ -1,32 +1,32 @@ { - "intro": "It's an interface for the Global Trade System!", - "title": "The GTS", - "description": "Ah, the GTS! A technological wonder, you can connect with anyone else around the globe to trade Pokémon with them! Will fortune smile upon your trade today?", - "query": "What will you do?", + "intro": "GTS 단말기가 있다!", + "title": "GTS", + "description": "오, GTS! 세상 참 좋아졌네요.\n이렇게 전세계 사람들과 연결해서 포켓몬을 교환 할 수 있으니 말이에요!\n오늘은 어떤 흥미로운 교환이 이루어질까요?", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Check Trade Offers", - "tooltip": "(+) Select a trade offer for one of your Pokémon", - "trade_options_prompt": "Select a Pokémon to receive through trade." + "label": "교환 제안을 확인한다", + "tooltip": "(+) 포켓몬 1마리와 제안을 골라 교환", + "trade_options_prompt": "교환을 통해 받을 포켓몬을 선택하세요." }, "2": { - "label": "Wonder Trade", - "tooltip": "(+) Send one of your Pokémon to the GTS and get a random Pokémon in return" + "label": "미라클 교환을 한다", + "tooltip": "(+) 포켓몬 중 하나를 GTS에 보내고 랜덤한 포켓몬을 받는다" }, "3": { - "label": "Trade an Item", - "trade_options_prompt": "Select an item to send.", - "invalid_selection": "This Pokémon doesn't have legal items to trade.", - "tooltip": "(+) Send one of your Items to the GTS and get a random new Item" + "label": "아이템을 교환한다", + "trade_options_prompt": "교환할 아이템을 선택하세요.", + "invalid_selection": "이 포켓몬은 교환할 아이템이 없습니다.", + "tooltip": "(+) 아이템 하나를 GTS에 보내고 랜덤한 아이템을 받는다" }, "4": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "No time to trade today!\nYou continue on." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "교환할 시간이 없다!\n서둘러 떠났다." } }, - "pokemon_trade_selected": "{{tradedPokemon}} will be sent to {{tradeTrainerName}}.", - "pokemon_trade_goodbye": "Goodbye, {{tradedPokemon}}!", - "item_trade_selected": "{{chosenItem}} will be sent to {{tradeTrainerName}}.$.@d{64}.@d{64}.@d{64}\n@s{level_up_fanfare}Trade complete!$You received a {{itemName}} from {{tradeTrainerName}}!", - "trade_received": "@s{evolution_fanfare}{{tradeTrainerName}} sent over {{received}}!" + "pokemon_trade_selected": "{{tradedPokemon}}[[를]] {{tradeTrainerName}}에게 보냅니다.", + "pokemon_trade_goodbye": "바이바이 {{tradedPokemon}}!", + "item_trade_selected": "{{chosenItem}}[[를]] {{tradeTrainerName}}에게 보냅니다.$.@d{64}.@d{64}.@d{64}\n@s{level_up_fanfare}전송 완료!${{tradeTrainerName}}[[로]]부터 {{itemName}}[[가]] 전송됐다!", + "trade_received": "@s{evolution_fanfare}{{tradeTrainerName}}[[로]]부터 {{received}}[[가]] 전송됐다!${{received}}[[를]] 귀여워해 줘!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/lost-at-sea-dialogue.json b/src/locales/ko/mystery-encounters/lost-at-sea-dialogue.json index 41709c66799e..deeb69f0d7a3 100644 --- a/src/locales/ko/mystery-encounters/lost-at-sea-dialogue.json +++ b/src/locales/ko/mystery-encounters/lost-at-sea-dialogue.json @@ -1,28 +1,28 @@ { - "intro": "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - "title": "Lost at Sea", - "description": "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - "query": "What will you do?", + "intro": "정처 없이 바다를 헤메었지만,\n당신은 아무런 성과도 거두지 못했습니다.", + "title": "바다 위의 표류", + "description": "이 지역의 바다는 꽤 사나운 편입니다.\n게다가 당신의 기력은 점점 떨어지고 있습니다.\n난감한 상황입니다.\n이 상황을 벗어날 수 있는 방법이 있을까요?", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "{{option1PrimaryName}} Might Help", - "label_disabled": "Can't {{option1RequiredMove}}", - "tooltip": "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP", - "tooltip_disabled": "You have no Pokémon to {{option1RequiredMove}} on", - "selected": "{{option1PrimaryName}} swims ahead, guiding you back on track.${{option1PrimaryName}} seems to also have gotten stronger in this time of need!" + "label": "{{option1PrimaryName}}의 도움", + "label_disabled": "{{option1RequiredMove}} 사용 불가", + "tooltip": "(+) {{option1PrimaryName}}[[가]] 당신을 구함\n(+) {{option1PrimaryName}} 경험치 획득", + "tooltip_disabled": "{{option1RequiredMove}}[[를]] 사용할 수 있는 포켓몬이 없다.", + "selected": "{{option1PrimaryName}}[[가]] 앞장서 헤엄치며, 돌아가는 길을 안내했다.${{option1PrimaryName}} 역시 이번 기회로 더 강해진 것 같다!" }, "2": { - "label": "{{option2PrimaryName}} Might Help", - "label_disabled": "Can't {{option2RequiredMove}}", - "tooltip": "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP", - "tooltip_disabled": "You have no Pokémon to {{option2RequiredMove}} with", - "selected": "{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.${{option2PrimaryName}} seems to also have gotten stronger in this time of need!" + "label": "{{option2PrimaryName}}의 도움", + "label_disabled": "{{option2RequiredMove}} 사용 불가", + "tooltip": "(+) {{option2PrimaryName}}[[가]] 당신을 구함\n(+) {{option2PrimaryName}} 경험치 획득", + "tooltip_disabled": "{{option2RequiredMove}}[[를]] 사용할 수 있는 포켓몬이 없다.", + "selected": "{{option2PrimaryName}}[[가]] 보트 앞에서 날아가며, 돌아가는 길을 안내했다.${{option2PrimaryName}} 역시 이번 기회로 더 강해진 것 같다!" }, "3": { - "label": "Wander Aimlessly", - "tooltip": "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP", - "selected": "You float about in the boat, steering without direction until you finally spot a landmark you remember.$You and your Pokémon are fatigued from the whole ordeal." + "label": "정처 없이 방황한다", + "tooltip": "(-) 모든 포켓몬 HP {{damagePercentage}}% 감소", + "selected": "마침내 기억하는 곳에 다다를 때까지\n정처 없이 배를 타고 떠돌아다닌다.$길고 긴 표류에 포켓몬과 당신 모두 지쳐버렸다." } }, - "outro": "You are back on track." + "outro": "다시 여정으로 돌아왔다." } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/mysterious-challengers-dialogue.json b/src/locales/ko/mystery-encounters/mysterious-challengers-dialogue.json index 01f4e6092ebb..9ccfe54d8083 100644 --- a/src/locales/ko/mystery-encounters/mysterious-challengers-dialogue.json +++ b/src/locales/ko/mystery-encounters/mysterious-challengers-dialogue.json @@ -1,22 +1,22 @@ { - "intro": "Mysterious challengers have appeared!", - "title": "Mysterious Challengers", - "description": "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", - "query": "Who will you battle?", + "intro": "수수께끼의 도전자들이 나타났다!", + "title": "수수께끼의 도전자", + "description": "만약 도전자에게 승리한다면, 당신의 배틀에 감명해 보상을 받을 수 있을 것 같습니다.\n그렇지만 어떤 도전자들은 꽤 강해보이기도 합니다.\n도전을 받아들일까요?", + "query": "누구와 배틀하시겠습니까?", "option": { "1": { - "label": "A Clever, Mindful Foe", - "tooltip": "(-) Standard Battle\n(+) Move Item Rewards" + "label": "신중해 보이는 도전자", + "tooltip": "(-) 일반 배틀\n(+) 기술 아이템 보상" }, "2": { - "label": "A Strong Foe", - "tooltip": "(-) Hard Battle\n(+) Good Rewards" + "label": "강해 보이는 도전자", + "tooltip": "(-) 어려운 배틀\n(+) 좋은 보상" }, "3": { - "label": "The Mightiest Foe", - "tooltip": "(-) Brutal Battle\n(+) Great Rewards" + "label": "가장 강한 도전자", + "tooltip": "(-) 악랄한 배틀\n(+) 훌륭한 보상" }, - "selected": "The trainer steps forward..." + "selected": "선택한 트레이너가 앞으로 걸어 나온다…" }, - "outro": "The mysterious challenger was defeated!" + "outro": "수수께끼의 도전자를 물리쳤다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/mysterious-chest-dialogue.json b/src/locales/ko/mystery-encounters/mysterious-chest-dialogue.json index 1de7a5992eda..3b61e58f7439 100644 --- a/src/locales/ko/mystery-encounters/mysterious-chest-dialogue.json +++ b/src/locales/ko/mystery-encounters/mysterious-chest-dialogue.json @@ -1,23 +1,23 @@ { - "intro": "You found...@d{32} a chest?", - "title": "The Mysterious Chest", - "description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", - "query": "Will you open it?", + "intro": "이건…@d{32} 뭐지?", + "title": "수수께끼 상자", + "description": "아름답게 장식된 상자가 바닥에 놓여 있습니다. 보통 이럴 땐, 안에 뭔가 좋은 게 들었다고 생각하는 것이 인지상정…\n그렇지 않을까요?", + "query": "열어보시겠습니까?", "option": { "1": { - "label": "Open It", - "tooltip": "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", - "selected": "You open the chest to find...", - "normal": "Just some normal tools and items.", - "good": "Some pretty nice tools and items.", - "great": "A couple great tools and items!", - "amazing": "Whoa! An amazing item!", - "bad": "Oh no!@d{32}\nThe chest was actually a {{gimmighoulName}} in disguise!$Your {{pokeName}} jumps in front of you\nbut is KOed in the process!" + "label": "열어본다", + "tooltip": "@[SUMMARY_BLUE]{(35%) 끔찍한 무언가}\n@[SUMMARY_GREEN]{(40%) 평범한 보상}\n@[SUMMARY_GREEN]{(20%) 좋은 보상}\n@[SUMMARY_GREEN]{(4%) 훌륭한 보상}\n@[SUMMARY_GREEN]{(1%) 대단한 보상}", + "selected": "당신이 상자안에서 찾은 것은…", + "normal": "평범한 도구와 아이템이다.", + "good": "꽤 좋은 도구와 아이템이다.", + "great": "훌륭한 도구와 아이템이다!", + "amazing": "앗! 대단한 아이템!", + "bad": "으악!@d{32}\n상자는 사실 변장한 {{gimmighoulName}}이었다!${{pokeName}}[[가]] 앞으로 뛰어들어 막았지만\n기절해버렸다!" }, "2": { - "label": "Too Risky, Leave", - "tooltip": "(-) No Rewards", - "selected": "You hurry along your way,\nwith a slight feeling of regret." + "label": "위험할 수 있으니 떠난다", + "tooltip": "(-) 보상 없음", + "selected": "아쉬움을 뒤로 하고,\n당신은 서둘러 떠났다." } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/part-timer-dialogue.json b/src/locales/ko/mystery-encounters/part-timer-dialogue.json index 614f1818e3f8..08c2dcffcf32 100644 --- a/src/locales/ko/mystery-encounters/part-timer-dialogue.json +++ b/src/locales/ko/mystery-encounters/part-timer-dialogue.json @@ -1,31 +1,31 @@ { - "intro": "A busy worker flags you down.", - "speaker": "Worker", - "intro_dialogue": "You look like someone with lots of capable Pokémon!$We can pay you if you're able to help us with some part-time work!", - "title": "Part-Timer", - "description": "Looks like there are plenty of tasks that need to be done. Depending how well-suited your Pokémon is to a task, they might earn more or less money.", - "query": "Which job will you choose?", - "invalid_selection": "Pokémon must be healthy enough.", + "intro": "바빠보이는 작업 팀장이 나를 불러세웠다.", + "speaker": "작업 팀장", + "intro_dialogue": "거기 당신!\n쓸만한 포켓몬들을 가지고 있는거 같네요.$혹시 시간 있으면 알바 안 할래요?", + "title": "아르바이트", + "description": "해야 할 일이 산더미같이 쌓여 있네요.\n포켓몬이 일을 얼마나 잘하는지에 따라\n일당을 더 많이 받을 수도, 더 적게 받을 수도 있을 것 같습니다.", + "query": "어떤 아르바이트를 해볼까요?", + "invalid_selection": "포켓몬이 건강하지 않습니다.", "option": { "1": { - "label": "Make Deliveries", - "tooltip": "(-) Your Pokémon Uses its Speed\n(+) Earn @[MONEY]{Money}", - "selected": "Your {{selectedPokemon}} works a shift delivering orders to customers." + "label": "배달하기", + "tooltip": "(-) 포켓몬의 스피드를 활용\n(+) @[MONEY]{Money} 획득", + "selected": "{{selectedPokemon}}[[는]] 배달 아르바이트를 시작했다." }, "2": { - "label": "Warehouse Work", - "tooltip": "(-) Your Pokémon Uses its Strength and Endurance\n(+) Earn @[MONEY]{Money}", - "selected": "Your {{selectedPokemon}} works a shift moving items around the warehouse." + "label": "창고 정리", + "tooltip": "(-) 포켓몬의 힘과 튼튼함을 활용\n(+) @[MONEY]{Money} 획득", + "selected": "{{selectedPokemon}}[[는]] 창고 정리를 시작했다." }, "3": { - "label": "Sales Assistant", - "tooltip": "(-) Your {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Earn @[MONEY]{Money}", - "disabled_tooltip": "Your Pokémon need to know certain moves for this job", - "selected": "Your {{option3PrimaryName}} spends the day using {{option3PrimaryMove}} to attract customers to the business!" + "label": "바람잡이", + "tooltip": "(-) {{option3PrimaryName}}의 {{option3PrimaryMove}}를 활용\n(+) @[MONEY]{Money} 획득", + "disabled_tooltip": "포켓몬이 해당 작업에 필요한 기술이 없습니다.", + "selected": "{{option3PrimaryName}}[[는]] {{option3PrimaryMove}}[[로]]\n하루 종일 손님들을 끌어모았다!" } }, - "job_complete_good": "Thanks for the assistance!\nYour {{selectedPokemon}} was incredibly helpful!$Here's your check for the day.", - "job_complete_bad": "Your {{selectedPokemon}} helped us out a bit!$Here's your check for the day.", - "pokemon_tired": "Your {{selectedPokemon}} is worn out!\nThe PP of all its moves was reduced to 2!", - "outro": "Come back and help out again sometime!" + "job_complete_good": "도와줘서 고마워요!\n오늘은 거의 {{selectedPokemon}} 혼자서 일을 다한 것 같네요!$여기 일당이에요!", + "job_complete_bad": "{{selectedPokemon}}[[가]] 뭐… 조금은 도움이 된 거 같네요!$여기 일당이에요.", + "pokemon_tired": "{{selectedPokemon}}[[가]] 지친 것 같다!\n모든 기술의 PP가 2로 감소했다!", + "outro": "다음에 또 도와주러 와요!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/safari-zone-dialogue.json b/src/locales/ko/mystery-encounters/safari-zone-dialogue.json index 8869f2055e5f..4cdad3dd1ed1 100644 --- a/src/locales/ko/mystery-encounters/safari-zone-dialogue.json +++ b/src/locales/ko/mystery-encounters/safari-zone-dialogue.json @@ -1,46 +1,46 @@ { - "intro": "It's a safari zone!", - "title": "The Safari Zone", - "description": "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\n\nBeware, though. These Pokémon may flee before you're able to catch them!", - "query": "Would you like to enter?", + "intro": "사파리존이다!", + "title": "사파리존", + "description": "여기에는 오만 가지 희귀하고 특별한 포켓몬들이 살고 있습니다! 특별한 포켓몬을 최대 3마리까지 만나고 잡을 기회가 있답니다.\n\n하지만 조심하세요! 잡기도 전에 포켓몬이 도망칠 수도 있으니까요!", + "query": "들어가시겠습니까?", "option": { "1": { - "label": "Enter", - "tooltip": "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", - "selected": "Time to test your luck!" + "label": "들어간다", + "tooltip": "(-) {{option1Money, money}} 지불\n@[SUMMARY_GREEN]{(?) 사파리존 입장}", + "selected": "행운을 시험할 시간입니다!" }, "2": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "You hurry along your way,\nwith a slight feeling of regret." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "약간의 아쉬움을 남기고, 서둘러 길을 떠났다" } }, "safari": { "1": { - "label": "Throw a Pokéball", - "tooltip": "(+) Throw a Pokéball", - "selected": "You throw a Pokéball!" + "label": "몬스터볼을 던진다", + "tooltip": "(+) 몬스터볼을 던짐", + "selected": "몬스터볼을 던졌다!" }, "2": { - "label": "Throw Bait", - "tooltip": "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", - "selected": "You throw some bait!" + "label": "먹이를 던진다", + "tooltip": "(+) 포획률 상승\n(-) 도망칠 확률 상승", + "selected": "먹이를 던졌다!" }, "3": { - "label": "Throw Mud", - "tooltip": "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", - "selected": "You throw some mud!" + "label": "진흙을 던진다", + "tooltip": "(+) 도망칠 확률 감소\n(-) 포획률 감소", + "selected": "진흙을 던졌다!" }, "4": { - "label": "Flee", - "tooltip": "(?) Flee from this Pokémon" + "label": "도망친다", + "tooltip": "(?) 이 포켓몬에게서 도망친다" }, - "watching": "{{pokemonName}} is watching carefully!", - "eating": "{{pokemonName}} is eating!", - "busy_eating": "{{pokemonName}} is busy eating!", - "angry": "{{pokemonName}} is angry!", - "beside_itself_angry": "{{pokemonName}} is beside itself with anger!", - "remaining_count": "{{remainingCount}} Pokémon remaining!" + "watching": "{{pokemonName}}[[는]] 조심스럽게 바라보고 있다!", + "eating": "{{pokemonName}}[[가]] 먹이를 먹고 있다!", + "busy_eating": "{{pokemonName}}[[가]] 먹이를 먹기 바쁘다!", + "angry": "{{pokemonName}}[[가]] 화가 난 것 같다!", + "beside_itself_angry": "{{pokemonName}}[[가]] 머리 끝까지 화가 난 것 같다!", + "remaining_count": "포켓몬이 {{remainingCount}}마리 남았다!" }, - "outro": "That was a fun little excursion!" + "outro": "재미있는 사파리 체험이었다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/shady-vitamin-dealer-dialogue.json b/src/locales/ko/mystery-encounters/shady-vitamin-dealer-dialogue.json index d0003de07f1d..3866570b1db7 100644 --- a/src/locales/ko/mystery-encounters/shady-vitamin-dealer-dialogue.json +++ b/src/locales/ko/mystery-encounters/shady-vitamin-dealer-dialogue.json @@ -1,27 +1,27 @@ { - "intro": "A man in a dark coat approaches you.", - "speaker": "Shady Salesman", - "intro_dialogue": ".@d{16}.@d{16}.@d{16}$I've got the goods if you've got the money.$Make sure your Pokémon can handle it though.", - "title": "The Vitamin Dealer", - "description": "The man opens his jacket to reveal some Pokémon vitamins. The numbers he quotes seem like a really good deal. Almost too good...\nHe offers two package deals to choose from.", - "query": "Which deal will you choose?", - "invalid_selection": "Pokémon must be healthy enough.", + "intro": "검은 코트를 입은 남자가 다가왔다.", + "speaker": "수상한 상인", + "intro_dialogue": ".@d{16}.@d{16}.@d{16}$아-주 좋은 물건이 있는데, 관심 있어?$물론, 네 포켓몬이 이걸 감당할 수 있을지는 모르지만.", + "title": "영양제(?) 딜러", + "description": "남자가 코트를 살짝 열어 보여주자,\n코트 안쪽에 포켓몬 영양제들이 빼곡히 들어있는 것이 보입니다.\n그가 부른 가격은 아주 매력적입니다. 좋아도 너무 좋군요…\n그는 두가지 선택지를 제시했습니다.", + "query": "거래를 받아들일까요?", + "invalid_selection": "포켓몬이 충분히 건강하지 않습니다.", "option": { "1": { - "label": "The Cheap Deal", - "tooltip": "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins" + "label": "저렴한 거래", + "tooltip": "(-) {{option1Money, money}} 지불\n(-) 부작용?\n(+) 선택한 포켓몬이 2가지 무작위 영양제 효과를 얻음" }, "2": { - "label": "The Pricey Deal", - "tooltip": "(-) Pay {{option2Money, money}}\n(+) Chosen Pokémon Gains 2 Random Vitamins" + "label": "비싼 거래", + "tooltip": "(-) {{option2Money, money}} 지불\n(+) 선택한 포켓몬이 2가지 무작위 영양제 효과를 얻음" }, "3": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "Heh, wouldn't have figured you for a coward." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "흥, 너 같은 겁쟁이한테는 안 팔아." }, - "selected": "The man hands you two bottles and quickly disappears.${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!" + "selected": "남자는 영양제 두 병을 건넨 뒤,\n빠르게 사라졌다.${{selectedPokemon}}[[는]] {{boost1}}[[과]] {{boost2}} 효과를 얻었다!" }, - "cheap_side_effects": "But the medicine had some side effects!$Your {{selectedPokemon}} takes some damage,\nand its Nature is changed to {{newNature}}!", - "no_bad_effects": "Looks like there were no side-effects from the medicine!" + "cheap_side_effects": "그런데 약이 부작용이 있는 것 같다!${{selectedPokemon}}[[가]] 약간 고통스러워한다.\n성격이 {{newNature}}[[로]] 변해버렸다!", + "no_bad_effects": "딱히 부작용은 없는 것 같다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/slumbering-snorlax-dialogue.json b/src/locales/ko/mystery-encounters/slumbering-snorlax-dialogue.json index cd3bb7465c48..afac8be35e27 100644 --- a/src/locales/ko/mystery-encounters/slumbering-snorlax-dialogue.json +++ b/src/locales/ko/mystery-encounters/slumbering-snorlax-dialogue.json @@ -1,25 +1,25 @@ { - "intro": "As you walk down a narrow pathway, you see a towering silhouette blocking your path.$You get closer to see a {{snorlaxName}} sleeping peacefully.\nIt seems like there's no way around it.", - "title": "Slumbering {{snorlaxName}}", - "description": "You could attack it to try and get it to move, or simply wait for it to wake up. Who knows how long that could take, though...", - "query": "What will you do?", + "intro": "좁은 길을 걷다보니 거대한 실루엣이\n길을 막고 있는 것을 발견했다.$가까이 다가가 보니 평화롭게 자고있는 {{snorlaxName}}였다.\n피할 수 있는 방법은 없는 것 같다….", + "title": "잠자는 {{snorlaxName}}", + "description": "자고있는 {{snorlaxName}}[[를]] 지금 당장 공격해서 자리를 비키게 할 수도, 그냥 알아서 잠에서 깨어날 때까지 기다릴 수도 있습니다.\n얼마나 기다려야 할지는 알 수 없겠지만요….", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Battle It", - "tooltip": "(-) Fight Sleeping {{snorlaxName}}\n(+) Special Reward", - "selected": "You approach the\nPokémon without fear." + "label": "싸운다", + "tooltip": "(-) 잠자는 {{snorlaxName}}[[과]] 배틀\n(+) 특별한 보상", + "selected": "용감하게 포켓몬에게 다가갔다." }, "2": { - "label": "Wait for It to Move", - "tooltip": "(-) Wait a Long Time\n(+) Recover Party", - "selected": ".@d{32}.@d{32}.@d{32}$You wait for a time, but the {{snorlaxName}}'s yawns make your party sleepy...", - "rest_result": "When you all awaken, the {{snorlaxName}} is no where to be found -\nbut your Pokémon are all healed!" + "label": "움직일 때까지 기다린다", + "tooltip": "(-) 긴 시간을 기다림 \n(+) 멤버 HP회복", + "selected": ".@d{32}.@d{32}.@d{32}$한참을 기다리다보니, {{snorlaxName}}의 하품이 모두를 졸리게 만든다….", + "rest_result": "모두가 잠에서 깨어났을 무렵, {{snorlaxName}}[[는]] 어디에도 없었다.\n하지만 모든 포켓몬이 회복되었다!" }, "3": { - "label": "Steal Its Item", - "tooltip": "(+) {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Special Reward", - "disabled_tooltip": "Your Pokémon need to know certain moves to choose this", - "selected": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}!$@s{item_fanfare}It steals Leftovers off the sleeping\n{{snorlaxName}} and you make out like bandits!" + "label": "아이템을 훔친다", + "tooltip": "(+) {{option3PrimaryName}}[[가]] {{option3PrimaryMove}}[[를]] 사용\n(+) 특별한 보상", + "disabled_tooltip": "포켓몬이 특정 기술을 알고 있어야 한다.", + "selected": "{{option3PrimaryName}}[[는]] {{option3PrimaryMove}}[[를]] 사용했다!$@s{item_fanfare}자고 있는 {{snorlaxName}}[[로]]부터\n남은 음식을 훔쳐서 살금살금 도망쳤다!" } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/teleporting-hijinks-dialogue.json b/src/locales/ko/mystery-encounters/teleporting-hijinks-dialogue.json index c295867f5218..de87ab83858a 100644 --- a/src/locales/ko/mystery-encounters/teleporting-hijinks-dialogue.json +++ b/src/locales/ko/mystery-encounters/teleporting-hijinks-dialogue.json @@ -1,27 +1,27 @@ { - "intro": "It's a strange machine, whirring noisily...", - "title": "Teleportating Hijinks", - "description": "The machine has a sign on it that reads:\n \"To use, insert money then step into the capsule.\"\n\nPerhaps it can transport you somewhere...", - "query": "What will you do?", + "intro": "시끄럽게 윙윙거리고 있는\n이상한 기계를 발견했다….", + "title": "텔레포트 대소동", + "description": "기계에는 다음과 같이 설명이 쓰여 있습니다.\n\"사용하려면 돈을 넣고 캡슐에 들어가세요.\"\n\n기계를 작동시키면 어딘가로 이동할 수 있을 듯하다……", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Put Money In", - "tooltip": "(-) Pay {{price, money}}\n(?) Teleport to New Biome", - "selected": "You insert some money, and the capsule opens.\nYou step inside..." + "label": "돈을 넣는다", + "tooltip": "(-) {{price, money}} 지불\n(?) 다른 바이옴으로 이동", + "selected": "돈을 넣자 캡슐이 열렸다.\n당신은 안으로 들어갔다……." }, "2": { - "label": "A Pokémon Helps", - "tooltip": "(-) {{option2PrimaryName}} Helps\n(+) {{option2PrimaryName}} gains EXP\n(?) Teleport to New Biome", - "disabled_tooltip": "You need a Steel or Electric Type Pokémon to choose this", - "selected": "{{option2PrimaryName}}'s Type allows it to bypass the machine's paywall!$The capsule opens, and you step inside..." + "label": "포켓몬의 도움", + "tooltip": "(-) {{option2PrimaryName}}[[가]] 도와줌\n(+) {{option2PrimaryName}}[[가]] 경험치를 획득\n(?) 다른 바이옴으로 이동", + "disabled_tooltip": "강철 또는 전기 타입 포켓몬이 있어야 한다.", + "selected": "{{option2PrimaryName}} 덕분에\n결제 시스템을 해제할 수 있었다!$캡슐이 열리자\n당신은 안으로 들어갔다…." }, "3": { - "label": "Inspect the Machine", - "tooltip": "(-) Pokémon Battle", - "selected": "You are drawn in by the blinking lights\nand strange noises coming from the machine...$You don't even notice as a wild\nPokémon sneaks up and ambushes you!" + "label": "기계를 조사한다", + "tooltip": "(-) 포켓몬 배틀", + "selected": "기계에서 나오는 깜빡이는 불빛과\n기묘한 소리에 몰두했다…….$정신이 팔려서 야생 포켓몬이\n다가오는 것도 눈치채지 못했다!" } }, - "transport": "The machine shakes violently,\nmaking all sorts of strange noises!$Just as soon as it had started, it quiets once more.", - "attacked": "You step out into a completely new area, startling a wild Pokémon!$The wild Pokémon attacks!", - "boss_enraged": "The opposing {{enemyPokemon}} has become enraged!" + "transport": "별안간 기계가 심하게 흔들리면서\n온갖 이상한 소리가 나기 시작했다!$얼마 안 가서 기계는 다시 조용해졌다.", + "attacked": "새로운 지역에 발을 내딛자마자\n놀란 야생 포켓몬과 마주쳤다!$야생 포켓몬이 달려들었다!", + "boss_enraged": "상대 {{enemyPokemon}}[[는]] 화가 난 것 같다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json index 7e8091bbfff0..f5b35cb33cb3 100644 --- a/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -1,23 +1,23 @@ { - "intro": "A chipper elderly man approaches you.", - "speaker": "Gentleman", - "intro_dialogue": "Hello there! Have I got a deal just for YOU!", - "title": "The Pokémon Salesman", - "description": "\"This {{purchasePokemon}} is extremely unique and carries an ability not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", - "description_shiny": "\"This {{purchasePokemon}} is extremely unique and has a pigment not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", - "query": "What will you do?", + "intro": "쾌활한 노신사가 다가왔다.", + "speaker": "신사", + "intro_dialogue": "거기, 안녕하신가!\n자네에게 좋은 거래를 제안하지!", + "title": "포켓몬 상인", + "description": "\"이 {{purchasePokemon}}[[는]] 다른 평범한 {{purchasePokemon}}에서는 찾을 수 없는 매우 희귀한 특성을 갖고 있다네!\n내가 이 멋진 {{purchasePokemon}}[[를]] 자네에게 {{price, money}}에 주고 싶은데!\"\n\n\"어떻게 생각하는가?\"", + "description_shiny": "\"이 {{purchasePokemon}}[[는]] 다른 평범한 {{purchasePokemon}}에서는 볼 수 없는 매우 희귀한 색깔이라네!\n내가 이 멋진 {{purchasePokemon}}[[를]] 자네에게 {{price, money}}에 주고 싶은데!\"\n\n\"어떻게 생각하는가?\"", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Accept", - "tooltip": "(-) Pay {{price, money}}\n(+) Gain a {{purchasePokemon}} with its Hidden Ability", - "tooltip_shiny": "(-) Pay {{price, money}}\n(+) Gain a shiny {{purchasePokemon}}", - "selected_message": "You paid an outrageous sum and bought the {{purchasePokemon}}.", - "selected_dialogue": "Excellent choice!$I can see you've a keen eye for business.$Oh, yeah...@d{64} Returns not accepted, got that?" + "label": "승낙한다", + "tooltip": "(-) {{price, money}} 지불\n(+) 숨겨진 특성을 가진 {{purchasePokemon}}[[를]] 얻음", + "tooltip_shiny": "(-) {{price, money}} 지불\n(+) 특별한 색을 가진 {{purchasePokemon}}[[를]] 얻음", + "selected_message": "터무니없는 금액을 내고\n{{purchasePokemon}}[[를]] 데려왔다.", + "selected_dialogue": "탁월한 선택이로군!$자네는 비즈니스에 안목이 있구먼.$아차차…@d{64} 반품은 안 된다네. 알고 있겠지?" }, "2": { - "label": "Refuse", - "tooltip": "(-) No Rewards", - "selected": "No?@d{32} You say no?$I'm only doing this as a favor to you!" + "label": "거절한다", + "tooltip": "(-) 보상 없음", + "selected": "아니?@d{32} 거절하겠다고?$요즘 젊은이들은\n호의를 베풀어도 모른다니까!" } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json index b5403616c9b5..1563041e5bdd 100644 --- a/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json @@ -1,21 +1,21 @@ { - "intro": "It's a massive {{shuckleName}} and what appears\nto be a large stash of... juice?", - "title": "The Strong Stuff", - "description": "The {{shuckleName}} that blocks your path looks incredibly strong. Meanwhile, the juice next to it is emanating power of some kind.\n\nThe {{shuckleName}} extends its feelers in your direction. It seems like it wants to do something...", - "query": "What will you do?", + "intro": "커다란 {{shuckleName}}를 만났다!\n옆에 한가득 차 있는 저건 주스…?", + "title": "강력한 물질", + "description": "당신을 막아선 {{shuckleName}}[[는]] 엄청나게 강해보입니다. 게다가 그 옆에 있는 주스에서는 무언가 강한 기운이 느껴지는 것 같습니다.\n\n{{shuckleName}}가 당신 쪽으로 다리를 내밉니다.\n무언가 하려는 모양입니다…", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Approach the {{shuckleName}}", - "tooltip": "(?) Something awful or amazing might happen", - "selected": "You black out.", - "selected_2": "@f{150}When you awaken, the {{shuckleName}} is gone\nand juice stash completely drained.${{highBstPokemon1}} and {{highBstPokemon2}}\nfeel a terrible lethargy come over them!$Their base stats were reduced by {{reductionValue}}!$Your remaining Pokémon feel an incredible vigor, though!\nTheir base stats are increased by {{increaseValue}}!" + "label": "{{shuckleName}}에게 다가간다", + "tooltip": "(?) 끔찍하거나 놀라운 일", + "selected": "당신은 기절해버렸다……….", + "selected_2": "@f{150}정신을 차리고 나니, {{shuckleName}}[[는]] 사라지고\n주스도 완전히 비었다.${{highBstPokemon1}}[[과]] {{highBstPokemon2}}[[는]]\n굉장히 무기력해졌다!$두 포켓몬의 종족치가 각각 {{reductionValue}}만큼 감소했다!$하지만 다른 포켓몬들은 놀라울만큼 활력이 넘친다!\n다른 포켓몬들의 종족치가 각각 {{increaseValue}}만큼 증가했다!" }, "2": { - "label": "Battle the {{shuckleName}}", - "tooltip": "(-) Hard Battle\n(+) Special Rewards", - "selected": "Enraged, the {{shuckleName}} drinks some of its juice and attacks!", - "stat_boost": "The {{shuckleName}}'s juice boosts its stats!" + "label": "{{shuckleName}}[[과]] 싸운다", + "tooltip": "(-) 어려운 배틀\n(+) 특별한 보상", + "selected": "화가 난 {{shuckleName}}[[가]] 주스를 마시고 공격해 왔다!", + "stat_boost": "주스를 마신 {{shuckleName}}의 능력치가 올라갔다!" } }, - "outro": "What a bizarre turn of events." + "outro": "기묘한 일을 겪은 것 같다…." } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json index 37807a91667e..b7b96926f575 100644 --- a/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -1,22 +1,22 @@ { - "intro": "It's a family standing outside their house!", - "speaker": "The Winstrates", - "intro_dialogue": "We're the Winstrates!$What do you say to taking on our family in a series of Pokémon battles?", - "title": "The Winstrate Challenge", - "description": "The Winstrates are a family of 5 trainers, and they want to battle! If you beat all of them back-to-back, they'll give you a grand prize. But can you handle the heat?", - "query": "What will you do?", + "intro": "한 가족이 집 앞에 모두 나와있다!", + "speaker": "연승가족", + "intro_dialogue": "우리는 연승가족!$잠깐 어떤가?\n지금 여기서 우리 가족 4명과 포켓몬 승부를 겨뤄보지 않겠나?", + "title": "연승가족", + "description": "모두 5명인 연승가족이 승부를 바라고 있습니다!\n가족 모두를 연달아 쓰러뜨릴 수 있다면 어마어마한 보상을 줄 겁니다.\n하지만 이걸 감당할 수 있을까요?", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "Accept the Challenge", - "tooltip": "(-) Brutal Battle\n(+) Special Item Reward", - "selected": "Let the challenge begin!" + "label": "승부한다", + "tooltip": "(-) 치열한 승부\n(+) 특별한 아이템 획득", + "selected": "승부를 시작하지!" }, "2": { - "label": "Refuse the Challenge", - "tooltip": "(+) Full Heal Party\n(+) Gain a Rarer Candy", - "selected": "That's too bad. Say, your team looks worn out, why don't you stay awhile and rest?" + "label": "승부를 거절한다", + "tooltip": "(+) 파티 전체 회복\n(+) 더이상한사탕 획득", + "selected": "아쉽군. 그런데 자네 포켓몬들 좀 지쳐보이는구만,\n조금 쉬고 가지 않을텐가?" } }, - "victory": "Congratulations on beating our challenge!$First off, we'd like you to have this Voucher.", - "victory_2": "Also, our family uses this Macho Brace to strengthen\nour Pokémon more effectively during training.$You may not need it considering that you beat the whole lot of us, but we hope you'll accept it anyway!" + "victory": "우리의 시련을 모두 극복하다니 축하하네!$먼저 이 바우처를 주겠네.", + "victory_2": "우리 가족은 이 교정깁스로 포켓몬을 더 효과적으로 훈련하고 있다네.$우리 전부를 이긴 자네에겐 의미 없을 수도 있겠지만,\n그래도 이걸 받아주게!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/training-session-dialogue.json b/src/locales/ko/mystery-encounters/training-session-dialogue.json index f018018fe4e2..fc9d6721c402 100644 --- a/src/locales/ko/mystery-encounters/training-session-dialogue.json +++ b/src/locales/ko/mystery-encounters/training-session-dialogue.json @@ -1,33 +1,33 @@ { - "intro": "You've come across some\ntraining tools and supplies.", - "title": "Training Session", - "description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", - "query": "How should you train?", - "invalid_selection": "Pokémon must be healthy enough.", + "intro": "훈련에 쓸 만한 물건들을 발견했다.", + "title": "트레이닝 시간", + "description": "발견한 기구들은 포켓몬들을 훈련시키는 데 쓸 수 있을 것 같습니다!\n파티의 다른 포켓몬들과 싸우면서 원하는 방식으로 훈련해 보면 어떨까요?", + "query": "어떻게 훈련할까요?", + "invalid_selection": "포켓몬이 힘들어 보인다.", "option": { "1": { - "label": "Light Training", - "tooltip": "(-) Light Battle\n(+) Improve 2 Random IVs of Pokémon", - "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!$Its {{stat1}} and {{stat2}} IVs were improved!" + "label": "가벼운 트레이닝", + "tooltip": "(-) 쉬운 배틀 \n(+) 선택 포켓몬 무작위 개체치 2가지 향상", + "finished": "훈련을 마친 {{selectedPokemon}}[[는]] 조금 지쳤지만 뿌듯해 보인다!${{selectedPokemon}}의 {{stat1}}[[과]] {{stat2}}[[가]] 상승했다!" }, "2": { - "label": "Moderate Training", - "tooltip": "(-) Moderate Battle\n(+) Change Pokémon's Nature", - "select_prompt": "Select a new nature\nto train your Pokémon in.", - "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!$Its nature was changed to {{nature}}!" + "label": "일반적인 트레이닝", + "tooltip": "(-) 평범한 배틀\n(+) 선택 포켓몬 성격 변경", + "select_prompt": "포켓몬과 훈련할\n새로운 성격을 선택하세요.", + "finished": "훈련을 마친 {{selectedPokemon}}[[는]] 조금 지쳤지만 뿌듯해 보인다!${{selectedPokemon}}의 성격이 {{nature}}[[로]] 바뀌었다!" }, "3": { - "label": "Heavy Training", - "tooltip": "(-) Harsh Battle\n(+) Change Pokémon's Ability", - "select_prompt": "Select a new ability\nto train your Pokémon in.", - "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!$Its ability was changed to {{ability}}!" + "label": "고강도 트레이닝", + "tooltip": "(-) 힘든 배틀\n(+) 선택 포켓몬 특성 변경", + "select_prompt": "포켓몬과 훈련할\n새로운 특성을 선택을 선택하세요.", + "finished": "훈련을 마친 {{selectedPokemon}}[[는]] 조금 지쳤지만 뿌듯해 보인다!${{selectedPokemon}}의 특성이 {{ability}}[[로]] 바뀌었다!" }, "4": { - "label": "Leave", - "tooltip": "(-) No Rewards", - "selected": "You've no time for training.\nTime to move on." + "label": "떠난다", + "tooltip": "(-) 보상 없음", + "selected": "훈련할 시간은 없다.\n바로 길을 떠났다." }, - "selected": "{{selectedPokemon}} moves across\nthe clearing to face you..." + "selected": "{{selectedPokemon}}[[가]] 공터를 가로질러\n이쪽을 보고 마주섰다…" }, - "outro": "That was a successful training session!" + "outro": "성공적인 트레이닝 시간이었다!" } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json index ae6e63ed8007..ac285692d23d 100644 --- a/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json @@ -1,19 +1,19 @@ { - "intro": "It's a massive pile of garbage!\nWhere did this come from?", - "title": "Trash to Treasure", - "description": "The garbage heap looms over you, and you can spot some items of value buried amidst the refuse. Are you sure you want to get covered in filth to get them, though?", - "query": "What will you do?", + "intro": "엄청난 쓰레기 더미다!\n도대체 어디서 온 걸까?", + "title": "쓰레기 속 보물", + "description": "쓰레기 더미가 눈앞에 펼쳐져 있습니다.\n그 속에서 가치 있는 물건을 찾을 수도 있겠죠.\n하지만 그 물건들을 얻기 위해\n정말로 오물을 뒤집어쓰고 싶으신가요?", + "query": "무엇을 하시겠습니까?", "option": { "1": { - "label": "Dig for Valuables", - "tooltip": "(-) Lose Healing Items in Shops\n(+) Gain Amazing Items", - "selected": "You wade through the garbage pile, becoming mired in filth.$There's no way any respectable shopkeepers\nwill sell you anything in your grimy state!$You'll just have to make do without shop healing items.$However, you found some incredible items in the garbage!" + "label": "쓸만한 것을 발굴한다", + "tooltip": "(-) 회복 아이템 가격 3배 상승\n(+) 끝내주는 아이템들을 획득", + "selected": "쓰레기 더미를 헤집고 다니며 오물을 뒤집어썼다.$지금 이 상태라면 아무리 친절한 점원이라도\n물건을 제 가격에 안 팔 것 같다!$앞으로는 상점에서 파는 회복약을 훨씬 비싸게 사야 한다.$하지만 쓰레기에서 엄청난 물건들을 발견했다!" }, "2": { - "label": "Investigate Further", - "tooltip": "(?) Find the Source of the Garbage", - "selected": "You wander around the heap, searching for any indication as to how this might have appeared here...", - "selected_2": "Suddenly, the garbage shifts! It wasn't just garbage, it was a Pokémon!" + "label": "주변을 조사한다", + "tooltip": "(?) 쓰레기의 근원을 찾는다", + "selected": "쓰레기 더미 주변을 거닐며,\n이게 여기 어떻게 생겨난 건지 단서를 찾아본다…", + "selected_2": "갑자기 쓰레기 더미가 움직였다!\n쓰레기가 아니라 포켓몬이었다!" } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/uncommon-breed-dialogue.json b/src/locales/ko/mystery-encounters/uncommon-breed-dialogue.json index e6f5b3d3fcd5..aeec128b3132 100644 --- a/src/locales/ko/mystery-encounters/uncommon-breed-dialogue.json +++ b/src/locales/ko/mystery-encounters/uncommon-breed-dialogue.json @@ -1,26 +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?", + "intro": "저건 평범한 포켓몬이 아닌 것 같다!", + "title": "흔하지 않은 포켓몬", + "description": "저 {{enemyPokemon}}[[는]] 다른 {{enemyPokemon}}[[과]]는 어딘가 달라보입니다. @[TOOLTIP_TITLE]{아마 특별한 기술을 알고 있을지도?}\n평범하게 배틀로 잡을 수도 있지만, 친구가 되는 방법도 있을 것 같습니다.", + "query": "어떻게 하시겠습니까?", "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}}'s heightened abilities boost its stats!" + "label": "포켓몬과 싸운다", + "tooltip": "(-) 까다로운 배틀\n(+) 포획 가능한 강한 적", + "selected": "{{enemyPokemon}}에게 용감하게 맞섰다.", + "stat_boost": "{{enemyPokemon}}[[가]] 집중해서 능력치가 상승했다!" }, "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!" + "label": "음식을 준다", + "disabled_tooltip": "선택지를 고르려면 나무열매가 4개 필요하다.", + "tooltip": "(-) 나무열매 4개를 줌\n(+) {{enemyPokemon}}[[가]] 좋아함", + "selected": "{{enemyPokemon}}에게 나무열매를 주었다!$행복한 듯 맛있게 먹기 시작했다!${{enemyPokemon}}[[는]] 동료가 되고 싶어하는 것 같다!" }, "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!" + "label": "친구가 되기", + "disabled_tooltip": "파티의 포켓몬이 특정한 기술을 알고 있어야한다.", + "tooltip": "(+) {{option3PrimaryName}}[[가]] {{option3PrimaryMove}}[[를]] 사용\n(+) {{enemyPokemon}}[[가]] 좋아함", + "selected": "{{option3PrimaryName}}[[가]] {{option3PrimaryMove}}[[를]] 사용해\n{{enemyPokemon}}를 매료시켰다!${{enemyPokemon}}[[는]] 동료가 되고 싶어하는 것 같다!" } } } \ No newline at end of file diff --git a/src/locales/ko/mystery-encounters/weird-dream-dialogue.json b/src/locales/ko/mystery-encounters/weird-dream-dialogue.json index 44acde84002c..303c459a1fba 100644 --- a/src/locales/ko/mystery-encounters/weird-dream-dialogue.json +++ b/src/locales/ko/mystery-encounters/weird-dream-dialogue.json @@ -1,22 +1,22 @@ { - "intro": "A shadowy woman blocks your path.\nSomething about her is unsettling...", - "speaker": "Woman", - "intro_dialogue": "I have seen your futures, your pasts...$Child, do you see them too?", + "intro": "어떤 여자의 실루엣이 앞을 막아섰다.\n그녀에게서 뭔가 불안한 느낌이 든다…….", + "speaker": "여자", + "intro_dialogue": "너의 미래와 과거를 봤어….$저기…\n너도 그게 보이는 걸까?", "title": "???", - "description": "The woman's words echo in your head. It wasn't just a singular voice, but a vast multitude, from all timelines and realities. You begin to feel dizzy, the question lingering on your mind...\n\n@[TOOLTIP_TITLE]{\"I have seen your futures, your pasts... Child, do you see them too?\"}", - "query": "What will you do?", + "description": "여자의 말이 머릿속에서 메아리처럼 울려 퍼집니다. 이건 단순히 한 사람의 목소리가 아닙니다. 모든 시간선과 현실에서 온 수많은 사람들의 목소리입니다.\n당신은 어지러움을 느끼기 시작하고, 한 질문이 머릿속을 맴돌기 시작합니다…\n\n@[TOOLTIP_TITLE]{\"너의 미래와 과거를 봤어….저기… 너도 그게 보이는 걸까?\"}", + "query": "어떻게 하시겠습니까?", "option": { "1": { - "label": "\"I See Them\"", - "tooltip": "@[SUMMARY_GREEN]{(?) Affects your Pokémon}", - "selected": "Her hand reaches out to touch you,\nand everything goes black.$Then...@d{64} You see everything.\nEvery timeline, all your different selves,\n past and future.$Everything that has made you,\neverything you will become...@d{64}", - "cutscene": "You see your Pokémon,@d{32} converging from\nevery reality to become something new...@d{64}", - "dream_complete": "When you awaken, the woman - was it a woman or a ghost? - is gone...$.@d{32}.@d{32}.@d{32}$Your Pokémon team has changed...\nOr is it the same team you've always had?" + "label": "고개를 끄덕인다", + "tooltip": "@[SUMMARY_GREEN]{(?) 파티의 포켓몬에 영향}", + "selected": "그녀는 당신에게 손을 뻗었고,\n이내 모든 것이 깜깜해졌다.$그리고…@d{64} 당신은 모든 것이 보인다.\n모든 시간선, 또 다른 당신의 모습,\n 과거와 미래.$당신을 만들어온 모든 것,\n당신이 될 모든 것…@d{64}", + "cutscene": "당신의 포켓몬들이 보인다.@d{32} 모든 현실이\n합쳐져 새로운 무언가가 되고 있다…@d{64}", + "dream_complete": "잠에서 깨어나자, 여자는 사라진 것 같다.\n사람이 아니라 유령이었을지도…$.@d{32}.@d{32}.@d{32}?$파티의 포켓몬이 바뀌었다…?$…아니, 원래부터 이 상태였는지도 모른다." }, "2": { - "label": "Quickly Leave", - "tooltip": "(-) Affects your Pokémon", - "selected": "You tear your mind from a numbing grip, and hastily depart.$When you finally stop to collect yourself, you check the Pokémon in your team.$For some reason, all of their levels have decreased!" + "label": "빠르게 떠난다", + "tooltip": "(-) 파티의 포켓몬에 영향", + "selected": "당신을 무감각하게 만들던 손아귀에서 벗어나,\n정신을 차리고 서둘러 자리를 떠났다.$간신히 정신을 추스르고 멈춰 서서\n파티의 포켓몬들을 확인했다.$이유는 알 수 없지만\n파티의 모든 포켓몬 레벨이 약간 줄어들었다!" } } } \ No newline at end of file diff --git a/src/locales/ko/party-ui-handler.json b/src/locales/ko/party-ui-handler.json index 10ae758381fc..35cf379556ff 100644 --- a/src/locales/ko/party-ui-handler.json +++ b/src/locales/ko/party-ui-handler.json @@ -13,9 +13,10 @@ "ALL": "전부", "PASS_BATON": "배턴터치한다", "UNPAUSE_EVOLUTION": "진화 재개", + "PAUSE_EVOLUTION": "진화 중지", "REVIVE": "되살린다", "RENAME": "닉네임 바꾸기", - "SELECT": "선택", + "SELECT": "선택한다", "choosePokemon": "포켓몬을 선택하세요.", "doWhatWithThisPokemon": "포켓몬을 어떻게 하겠습니까?", "noEnergy": "{{pokemonName}}[[는]] 싸울 수 있는\n기력이 남아 있지 않습니다!", @@ -24,6 +25,7 @@ "tooManyItems": "{{pokemonName}}[[는]] 지닌 도구의 수가\n너무 많습니다", "anyEffect": "써도 효과가 없다.", "unpausedEvolutions": "{{pokemonName}}의 진화가 재개되었다.", + "pausedEvolutions": "{{pokemonName}}[[가]] 진화하지 않도록 했다.", "unspliceConfirmation": "{{pokemonName}}로부터 {{fusionName}}의 융합을 해제하시겠습니까?\n{{fusionName}}는 사라지게 됩니다.", "wasReverted": "{{fusionName}}은 {{pokemonName}}의 모습으로 돌아갔습니다!", "releaseConfirmation": "{{pokemonName}}[[를]]\n정말 놓아주겠습니까?", diff --git a/src/locales/ko/pokemon-summary.json b/src/locales/ko/pokemon-summary.json index d91196236626..ca4b7a22b659 100644 --- a/src/locales/ko/pokemon-summary.json +++ b/src/locales/ko/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "그만둔다", "memoString": "{{natureFragment}}.\n{{metFragment}}", "metFragment": { - "normal": "{{biome}}에서\n레벨 {{level}}일 때 만났다.", + "normal": "{{biome}}에서 웨이브{{wave}},\n레벨 {{level}}일 때 만났다.", "apparently": "{{biome}}에서\n레벨 {{level}}일 때 만난 것 같다." }, "natureFragment": { diff --git a/src/locales/ko/settings.json b/src/locales/ko/settings.json index c10046385e12..d0655009a3cc 100644 --- a/src/locales/ko/settings.json +++ b/src/locales/ko/settings.json @@ -11,6 +11,10 @@ "expGainsSpeed": "경험치 획득 속도", "expPartyDisplay": "파티 경험치 표시", "skipSeenDialogues": "본 대화 생략", + "eggSkip": "알 스킵", + "never": "안 함", + "always": "항상", + "ask": "확인하기", "battleStyle": "시합 룰", "enableRetries": "재도전 허용", "hideIvs": "개체값탐지기 효과 끄기", diff --git a/src/locales/ko/trainer-titles.json b/src/locales/ko/trainer-titles.json index 269b607b630c..748f397a6551 100644 --- a/src/locales/ko/trainer-titles.json +++ b/src/locales/ko/trainer-titles.json @@ -36,5 +36,5 @@ "skull_admin": "스컬단 간부", "macro_admin": "매크로코스모스 간부", - "the_winstrates": "연승가족'" + "the_winstrates": "연승가족" } diff --git a/src/locales/pt_BR/ability-trigger.json b/src/locales/pt_BR/ability-trigger.json index cd47fd8e3dc4..60e86f3723c4 100644 --- a/src/locales/pt_BR/ability-trigger.json +++ b/src/locales/pt_BR/ability-trigger.json @@ -60,4 +60,4 @@ "postSummonTabletsOfRuin": "Tablets of Ruin de {{pokemonNameWithAffix}} reduziu o {{statName}}\nde todos os Pokémon em volta!", "postSummonBeadsOfRuin": "Beads of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", "preventBerryUse": "{{pokemonNameWithAffix}} está nervoso\ndemais para comer frutas!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/ability.json b/src/locales/pt_BR/ability.json index c4180ff01dde..57af43542250 100644 --- a/src/locales/pt_BR/ability.json +++ b/src/locales/pt_BR/ability.json @@ -421,7 +421,7 @@ }, "aftermath": { "name": "Aftermath", - "description": "Caso o Pokémon seja derrotado em decorrência de um movimento de contato, o atacante recebe dano." + "description": "Causa dano ao atacante se ele entrar em contato com o Pokémon com um golpe final." }, "anticipation": { "name": "Anticipation", diff --git a/src/locales/pt_BR/arena-tag.json b/src/locales/pt_BR/arena-tag.json index 7ab1ecea721b..3a1476dcef6f 100644 --- a/src/locales/pt_BR/arena-tag.json +++ b/src/locales/pt_BR/arena-tag.json @@ -54,4 +54,4 @@ "safeguardOnRemove": "O campo não está mais protegido por Safeguard!", "safeguardOnRemovePlayer": "Sua equipe não está mais protegido por Safeguard!", "safeguardOnRemoveEnemy": "A equipe adversária não está mais protegido por Safeguard!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/battle-info.json b/src/locales/pt_BR/battle-info.json index 0fd211c5c859..8a43839efb16 100644 --- a/src/locales/pt_BR/battle-info.json +++ b/src/locales/pt_BR/battle-info.json @@ -1,3 +1,3 @@ { "generation": "Geração {{generation}}" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/battle-message-ui-handler.json b/src/locales/pt_BR/battle-message-ui-handler.json index ee7062bccba4..d82fd665821e 100644 --- a/src/locales/pt_BR/battle-message-ui-handler.json +++ b/src/locales/pt_BR/battle-message-ui-handler.json @@ -5,4 +5,4 @@ "ivPrettyGood": "Bom", "ivDecent": "Regular", "ivNoGood": "Ruim" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/battle-scene.json b/src/locales/pt_BR/battle-scene.json index a0288475d69b..de2232b4edf6 100644 --- a/src/locales/pt_BR/battle-scene.json +++ b/src/locales/pt_BR/battle-scene.json @@ -1,3 +1,3 @@ { "moneyOwned": "₽{{formattedMoney}}" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json index fc5ed6e894c2..38eec73fdd47 100644 --- a/src/locales/pt_BR/battle.json +++ b/src/locales/pt_BR/battle.json @@ -14,10 +14,10 @@ "moneyWon": "Você ganhou\n₽{{moneyAmount}} por vencer!", "moneyPickedUp": "Você pegou ₽{{moneyAmount}} do chão!", "pokemonCaught": "{{pokemonName}} foi capturado!", - "pokemonObtained": "You got {{pokemonName}}!", - "pokemonBrokeFree": "Oh no!\nThe Pokémon broke free!", - "pokemonFled": "The wild {{pokemonName}} fled!", - "playerFled": "You fled from the {{pokemonName}}!", + "pokemonObtained": "Você recebeu um {{pokemonName}}!", + "pokemonBrokeFree": "Não!\nO Pokémon escapou!", + "pokemonFled": "{{pokemonName}} selvagem fugiu!", + "playerFled": "Você fugiu de {{pokemonName}}!", "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", "partyFull": "Sua equipe está cheia.\nSolte um Pokémon para ter espaço para {{pokemonName}}?", "pokemon": "Pokémon", @@ -53,7 +53,7 @@ "noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!", "noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!", "noPokeballStrong": "Este Pokémon é forte demais para ser capturado!\nÉ preciso enfraquecê-lo primeiro!", - "noPokeballMysteryEncounter": "You aren't able to\ncatch this Pokémon!", + "noPokeballMysteryEncounter": "Você não pode capturar\nesse Pokémon!", "noEscapeForce": "Uma força misteriosa\nte impede de fugir.", "noEscapeTrainer": "Não se pode fugir de\nbatalhas contra treinadores!", "noEscapePokemon": "O movimento {{moveName}} de {{pokemonName}} te impede de fugir!", @@ -102,5 +102,5 @@ "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", "congratulations": "Parabéns!", "beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!", - "mysteryEncounterAppeared": "What's this?" + "mysteryEncounterAppeared": "O que é isso?" } diff --git a/src/locales/pt_BR/berry.json b/src/locales/pt_BR/berry.json index 0ca5d3de286d..7cd5e5c14ddc 100644 --- a/src/locales/pt_BR/berry.json +++ b/src/locales/pt_BR/berry.json @@ -43,4 +43,4 @@ "name": "Fruta Leppa", "effect": "Restaura 10 PP de um movimento se seus PP acabarem" } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/bgm-name.json b/src/locales/pt_BR/bgm-name.json index 124665e0c8b7..8f73dffaee08 100644 --- a/src/locales/pt_BR/bgm-name.json +++ b/src/locales/pt_BR/bgm-name.json @@ -91,7 +91,7 @@ "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_aether_boss": "SM Batalha da Lusamine", "battle_skull_boss": "SM Batalha do Guzma", "battle_macro_boss": "SWSH Batalha do Rose", diff --git a/src/locales/pt_BR/biome.json b/src/locales/pt_BR/biome.json index d10f22eb4878..6235ebc4c3fd 100644 --- a/src/locales/pt_BR/biome.json +++ b/src/locales/pt_BR/biome.json @@ -35,4 +35,4 @@ "ISLAND": "Ilha", "LABORATORY": "Laboratório", "END": "???" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/challenges.json b/src/locales/pt_BR/challenges.json index 9dc613651a60..b8249882033b 100644 --- a/src/locales/pt_BR/challenges.json +++ b/src/locales/pt_BR/challenges.json @@ -34,4 +34,4 @@ "value.0": "Desligado", "value.1": "Ligado" } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/command-ui-handler.json b/src/locales/pt_BR/command-ui-handler.json index fcd8e7026b4c..1e541e60b9ac 100644 --- a/src/locales/pt_BR/command-ui-handler.json +++ b/src/locales/pt_BR/command-ui-handler.json @@ -4,4 +4,4 @@ "pokemon": "Pokémon", "run": "Fugir", "actionMessage": "O que {{pokemonName}}\ndeve fazer?" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/common.json b/src/locales/pt_BR/common.json index a5ec4381f26d..9c04c3ec811b 100644 --- a/src/locales/pt_BR/common.json +++ b/src/locales/pt_BR/common.json @@ -5,4 +5,4 @@ "commonShiny": "Comum", "rareShiny": "Raro", "epicShiny": "Épico" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index e1fe63f69eca..69ff87c25857 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -1,89 +1,89 @@ -import common from "./common.json"; -import settings from "./settings.json"; -import ability from "./ability.json"; import abilityTriggers from "./ability-trigger.json"; +import ability from "./ability.json"; +import achv from "./achv.json"; import arenaFlyout from "./arena-flyout.json"; import arenaTag from "./arena-tag.json"; -import achv from "./achv.json"; -import battle from "./battle.json"; -import battleScene from "./battle-scene.json"; import battleInfo from "./battle-info.json"; import battleMessageUiHandler from "./battle-message-ui-handler.json"; +import battleScene from "./battle-scene.json"; +import battle from "./battle.json"; import battlerTags from "./battler-tags.json"; import berry from "./berry.json"; import bgmName from "./bgm-name.json"; import biome from "./biome.json"; import challenges from "./challenges.json"; import commandUiHandler from "./command-ui-handler.json"; -import dialogue from "./dialogue.json"; +import common from "./common.json"; +import doubleBattleDialogue from "./dialogue-double-battle.json"; import battleSpecDialogue from "./dialogue-final-boss.json"; import miscDialogue from "./dialogue-misc.json"; -import doubleBattleDialogue from "./dialogue-double-battle.json"; +import dialogue from "./dialogue.json"; import egg from "./egg.json"; import fightUiHandler from "./fight-ui-handler.json"; import filterBar from "./filter-bar.json"; import gameMode from "./game-mode.json"; import gameStatsUiHandler from "./game-stats-ui-handler.json"; import growth from "./growth.json"; -import menu from "./menu.json"; import menuUiHandler from "./menu-ui-handler.json"; -import modifier from "./modifier.json"; +import menu from "./menu.json"; +import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; import modifierType from "./modifier-type.json"; +import modifier from "./modifier.json"; +import moveTriggers from "./move-trigger.json"; import move from "./move.json"; +import mysteryEncounterMessages from "./mystery-encounter-messages.json"; +import aTrainersTest from "./mystery-encounters/a-trainers-test-dialogue.json"; +import absoluteAvarice from "./mystery-encounters/absolute-avarice-dialogue.json"; +import offerYouCantRefuse from "./mystery-encounters/an-offer-you-cant-refuse-dialogue.json"; +import berriesAbound from "./mystery-encounters/berries-abound-dialogue.json"; +import bugTypeSuperfan from "./mystery-encounters/bug-type-superfan-dialogue.json"; +import clowningAround from "./mystery-encounters/clowning-around-dialogue.json"; +import dancingLessons from "./mystery-encounters/dancing-lessons-dialogue.json"; +import darkDeal from "./mystery-encounters/dark-deal-dialogue.json"; +import delibirdy from "./mystery-encounters/delibirdy-dialogue.json"; +import departmentStoreSale from "./mystery-encounters/department-store-sale-dialogue.json"; +import fieldTrip from "./mystery-encounters/field-trip-dialogue.json"; +import fieryFallout from "./mystery-encounters/fiery-fallout-dialogue.json"; +import fightOrFlight from "./mystery-encounters/fight-or-flight-dialogue.json"; +import funAndGames from "./mystery-encounters/fun-and-games-dialogue.json"; +import globalTradeSystem from "./mystery-encounters/global-trade-system-dialogue.json"; +import lostAtSea from "./mystery-encounters/lost-at-sea-dialogue.json"; +import mysteriousChallengers from "./mystery-encounters/mysterious-challengers-dialogue.json"; +import mysteriousChest from "./mystery-encounters/mysterious-chest-dialogue.json"; +import partTimer from "./mystery-encounters/part-timer-dialogue.json"; +import safariZone from "./mystery-encounters/safari-zone-dialogue.json"; +import shadyVitaminDealer from "./mystery-encounters/shady-vitamin-dealer-dialogue.json"; +import slumberingSnorlax from "./mystery-encounters/slumbering-snorlax-dialogue.json"; +import teleportingHijinks from "./mystery-encounters/teleporting-hijinks-dialogue.json"; +import pokemonSalesman from "./mystery-encounters/the-pokemon-salesman-dialogue.json"; +import theStrongStuff from "./mystery-encounters/the-strong-stuff-dialogue.json"; +import theWinstrateChallenge from "./mystery-encounters/the-winstrate-challenge-dialogue.json"; +import trainingSession from "./mystery-encounters/training-session-dialogue.json"; +import trashToTreasure from "./mystery-encounters/trash-to-treasure-dialogue.json"; +import uncommonBreed from "./mystery-encounters/uncommon-breed-dialogue.json"; +import weirdDream from "./mystery-encounters/weird-dream-dialogue.json"; import nature from "./nature.json"; import partyUiHandler from "./party-ui-handler.json"; import pokeball from "./pokeball.json"; -import pokemon from "./pokemon.json"; -import pokemonForm from "./pokemon-form.json"; import battlePokemonForm from "./pokemon-form-battle.json"; -import pokemonInfo from "./pokemon-info.json"; +import pokemonForm from "./pokemon-form.json"; import pokemonInfoContainer from "./pokemon-info-container.json"; +import pokemonInfo from "./pokemon-info.json"; import pokemonSummary from "./pokemon-summary.json"; +import pokemon from "./pokemon.json"; +import runHistory from "./run-history.json"; import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json"; +import settings from "./settings.json"; import splashMessages from "./splash-messages.json"; import starterSelectUiHandler from "./starter-select-ui-handler.json"; import statusEffect from "./status-effect.json"; -import trainerTitles from "./trainer-titles.json"; +import terrain from "./terrain.json"; import trainerClasses from "./trainer-classes.json"; import trainerNames from "./trainer-names.json"; +import trainerTitles from "./trainer-titles.json"; import tutorial from "./tutorial.json"; import voucher from "./voucher.json"; import weather from "./weather.json"; -import terrain from "./terrain.json"; -import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; -import moveTriggers from "./move-trigger.json"; -import runHistory from "./run-history.json"; -import mysteryEncounterMessages from "./mystery-encounter-messages.json"; -import lostAtSea from "./mystery-encounters/lost-at-sea-dialogue.json"; -import mysteriousChest from "./mystery-encounters/mysterious-chest-dialogue.json"; -import mysteriousChallengers from "./mystery-encounters/mysterious-challengers-dialogue.json"; -import darkDeal from "./mystery-encounters/dark-deal-dialogue.json"; -import departmentStoreSale from "./mystery-encounters/department-store-sale-dialogue.json"; -import fieldTrip from "./mystery-encounters/field-trip-dialogue.json"; -import fieryFallout from "./mystery-encounters/fiery-fallout-dialogue.json"; -import fightOrFlight from "./mystery-encounters/fight-or-flight-dialogue.json"; -import safariZone from "./mystery-encounters/safari-zone-dialogue.json"; -import shadyVitaminDealer from "./mystery-encounters/shady-vitamin-dealer-dialogue.json"; -import slumberingSnorlax from "./mystery-encounters/slumbering-snorlax-dialogue.json"; -import trainingSession from "./mystery-encounters/training-session-dialogue.json"; -import theStrongStuff from "./mystery-encounters/the-strong-stuff-dialogue.json"; -import pokemonSalesman from "./mystery-encounters/the-pokemon-salesman-dialogue.json"; -import offerYouCantRefuse from "./mystery-encounters/an-offer-you-cant-refuse-dialogue.json"; -import delibirdy from "./mystery-encounters/delibirdy-dialogue.json"; -import absoluteAvarice from "./mystery-encounters/absolute-avarice-dialogue.json"; -import aTrainersTest from "./mystery-encounters/a-trainers-test-dialogue.json"; -import trashToTreasure from "./mystery-encounters/trash-to-treasure-dialogue.json"; -import berriesAbound from "./mystery-encounters/berries-abound-dialogue.json"; -import clowningAround from "./mystery-encounters/clowning-around-dialogue.json"; -import partTimer from "./mystery-encounters/part-timer-dialogue.json"; -import dancingLessons from "./mystery-encounters/dancing-lessons-dialogue.json"; -import weirdDream from "./mystery-encounters/weird-dream-dialogue.json"; -import theWinstrateChallenge from "./mystery-encounters/the-winstrate-challenge-dialogue.json"; -import teleportingHijinks from "./mystery-encounters/teleporting-hijinks-dialogue.json"; -import bugTypeSuperfan from "./mystery-encounters/bug-type-superfan-dialogue.json"; -import funAndGames from "./mystery-encounters/fun-and-games-dialogue.json"; -import uncommonBreed from "./mystery-encounters/uncommon-breed-dialogue.json"; -import globalTradeSystem from "./mystery-encounters/global-trade-system-dialogue.json"; /** * Dialogue/Text token injection patterns that can be used: diff --git a/src/locales/pt_BR/dialogue-double-battle.json b/src/locales/pt_BR/dialogue-double-battle.json index 4d1c7d90c9bf..e796a6ea2a2c 100644 --- a/src/locales/pt_BR/dialogue-double-battle.json +++ b/src/locales/pt_BR/dialogue-double-battle.json @@ -80,4 +80,4 @@ "1": "Piers: Agora esse foi um ótimo show!\n$Marnie: Irmão..." } } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/dialogue-final-boss.json b/src/locales/pt_BR/dialogue-final-boss.json index 7009f00db5bb..c1e492a41ef0 100644 --- a/src/locales/pt_BR/dialogue-final-boss.json +++ b/src/locales/pt_BR/dialogue-final-boss.json @@ -3,4 +3,4 @@ "encounter_female": "Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe?\n$Você foi atraída para cá, porque já esteve aqui antes.\nInúmeras vezes.\n$Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu {{cycleCount}}º ciclo.\n$A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos \"eus\" permanecem.\n$Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n\n$Você é a única aqui, embora pareça haver... outro.\n$Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios?\n$Vamos começar.", "firstStageWin": "Entendo. A presença que senti era realmente real.\nParece que não preciso mais me segurar.\n$Não me decepcione.", "secondStageWin": "…Magnífico." -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/dialogue.json b/src/locales/pt_BR/dialogue.json index c09066b87441..56cd5333d12a 100644 --- a/src/locales/pt_BR/dialogue.json +++ b/src/locales/pt_BR/dialogue.json @@ -970,112 +970,115 @@ }, "stat_trainer_buck": { "encounter": { - "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", - "2": "I can feel my Pokémon shivering inside their Pokéballs!" + "1": "...Estou te falando agora. Eu sou muito durão. Finge surpresa!", + "2": "Posso sentir meus Pokémon tremendo dentro de suas Pokébolas!" }, "victory": { - "1": "Heeheehee!\nSo hot, you!", - "2": "Heeheehee!\nSo hot, you!" + "1": "Hehehe!\nVocê é uma máquina!", + "2": "Hehehe!\nVocê é uma máquina!" }, "defeat": { - "1": "Whoa! You're all out of gas, I guess.", - "2": "Whoa! You're all out of gas, I guess." + "1": "Uau! Acho que vocês estão sem gás.", + "2": "Uau! Acho que vocês estão sem gás." } }, "stat_trainer_cheryl": { "encounter": { - "1": "My Pokémon have been itching for a battle.", - "2": "I should warn you, my Pokémon can be quite rambunctious." + "1": "Meus Pokémon estavam ansiosos por uma batalha.", + "2": "Devo avisá-lo, meus Pokémon podem ser bastante agitados.", + "2_female": "Devo avisá-la, meus Pokémon podem ser bastante agitados." }, "victory": { - "1": "Striking the right balance of offense and defense... It's not easy to do.", - "2": "Striking the right balance of offense and defense... It's not easy to do." + "1": "Acertar o equilíbrio certo entre ataque e defesa... Não é fácil de fazer.", + "2": "Acertar o equilíbrio certo entre ataque e defesa... Não é fácil de fazer." }, "defeat": { - "1": "Do your Pokémon need any healing?", - "2": "Do your Pokémon need any healing?" + "1": "Seus Pokémon precisam de cura?", + "2": "Seus Pokémon precisam de cura?" } }, "stat_trainer_marley": { "encounter": { - "1": "... OK.\nI'll do my best.", - "2": "... OK.\nI... won't lose...!" + "1": "... Tá.\nVou dar o meu melhor.", + "2": "... Tá.\nEu... não vou perder...!" }, "victory": { "1": "... Awww.", "2": "... Awww." }, "defeat": { - "1": "... Goodbye.", - "2": "... Goodbye." + "1": "... Adeus.", + "2": "... Adeus." } }, "stat_trainer_mira": { "encounter": { - "1": "You will be shocked by Mira!", - "2": "Mira will show you that Mira doesn't get lost anymore!" + "1": "Você ficará surpreso com a Mira!", + "1_female": "Você ficará surpresa com a Mira!", + "2": "Mira vai te mostrar que ela não se perde mais!" }, "victory": { - "1": "Mira wonders if she can get very far in this land.", - "2": "Mira wonders if she can get very far in this land." + "1": "Mira se pergunta se conseguirá ir longe nessa terra.", + "2": "Mira se pergunta se conseguirá ir longe nessa terra." }, "defeat": { - "1": "Mira knew she would win!", - "2": "Mira knew she would win!" + "1": "Mira sabia que venceria!", + "2": "Mira sabia que venceria!" } }, "stat_trainer_riley": { "encounter": { - "1": "Battling is our way of greeting!", - "2": "We're pulling out all the stops to put your Pokémon down." + "1": "Lutar é nossa forma de saudação!", + "2": "Estamos fazendo de tudo para derrubar seus Pokémon." }, "victory": { - "1": "At times we battle, and sometimes we team up...$It's great how Trainers can interact.", - "2": "At times we battle, and sometimes we team up...$It's great how Trainers can interact." + "1": "Às vezes, lutamos e, às vezes, nos unimos...$É ótimo como Treinadores podem interagir.", + "2": "Às vezes, lutamos e, às vezes, nos unimos...$É ótimo como Treinadores podem interagir." }, "defeat": { - "1": "You put up quite the display.\nBetter luck next time.", - "2": "You put up quite the display.\nBetter luck next time." + "1": "Você fez uma bela exibição.\nMelhor sorte na próxima vez.", + "2": "Você fez uma bela exibição.\nMelhor sorte na próxima vez." } }, "winstrates_victor": { "encounter": { - "1": "That's the spirit! I like you!" + "1": "Esse é o espírito! Gosto de você!" }, "victory": { - "1": "A-ha! You're stronger than I thought!" + "1": "A-ha! Você é mais forte do que eu pensei!" } }, "winstrates_victoria": { "encounter": { - "1": "My goodness! Aren't you young?$You must be quite the trainer to beat my husband, though.$Now I suppose it's my turn to battle!" + "1": "Meu Deus! Você não é jovem?$Deve ser um grande Treinador para derrotar meu marido.$Acho que agora é a minha vez de lutar!", + "1_female": "Meu Deus! Você não é jovem?$Deve ser uma grande Treinadora para derrotar meu marido.$Acho que agora é a minha vez de lutar!" }, "victory": { - "1": "Uwah! Just how strong are you?!" + "1": "Uwah! Quão forte você é?!" } }, "winstrates_vivi": { "encounter": { - "1": "You're stronger than Mom? Wow!$But I'm strong, too!\nReally! Honestly!" + "1": "Você é mais forte que a Mamãe? Uau!$Mas eu também sou forte!\nDe verdade! Falando sério!" }, "victory": { - "1": "Huh? Did I really lose?\nSnivel... Grandmaaa!" + "1": "Ahn? Eu perdi mesmo?\nSnif... Vovóóó!" } }, "winstrates_vicky": { "encounter": { - "1": "How dare you make my precious\ngranddaughter cry!$I see I need to teach you a lesson.\nPrepare to feel the sting of defeat!" + "1": "Como ousa fazer minha preciosa\nneta chorar!$Vejo que preciso lhe dar uma lição.\nPrepare-se para sentir o ferrão da derrota!" }, "victory": { - "1": "Whoa! So strong!\nMy granddaughter wasn't lying." + "1": "Uau! Tão forte!\nMinha neta não estava mentindo." } }, "winstrates_vito": { "encounter": { - "1": "I trained together with my whole family,\nevery one of us!$I'm not losing to anyone!" + "1": "Treinei com toda a minha família,\ncada um de nós!$Não vou perder para para ninguém!" }, "victory": { - "1": "I was better than everyone in my family.\nI've never lost before..." + "1": "Eu era melhor do que todos em minha família.\nEu nunca perdi antes..." } }, "brock": { diff --git a/src/locales/pt_BR/egg.json b/src/locales/pt_BR/egg.json index 2a7a07f5206b..cbe31d27ed4c 100644 --- a/src/locales/pt_BR/egg.json +++ b/src/locales/pt_BR/egg.json @@ -11,7 +11,7 @@ "gachaTypeLegendary": "Chance de Lendário Aumentada", "gachaTypeMove": "Chance de Movimento de Ovo Raro Aumentada", "gachaTypeShiny": "Chance de Shiny Aumentada", - "eventType": "Mystery Event", + "eventType": "Evento Misterioso", "selectMachine": "Escolha uma máquina.", "notEnoughVouchers": "Você não tem vouchers suficientes!", "tooManyEggs": "Você já tem muitos ovos!", diff --git a/src/locales/pt_BR/filter-bar.json b/src/locales/pt_BR/filter-bar.json index 05898796d9fa..45b17c330776 100644 --- a/src/locales/pt_BR/filter-bar.json +++ b/src/locales/pt_BR/filter-bar.json @@ -35,4 +35,4 @@ "sortByCandies": "# Doces", "sortByIVs": "IVs", "sortByName": "Nome" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/game-mode.json b/src/locales/pt_BR/game-mode.json index 9aa0f2869592..674552bd9236 100644 --- a/src/locales/pt_BR/game-mode.json +++ b/src/locales/pt_BR/game-mode.json @@ -5,4 +5,4 @@ "dailyRun": "Desafio Diário", "unknown": "Desconhecido", "challenge": "Desafio" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/game-stats-ui-handler.json b/src/locales/pt_BR/game-stats-ui-handler.json index eb36f484cc3e..b473aa09c2f9 100644 --- a/src/locales/pt_BR/game-stats-ui-handler.json +++ b/src/locales/pt_BR/game-stats-ui-handler.json @@ -39,4 +39,4 @@ "epicEggsPulled": "Ovos Épicos Ganhos", "legendaryEggsPulled": "Ovos Lendários Ganhos", "manaphyEggsPulled": "Ovos de Manaphy Ganhos" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/growth.json b/src/locales/pt_BR/growth.json index d9b11dc23c35..272856a006c5 100644 --- a/src/locales/pt_BR/growth.json +++ b/src/locales/pt_BR/growth.json @@ -5,4 +5,4 @@ "Medium_Slow": "Meio Lento", "Slow": "Lento", "Fluctuating": "Muito Lento" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/menu.json b/src/locales/pt_BR/menu.json index 415796f91ed7..97acc63400f9 100644 --- a/src/locales/pt_BR/menu.json +++ b/src/locales/pt_BR/menu.json @@ -52,4 +52,4 @@ "rename": "Renomear", "nickname": "Apelido", "errorServerDown": "Opa! Não foi possível conectar-se ao servidor.\n\nVocê pode deixar essa janela aberta,\npois o jogo irá se reconectar automaticamente." -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/modifier-select-ui-handler.json b/src/locales/pt_BR/modifier-select-ui-handler.json index b111c41cc98f..e741eaa5f219 100644 --- a/src/locales/pt_BR/modifier-select-ui-handler.json +++ b/src/locales/pt_BR/modifier-select-ui-handler.json @@ -9,6 +9,6 @@ "checkTeamDesc": "Cheque seu time ou use um item de mudança de forma.", "rerollCost": "₽{{formattedMoney}}", "itemCost": "₽{{formattedMoney}}", - "continueNextWaveButton": "Continue", - "continueNextWaveDescription": "Continue to the next wave" + "continueNextWaveButton": "Continuar", + "continueNextWaveDescription": "Continuar para a próxima onda" } diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json index d5e32c451267..ae7a2cba93ef 100644 --- a/src/locales/pt_BR/modifier-type.json +++ b/src/locales/pt_BR/modifier-type.json @@ -69,18 +69,18 @@ "description": "Aumenta o atributo base de {{stat}} em 10%. Quanto maior os IVs, maior o limite de aumento." }, "PokemonBaseStatTotalModifierType": { - "name": "Shuckle Juice", - "description": "{{increaseDecrease}} all of the holder's base stats by {{statValue}}. You were {{blessCurse}} by the Shuckle.", + "name": "Suco Shuckle", + "description": "{{increaseDecrease}} todos os atributos base de quem o segurar por {{statValue}}. Você foi {{blessCurse}} por Shuckle.", "extra": { - "increase": "Increases", - "decrease": "Decreases", - "blessed": "blessed", - "cursed": "cursed" + "increase": "Aumenta", + "decrease": "Diminui", + "blessed": "abençoado", + "cursed": "amaldiçoado" } }, "PokemonBaseStatFlatModifierType": { - "name": "Old Gateau", - "description": "Increases the holder's {{stats}} base stats by {{statValue}}. Found after a strange dream." + "name": "Doce Antigo", + "description": "Aumenta os atributos base de {{stats}} de quem o segurar por {{statValue}}. Encontrado depois de um sonho estranho." }, "AllPokemonFullHpRestoreModifierType": { "description": "Restaura totalmente os PS de todos os Pokémon." @@ -266,11 +266,11 @@ "name": "Lentes de Mira", "description": "Estas lentes facilitam o foco em pontos fracos. Aumenta a chance de acerto crítico de quem a segurar." }, - "DIRE_HIT": { - "name": "Direto", - "extra": { - "raises": "Chance de Acerto Crítico" - } + "DIRE_HIT": { + "name": "Direto", + "extra": { + "raises": "Chance de Acerto Crítico" + } }, "LEEK": { "name": "Alho-poró", @@ -417,11 +417,23 @@ "description": "Adiciona uma chance de 1% de que um Pokémon selvagem seja uma fusão." }, - "MYSTERY_ENCOUNTER_SHUCKLE_JUICE": { "name": "Shuckle Juice" }, - "MYSTERY_ENCOUNTER_BLACK_SLUDGE": { "name": "Black Sludge", "description": "The stench is so powerful that shops will only sell you items at a steep cost increase." }, - "MYSTERY_ENCOUNTER_MACHO_BRACE": { "name": "Macho Brace", "description": "Defeating a Pokémon grants the holder a Macho Brace stack. Each stack slightly boosts stats, with an extra bonus at max stacks." }, - "MYSTERY_ENCOUNTER_OLD_GATEAU": { "name": "Old Gateau", "description": "Increases the holder's {{stats}} stats by {{statValue}}." }, - "MYSTERY_ENCOUNTER_GOLDEN_BUG_NET": { "name": "Golden Bug Net", "description": "Imbues the owner with luck to find Bug Type Pokémon more often. Has a strange heft to it." } + "MYSTERY_ENCOUNTER_SHUCKLE_JUICE": { "name": "Suco Shuckle" }, + "MYSTERY_ENCOUNTER_BLACK_SLUDGE": { + "name": "Lodo Escuro", + "description": "O fedor é tão forte que as lojas só venderão itens com um grande aumento de custo." + }, + "MYSTERY_ENCOUNTER_MACHO_BRACE": { + "name": "Pulseira Macho", + "description": "Derrotar um Pokémon concede a quem segura uma pilha de Pulseira Macho. Cada pilha aumenta ligeiramente os atributos, com um bônus extra no máximo de pilhas." + }, + "MYSTERY_ENCOUNTER_OLD_GATEAU": { + "name": "Doce Antigo", + "description_pt": "Aumenta os atributos de {{stats}} de quem o segurar por {{statValue}}." + }, + "MYSTERY_ENCOUNTER_GOLDEN_BUG_NET": { + "name": "Rede de Insetos Dourada", + "description": "Concede ao dono sorte para encontrar Pokémon do tipo Inseto com mais frequência. Tem um peso estranho." + } }, "SpeciesBoosterItem": { "LIGHT_BALL": { diff --git a/src/locales/pt_BR/modifier.json b/src/locales/pt_BR/modifier.json index 38622de579e0..6d1a1222f738 100644 --- a/src/locales/pt_BR/modifier.json +++ b/src/locales/pt_BR/modifier.json @@ -9,4 +9,4 @@ "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi pego(a)\npela {{typeName}} de {{pokemonName}}!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaurou um pouco de seus PS!", "bypassSpeedChanceApply": "{{pokemonName}} se move mais rápido que o normal graças à sua {{itemName}}!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/move-trigger.json b/src/locales/pt_BR/move-trigger.json index 4549f83cdf1c..a2ffa6500b49 100644 --- a/src/locales/pt_BR/move-trigger.json +++ b/src/locales/pt_BR/move-trigger.json @@ -4,11 +4,11 @@ "absorbedElectricity": "{{pokemonName}} absorveu eletricidade!", "switchedStatChanges": "{{pokemonName}} trocou as mudanças de atributo com o alvo!", "goingAllOutForAttack": "{{pokemonName}} está arriscando tudo nesse ataque!", - "regainedHealth": "{{pokemonName}} recuperou/nsaúde!", - "keptGoingAndCrashed": "{{pokemonName}} errou o alvo/ne se arrebentou!", + "regainedHealth": "{{pokemonName}} recuperou\nsaúde!", + "keptGoingAndCrashed": "{{pokemonName}} errou o alvo\ne se arrebentou!", "fled": "{{pokemonName}} fugiu!", "cannotBeSwitchedOut": "{{pokemonName}} não pode ser trocado!", - "swappedAbilitiesWithTarget": "{{pokemonName}} trocou/nde habilidades com o alvo!", + "swappedAbilitiesWithTarget": "{{pokemonName}} trocou\nde habilidades com o alvo!", "coinsScatteredEverywhere": "Moedas foram espalhadas por toda parte!", "attackedByItem": "{{pokemonName}} está prestes a ser atacado por {{itemName}}!", "whippedUpAWhirlwind": "{{pokemonName}} criou\num redemoinho de vento!", @@ -18,23 +18,23 @@ "loweredItsHead": "{{pokemonName}} abaixou sua cabeça!", "isGlowing": "{{pokemonName}} ficou envolto em uma luz forte!", "bellChimed": "Um sino tocou!", - "foresawAnAttack": "{{pokemonName}} previu/num ataque!", + "foresawAnAttack": "{{pokemonName}} previu\num ataque!", "isTighteningFocus": "{{pokemonName}} está\naumentando seu foco!", - "hidUnderwater": "{{pokemonName}} se escondeu/nembaixo d'água!", + "hidUnderwater": "{{pokemonName}} se escondeu\nembaixo d'água!", "soothingAromaWaftedThroughArea": "Um aroma suave se espalhou pelo ambiente!", "sprangUp": "{{pokemonName}} se levantou!", "choseDoomDesireAsDestiny": "{{pokemonName}} escolheu\no Desejo da Perdição como seu destino!", "vanishedInstantly": "{{pokemonName}} desapareceu\nde repente!", "tookTargetIntoSky": "{{pokemonName}} levou {{targetName}}\npara o céu!", - "becameCloakedInFreezingLight": "{{pokemonName}} ficou envolto/nem uma luz congelante!", - "becameCloakedInFreezingAir": "{{pokemonName}} ficou envolto/nem ar congelante!", + "becameCloakedInFreezingLight": "{{pokemonName}} ficou envolto\nem uma luz congelante!", + "becameCloakedInFreezingAir": "{{pokemonName}} ficou envolto\nem ar congelante!", "isChargingPower": "{{pokemonName}} está absorvendo energia!", "burnedItselfOut": "{{pokemonName}} apagou seu próprio fogo!", "startedHeatingUpBeak": "{{pokemonName}} começou\na esquentar seu bico!", "setUpShellTrap": "{{pokemonName}} armou uma armadilha de carapaça!", "isOverflowingWithSpacePower": "{{pokemonName}} está sobrecarregado\ncom energia espacial!", "usedUpAllElectricity": "{{pokemonName}} usou toda a sua eletricidade!", - "stoleItem": "{{pokemonName}} roubou/no(a) {{itemName}} de {{targetName}}!", + "stoleItem": "{{pokemonName}} roubou\no(a) {{itemName}} de {{targetName}}!", "incineratedItem": "{{pokemonName}} incinerou\na {{itemName}} de {{targetName}}!", "knockedOffItem": "{{pokemonName}} derrubou\no(a) {{itemName}} de {{targetName}}!", "tookMoveAttack": "{{pokemonName}} pegou\no movimento {{moveName}}!", diff --git a/src/locales/pt_BR/mystery-encounter-messages.json b/src/locales/pt_BR/mystery-encounter-messages.json index 3b81c8e46f0a..2c8b3738949f 100644 --- a/src/locales/pt_BR/mystery-encounter-messages.json +++ b/src/locales/pt_BR/mystery-encounter-messages.json @@ -1,7 +1,7 @@ { - "paid_money": "You paid ₽{{amount, number}}.", - "receive_money": "You received ₽{{amount, number}}!", - "affects_pokedex": "Affects Pokédex Data", - "cancel_option": "Return to encounter option select.", - "view_party_button": "View Party" + "paid_money": "Você pagou ₽{{amount, number}}.", + "receive_money": "Você recebeu ₽{{amount, number}}!", + "affects_pokedex": "Afeta Dados da Pokédex", + "cancel_option": "Voltar para a seleção de opções de encontro.", + "view_party_button": "Ver Equipe" } diff --git a/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json index c96c0d5f3277..849e3a94cbbc 100644 --- a/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json @@ -44,4 +44,4 @@ "legendary": "a Legendary Egg" }, "outro": "{{statTrainerName}} gave you {{eggType}}!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json index 5e4e8be90e79..2fdcd53e2959 100644 --- a/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json @@ -17,9 +17,9 @@ "disabled_tooltip": "You need at least 1 Bug Type Pokémon on your team to select this.", "selected": "You show the trainer all your Bug Type Pokémon...", "selected_0_to_1": "Huh? You only have {{numBugTypes}}...$Guess I'm wasting my breath on someone like you...", - "selected_2_to_3": "Hey, you've got {{numBugTypes}} Bug Types!\nNot bad.$Here, this might help you on your journey to catch more!", - "selected_4_to_5": "What? You have {{numBugTypes}} Bug Types?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", - "selected_6": "Whoa! {{numBugTypes}} Bug Types!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" + "selected_2_to_3": "Hey, you've got {{numBugTypes}}!\nNot bad.$Here, this might help you on your journey to catch more!", + "selected_4_to_5": "What? You have {{numBugTypes}}?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", + "selected_6": "Whoa! {{numBugTypes}}!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" }, "3": { "label": "Gift a Bug Item", @@ -34,5 +34,7 @@ "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", "teach_move_prompt": "Select a move to teach a Pokémon.", "confirm_no_teach": "You sure you don't want to learn one of these great moves?", - "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" + "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!", + "numBugTypes_one": "{{count}} Bug Type", + "numBugTypes_other": "{{count}} Bug Types" } diff --git a/src/locales/pt_BR/nature.json b/src/locales/pt_BR/nature.json index 5678c74061c5..11be27d6f535 100644 --- a/src/locales/pt_BR/nature.json +++ b/src/locales/pt_BR/nature.json @@ -24,4 +24,4 @@ "Sassy": "Atrevida", "Careful": "Cuidadosa", "Quirky": "Peculiar" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/pokeball.json b/src/locales/pt_BR/pokeball.json index 3a059654bb39..5f1dff974ec0 100644 --- a/src/locales/pt_BR/pokeball.json +++ b/src/locales/pt_BR/pokeball.json @@ -5,4 +5,4 @@ "rogueBall": "Bola Rogue", "masterBall": "Bola Mestra", "luxuryBall": "Bola Luxo" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/pokemon-form-battle.json b/src/locales/pt_BR/pokemon-form-battle.json index 6ea7947fb66b..50fbeeef29ef 100644 --- a/src/locales/pt_BR/pokemon-form-battle.json +++ b/src/locales/pt_BR/pokemon-form-battle.json @@ -11,4 +11,4 @@ "revertChange": "{{pokemonName}} voltou\npara sua forma original!", "formChange": "{{preName}} mudou de forma!", "disguiseChange": "O seu disfarce serviu-lhe de isca!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/pokemon-info-container.json b/src/locales/pt_BR/pokemon-info-container.json index dcf1fc4e0b5f..3ba3312a4019 100644 --- a/src/locales/pt_BR/pokemon-info-container.json +++ b/src/locales/pt_BR/pokemon-info-container.json @@ -4,4 +4,4 @@ "ability": "Habilidade:", "nature": "Natureza:", "form": "Forma:" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/pokemon-summary.json b/src/locales/pt_BR/pokemon-summary.json index 4c427dbac4f9..14b736a0cf21 100644 --- a/src/locales/pt_BR/pokemon-summary.json +++ b/src/locales/pt_BR/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Cancelar", "memoString": "Natureza {{natureFragment}},\n{{metFragment}}", "metFragment": { - "normal": "encontrado no Nv.{{level}},\n{{biome}}.", + "normal": "encontrado no Nv.{{level}},\n{{biome}}, Onda {{wave}}.", "apparently": "aparentemente encontrado no Nv.{{level}},\n{{biome}}." }, "natureFragment": { diff --git a/src/locales/pt_BR/pokemon.json b/src/locales/pt_BR/pokemon.json index f780d2accbd7..f50b89c4f70f 100644 --- a/src/locales/pt_BR/pokemon.json +++ b/src/locales/pt_BR/pokemon.json @@ -1081,4 +1081,4 @@ "paldea_tauros": "Tauros", "paldea_wooper": "Wooper", "bloodmoon_ursaluna": "Ursaluna" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/run-history.json b/src/locales/pt_BR/run-history.json index 74cc2c35d282..a615b598bcfc 100644 --- a/src/locales/pt_BR/run-history.json +++ b/src/locales/pt_BR/run-history.json @@ -34,4 +34,4 @@ "hallofFameText_female": "Bem-vinda ao Hall da Fama!", "viewHallOfFame": "Veja o Hall da Fama!", "viewEndingSplash": "Veja a arte final!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/save-slot-select-ui-handler.json b/src/locales/pt_BR/save-slot-select-ui-handler.json index 31fe28de6914..60ea7b073e9f 100644 --- a/src/locales/pt_BR/save-slot-select-ui-handler.json +++ b/src/locales/pt_BR/save-slot-select-ui-handler.json @@ -4,4 +4,4 @@ "wave": "Onda", "lv": "Nv", "empty": "Vazio" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/settings.json b/src/locales/pt_BR/settings.json index 74f3918bed8a..6c4eae23a826 100644 --- a/src/locales/pt_BR/settings.json +++ b/src/locales/pt_BR/settings.json @@ -104,4 +104,4 @@ "reroll": "Atualizar", "shop": "Loja", "checkTeam": "Checar Time" -} +} \ No newline at end of file diff --git a/src/locales/pt_BR/splash-messages.json b/src/locales/pt_BR/splash-messages.json index 55c0b1b9e74b..7e4001610e25 100644 --- a/src/locales/pt_BR/splash-messages.json +++ b/src/locales/pt_BR/splash-messages.json @@ -33,4 +33,4 @@ "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", "breedersInSpace": "Criadores Pokémon no Espaço!" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/starter-select-ui-handler.json b/src/locales/pt_BR/starter-select-ui-handler.json index 1d83e43f12c9..8de6c8bcae42 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.json +++ b/src/locales/pt_BR/starter-select-ui-handler.json @@ -42,4 +42,4 @@ "locked": "Bloqueada", "disabled": "Desativada", "uncaught": "Não capturado" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/status-effect.json b/src/locales/pt_BR/status-effect.json index 5a851a0bdeb4..9b33b9fa8f79 100644 --- a/src/locales/pt_BR/status-effect.json +++ b/src/locales/pt_BR/status-effect.json @@ -62,4 +62,4 @@ "overlap": "{{pokemonNameWithAffix}} já\nestá queimado!", "heal": "{{pokemonNameWithAffix}} foi\ncurado de sua queimadura!" } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/terrain.json b/src/locales/pt_BR/terrain.json index 73df2b441ac1..a672c58ca825 100644 --- a/src/locales/pt_BR/terrain.json +++ b/src/locales/pt_BR/terrain.json @@ -13,4 +13,4 @@ "psychicStartMessage": "O campo de batalha ficou esquisito!", "psychicClearMessage": "A esquisitice sumiu do campo de batalha!", "defaultBlockMessage": "{{pokemonNameWithAffix}} está protegido pelo Terreno {{terrainName}}!" -} \ 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 482265d00c68..cfa5fc5e0a4b 100644 --- a/src/locales/pt_BR/trainer-classes.json +++ b/src/locales/pt_BR/trainer-classes.json @@ -127,5 +127,4 @@ "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/tutorial.json b/src/locales/pt_BR/tutorial.json index 92ea0dd080fb..09199a9e31cd 100644 --- a/src/locales/pt_BR/tutorial.json +++ b/src/locales/pt_BR/tutorial.json @@ -1,7 +1,7 @@ { "intro": "Bem-vindo ao PokéRogue!\n$Este é um fangame Pokémon focado em batalhas com elementos roguelite.\n$Este jogo não é monetizado e não reivindicamos propriedade do Pokémon nem dos ativos protegidos$por direitos autorais usados.\n$O jogo é um trabalho em andamento,\nmas totalmente jogável.\n$Para relatórios de bugs, use a comunidade do Discord.\n$Se o jogo rodar lentamente, certifique-se de que\na 'Aceleração de Hardware' esteja ativada$nas configurações do seu navegador.", "accessMenu": "Para acessar o menu, pressione M ou Esc.\n$O menu contém configurações e diversas funções.", - "menu": "A partir deste menu, você pode\\nacessar as configurações.\n$A partir das configurações, você\npode alterar a velocidade do jogo,\n$o estilo da janela e outras opções.\n$Há também vários outros recursos aqui.\nCertifique-se de verificar todos eles!", + "menu": "A partir deste menu, você pode\nacessar as configurações.\n$A partir das configurações, você\npode alterar a velocidade do jogo,\n$o estilo da janela e outras opções.\n$Há também vários outros recursos aqui.\nCertifique-se de verificar todos eles!", "starterSelect": "Nesta tela, você pode selecionar seus iniciais\npressionando Z ou a barra de espaço.\n$Esses serão os primeiros membros da sua equipe.\n$Cada inicial tem um custo. Sua equipe pode ter até 6 membros,\ndesde que desde que o custo total não exceda 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 todas as 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.", diff --git a/src/locales/pt_BR/voucher.json b/src/locales/pt_BR/voucher.json index c33dfa20e0ff..7430fecaece9 100644 --- a/src/locales/pt_BR/voucher.json +++ b/src/locales/pt_BR/voucher.json @@ -6,4 +6,4 @@ "eggVoucherGold": "Voucher de Ovo Dourado", "locked": "Bloqueado", "defeatTrainer": "Derrote {{trainerName}}" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/weather.json b/src/locales/pt_BR/weather.json index 54b929da0b90..eb3b3a740054 100644 --- a/src/locales/pt_BR/weather.json +++ b/src/locales/pt_BR/weather.json @@ -29,4 +29,4 @@ "strongWindsLapseMessage": "Os ventos fortes continuam.", "strongWindsEffectMessage": "A corrente de ar misteriosa enfraqueceu o ataque!", "strongWindsClearMessage": "Os ventos fortes diminuíram." -} \ No newline at end of file +} diff --git a/src/locales/zh_CN/bgm-name.json b/src/locales/zh_CN/bgm-name.json index 70512bbd6979..6e3966ad2d36 100644 --- a/src/locales/zh_CN/bgm-name.json +++ b/src/locales/zh_CN/bgm-name.json @@ -149,5 +149,6 @@ "mystery_encounter_weird_dream": "空之探险队「时限之塔」", "mystery_encounter_fun_and_games": "空之探险队「会长胖可丁」", "mystery_encounter_gen_5_gts": "黑白「GTS」", - "mystery_encounter_gen_6_gts": "XY「GTS」" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/zh_TW/bgm-name.json b/src/locales/zh_TW/bgm-name.json index f7076d427a22..3164558aa324 100644 --- a/src/locales/zh_TW/bgm-name.json +++ b/src/locales/zh_TW/bgm-name.json @@ -142,5 +142,6 @@ "mystery_encounter_weird_dream": "PMD EoS Temporal Spire", "mystery_encounter_fun_and_games": "PMD EoS Guildmaster Wigglytuff", "mystery_encounter_gen_5_gts": "BW GTS", - "mystery_encounter_gen_6_gts": "XY GTS" + "mystery_encounter_gen_6_gts": "XY GTS", + "mystery_encounter_delibirdy": "Firel - DeliDelivery!" } diff --git a/src/locales/zh_TW/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/zh_TW/mystery-encounters/a-trainers-test-dialogue.json index c96c0d5f3277..849e3a94cbbc 100644 --- a/src/locales/zh_TW/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/zh_TW/mystery-encounters/a-trainers-test-dialogue.json @@ -44,4 +44,4 @@ "legendary": "a Legendary Egg" }, "outro": "{{statTrainerName}} gave you {{eggType}}!" -} \ No newline at end of file +} diff --git a/src/locales/zh_TW/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/zh_TW/mystery-encounters/bug-type-superfan-dialogue.json index 5e4e8be90e79..2fdcd53e2959 100644 --- a/src/locales/zh_TW/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/zh_TW/mystery-encounters/bug-type-superfan-dialogue.json @@ -17,9 +17,9 @@ "disabled_tooltip": "You need at least 1 Bug Type Pokémon on your team to select this.", "selected": "You show the trainer all your Bug Type Pokémon...", "selected_0_to_1": "Huh? You only have {{numBugTypes}}...$Guess I'm wasting my breath on someone like you...", - "selected_2_to_3": "Hey, you've got {{numBugTypes}} Bug Types!\nNot bad.$Here, this might help you on your journey to catch more!", - "selected_4_to_5": "What? You have {{numBugTypes}} Bug Types?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", - "selected_6": "Whoa! {{numBugTypes}} Bug Types!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" + "selected_2_to_3": "Hey, you've got {{numBugTypes}}!\nNot bad.$Here, this might help you on your journey to catch more!", + "selected_4_to_5": "What? You have {{numBugTypes}}?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", + "selected_6": "Whoa! {{numBugTypes}}!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" }, "3": { "label": "Gift a Bug Item", @@ -34,5 +34,7 @@ "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", "teach_move_prompt": "Select a move to teach a Pokémon.", "confirm_no_teach": "You sure you don't want to learn one of these great moves?", - "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" + "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!", + "numBugTypes_one": "{{count}} Bug Type", + "numBugTypes_other": "{{count}} Bug Types" } diff --git a/src/locales/zh_TW/pokemon-summary.json b/src/locales/zh_TW/pokemon-summary.json index ddbbea63a3ad..331330f5bdd7 100644 --- a/src/locales/zh_TW/pokemon-summary.json +++ b/src/locales/zh_TW/pokemon-summary.json @@ -12,7 +12,7 @@ "memoString": "{{natureFragment}} 性格,\n{{metFragment}}", "metFragment": { - "normal": "met at Lv{{level}},\n{{biome}}.", + "normal": "met at Lv{{level}},\n{{biome}}, Wave {{wave}}.", "apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。" }, "natureFragment": { diff --git a/src/overrides.ts b/src/overrides.ts index 6b550d152c21..ec0577ceb3d2 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -70,6 +70,8 @@ class DefaultOverrides { [PokeballType.MASTER_BALL]: 0, }, }; + /** Set to `true` to show all tutorials */ + readonly BYPASS_TUTORIAL_SKIP: boolean = false; // ---------------- // PLAYER OVERRIDES diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 1d9567ee9b3a..012738df9ab8 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -216,8 +216,8 @@ export class EncounterPhase extends BattlePhase { this.scene.ui.setMode(Mode.MESSAGE).then(() => { if (!this.loaded) { - //@ts-ignore - this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 300).then(success => { // TODO: get rid of ts-ignore + this.trySetWeatherIfNewBiome(); // Set weather before session gets saved + this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || (this.scene.lastSavePlayTime ?? 0) >= 300).then(success => { this.scene.disableMenu = false; if (!success) { return this.scene.reset(true); @@ -250,10 +250,6 @@ export class EncounterPhase extends BattlePhase { } } - if (!this.loaded) { - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - } - const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), @@ -519,4 +515,18 @@ export class EncounterPhase extends BattlePhase { } return false; } + + /** + * Set biome weather if and only if this encounter is the start of a new biome. + * + * By using function overrides, this should happen if and only if this phase + * is exactly a NewBiomeEncounterPhase or an EncounterPhase (to account for + * Wave 1 of a Daily Run), but NOT NextEncounterPhase (which starts the next + * wave in the same biome). + */ + trySetWeatherIfNewBiome(): void { + if (!this.loaded) { + this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + } + } } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index c3199166e840..e2fca951b2fa 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -4,7 +4,7 @@ import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; import { MoveAnim } from "#app/data/battle-anims"; import { BattlerTagLapseType, DamageProtectedTag, ProtectedTag, SemiInvulnerableTag, SubstituteTag } from "#app/data/battler-tags"; -import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move"; +import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, DealsDoubleDamageToTagAttr } from "#app/data/move"; import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Moves } from "#app/enums/moves"; @@ -394,7 +394,7 @@ export class MoveEffectPhase extends PokemonPhase { } const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); - if (semiInvulnerableTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType)) { + if (semiInvulnerableTag && !this.move.getMove().getAttrs(DealsDoubleDamageToTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType)) { return false; } diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts index 48d928402dea..2a526a22ee28 100644 --- a/src/phases/new-biome-encounter-phase.ts +++ b/src/phases/new-biome-encounter-phase.ts @@ -17,8 +17,6 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { } } - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - for (const pokemon of this.scene.getParty().filter(p => p.isOnField())) { applyAbAttrs(PostBiomeChangeAbAttr, pokemon, null); } @@ -41,4 +39,11 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { } }); } + + /** + * Set biome weather. + */ + trySetWeatherIfNewBiome(): void { + this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + } } diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts index 7de2472dd359..d63823e4167c 100644 --- a/src/phases/next-encounter-phase.ts +++ b/src/phases/next-encounter-phase.ts @@ -67,4 +67,10 @@ export class NextEncounterPhase extends EncounterPhase { } }); } + + /** + * Do nothing (since this is simply the next wave in the same biome). + */ + trySetWeatherIfNewBiome(): void { + } } diff --git a/src/phases/stat-stage-change-phase.ts b/src/phases/stat-stage-change-phase.ts index 55faaa299039..4418c38c8496 100644 --- a/src/phases/stat-stage-change-phase.ts +++ b/src/phases/stat-stage-change-phase.ts @@ -6,7 +6,7 @@ import Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { ResetNegativeStatStageModifier } from "#app/modifier/modifier"; import { handleTutorial, Tutorial } from "#app/tutorial"; -import * as Utils from "#app/utils"; +import { NumberHolder, BooleanHolder } from "#app/utils"; import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; import { Stat, type BattleStat, getStatKey, getStatStageChangeDescriptionKey } from "#enums/stat"; @@ -42,17 +42,23 @@ export class StatStageChangePhase extends PokemonPhase { return this.end(); } + const stages = new NumberHolder(this.stages); + + if (!this.ignoreAbilities) { + applyAbAttrs(StatStageChangeMultiplierAbAttr, pokemon, null, false, stages); + } + let simulate = false; const filteredStats = this.stats.filter(stat => { - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); - if (!this.selfTarget && this.stages < 0) { + if (!this.selfTarget && stages.value < 0) { // TODO: Include simulate boolean when tag applications can be simulated this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, cancelled); } - if (!cancelled.value && !this.selfTarget && this.stages < 0) { + if (!cancelled.value && !this.selfTarget && stages.value < 0) { applyPreStatStageChangeAbAttrs(ProtectStatAbAttr, pokemon, stat, cancelled, simulate); } @@ -64,12 +70,6 @@ export class StatStageChangePhase extends PokemonPhase { return !cancelled.value; }); - const stages = new Utils.IntegerHolder(this.stages); - - if (!this.ignoreAbilities) { - applyAbAttrs(StatStageChangeMultiplierAbAttr, pokemon, null, false, stages); - } - const relLevels = filteredStats.map(s => (stages.value >= 1 ? Math.min(pokemon.getStatStage(s) + stages.value, 6) : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s)); this.onChange && this.onChange(this.getPokemon(), filteredStats, relLevels); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 5e6c0d93c8c6..0fd90e448a1d 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -38,8 +38,9 @@ export default class PokemonData { public status: Status | null; public friendship: integer; public metLevel: integer; - public metBiome: Biome | -1; + public metBiome: Biome | -1; // -1 for starters public metSpecies: Species; + public metWave: number; // 0 for unknown (previous saves), -1 for starters public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -90,14 +91,14 @@ export default class PokemonData { this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; this.metSpecies = source.metSpecies; + this.metWave = source.metWave ?? (this.metBiome === -1 ? -1 : 0); this.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; + this.evoCounter = source.evoCounter ?? 0; } this.pokerus = !!source.pokerus; - this.evoCounter = source.evoCounter ?? 0; - this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; this.fusionAbilityIndex = source.fusionAbilityIndex; diff --git a/src/test/abilities/contrary.test.ts b/src/test/abilities/contrary.test.ts index 95a209395dc8..5221e821e703 100644 --- a/src/test/abilities/contrary.test.ts +++ b/src/test/abilities/contrary.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Contrary", () => { }); it("should invert stat changes when applied", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.SLOWBRO ]); @@ -39,4 +39,39 @@ describe("Abilities - Contrary", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); }, 20000); + + describe("With Clear Body", () => { + it("should apply positive effects", async () => { + game.override + .enemyPassiveAbility(Abilities.CLEAR_BODY) + .moveset([Moves.TAIL_WHIP]); + await game.classicMode.startBattle([Species.SLOWBRO]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); + + game.move.select(Moves.TAIL_WHIP); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(1); + }); + + it("should block negative effects", async () => { + game.override + .enemyPassiveAbility(Abilities.CLEAR_BODY) + .enemyMoveset([Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL]) + .moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.SLOWBRO]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); + }); + }); }); diff --git a/src/test/arena/grassy_terrain.test.ts b/src/test/arena/grassy_terrain.test.ts index e80646767415..efb2539885d8 100644 --- a/src/test/arena/grassy_terrain.test.ts +++ b/src/test/arena/grassy_terrain.test.ts @@ -26,16 +26,16 @@ describe("Arena - Grassy Terrain", () => { game.override .battleType("single") .disableCrits() - .enemyLevel(30) - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH) + .enemyLevel(1) + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.STURDY) + .enemyMoveset(Moves.FLY) .moveset([Moves.GRASSY_TERRAIN, Moves.EARTHQUAKE]) - .ability(Abilities.BALL_FETCH); + .ability(Abilities.NO_GUARD); }); it("halves the damage of Earthquake", async () => { - await game.classicMode.startBattle([Species.FEEBAS]); + await game.classicMode.startBattle([Species.TAUROS]); const eq = allMoves[Moves.EARTHQUAKE]; vi.spyOn(eq, "calculateBattlePower"); @@ -53,4 +53,19 @@ describe("Arena - Grassy Terrain", () => { expect(eq.calculateBattlePower).toHaveReturnedWith(50); }, TIMEOUT); + + it("Does not halve the damage of Earthquake if opponent is not grounded", async () => { + await game.classicMode.startBattle([Species.NINJASK]); + + const eq = allMoves[Moves.EARTHQUAKE]; + vi.spyOn(eq, "calculateBattlePower"); + + game.move.select(Moves.GRASSY_TERRAIN); + await game.toNextTurn(); + + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(eq.calculateBattlePower).toHaveReturnedWith(100); + }, TIMEOUT); }); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 6e15bbd99d9a..554692374d29 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -24,7 +24,8 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { Biome } from "#app/enums/biome"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -290,22 +291,27 @@ describe("Test Battle Phase", () => { expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); }, 20000); - it("to next wave with pokemon killed, single", async () => { + it("does not set new weather if staying in same biome", async () => { const moveToUse = Moves.SPLASH; - game.override.battleType("single"); - game.override.starterSpecies(Species.MEWTWO); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(Abilities.HYDRATION); - game.override.ability(Abilities.ZEN_MODE); - game.override.startingLevel(2000); - game.override.startingWave(3); - game.override.moveset([moveToUse]); + game.override + .battleType("single") + .starterSpecies(Species.MEWTWO) + .enemySpecies(Species.RATTATA) + .enemyAbility(Abilities.HYDRATION) + .ability(Abilities.ZEN_MODE) + .startingLevel(2000) + .startingWave(3) + .startingBiome(Biome.LAKE) + .moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - await game.startBattle(); + await game.classicMode.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; game.move.select(moveToUse); + + vi.spyOn(game.scene.arena, "trySetWeather"); await game.doKillOpponents(); await game.toNextWave(); + expect(game.scene.arena.trySetWeather).not.toHaveBeenCalled(); expect(game.scene.currentBattle.waveIndex).toBeGreaterThan(waveIndex); }, 20000); diff --git a/src/test/moves/steamroller.test.ts b/src/test/moves/steamroller.test.ts new file mode 100644 index 000000000000..cbbb3a22593f --- /dev/null +++ b/src/test/moves/steamroller.test.ts @@ -0,0 +1,58 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { DamageCalculationResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Steamroller", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.moveset([Moves.STEAMROLLER]).battleType("single").enemyAbility(Abilities.BALL_FETCH); + }); + + it("should always hit a minimzed target with double damage", async () => { + game.override.enemySpecies(Species.DITTO).enemyMoveset(Moves.MINIMIZE); + await game.classicMode.startBattle([Species.IRON_BOULDER]); + + const ditto = game.scene.getEnemyPokemon()!; + vi.spyOn(ditto, "getAttackDamage"); + ditto.hp = 5000; + const steamroller = allMoves[Moves.STEAMROLLER]; + vi.spyOn(steamroller, "calculateBattleAccuracy"); + const ironBoulder = game.scene.getPlayerPokemon()!; + vi.spyOn(ironBoulder, "getAccuracyMultiplier"); + // Turn 1 + game.move.select(Moves.STEAMROLLER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + // Turn 2 + game.move.select(Moves.STEAMROLLER); + await game.toNextTurn(); + + const [dmgCalcTurn1, dmgCalcTurn2]: DamageCalculationResult[] = vi + .mocked(ditto.getAttackDamage) + .mock.results.map((r) => r.value); + + expect(dmgCalcTurn2.damage).toBeGreaterThanOrEqual(dmgCalcTurn1.damage * 2); + expect(ditto.getTag(BattlerTagType.MINIMIZED)).toBeDefined(); + expect(steamroller.calculateBattleAccuracy).toHaveReturnedWith(-1); + }); +}); diff --git a/src/test/moves/whirlwind.test.ts b/src/test/moves/whirlwind.test.ts new file mode 100644 index 000000000000..a591a3cd6c56 --- /dev/null +++ b/src/test/moves/whirlwind.test.ts @@ -0,0 +1,53 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; + +describe("Moves - Whirlwind", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.WHIRLWIND) + .enemySpecies(Species.PIDGEY); + }); + + it.each([ + { move: Moves.FLY, name: "Fly" }, + { move: Moves.BOUNCE, name: "Bounce" }, + { move: Moves.SKY_DROP, name: "Sky Drop" }, + ])("should not hit a flying target: $name (=$move)", async ({ move }) => { + game.override.moveset([move]); + await game.classicMode.startBattle([Species.STARAPTOR]); + + const staraptor = game.scene.getPlayerPokemon()!; + const whirlwind = allMoves[Moves.WHIRLWIND]; + vi.spyOn(whirlwind, "getFailedText"); + + game.move.select(move); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + expect(staraptor.findTag((t) => t.tagType === BattlerTagType.FLYING)).toBeDefined(); + expect(whirlwind.getFailedText).toHaveBeenCalledOnce(); + }); +}); diff --git a/src/test/reload.test.ts b/src/test/reload.test.ts index a96a525ca2dc..7c4523dd9efd 100644 --- a/src/test/reload.test.ts +++ b/src/test/reload.test.ts @@ -38,16 +38,15 @@ describe("Reload", () => { it("should not have RNG inconsistencies after a biome switch", async () => { game.override .startingWave(10) - .startingBiome(Biome.CAVE) // Will lead to biomes with randomly generated weather .battleType("single") - .startingLevel(100) - .enemyLevel(1000) + .startingLevel(100) // Avoid levelling up + .enemyLevel(1000) // Avoid opponent dying before game.doKillOpponents() .disableTrainerWaves() .moveset([Moves.KOWTOW_CLEAVE]) .enemyMoveset(Moves.SPLASH); await game.dailyMode.startBattle(); - // Transition from Daily Run Wave 10 to Wave 11 in order to trigger biome switch + // Transition from Wave 10 to Wave 11 in order to trigger biome switch game.move.select(Moves.KOWTOW_CLEAVE); await game.phaseInterceptor.to("DamagePhase"); await game.doKillOpponents(); @@ -63,6 +62,34 @@ describe("Reload", () => { expect(preReloadRngState).toBe(postReloadRngState); }, 20000); + it("should not have weather inconsistencies after a biome switch", async () => { + game.override + .startingWave(10) + .startingBiome(Biome.ICE_CAVE) // Will lead to Snowy Forest with randomly generated weather + .battleType("single") + .startingLevel(100) // Avoid levelling up + .enemyLevel(1000) // Avoid opponent dying before game.doKillOpponents() + .disableTrainerWaves() + .moveset([Moves.KOWTOW_CLEAVE]) + .enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle(); // Apparently daily mode would override the biome + + // Transition from Wave 10 to Wave 11 in order to trigger biome switch + game.move.select(Moves.KOWTOW_CLEAVE); + await game.phaseInterceptor.to("DamagePhase"); + await game.doKillOpponents(); + await game.toNextWave(); + expect(game.phaseInterceptor.log).toContain("NewBiomeEncounterPhase"); + + const preReloadWeather = game.scene.arena.weather; + + await game.reload.reloadSession(); + + const postReloadWeather = game.scene.arena.weather; + + expect(postReloadWeather).toStrictEqual(preReloadWeather); + }, 20000); + it("should not have RNG inconsistencies at a Daily run wild Pokemon fight", async () => { await game.dailyMode.startBattle(); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 452956ab4662..36423c5e18ff 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -31,7 +31,6 @@ import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { Button } from "#enums/buttons"; import { ExpNotification } from "#enums/exp-notification"; -import { GameDataType } from "#enums/game-data-type"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; @@ -371,13 +370,11 @@ export default class GameManager { * @returns A promise that resolves with the exported save data. */ exportSaveToTest(): Promise { + const saveKey = "x0i2O7WRiANTqPmZ"; return new Promise(async (resolve) => { - await this.scene.gameData.saveAll(this.scene, true, true, true, true); - this.scene.reset(true); - await waitUntil(() => this.scene.ui?.getMode() === Mode.TITLE); - await this.scene.gameData.tryExportData(GameDataType.SESSION, 0); - await waitUntil(() => localStorage.hasOwnProperty("toExport")); - return resolve(localStorage.getItem("toExport")!); // TODO: is this bang correct?; + const sessionSaveData = this.scene.gameData.getSessionSaveData(this.scene); + const encryptedSaveData = AES.encrypt(JSON.stringify(sessionSaveData), saveKey).toString(); + resolve(encryptedSaveData); }); } diff --git a/src/test/utils/helpers/reloadHelper.ts b/src/test/utils/helpers/reloadHelper.ts index c15347b08c99..e0e538120cce 100644 --- a/src/test/utils/helpers/reloadHelper.ts +++ b/src/test/utils/helpers/reloadHelper.ts @@ -5,11 +5,27 @@ import { vi } from "vitest"; import { BattleStyle } from "#app/enums/battle-style"; import { CommandPhase } from "#app/phases/command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { SessionSaveData } from "#app/system/game-data"; +import GameManager from "../gameManager"; /** * Helper to allow reloading sessions in unit tests. */ export class ReloadHelper extends GameManagerHelper { + sessionData: SessionSaveData; + + constructor(game: GameManager) { + super(game); + + // Whenever the game saves the session, save it to the reloadHelper instead + vi.spyOn(game.scene.gameData, "saveAll").mockImplementation((scene) => { + return new Promise((resolve, reject) => { + this.sessionData = scene.gameData.getSessionSaveData(scene); + resolve(true); + }); + }); + } + /** * Simulate reloading the session from the title screen, until reaching the * beginning of the first turn (equivalent to running `startBattle()`) for @@ -17,7 +33,6 @@ export class ReloadHelper extends GameManagerHelper { */ async reloadSession() : Promise { const scene = this.game.scene; - const sessionData = scene.gameData.getSessionSaveData(scene); const titlePhase = new TitlePhase(scene); scene.clearPhaseQueue(); @@ -25,7 +40,7 @@ export class ReloadHelper extends GameManagerHelper { // Set the last saved session to the desired session data vi.spyOn(scene.gameData, "getSession").mockReturnValue( new Promise((resolve, reject) => { - resolve(sessionData); + resolve(this.sessionData); }) ); scene.unshiftPhase(titlePhase); diff --git a/src/tutorial.ts b/src/tutorial.ts index c44828397798..18d8291d227d 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -1,7 +1,9 @@ import BattleScene from "./battle-scene"; import AwaitableUiHandler from "./ui/awaitable-ui-handler"; +import UiHandler from "./ui/ui-handler"; import { Mode } from "./ui/ui"; import i18next from "i18next"; +import Overrides from "#app/overrides"; export enum Tutorial { Intro = "INTRO", @@ -39,7 +41,7 @@ const tutorialHandlers = { scene.ui.showText(i18next.t("tutorial:starterSelect"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); }, - [Tutorial.Pokerus]: (scene: BattleScene) => { + [Tutorial.Pokerus]: (scene: BattleScene) => { return new Promise(resolve => { scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); @@ -63,26 +65,87 @@ const tutorialHandlers = { }, }; -export function handleTutorial(scene: BattleScene, tutorial: Tutorial): Promise { - return new Promise(resolve => { - if (!scene.enableTutorials) { - return resolve(false); - } +/** + * Run through the specified tutorial if it hasn't been seen before and mark it as seen once done + * This will show a tutorial overlay if defined in the current {@linkcode AwaitableUiHandler} + * The main menu will also get disabled while the tutorial is running + * @param scene the current {@linkcode BattleScene} + * @param tutorial the {@linkcode Tutorial} to play + * @returns a promise with result `true` if the tutorial was run and finished, `false` otherwise + */ +export async function handleTutorial(scene: BattleScene, tutorial: Tutorial): Promise { + if (!scene.enableTutorials && !Overrides.BYPASS_TUTORIAL_SKIP) { + return false; + } - if (scene.gameData.getTutorialFlags()[tutorial]) { - return resolve(false); - } + if (scene.gameData.getTutorialFlags()[tutorial] && !Overrides.BYPASS_TUTORIAL_SKIP) { + return false; + } - const handler = scene.ui.getHandler(); - if (handler instanceof AwaitableUiHandler) { - handler.tutorialActive = true; - } - tutorialHandlers[tutorial](scene).then(() => { - scene.gameData.saveTutorialFlag(tutorial, true); - if (handler instanceof AwaitableUiHandler) { - handler.tutorialActive = false; + const handler = scene.ui.getHandler(); + const isMenuDisabled = scene.disableMenu; + + // starting tutorial, disable menu + scene.disableMenu = true; + if (handler instanceof AwaitableUiHandler) { + handler.tutorialActive = true; + } + + await showTutorialOverlay(scene, handler); + await tutorialHandlers[tutorial](scene); + await hideTutorialOverlay(scene, handler); + + // tutorial finished and overlay gone, re-enable menu, save tutorial as seen + scene.disableMenu = isMenuDisabled; + scene.gameData.saveTutorialFlag(tutorial, true); + if (handler instanceof AwaitableUiHandler) { + handler.tutorialActive = false; + } + + return true; +} + +/** + * Show the tutorial overlay if there is one + * @param scene the current BattleScene + * @param handler the current UiHandler + * @returns `true` once the overlay has finished appearing, or if there is no overlay + */ +async function showTutorialOverlay(scene: BattleScene, handler: UiHandler) { + if (handler instanceof AwaitableUiHandler && handler.tutorialOverlay) { + scene.tweens.add({ + targets: handler.tutorialOverlay, + alpha: 0.5, + duration: 750, + ease: "Sine.easeOut", + onComplete: () => { + return true; } - resolve(true); }); - }); + } else { + return true; + } } + +/** + * Hide the tutorial overlay if there is one + * @param scene the current BattleScene + * @param handler the current UiHandler + * @returns `true` once the overlay has finished disappearing, or if there is no overlay + */ +async function hideTutorialOverlay(scene: BattleScene, handler: UiHandler) { + if (handler instanceof AwaitableUiHandler && handler.tutorialOverlay) { + scene.tweens.add({ + targets: handler.tutorialOverlay, + alpha: 0, + duration: 500, + ease: "Sine.easeOut", + onComplete: () => { + return true; + } + }); + } else { + return true; + } +} + diff --git a/src/ui/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index 2052c6e2ade6..c6dc717aa3aa 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -7,6 +7,7 @@ export default abstract class AwaitableUiHandler extends UiHandler { protected awaitingActionInput: boolean; protected onActionInput: Function | null; public tutorialActive: boolean = false; + public tutorialOverlay: Phaser.GameObjects.Rectangle; constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); @@ -24,4 +25,21 @@ export default abstract class AwaitableUiHandler extends UiHandler { return false; } + + /** + * Create a semi transparent overlay that will get shown during tutorials + * @param container the container to add the overlay to + */ + initTutorialOverlay(container: Phaser.GameObjects.Container) { + if (!this.tutorialOverlay) { + this.tutorialOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0x070707); + this.tutorialOverlay.setName("tutorial-overlay"); + this.tutorialOverlay.setOrigin(0, 0); + this.tutorialOverlay.setAlpha(0); + } + + if (container) { + container.add(this.tutorialOverlay); + } + } } diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 8e7e5bc40602..1d598f6ac4eb 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -162,7 +162,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.splicedIcon); - this.statusIndicator = this.scene.add.sprite(0, 0, "statuses"); + this.statusIndicator = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses")); this.statusIndicator.setName("icon_status"); this.statusIndicator.setVisible(false); this.statusIndicator.setOrigin(0, 0); diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 9a694d50b295..c27c69741926 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -83,12 +83,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.nameBoxContainer.add(this.nameText); messageContainer.add(this.nameBoxContainer); - const prompt = this.scene.add.sprite(0, 0, "prompt"); - prompt.setVisible(false); - prompt.setOrigin(0, 0); - messageContainer.add(prompt); - - this.prompt = prompt; + this.initPromptSprite(messageContainer); const levelUpStatsContainer = this.scene.add.container(0, 0); levelUpStatsContainer.setVisible(false); diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 9497dfe58c69..b109eda53700 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -287,7 +287,6 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(this.eggGachaSummaryContainer); const gachaMessageBoxContainer = this.scene.add.container(0, 148); - this.eggGachaContainer.add(gachaMessageBoxContainer); const gachaMessageBox = addWindow(this.scene, 0, 0, 320, 32); gachaMessageBox.setOrigin(0, 0); @@ -301,8 +300,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.message = gachaMessageText; + this.initTutorialOverlay(this.eggGachaContainer); this.eggGachaContainer.add(gachaMessageBoxContainer); + this.initPromptSprite(gachaMessageBoxContainer); + this.setCursor(0); } diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index ffbd06afde30..76d148d083e4 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -45,12 +45,7 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.message = message; - const prompt = this.scene.add.sprite(0, 0, "prompt"); - prompt.setVisible(false); - prompt.setOrigin(0, 0); - this.messageContainer.add(prompt); - - this.prompt = prompt; + this.initPromptSprite(this.messageContainer); } show(_args: any[]): boolean { diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index b8c3cfd13641..0af527e518f1 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -157,6 +157,9 @@ export default class MenuUiHandler extends MessageUiHandler { menuMessageText.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageText); + this.initTutorialOverlay(this.menuContainer); + this.initPromptSprite(this.menuMessageBoxContainer); + this.message = menuMessageText; // By default we use the general purpose message window @@ -433,6 +436,9 @@ export default class MenuUiHandler extends MessageUiHandler { this.scene.playSound("ui/menu_open"); + // Make sure the tutorial overlay sits above everything, but below the message box + this.menuContainer.bringToTop(this.tutorialOverlay); + this.menuContainer.bringToTop(this.menuMessageBoxContainer); handleTutorial(this.scene, Tutorial.Menu); this.bgmBar.toggleBgmBar(true); diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 93e00cb6b703..54965a590fc5 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -17,6 +17,23 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { this.pendingPrompt = false; } + /** + * Add the sprite to be displayed at the end of messages with prompts + * @param container the container to add the sprite to + */ + initPromptSprite(container: Phaser.GameObjects.Container) { + if (!this.prompt) { + const promptSprite = this.scene.add.sprite(0, 0, "prompt"); + promptSprite.setVisible(false); + promptSprite.setOrigin(0, 0); + this.prompt = promptSprite; + } + + if (container) { + container.add(this.prompt); + } + } + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } @@ -180,7 +197,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const lastLineWidth = lastLineTest.displayWidth; lastLineTest.destroy(); if (this.prompt) { - this.prompt.setPosition(lastLineWidth + 2, (textLinesCount - 1) * 18 + 2); + this.prompt.setPosition(this.message.x + lastLineWidth + 2, this.message.y + (textLinesCount - 1) * 18 + 2); this.prompt.play("prompt"); } this.pendingPrompt = false; diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 77010f84528f..a99e4c81e27f 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -91,7 +91,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem valuesBg.setOrigin(0, 0); this.val.add(valuesBg); - this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, "unknown"); + this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35, Utils.getLocalizedSpriteKey("types"), "unknown"); this.typ.setScale(0.8); this.val.add(this.typ); @@ -138,7 +138,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem this.pow.setText(move.power >= 0 ? move.power.toString() : "---"); this.acc.setText(move.accuracy >= 0 ? move.accuracy.toString() : "---"); this.pp.setText(move.pp >= 0 ? move.pp.toString() : "---"); - this.typ.setTexture(`types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, Type[move.type].toLowerCase()); + this.typ.setTexture(Utils.getLocalizedSpriteKey("types"), Type[move.type].toLowerCase()); this.cat.setFrame(MoveCategory[move.category].toLowerCase()); this.desc.setText(move?.effect || ""); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index a793dad6a737..8c777350964c 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1272,7 +1272,7 @@ class PartySlot extends Phaser.GameObjects.Container { } if (this.pokemon.status) { - const statusIndicator = this.scene.add.sprite(0, 0, "statuses"); + const statusIndicator = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses")); statusIndicator.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase()); statusIndicator.setOrigin(0, 0); statusIndicator.setPositionRelative(slotLevelLabel, this.slotIndex >= battlerCount ? 43 : 55, 0); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index ee56a3631ddc..0e101d30ce78 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -760,7 +760,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); this.pokemonMovesContainer = this.scene.add.container(102, 16); - this.pokemonMovesContainer.setScale(0.5); + this.pokemonMovesContainer.setScale(0.375); for (let m = 0; m < 4; m++) { const moveContainer = this.scene.add.container(0, 14 * m); @@ -894,6 +894,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.message.setOrigin(0, 0); this.starterSelectMessageBoxContainer.add(this.message); + // arrow icon for the message box + this.initPromptSprite(this.starterSelectMessageBoxContainer); + this.statsContainer = new StatsContainer(this.scene, 6, 16); this.scene.add.existing(this.statsContainer); @@ -911,7 +914,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { y: this.scene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, }); this.starterSelectContainer.add(this.moveInfoOverlay); + + // Filter bar sits above everything, except the tutorial overlay and message box this.starterSelectContainer.bringToTop(this.filterBarContainer); + this.initTutorialOverlay(this.starterSelectContainer); + this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); this.scene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, (e) => this.onCandyUpgradeDisplayChanged(e)); diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index c6e0ea3a71c1..06dd6e7c035d 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -4,12 +4,15 @@ import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./t import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; import i18next from "i18next"; + const ivChartSize = 24; const ivChartStatCoordMultipliers = [[0, -1], [0.825, -0.5], [0.825, 0.5], [-0.825, -0.5], [-0.825, 0.5], [0, 1]]; const speedLabelOffset = -3; const sideLabelOffset = 1; const ivLabelOffset = [0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset]; +const ivChartLabelyOffset= [0, 5, 0, 5, 0, 0]; // doing this so attack does not overlap with (+N) const ivChartStatIndexes = [0, 1, 2, 5, 4, 3]; // swap special attack and speed + const defaultIvChartData = new Array(12).fill(null).map(() => 0); export class StatsContainer extends Phaser.GameObjects.Container { @@ -29,7 +32,6 @@ export class StatsContainer extends Phaser.GameObjects.Container { setup() { this.setName("stats"); const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); - const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); ivChartBg.setOrigin(0, 0); @@ -55,12 +57,19 @@ export class StatsContainer extends Phaser.GameObjects.Container { this.ivStatValueTexts = []; for (const s of PERMANENT_STATS) { - const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + ivLabelOffset[s], i18next.t(getStatKey(s)), TextStyle.TOOLTIP_CONTENT); + const statLabel = addTextObject( + this.scene, + ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325 + (this.showDiff ? 0 : ivLabelOffset[s]), + ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + (this.showDiff ? 0 : ivChartLabelyOffset[s]), + i18next.t(getStatKey(s)), + TextStyle.TOOLTIP_CONTENT + ); statLabel.setOrigin(0.5); - this.ivStatValueTexts[s] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); + this.ivStatValueTexts[s] = addBBCodeTextObject(this.scene, statLabel.x - (this.showDiff ? 0 : ivLabelOffset[s]), statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); this.ivStatValueTexts[s].setOrigin(0.5); + this.add(statLabel); this.add(this.ivStatValueTexts[s]); } diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 8ae72f08edd9..fb9f15614473 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -214,7 +214,7 @@ export default class SummaryUiHandler extends UiHandler { this.statusContainer.add(statusLabel); - this.status = this.scene.add.sprite(91, 4, "statuses"); + this.status = this.scene.add.sprite(91, 4, Utils.getLocalizedSpriteKey("statuses")); this.status.setOrigin(0.5, 0); this.statusContainer.add(this.status); @@ -824,6 +824,7 @@ export default class SummaryUiHandler extends UiHandler { metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1? "apparently": "normal"}`, { 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? + wave: `${getBBCodeFrag((this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer")), TextStyle.SUMMARY_RED)}${closeFragment}`, }), natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) }); diff --git a/src/utils.ts b/src/utils.ts index a8206bf4dcfb..e526d086316d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,5 @@ import { MoneyFormat } from "#enums/money-format"; +import { Moves } from "#enums/moves"; import i18next from "i18next"; export const MissingTextureKey = "__MISSING"; @@ -628,3 +629,12 @@ export function getLocalizedSpriteKey(baseKey: string) { export function isBetween(num: number, min: number, max: number): boolean { return num >= min && num <= max; } + +/** + * Helper method to return the animation filename for a given move + * + * @param move the move for which the animation filename is needed + */ +export function animationFileName(move: Moves): string { + return Moves[move].toLowerCase().replace(/\_/g, "-"); +} diff --git a/vite.config.ts b/vite.config.ts index 1fd85e2572f1..946315c4b7b6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -31,6 +31,7 @@ export default defineConfig(({mode}) => { return ({ ...defaultConfig, + base: '', esbuild: { pure: mode === 'production' ? ['console.log'] : [], keepNames: true,