diff --git a/.gitignore b/.gitignore index 4cf3196a72b..55f9203a81d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,5 +33,6 @@ public/images/pokemon/icons/input/output/* public/images/character/*/ src/data/battle-anim-raw-data*.ts src/data/battle-anim-data.ts +src/overrides.ts coverage \ No newline at end of file diff --git a/index.css b/index.css index 9a507ad6766..dd47387adee 100644 --- a/index.css +++ b/index.css @@ -150,6 +150,10 @@ body { display: none; } +#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apad #apadStats { + display: none; +} + #apad .apadRectBtnContainer + .apadSqBtnContainer { top: calc(var(--controls-size) * -1.9); left: calc(var(--controls-size) * -0.9); diff --git a/index.html b/index.html index bd316330a99..177a92efce6 100644 --- a/index.html +++ b/index.html @@ -74,6 +74,9 @@
V
+
+ C +
Menu
diff --git a/package-lock.json b/package-lock.json index 5521dcc86a8..7db944a4533 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "name": "pokemon-rogue-battle", - "version": "1.0.1", + "version": "1.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.0.1", + "version": "1.0.4", "dependencies": { "@material/material-color-utilities": "^0.2.7", "crypto-js": "^4.2.0", "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", "json-stable-stringify": "^1.1.0", "phaser": "^3.70.0", "phaser3-rex-plugins": "^1.1.84" @@ -2772,6 +2773,14 @@ "@babel/runtime": "^7.23.2" } }, + "node_modules/i18next-browser-languagedetector": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", + "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/i18next-http-backend": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", diff --git a/package.json b/package.json index a8c20cc49ed..d5ffb651f54 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@material/material-color-utilities": "^0.2.7", "crypto-js": "^4.2.0", "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", "json-stable-stringify": "^1.1.0", "phaser": "^3.70.0", "phaser3-rex-plugins": "^1.1.84" diff --git a/public/images/pbinfo_stat_numbers.json b/public/images/pbinfo_stat_numbers.json new file mode 100644 index 00000000000..32170690aa0 --- /dev/null +++ b/public/images/pbinfo_stat_numbers.json @@ -0,0 +1,293 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_numbers.png", + "format": "RGBA8888", + "size": { + "w": 117, + "h": 8 + }, + "scale": 1, + "frames": [ + { + "filename": "+1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 9, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 18, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+4", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 27, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+5", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 36, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+6", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 45, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 54, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 63, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 72, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-4", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 81, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-5", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 90, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-6", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 99, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 108, + "y": 0, + "w": 9, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:794aa4af3291db5abd8a2667626c1998:1a6706ad557b92f9bf099c23e02af4a6:6537c634087637bb27e8a1edb1ee2e35$" + } +} diff --git a/public/images/pokemon/back/shiny/676-dandy.json b/public/images/pokemon/back/shiny/676-dandy.json index c2bbb272d46..b13560feb7d 100644 --- a/public/images/pokemon/back/shiny/676-dandy.json +++ b/public/images/pokemon/back/shiny/676-dandy.json @@ -4,30 +4,30 @@ "image": "676-dandy.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 66, + "h": 66 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 62, - "h": 72 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 72 + "x": 20, + "y": 14, + "w": 56, + "h": 66 }, "frame": { "x": 0, "y": 0, - "w": 62, - "h": 72 + "w": 56, + "h": 66 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9a72775f436bbda574bf3721630310fb:f01538e7a19ca3d0d2fea48cd27d8a4c:b5a287256e260744fe6660dc2ceefd11$" + "smartupdate": "$TexturePacker:SmartUpdate:30c2972a226f8e360e323bea40a8005e:232a9bbcc4dba00a033204f1ec06cffd:b5a287256e260744fe6660dc2ceefd11$" } } diff --git a/public/images/pokemon/back/shiny/676-dandy.png b/public/images/pokemon/back/shiny/676-dandy.png index 634a2b0c8a9..f8c77d88326 100644 Binary files a/public/images/pokemon/back/shiny/676-dandy.png and b/public/images/pokemon/back/shiny/676-dandy.png differ diff --git a/public/images/pokemon/back/shiny/676-debutante.json b/public/images/pokemon/back/shiny/676-debutante.json index b1067eed9f9..0469fb6702b 100644 --- a/public/images/pokemon/back/shiny/676-debutante.json +++ b/public/images/pokemon/back/shiny/676-debutante.json @@ -4,30 +4,30 @@ "image": "676-debutante.png", "format": "RGBA8888", "size": { - "w": 68, - "h": 68 + "w": 62, + "h": 62 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 57, - "h": 68 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 68 + "x": 25, + "y": 18, + "w": 51, + "h": 62 }, "frame": { "x": 0, "y": 0, - "w": 57, - "h": 68 + "w": 51, + "h": 62 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6d038d8d188d6e545741353c2dd5b812:6f39eb82deb32d251df708f5d4edc9f1:bf2f862a1c8881133f9f3ffbf44602fa$" + "smartupdate": "$TexturePacker:SmartUpdate:5a68081e37dfebc3935ecf4a4fbee3ad:71cbee6966c08512b0617eba3ce34a49:bf2f862a1c8881133f9f3ffbf44602fa$" } } diff --git a/public/images/pokemon/back/shiny/676-debutante.png b/public/images/pokemon/back/shiny/676-debutante.png index 3a7a0d7abc2..965e0aaf86d 100644 Binary files a/public/images/pokemon/back/shiny/676-debutante.png and b/public/images/pokemon/back/shiny/676-debutante.png differ diff --git a/public/images/pokemon/back/shiny/676-diamond.json b/public/images/pokemon/back/shiny/676-diamond.json index 2df54c70a2d..50319863eb3 100644 --- a/public/images/pokemon/back/shiny/676-diamond.json +++ b/public/images/pokemon/back/shiny/676-diamond.json @@ -4,30 +4,30 @@ "image": "676-diamond.png", "format": "RGBA8888", "size": { - "w": 74, - "h": 74 + "w": 68, + "h": 68 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 51, - "h": 74 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 74 + "x": 27, + "y": 12, + "w": 45, + "h": 68 }, "frame": { "x": 0, "y": 0, - "w": 51, - "h": 74 + "w": 45, + "h": 68 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6e2189160ebb9fff02e9a051ee296d91:47037a1746645a551e31781cb8262e1f:88c467fc09249b0d2f579d44eacd528d$" + "smartupdate": "$TexturePacker:SmartUpdate:2d32af44d56592301808b561e6fa22f6:c70b6710f9c7ebb5268979a777193386:88c467fc09249b0d2f579d44eacd528d$" } } diff --git a/public/images/pokemon/back/shiny/676-diamond.png b/public/images/pokemon/back/shiny/676-diamond.png index d737c62b507..9ea8ff97838 100644 Binary files a/public/images/pokemon/back/shiny/676-diamond.png and b/public/images/pokemon/back/shiny/676-diamond.png differ diff --git a/public/images/pokemon/back/shiny/676-heart.json b/public/images/pokemon/back/shiny/676-heart.json index 6ebd9b679e9..6202b4b2050 100644 --- a/public/images/pokemon/back/shiny/676-heart.json +++ b/public/images/pokemon/back/shiny/676-heart.json @@ -4,30 +4,30 @@ "image": "676-heart.png", "format": "RGBA8888", "size": { - "w": 71, - "h": 71 + "w": 65, + "h": 65 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 52, - "h": 71 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 52, - "h": 71 + "x": 26, + "y": 15, + "w": 46, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 52, - "h": 71 + "w": 46, + "h": 65 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bd54cfc49b95a12709696441044b115c:dce25f0e6474cad17709f18c96ffb3e5:e11d4dd16bff2ef69bc5ca683c44ca7c$" + "smartupdate": "$TexturePacker:SmartUpdate:e936d451ba0b36434d6444cb1b80f4d9:0b0d0b49e11fcc790a20130e3ab18ca5:e11d4dd16bff2ef69bc5ca683c44ca7c$" } } diff --git a/public/images/pokemon/back/shiny/676-heart.png b/public/images/pokemon/back/shiny/676-heart.png index fac541f4438..e44c8218aba 100644 Binary files a/public/images/pokemon/back/shiny/676-heart.png and b/public/images/pokemon/back/shiny/676-heart.png differ diff --git a/public/images/pokemon/back/shiny/676-kabuki.json b/public/images/pokemon/back/shiny/676-kabuki.json index 140e74be3b3..87bcba2e93c 100644 --- a/public/images/pokemon/back/shiny/676-kabuki.json +++ b/public/images/pokemon/back/shiny/676-kabuki.json @@ -4,30 +4,30 @@ "image": "676-kabuki.png", "format": "RGBA8888", "size": { - "w": 71, - "h": 71 + "w": 65, + "h": 65 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 55, - "h": 71 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 71 + "x": 23, + "y": 15, + "w": 49, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 55, - "h": 71 + "w": 49, + "h": 65 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5bd5ad9678c59b2b1d85a6af103ba1ba:2f6c7f2792f64728b478333fc2c65138:c3cad56aa65d2ee971ceebc435a14ee6$" + "smartupdate": "$TexturePacker:SmartUpdate:517d96cd6baa5b7616a51e8c4fed7a55:0a0f239ab3df60459410fab5eba8a4e6:c3cad56aa65d2ee971ceebc435a14ee6$" } } diff --git a/public/images/pokemon/back/shiny/676-kabuki.png b/public/images/pokemon/back/shiny/676-kabuki.png index bbb1a776ece..e81aada06bd 100644 Binary files a/public/images/pokemon/back/shiny/676-kabuki.png and b/public/images/pokemon/back/shiny/676-kabuki.png differ diff --git a/public/images/pokemon/back/shiny/676-la-reine.json b/public/images/pokemon/back/shiny/676-la-reine.json index 88ddfdc23ac..a5b408946b3 100644 --- a/public/images/pokemon/back/shiny/676-la-reine.json +++ b/public/images/pokemon/back/shiny/676-la-reine.json @@ -4,30 +4,30 @@ "image": "676-la-reine.png", "format": "RGBA8888", "size": { - "w": 69, - "h": 69 + "w": 63, + "h": 63 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 54, - "h": 69 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 69 + "x": 24, + "y": 17, + "w": 48, + "h": 63 }, "frame": { "x": 0, "y": 0, - "w": 54, - "h": 69 + "w": 48, + "h": 63 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e01297ffc2dd40460e87b64750997ca6:3261fa54b4c9574937d670de782ca3e8:b99821e87dffda3297dd25a224a9029f$" + "smartupdate": "$TexturePacker:SmartUpdate:e2179e3c9dfa079f84af302283187a80:518e57f1e0614d1aedad1d9826def3d4:b99821e87dffda3297dd25a224a9029f$" } } diff --git a/public/images/pokemon/back/shiny/676-la-reine.png b/public/images/pokemon/back/shiny/676-la-reine.png index e4d699e5fe8..78e43bc30af 100644 Binary files a/public/images/pokemon/back/shiny/676-la-reine.png and b/public/images/pokemon/back/shiny/676-la-reine.png differ diff --git a/public/images/pokemon/back/shiny/676-matron.json b/public/images/pokemon/back/shiny/676-matron.json index 6bf6d37dd2a..b24180fa85e 100644 --- a/public/images/pokemon/back/shiny/676-matron.json +++ b/public/images/pokemon/back/shiny/676-matron.json @@ -4,30 +4,30 @@ "image": "676-matron.png", "format": "RGBA8888", "size": { - "w": 68, - "h": 68 + "w": 62, + "h": 62 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 53, - "h": 68 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 68 + "x": 26, + "y": 18, + "w": 47, + "h": 62 }, "frame": { "x": 0, "y": 0, - "w": 53, - "h": 68 + "w": 47, + "h": 62 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:262f28877dc9ef9e7920282c4b36b8dd:18b55adc9c377d1b24d6b236e1f39177:020798583d07c479020bb0af34cf8bb6$" + "smartupdate": "$TexturePacker:SmartUpdate:6c9b45763eb4fedb5ec7099762f23606:884e9813686e91cf2a2cd9f51652a875:020798583d07c479020bb0af34cf8bb6$" } } diff --git a/public/images/pokemon/back/shiny/676-matron.png b/public/images/pokemon/back/shiny/676-matron.png index 1867cf457aa..0324b0baf94 100644 Binary files a/public/images/pokemon/back/shiny/676-matron.png and b/public/images/pokemon/back/shiny/676-matron.png differ diff --git a/public/images/pokemon/back/shiny/676-pharaoh.json b/public/images/pokemon/back/shiny/676-pharaoh.json index da483501127..9b18b969754 100644 --- a/public/images/pokemon/back/shiny/676-pharaoh.json +++ b/public/images/pokemon/back/shiny/676-pharaoh.json @@ -4,30 +4,30 @@ "image": "676-pharaoh.png", "format": "RGBA8888", "size": { - "w": 70, - "h": 70 + "w": 64, + "h": 64 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 53, - "h": 70 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 70 + "x": 25, + "y": 16, + "w": 47, + "h": 64 }, "frame": { "x": 0, "y": 0, - "w": 53, - "h": 70 + "w": 47, + "h": 64 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a5d56fc494b2194036a8d6d1d876a296:6260eeb9aa48a1047c8ec12842ac28c6:904b7ab6f57249c96beea4b5f72deb53$" + "smartupdate": "$TexturePacker:SmartUpdate:5143f43786377eae745a9355e5e1cc24:158aa35a349be4cf7c56820170aa4546:904b7ab6f57249c96beea4b5f72deb53$" } } diff --git a/public/images/pokemon/back/shiny/676-pharaoh.png b/public/images/pokemon/back/shiny/676-pharaoh.png index 4c139a498d2..563c2f93e21 100644 Binary files a/public/images/pokemon/back/shiny/676-pharaoh.png and b/public/images/pokemon/back/shiny/676-pharaoh.png differ diff --git a/public/images/pokemon/back/shiny/676-star.json b/public/images/pokemon/back/shiny/676-star.json index 1ef3e6a6111..6ca9f42e5c3 100644 --- a/public/images/pokemon/back/shiny/676-star.json +++ b/public/images/pokemon/back/shiny/676-star.json @@ -4,30 +4,30 @@ "image": "676-star.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 66, + "h": 66 }, - "scale": 1, + "scale": 0.333, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 54, - "h": 72 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 72 + "x": 24, + "y": 14, + "w": 48, + "h": 66 }, "frame": { "x": 0, "y": 0, - "w": 54, - "h": 72 + "w": 48, + "h": 66 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6be66775c485bf44d69f7cd44e346324:c9e3d3db02b6ea0720a20b9bbd159d79:dd7fedf66b493b0bbdef5d25e0041dd8$" + "smartupdate": "$TexturePacker:SmartUpdate:d9af00245cb6498c9dec7508ed563454:12f19bad174b64678e8b8be8455f2b5a:dd7fedf66b493b0bbdef5d25e0041dd8$" } } diff --git a/public/images/pokemon/back/shiny/676-star.png b/public/images/pokemon/back/shiny/676-star.png index 0ad91515631..0f388480b4f 100644 Binary files a/public/images/pokemon/back/shiny/676-star.png and b/public/images/pokemon/back/shiny/676-star.png differ diff --git a/public/images/pokemon/back/shiny/678.json b/public/images/pokemon/back/shiny/678.json index 98341ac8e5c..14101a5b062 100644 --- a/public/images/pokemon/back/shiny/678.json +++ b/public/images/pokemon/back/shiny/678.json @@ -4,219 +4,30 @@ "image": "678.png", "format": "RGBA8888", "size": { - "w": 157, - "h": 157 + "w": 55, + "h": 55 }, - "scale": 1, + "scale": 0.333, "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 25, - "y": 16, - "w": 54, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 60 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 25, - "y": 16, - "w": 54, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 25, - "y": 15, - "w": 53, - "h": 61 - }, - "frame": { - "x": 54, - "y": 0, - "w": 53, - "h": 61 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 25, - "y": 15, - "w": 53, - "h": 61 - }, - "frame": { - "x": 54, - "y": 0, - "w": 53, - "h": 61 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 24, - "y": 15, - "w": 52, - "h": 61 - }, - "frame": { - "x": 0, - "y": 60, - "w": 52, - "h": 61 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 24, - "y": 15, - "w": 52, - "h": 61 - }, - "frame": { - "x": 0, - "y": 60, - "w": 52, - "h": 61 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 26, - "y": 16, - "w": 54, - "h": 60 - }, - "frame": { - "x": 52, - "y": 61, - "w": 54, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 24, - "y": 17, - "w": 51, - "h": 59 - }, - "frame": { - "x": 106, - "y": 61, - "w": 51, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 24, - "y": 17, - "w": 51, - "h": 59 - }, - "frame": { - "x": 106, - "y": 61, - "w": 51, - "h": 59 - } - }, { "filename": "0001.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { "w": 96, "h": 96 }, "spriteSourceSize": { - "x": 23, - "y": 19, - "w": 50, - "h": 57 + "x": 25, + "y": 20, + "w": 46, + "h": 55 }, "frame": { - "x": 107, + "x": 0, "y": 0, - "w": 50, - "h": 57 + "w": 46, + "h": 55 } } ] @@ -225,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ab77ad452685ab677c7e5e70a386e880:27bb9b07316cb5c401e67e15e2b0f06a:887aa14e4a3a3e9141c6ae460f968db1$" + "smartupdate": "$TexturePacker:SmartUpdate:7b46b2656390e5ddac94370837e7cdaa:7f76286d5acb65066eff0c2532fa7fea:887aa14e4a3a3e9141c6ae460f968db1$" } } diff --git a/public/images/pokemon/back/shiny/678.png b/public/images/pokemon/back/shiny/678.png index 7bb6cfc0b88..3e9d72b066e 100644 Binary files a/public/images/pokemon/back/shiny/678.png and b/public/images/pokemon/back/shiny/678.png differ diff --git a/public/images/pokemon/shiny/676-dandy.json b/public/images/pokemon/shiny/676-dandy.json index 2bb36e87e27..770db5763b3 100644 --- a/public/images/pokemon/shiny/676-dandy.json +++ b/public/images/pokemon/shiny/676-dandy.json @@ -4,30 +4,30 @@ "image": "676-dandy.png", "format": "RGBA8888", "size": { - "w": 71, - "h": 71 + "w": 65, + "h": 65 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 56, - "h": 71 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 71 + "x": 22, + "y": 15, + "w": 50, + "h": 65 }, "frame": { "x": 0, "y": 0, - "w": 56, - "h": 71 + "w": 50, + "h": 65 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cd88917bff3fae3d6ff808096f539d70:17a1912fd81d23ce8a7209e27ad3e9ed:b5a287256e260744fe6660dc2ceefd11$" + "smartupdate": "$TexturePacker:SmartUpdate:30639f5b87709c77f1b970be4078abf4:7b6183e776852f811a1e5c3fa15805fc:b5a287256e260744fe6660dc2ceefd11$" } } diff --git a/public/images/pokemon/shiny/676-dandy.png b/public/images/pokemon/shiny/676-dandy.png index 738b9eaec07..d0e19946a24 100644 Binary files a/public/images/pokemon/shiny/676-dandy.png and b/public/images/pokemon/shiny/676-dandy.png differ diff --git a/public/images/pokemon/shiny/676-debutante.json b/public/images/pokemon/shiny/676-debutante.json index fa4859812ed..720b39294e4 100644 --- a/public/images/pokemon/shiny/676-debutante.json +++ b/public/images/pokemon/shiny/676-debutante.json @@ -4,30 +4,30 @@ "image": "676-debutante.png", "format": "RGBA8888", "size": { - "w": 67, - "h": 67 + "w": 61, + "h": 61 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 56, - "h": 67 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 67 + "x": 20, + "y": 19, + "w": 50, + "h": 61 }, "frame": { "x": 0, "y": 0, - "w": 56, - "h": 67 + "w": 50, + "h": 61 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:68f3a2720b7b1e5e59f628f021cac698:07d06d321fff31976e1b993edb972e4f:bf2f862a1c8881133f9f3ffbf44602fa$" + "smartupdate": "$TexturePacker:SmartUpdate:2ccaadba59ae7a3f23287601b725067d:18ae045d433354fd8b461b528bba113d:bf2f862a1c8881133f9f3ffbf44602fa$" } } diff --git a/public/images/pokemon/shiny/676-debutante.png b/public/images/pokemon/shiny/676-debutante.png index 2be51b49d14..ff8d8d76dbe 100644 Binary files a/public/images/pokemon/shiny/676-debutante.png and b/public/images/pokemon/shiny/676-debutante.png differ diff --git a/public/images/pokemon/shiny/676-diamond.json b/public/images/pokemon/shiny/676-diamond.json index 9098c46140e..8ceec5a6f3a 100644 --- a/public/images/pokemon/shiny/676-diamond.json +++ b/public/images/pokemon/shiny/676-diamond.json @@ -4,30 +4,30 @@ "image": "676-diamond.png", "format": "RGBA8888", "size": { - "w": 74, - "h": 74 + "w": 68, + "h": 68 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 53, - "h": 74 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 74 + "x": 24, + "y": 12, + "w": 47, + "h": 68 }, "frame": { "x": 0, "y": 0, - "w": 53, - "h": 74 + "w": 47, + "h": 68 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e054ccb4d021c87a6a02c6728403d87a:c7e104da9393ec52b9e6d37f92fc20d9:88c467fc09249b0d2f579d44eacd528d$" + "smartupdate": "$TexturePacker:SmartUpdate:bd55e138e32873b99b7a1a2e237d5278:befb394d45c46c22e2711f4c6d5d9623:88c467fc09249b0d2f579d44eacd528d$" } } diff --git a/public/images/pokemon/shiny/676-diamond.png b/public/images/pokemon/shiny/676-diamond.png index 5662825df7d..a29257968a3 100644 Binary files a/public/images/pokemon/shiny/676-diamond.png and b/public/images/pokemon/shiny/676-diamond.png differ diff --git a/public/images/pokemon/shiny/676-heart.json b/public/images/pokemon/shiny/676-heart.json index 43f03c195eb..a330e953d10 100644 --- a/public/images/pokemon/shiny/676-heart.json +++ b/public/images/pokemon/shiny/676-heart.json @@ -4,30 +4,30 @@ "image": "676-heart.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 66, + "h": 66 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 54, - "h": 72 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 72 + "x": 24, + "y": 14, + "w": 48, + "h": 66 }, "frame": { "x": 0, "y": 0, - "w": 54, - "h": 72 + "w": 48, + "h": 66 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:adb921bf32ae497738fbecc12e2aab07:421a40542b16cdb2cc154c85e963b40d:e11d4dd16bff2ef69bc5ca683c44ca7c$" + "smartupdate": "$TexturePacker:SmartUpdate:6a000209d8789ed27cdd0700711ccc27:75157608bd339b63c9a7ce68e259b3b7:e11d4dd16bff2ef69bc5ca683c44ca7c$" } } diff --git a/public/images/pokemon/shiny/676-heart.png b/public/images/pokemon/shiny/676-heart.png index 2747c376bca..39c7e8b900c 100644 Binary files a/public/images/pokemon/shiny/676-heart.png and b/public/images/pokemon/shiny/676-heart.png differ diff --git a/public/images/pokemon/shiny/676-kabuki.json b/public/images/pokemon/shiny/676-kabuki.json index 7121f0b3030..a892c23d256 100644 --- a/public/images/pokemon/shiny/676-kabuki.json +++ b/public/images/pokemon/shiny/676-kabuki.json @@ -4,30 +4,30 @@ "image": "676-kabuki.png", "format": "RGBA8888", "size": { - "w": 70, - "h": 70 + "w": 64, + "h": 64 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 58, - "h": 70 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 70 + "x": 22, + "y": 16, + "w": 52, + "h": 64 }, "frame": { "x": 0, "y": 0, - "w": 58, - "h": 70 + "w": 52, + "h": 64 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ef8ecfc1b406aa668e3f8daf0dfbaae7:08eecd31f557298e1570ec3490acffe2:c3cad56aa65d2ee971ceebc435a14ee6$" + "smartupdate": "$TexturePacker:SmartUpdate:cd44f74e9b1dc4a581bd72f235552344:1404c36e03543b4eb1d1a4d5916a6652:c3cad56aa65d2ee971ceebc435a14ee6$" } } diff --git a/public/images/pokemon/shiny/676-kabuki.png b/public/images/pokemon/shiny/676-kabuki.png index 1a9a2ad1689..d11cff6c87e 100644 Binary files a/public/images/pokemon/shiny/676-kabuki.png and b/public/images/pokemon/shiny/676-kabuki.png differ diff --git a/public/images/pokemon/shiny/676-la-reine.json b/public/images/pokemon/shiny/676-la-reine.json index dc3c4d596a1..24299b06187 100644 --- a/public/images/pokemon/shiny/676-la-reine.json +++ b/public/images/pokemon/shiny/676-la-reine.json @@ -4,30 +4,30 @@ "image": "676-la-reine.png", "format": "RGBA8888", "size": { - "w": 69, - "h": 69 + "w": 63, + "h": 63 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 55, - "h": 69 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 69 + "x": 23, + "y": 17, + "w": 49, + "h": 63 }, "frame": { "x": 0, "y": 0, - "w": 55, - "h": 69 + "w": 49, + "h": 63 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6ba780e3e4c772966f8fa209410a9370:c56ae957d7acb10c7373b842af3a8786:b99821e87dffda3297dd25a224a9029f$" + "smartupdate": "$TexturePacker:SmartUpdate:1982df9d4acf87f005bb76829bd78a65:e3590ee437367a91742856b3887339a8:b99821e87dffda3297dd25a224a9029f$" } } diff --git a/public/images/pokemon/shiny/676-la-reine.png b/public/images/pokemon/shiny/676-la-reine.png index 1ca19430e66..7eed3ef20a2 100644 Binary files a/public/images/pokemon/shiny/676-la-reine.png and b/public/images/pokemon/shiny/676-la-reine.png differ diff --git a/public/images/pokemon/shiny/676-matron.json b/public/images/pokemon/shiny/676-matron.json index fac13c6551f..def3de9d349 100644 --- a/public/images/pokemon/shiny/676-matron.json +++ b/public/images/pokemon/shiny/676-matron.json @@ -4,30 +4,30 @@ "image": "676-matron.png", "format": "RGBA8888", "size": { - "w": 68, - "h": 68 + "w": 62, + "h": 62 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 52, - "h": 68 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 52, - "h": 68 + "x": 23, + "y": 18, + "w": 46, + "h": 62 }, "frame": { "x": 0, "y": 0, - "w": 52, - "h": 68 + "w": 46, + "h": 62 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89ab717076c514df8295db07981b18e9:72a9977db421d061829c639e3b50a617:020798583d07c479020bb0af34cf8bb6$" + "smartupdate": "$TexturePacker:SmartUpdate:e2bcb6e27807980dfb68c17e65a7e8bd:d2409a3631a4a2263717bf5aa7e273b2:020798583d07c479020bb0af34cf8bb6$" } } diff --git a/public/images/pokemon/shiny/676-matron.png b/public/images/pokemon/shiny/676-matron.png index 0ea64fcd55e..14e31ce77b7 100644 Binary files a/public/images/pokemon/shiny/676-matron.png and b/public/images/pokemon/shiny/676-matron.png differ diff --git a/public/images/pokemon/shiny/676-pharaoh.json b/public/images/pokemon/shiny/676-pharaoh.json index 6acf62a9f31..0cb4f035c81 100644 --- a/public/images/pokemon/shiny/676-pharaoh.json +++ b/public/images/pokemon/shiny/676-pharaoh.json @@ -4,30 +4,30 @@ "image": "676-pharaoh.png", "format": "RGBA8888", "size": { - "w": 69, - "h": 69 + "w": 63, + "h": 63 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 52, - "h": 69 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 52, - "h": 69 + "x": 25, + "y": 17, + "w": 46, + "h": 63 }, "frame": { "x": 0, "y": 0, - "w": 52, - "h": 69 + "w": 46, + "h": 63 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:85c709f8538d07088a17e53a7c85afa0:623b4bc6698ef1a984b6bad42e68115b:904b7ab6f57249c96beea4b5f72deb53$" + "smartupdate": "$TexturePacker:SmartUpdate:bdf2959fe7e2556fe6d031d7de04fc6c:fbff7f59a6ed25ee3eef955cbb3b9a56:904b7ab6f57249c96beea4b5f72deb53$" } } diff --git a/public/images/pokemon/shiny/676-pharaoh.png b/public/images/pokemon/shiny/676-pharaoh.png index d3019440c8a..32b78156f7d 100644 Binary files a/public/images/pokemon/shiny/676-pharaoh.png and b/public/images/pokemon/shiny/676-pharaoh.png differ diff --git a/public/images/pokemon/shiny/676-star.json b/public/images/pokemon/shiny/676-star.json index 0686d348789..db4d10dde76 100644 --- a/public/images/pokemon/shiny/676-star.json +++ b/public/images/pokemon/shiny/676-star.json @@ -4,30 +4,30 @@ "image": "676-star.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 66, + "h": 66 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 56, - "h": 72 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 72 + "x": 24, + "y": 14, + "w": 50, + "h": 66 }, "frame": { "x": 0, "y": 0, - "w": 56, - "h": 72 + "w": 50, + "h": 66 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:56c2df4ee634b690a816b79120bc3600:d7eefc05e299310d05d389e05997e449:dd7fedf66b493b0bbdef5d25e0041dd8$" + "smartupdate": "$TexturePacker:SmartUpdate:a3f92eef83bcae7716ee78c669738785:156a85da733d2e878a00be0efc1c4d38:dd7fedf66b493b0bbdef5d25e0041dd8$" } } diff --git a/public/images/pokemon/shiny/676-star.png b/public/images/pokemon/shiny/676-star.png index de93346cb74..d7a327566b9 100644 Binary files a/public/images/pokemon/shiny/676-star.png and b/public/images/pokemon/shiny/676-star.png differ diff --git a/public/images/pokemon/shiny/678.json b/public/images/pokemon/shiny/678.json index 3b0b49acd46..681f8466719 100644 --- a/public/images/pokemon/shiny/678.json +++ b/public/images/pokemon/shiny/678.json @@ -4,240 +4,30 @@ "image": "678.png", "format": "RGBA8888", "size": { - "w": 130, - "h": 130 + "w": 56, + "h": 56 }, - "scale": 1, + "scale": 0.5, "frames": [ { "filename": "0001.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 96, + "h": 96 }, "spriteSourceSize": { - "x": 18, - "y": 11, - "w": 44, - "h": 57 + "x": 25, + "y": 20, + "w": 45, + "h": 56 }, "frame": { "x": 0, "y": 0, - "w": 44, - "h": 57 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 18, - "y": 11, - "w": 44, - "h": 57 - }, - "frame": { - "x": 0, - "y": 57, - "w": 44, - "h": 57 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 18, - "y": 11, - "w": 44, - "h": 57 - }, - "frame": { - "x": 0, - "y": 57, - "w": 44, - "h": 57 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 21, - "y": 15, - "w": 44, - "h": 53 - }, - "frame": { - "x": 44, - "y": 0, - "w": 44, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 21, - "y": 15, - "w": 44, - "h": 53 - }, - "frame": { - "x": 44, - "y": 0, - "w": 44, - "h": 53 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 24, - "y": 12, - "w": 42, + "w": 45, "h": 56 - }, - "frame": { - "x": 88, - "y": 0, - "w": 42, - "h": 56 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 24, - "y": 12, - "w": 42, - "h": 56 - }, - "frame": { - "x": 88, - "y": 0, - "w": 42, - "h": 56 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 43, - "h": 57 - }, - "frame": { - "x": 44, - "y": 53, - "w": 43, - "h": 57 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 43, - "h": 57 - }, - "frame": { - "x": 44, - "y": 53, - "w": 43, - "h": 57 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 22, - "y": 13, - "w": 43, - "h": 55 - }, - "frame": { - "x": 87, - "y": 56, - "w": 43, - "h": 55 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 22, - "y": 13, - "w": 43, - "h": 55 - }, - "frame": { - "x": 87, - "y": 56, - "w": 43, - "h": 55 } } ] @@ -246,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9579cbb834c4127f905679ba92633a05:64ed3d991add5e47034b1ca9aad80a4c:887aa14e4a3a3e9141c6ae460f968db1$" + "smartupdate": "$TexturePacker:SmartUpdate:ee6cbb7807c28f4b3f12e8dcf4da4888:77056356d7cbf2a4fb20508f50dbd3ce:887aa14e4a3a3e9141c6ae460f968db1$" } } diff --git a/public/images/pokemon/shiny/678.png b/public/images/pokemon/shiny/678.png index f41018c9838..a2ec8d89519 100644 Binary files a/public/images/pokemon/shiny/678.png and b/public/images/pokemon/shiny/678.png differ diff --git a/public/images/ui/legacy/pbinfo_enemy_boss_stats.png b/public/images/ui/legacy/pbinfo_enemy_boss_stats.png new file mode 100644 index 00000000000..94c9f2a1817 Binary files /dev/null and b/public/images/ui/legacy/pbinfo_enemy_boss_stats.png differ diff --git a/public/images/ui/legacy/pbinfo_enemy_mini_stats.png b/public/images/ui/legacy/pbinfo_enemy_mini_stats.png new file mode 100644 index 00000000000..eb32e694134 Binary files /dev/null and b/public/images/ui/legacy/pbinfo_enemy_mini_stats.png differ diff --git a/public/images/ui/legacy/pbinfo_player_mini_stats.png b/public/images/ui/legacy/pbinfo_player_mini_stats.png new file mode 100644 index 00000000000..dd2b7e65ba3 Binary files /dev/null and b/public/images/ui/legacy/pbinfo_player_mini_stats.png differ diff --git a/public/images/ui/legacy/pbinfo_player_stats.png b/public/images/ui/legacy/pbinfo_player_stats.png new file mode 100644 index 00000000000..078248624bc Binary files /dev/null and b/public/images/ui/legacy/pbinfo_player_stats.png differ diff --git a/public/images/ui/legacy/pbinfo_stat.json b/public/images/ui/legacy/pbinfo_stat.json new file mode 100644 index 00000000000..b7da47fc192 --- /dev/null +++ b/public/images/ui/legacy/pbinfo_stat.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "pbinfo_stat.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/pbinfo_stat.png b/public/images/ui/legacy/pbinfo_stat.png new file mode 100644 index 00000000000..62ec3758772 Binary files /dev/null and b/public/images/ui/legacy/pbinfo_stat.png differ diff --git a/public/images/ui/legacy/pbinfo_stat_numbers.json b/public/images/ui/legacy/pbinfo_stat_numbers.json new file mode 100644 index 00000000000..9c74ee86dbc --- /dev/null +++ b/public/images/ui/legacy/pbinfo_stat_numbers.json @@ -0,0 +1,293 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_numbers.png", + "format": "RGBA8888", + "size": { + "w": 117, + "h": 8 + }, + "scale": 1, + "frames": [ + { + "filename": "+1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 9, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 18, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+4", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 27, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+5", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 36, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "+6", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 45, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 54, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 63, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 72, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-4", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 81, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-5", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 90, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-6", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 99, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 108, + "y": 0, + "w": 9, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:1f22b7cb085faf9e9764273fa5e70c28:afc5587ebacca78d178ac7e0c434591b:6537c634087637bb27e8a1edb1ee2e35$" + } +} diff --git a/public/images/ui/legacy/pbinfo_stat_numbers.png b/public/images/ui/legacy/pbinfo_stat_numbers.png new file mode 100644 index 00000000000..ee1453b2107 Binary files /dev/null and b/public/images/ui/legacy/pbinfo_stat_numbers.png differ diff --git a/public/images/ui/pbinfo_enemy_boss.png b/public/images/ui/pbinfo_enemy_boss.png index 58edefa164f..ff5ba661450 100644 Binary files a/public/images/ui/pbinfo_enemy_boss.png and b/public/images/ui/pbinfo_enemy_boss.png differ diff --git a/public/images/ui/pbinfo_enemy_boss_stats.png b/public/images/ui/pbinfo_enemy_boss_stats.png new file mode 100644 index 00000000000..7148a7af475 Binary files /dev/null and b/public/images/ui/pbinfo_enemy_boss_stats.png differ diff --git a/public/images/ui/pbinfo_enemy_mini.png b/public/images/ui/pbinfo_enemy_mini.png index 5250cb6f070..a7ff3cb9b82 100644 Binary files a/public/images/ui/pbinfo_enemy_mini.png and b/public/images/ui/pbinfo_enemy_mini.png differ diff --git a/public/images/ui/pbinfo_enemy_mini_stats.png b/public/images/ui/pbinfo_enemy_mini_stats.png new file mode 100644 index 00000000000..69ac5d49411 Binary files /dev/null and b/public/images/ui/pbinfo_enemy_mini_stats.png differ diff --git a/public/images/ui/pbinfo_enemy_type.png b/public/images/ui/pbinfo_enemy_type.png index 021a120070c..9bac63e5e72 100644 Binary files a/public/images/ui/pbinfo_enemy_type.png and b/public/images/ui/pbinfo_enemy_type.png differ diff --git a/public/images/ui/pbinfo_enemy_type1.png b/public/images/ui/pbinfo_enemy_type1.png index 89b84d7f630..6d94871e8da 100644 Binary files a/public/images/ui/pbinfo_enemy_type1.png and b/public/images/ui/pbinfo_enemy_type1.png differ diff --git a/public/images/ui/pbinfo_enemy_type2.png b/public/images/ui/pbinfo_enemy_type2.png index d1f9818d7bd..56a1989f2cd 100644 Binary files a/public/images/ui/pbinfo_enemy_type2.png and b/public/images/ui/pbinfo_enemy_type2.png differ diff --git a/public/images/ui/pbinfo_player.png b/public/images/ui/pbinfo_player.png index 9d3e03bd66d..fee08f71044 100644 Binary files a/public/images/ui/pbinfo_player.png and b/public/images/ui/pbinfo_player.png differ diff --git a/public/images/ui/pbinfo_player_mini.png b/public/images/ui/pbinfo_player_mini.png index db276227233..f12d46bb4ff 100644 Binary files a/public/images/ui/pbinfo_player_mini.png and b/public/images/ui/pbinfo_player_mini.png differ diff --git a/public/images/ui/pbinfo_player_mini_stats.png b/public/images/ui/pbinfo_player_mini_stats.png new file mode 100644 index 00000000000..7ce3bd1af1e Binary files /dev/null and b/public/images/ui/pbinfo_player_mini_stats.png differ diff --git a/public/images/ui/pbinfo_player_stats.png b/public/images/ui/pbinfo_player_stats.png new file mode 100644 index 00000000000..cda978979aa Binary files /dev/null and b/public/images/ui/pbinfo_player_stats.png differ diff --git a/public/images/ui/pbinfo_player_type1.png b/public/images/ui/pbinfo_player_type1.png index d1f9818d7bd..56a1989f2cd 100644 Binary files a/public/images/ui/pbinfo_player_type1.png and b/public/images/ui/pbinfo_player_type1.png differ diff --git a/public/images/ui/pbinfo_player_type2.png b/public/images/ui/pbinfo_player_type2.png index 89b84d7f630..6d94871e8da 100644 Binary files a/public/images/ui/pbinfo_player_type2.png and b/public/images/ui/pbinfo_player_type2.png differ diff --git a/public/images/ui/pbinfo_stat.json b/public/images/ui/pbinfo_stat.json new file mode 100644 index 00000000000..f431e5afafd --- /dev/null +++ b/public/images/ui/pbinfo_stat.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "pbinfo_stat.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/pbinfo_stat.png b/public/images/ui/pbinfo_stat.png new file mode 100644 index 00000000000..46169091e7c Binary files /dev/null and b/public/images/ui/pbinfo_stat.png differ diff --git a/public/images/ui/pbinfo_stat_numbers.json b/public/images/ui/pbinfo_stat_numbers.json new file mode 100644 index 00000000000..ec4f7117bb7 --- /dev/null +++ b/public/images/ui/pbinfo_stat_numbers.json @@ -0,0 +1,293 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_numbers.png", + "format": "RGBA8888", + "size": { + "w": 117, + "h": 8 + }, + "scale": 1, + "frames": [ + { + "filename": "1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 9, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 18, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "4", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 27, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "5", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 36, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "6", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 45, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 54, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 63, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 72, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-4", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 81, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-5", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 90, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "-6", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 99, + "y": 0, + "w": 9, + "h": 8 + } + }, + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 9, + "h": 8 + }, + "frame": { + "x": 108, + "y": 0, + "w": 9, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b0719fae0d9b670a727148cdc7202249:afc5587ebacca78d178ac7e0c434591b:4825a9f02f72f1fe28a724c6c5dffb37$" + } +} diff --git a/public/images/ui/pbinfo_stat_numbers.png b/public/images/ui/pbinfo_stat_numbers.png new file mode 100644 index 00000000000..c778ba99273 Binary files /dev/null and b/public/images/ui/pbinfo_stat_numbers.png differ diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 6b54505b6a1..8f07256e327 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -60,25 +60,10 @@ import { SceneBase } from './scene-base'; import CandyBar from './ui/candy-bar'; import { Variant, variantData } from './data/variant'; import { Localizable } from './plugins/i18n'; +import { STARTING_WAVE_OVERRIDE, OPP_SPECIES_OVERRIDE, SEED_OVERRIDE, STARTING_BIOME_OVERRIDE } from './overrides'; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; -export const SEED_OVERRIDE = ''; -export const STARTER_SPECIES_OVERRIDE = 0; -export const STARTER_FORM_OVERRIDE = 0; -export const STARTING_LEVEL_OVERRIDE = 0; -export const STARTING_WAVE_OVERRIDE = 0; -export const STARTING_BIOME_OVERRIDE = Biome.TOWN; -export const STARTING_MONEY_OVERRIDE = 0; - -export const ABILITY_OVERRIDE = Abilities.NONE; -export const MOVE_OVERRIDE = Moves.NONE; -export const OPP_SPECIES_OVERRIDE = 0; -export const OPP_ABILITY_OVERRIDE = Abilities.NONE; -export const OPP_MOVE_OVERRIDE = Moves.NONE; -export const OPP_SHINY_OVERRIDE = false; -export const OPP_VARIANT_OVERRIDE = 0; - const DEBUG_RNG = false; export const startingWave = STARTING_WAVE_OVERRIDE || 1; @@ -100,6 +85,7 @@ export enum Button { ACTION, CANCEL, MENU, + STATS, CYCLE_SHINY, CYCLE_FORM, CYCLE_GENDER, @@ -211,25 +197,26 @@ export default class BattleScene extends SceneBase { private movementButtonLock: Button; // using a dualshock controller as a map - private gamepadKeyConfig = { - [Button.UP]: 12, // up - [Button.DOWN]: 13, // down - [Button.LEFT]: 14, // left - [Button.RIGHT]: 15, // right - [Button.SUBMIT]: 17, // touchpad - [Button.ACTION]: 0, // X - [Button.CANCEL]: 1, // O - [Button.MENU]: 9, // options - [Button.CYCLE_SHINY]: 5, // RB - [Button.CYCLE_FORM]: 4, // LB - [Button.CYCLE_GENDER]: 6, // LT - [Button.CYCLE_ABILITY]: 7, // RT - [Button.CYCLE_NATURE]: 2, // square - [Button.CYCLE_VARIANT]: 3, // triangle - [Button.SPEED_UP]: 10, // L3 - [Button.SLOW_DOWN]: 11 // R3 - }; - public gamepadButtonStates: boolean[] = new Array(17).fill(false); + private gamepadKeyConfig = { + [Button.UP]: 12, // up + [Button.DOWN]: 13, // down + [Button.LEFT]: 14, // left + [Button.RIGHT]: 15, // right + [Button.SUBMIT]: 17, // touchpad + [Button.ACTION]: 0, // X + [Button.CANCEL]: 1, // O + [Button.MENU]: 8, // share + [Button.STATS]: 9, // options + [Button.CYCLE_SHINY]: 5, // RB + [Button.CYCLE_FORM]: 4, // LB + [Button.CYCLE_GENDER]: 6, // LT + [Button.CYCLE_ABILITY]: 7, // RT + [Button.CYCLE_NATURE]: 2, // square + [Button.CYCLE_VARIANT]: 3, // triangle + [Button.SPEED_UP]: 10, // L3 + [Button.SLOW_DOWN]: 11 // R3 + }; + public gamepadButtonStates: boolean[] = new Array(17).fill(false); public rngCounter: integer = 0; public rngSeedOverride: string = ''; @@ -630,6 +617,7 @@ export default class BattleScene extends SceneBase { [Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z], [Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X], [Button.MENU]: [keyCodes.ESC, keyCodes.M], + [Button.STATS]: [keyCodes.C], [Button.CYCLE_SHINY]: [keyCodes.R], [Button.CYCLE_FORM]: [keyCodes.F], [Button.CYCLE_GENDER]: [keyCodes.G], @@ -1447,8 +1435,16 @@ export default class BattleScene extends SceneBase { if (this.ui?.getMode() === Mode.SETTINGS) (this.ui.getHandler() as SettingsUiHandler).show([]); } - } else - return; + } else { + let pressed = false; + if (this.buttonJustReleased(Button.STATS) || (pressed = this.buttonJustPressed(Button.STATS))) { + for (let p of this.getField().filter(p => p?.isActive(true))) + p.toggleStats(pressed); + if (pressed) + this.setLastProcessedMovementTime(Button.STATS); + } else + return; + } if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined') navigator.vibrate(vibrationLength || 10); } @@ -1458,7 +1454,7 @@ export default class BattleScene extends SceneBase { * or not. It will only return true once, until the key is released and pressed down * again. */ - gamepadButtonJustDown(button: Phaser.Input.Gamepad.Button) : boolean { + gamepadButtonJustDown(button: Phaser.Input.Gamepad.Button): boolean { if (!button || !this.gamepadSupport) return false; @@ -1478,6 +1474,23 @@ export default class BattleScene extends SceneBase { return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustDown(k)) || this.gamepadButtonJustDown(gamepad?.buttons[this.gamepadKeyConfig[button]]); } + /** + * gamepadButtonJustUp returns true if @param button has just been released + * or not. It will only return true once, until the key is released and pressed down + * again. + */ + gamepadButtonJustUp(button: Phaser.Input.Gamepad.Button): boolean { + if (!button || !this.gamepadSupport) + return false; + + return !this.gamepadButtonStates[button.index]; + } + + buttonJustReleased(button: Button): boolean { + const gamepad = this.input.gamepad?.gamepads[0]; + return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustUp(k)) || this.gamepadButtonJustUp(gamepad?.buttons[this.gamepadKeyConfig[button]]); + } + /** * repeatInputDurationJustPassed returns true if @param button has been held down long * enough to fire a repeated input. A button must claim the movementButtonLock before diff --git a/src/data/ability.ts b/src/data/ability.ts index 281a37cfd0c..2ac7d6be1ac 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -976,16 +976,19 @@ export class FieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostAbAttr { export class BattleStatMultiplierAbAttr extends AbAttr { private battleStat: BattleStat; private multiplier: number; + private condition: PokemonAttackCondition; - constructor(battleStat: BattleStat, multiplier: number) { + constructor(battleStat: BattleStat, multiplier: number, condition?: PokemonAttackCondition) { super(false); this.battleStat = battleStat; this.multiplier = multiplier; + this.condition = condition; } applyBattleStat(pokemon: Pokemon, passive: boolean, battleStat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise { - if (battleStat === this.battleStat) { + const move = (args[0] as Move); + if (battleStat === this.battleStat && (!this.condition || this.condition(pokemon, null, move))) { statValue.value *= this.multiplier; return true; } @@ -1402,6 +1405,7 @@ export class TraceAbAttr extends PostSummonAbAttr { const targets = pokemon.getOpponents(); if (!targets.length) return false; + let target: Pokemon; if (targets.length > 1) pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); @@ -1427,6 +1431,9 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); + if (!targets.length) + return false; + let target: Pokemon; if (targets.length > 1) pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); @@ -2642,8 +2649,8 @@ export function initAbilities() { new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) - .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5) - .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8), + .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5, (user, target, move) => move.category == MoveCategory.PHYSICAL) + .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category == MoveCategory.PHYSICAL), new Ability(Abilities.CUTE_CHARM, 3) .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), new Ability(Abilities.PLUS, 3) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index bb76a9880b3..a879c68d4ce 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,10 +1,10 @@ import { Arena } from "../field/arena"; import { Type } from "./type"; import * as Utils from "../utils"; -import { MoveCategory, StatChangeAttr, allMoves } from "./move"; +import { MoveCategory, allMoves } from "./move"; import { getPokemonMessage } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; -import { MoveEffectPhase, StatChangePhase } from "../phases"; +import { MoveEffectPhase, PokemonHealPhase, StatChangePhase} from "../phases"; import { StatusEffect } from "./status-effect"; import { BattlerIndex } from "../battle"; import { Moves } from "./enums/moves"; @@ -146,6 +146,31 @@ class AuroraVeilTag extends WeakenMoveScreenTag { } } +class WishTag extends ArenaTag { + private battlerIndex: BattlerIndex; + private triggerMessage: string; + private healHp: number; + + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side); + } + + onAdd(arena: Arena): void { + const user = arena.scene.getPokemonById(this.sourceId); + this.battlerIndex = user.getBattlerIndex(); + this.triggerMessage = getPokemonMessage(user, '\'s wish\ncame true!'); + this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1); + } + + onRemove(arena: Arena): void { + const target = arena.scene.getField()[this.battlerIndex]; + if (target?.isActive(true)) { + arena.scene.queueMessage(this.triggerMessage); + arena.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), this.healHp, null, true, false)); + } + } +} + export class WeakenMoveTypeTag extends ArenaTag { private weakenedType: Type; @@ -472,6 +497,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov case ArenaTagType.FUTURE_SIGHT: case ArenaTagType.DOOM_DESIRE: return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex); + case ArenaTagType.WISH: + return new WishTag(turnCount, sourceId, side); case ArenaTagType.STEALTH_ROCK: return new StealthRockTag(sourceId, side); case ArenaTagType.STICKY_WEB: diff --git a/src/data/enums/arena-tag-type.ts b/src/data/enums/arena-tag-type.ts index cc08ca4fdcf..8478b6f3f57 100644 --- a/src/data/enums/arena-tag-type.ts +++ b/src/data/enums/arena-tag-type.ts @@ -8,6 +8,7 @@ export enum ArenaTagType { MIST = "MIST", FUTURE_SIGHT = "FUTURE_SIGHT", DOOM_DESIRE = "DOOM_DESIRE", + WISH = "WISH", STEALTH_ROCK = "STEALTH_ROCK", STICKY_WEB = "STICKY_WEB", TRICK_ROOM = "TRICK_ROOM", diff --git a/src/data/move.ts b/src/data/move.ts index f7ccb618a4e..525512b607a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1009,6 +1009,25 @@ export class StatusEffectAttr extends MoveEffectAttr { } } +export class MultiStatusEffectAttr extends StatusEffectAttr { + public effects: StatusEffect[]; + + constructor(effects: StatusEffect[], selfTarget?: boolean, cureTurn?: integer, overrideStatus?: boolean) { + super(effects[0], selfTarget, cureTurn, overrideStatus); + this.effects = effects; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + this.effect = Utils.randSeedItem(this.effects); + const result = super.apply(user, target, move, args); + return result; + } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { + return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0; + } +} + export class PsychoShiftEffectAttr extends MoveEffectAttr { constructor() { super(false, MoveEffectTrigger.HIT); @@ -1552,6 +1571,8 @@ export class CopyStatsAttr extends MoveEffectAttr { else user.removeTag(BattlerTagType.CRIT_BOOST); + user.updateInfo(); + target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`)); return true; @@ -1566,6 +1587,8 @@ export class InvertStatsAttr extends MoveEffectAttr { for (let s = 0; s < target.summonData.battleStats.length; s++) target.summonData.battleStats[s] *= -1; + user.updateInfo(); + target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere all reversed!`)); return true; @@ -1580,6 +1603,8 @@ export class ResetStatsAttr extends MoveEffectAttr { for (let s = 0; s < target.summonData.battleStats.length; s++) target.summonData.battleStats[s] = 0; + user.updateInfo(); + target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere eliminated!`)); return true; @@ -3099,11 +3124,23 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { const moveTargets = getMoveTargets(user, move.moveId); if (!moveTargets.targets.length) return false; - const targets = moveTargets.multiple || moveTargets.targets.length === 1 - ? moveTargets.targets - : moveTargets.targets.indexOf(target.getBattlerIndex()) > -1 - ? [ target.getBattlerIndex() ] - : [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; + let selectTargets: BattlerIndex[]; + switch (true) { + case (moveTargets.multiple || moveTargets.targets.length === 1): { + selectTargets = moveTargets.targets; + break; + } + case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): { + selectTargets = [ target.getBattlerIndex() ]; + break; + } + default: { + moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex())); + selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; + break; + } + } + const targets = selectTargets; user.getMoveQueue().push({ move: move.moveId, targets: targets, ignorePP: true }); user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex], true)); return true; @@ -4170,9 +4207,7 @@ export function initMoves() { new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1) .attr(FirstMoveTypeAttr), new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) - .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(StatusEffectAttr, StatusEffect.BURN) - .attr(StatusEffectAttr, StatusEffect.FREEZE), + .attr(MultiStatusEffectAttr, [StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS]), new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) .attr(TargetHalfHpDamageAttr), new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) @@ -4499,7 +4534,7 @@ export function initMoves() { .attr(AbilityCopyAttr), new SelfStatusMove(Moves.WISH, Type.NORMAL, -1, 10, -1, 0, 3) .triageMove() - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.WISH, 2, true), new SelfStatusMove(Moves.ASSIST, Type.NORMAL, -1, 20, -1, 0, 3) .attr(RandomMovesetMoveAttr, true) .ignoresVirtual(), @@ -5986,9 +6021,7 @@ export function initMoves() { .soundBased() .attr(ReducePpMoveAttr, 3, false), new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) - .attr(StatusEffectAttr, StatusEffect.POISON) - .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(StatusEffectAttr, StatusEffect.SLEEP), + .attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]), new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.DEF, 1, true), new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, 100, 0, 8) diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index 11629cf05d7..198ff07cec9 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -33,6 +33,5 @@ splashMessages.push(...[ 'Also Try Emerald Rogue!', 'Also Try Radical Red!', 'Eevee Expo!', - 'YNOproject!', - 'Shh, don\'t tell Sam!' + 'YNOproject!' ]); \ No newline at end of file diff --git a/src/field/arena.ts b/src/field/arena.ts index 910d998d68e..5b14560d407 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -18,8 +18,7 @@ import { TimeOfDay } from "../data/enums/time-of-day"; import { Terrain, TerrainType } from "../data/terrain"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import Pokemon from "./pokemon"; - -const WEATHER_OVERRIDE = WeatherType.NONE; +import { WEATHER_OVERRIDE } from '../overrides'; export class Arena { public scene: BattleScene; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 4e20bad407b..55036e1906d 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1,5 +1,5 @@ import Phaser from 'phaser'; -import BattleScene, { ABILITY_OVERRIDE, AnySound, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../battle-scene'; +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'; @@ -43,6 +43,7 @@ import { Nature, getNatureStatMultiplier } from '../data/nature'; import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms'; import { TerrainType } from '../data/terrain'; import { TrainerSlot } from '../data/trainer-config'; +import { ABILITY_OVERRIDE, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../overrides'; export enum FieldPosition { CENTER, @@ -657,7 +658,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getHpRatio(precise: boolean = false): number { return precise ? this.hp / this.getMaxHp() - : ((this.hp / this.getMaxHp()) * 100) / 100; + : Math.round((this.hp / this.getMaxHp()) * 100) / 100; } generateGender(): void { @@ -1178,6 +1179,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.battleInfo.updateInfo(this, instant); } + toggleStats(visible: boolean): void { + this.battleInfo.toggleStats(visible); + } + addExp(exp: integer) { const maxExpLevel = this.scene.getMaxExpLevel(); const initialExp = this.exp; @@ -1619,6 +1624,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.summonData.tags.push(tag); if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT); + this.updateInfo(); } getMoveHistory(): TurnMove[] { @@ -1919,6 +1925,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.summonDataPrimer = null; } + this.updateInfo(); } resetBattleData(): void { diff --git a/src/game-mode.ts b/src/game-mode.ts index 0ac3f0503f1..76c97b4c9ac 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -1,10 +1,11 @@ import { fixedBattles } from "./battle"; -import BattleScene, { STARTING_BIOME_OVERRIDE, STARTING_LEVEL_OVERRIDE, STARTING_MONEY_OVERRIDE } from "./battle-scene"; +import BattleScene from "./battle-scene"; import { Biome } from "./data/enums/biome"; import { Species } from "./data/enums/species"; import PokemonSpecies, { allSpecies } from "./data/pokemon-species"; import { Arena } from "./field/arena"; import * as Utils from "./utils"; +import { STARTING_BIOME_OVERRIDE, STARTING_LEVEL_OVERRIDE, STARTING_MONEY_OVERRIDE } from './overrides'; export enum GameModes { CLASSIC, diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 2f37b900ab5..875d618ec0f 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -39,15 +39,21 @@ export class LoadingScene extends SceneBase { } this.loadAtlas('namebox', 'ui'); this.loadImage('pbinfo_player', 'ui'); + this.loadImage('pbinfo_player_stats', 'ui'); this.loadImage('pbinfo_player_mini', 'ui'); + this.loadImage('pbinfo_player_mini_stats', 'ui'); this.loadAtlas('pbinfo_player_type', 'ui'); this.loadAtlas('pbinfo_player_type1', 'ui'); this.loadAtlas('pbinfo_player_type2', 'ui'); this.loadImage('pbinfo_enemy_mini', 'ui'); + this.loadImage('pbinfo_enemy_mini_stats', 'ui'); this.loadImage('pbinfo_enemy_boss', 'ui'); + this.loadImage('pbinfo_enemy_boss_stats', 'ui'); this.loadAtlas('pbinfo_enemy_type', 'ui'); this.loadAtlas('pbinfo_enemy_type1', 'ui'); this.loadAtlas('pbinfo_enemy_type2', 'ui'); + this.loadAtlas('pbinfo_stat', 'ui'); + this.loadAtlas('pbinfo_stat_numbers', 'ui'); this.loadImage('overlay_lv', 'ui'); this.loadAtlas('numbers', 'ui'); this.loadAtlas('numbers_red', 'ui'); diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index d70cd83c50d..4876fa3432a 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -59,4 +59,9 @@ export const menu: SimpleTranslationEntries = { "escapeVerbSwitch": "auswechseln", "escapeVerbFlee": "flucht", "notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!", + "rankings": "Rankings", + "dailyRankings": "Daily Rankings", + "noRankings": "No Rankings", + "loading": "Loading…", + "playersOnline": "Players Online" } as const; \ No newline at end of file diff --git a/src/locales/de/pokemon.ts b/src/locales/de/pokemon.ts index 08fdbf01d02..db92ccc5c18 100644 --- a/src/locales/de/pokemon.ts +++ b/src/locales/de/pokemon.ts @@ -387,102 +387,102 @@ export const pokemon: SimpleTranslationEntries = { "rayquaza": "Rayquaza", "jirachi": "Jirachi", "deoxys": "Deoxys", - "turtwig": "Turtwig", - "grotle": "Grotle", - "torterra": "Torterra", - "chimchar": "Chimchar", - "monferno": "Monferno", - "infernape": "Infernape", - "piplup": "Piplup", - "prinplup": "Prinplup", - "empoleon": "Empoleon", - "starly": "Starly", + "turtwig": "Chelast", + "grotle": "Chelcarain", + "torterra": "Chelterrar", + "chimchar": "Panflam", + "monferno": "Panpyro", + "infernape": "Panferno", + "piplup": "Plinfa", + "prinplup": "Pilprin", + "empoleon": "Impoleon", + "starly": "Staralili", "staravia": "Staravia", "staraptor": "Staraptor", - "bidoof": "Bidoof", - "bibarel": "Bibarel", - "kricketot": "Kricketot", - "kricketune": "Kricketune", - "shinx": "Shinx", + "bidoof": "Bidiza", + "bibarel": "Bidifas", + "kricketot": "Zirpurze", + "kricketune": "Zirpeise", + "shinx": "Sheinux", "luxio": "Luxio", "luxray": "Luxray", - "budew": "Budew", + "budew": "Knospi", "roserade": "Roserade", - "cranidos": "Cranidos", - "rampardos": "Rampardos", - "shieldon": "Shieldon", - "bastiodon": "Bastiodon", + "cranidos": "Koknodon", + "rampardos": "Rameidon", + "shieldon": "Schilterus", + "bastiodon": "Bollterus", "burmy": "Burmy", - "wormadam": "Wormadam", - "mothim": "Mothim", - "combee": "Combee", - "vespiquen": "Vespiquen", + "wormadam": "Burmadame", + "mothim": "Moterpel", + "combee": "Wadribie", + "vespiquen": "Hornwiesel", "pachirisu": "Pachirisu", - "buizel": "Buizel", - "floatzel": "Floatzel", - "cherubi": "Cherubi", - "cherrim": "Cherrim", - "shellos": "Shellos", + "buizel": "Bamelin", + "floatzel": "Bojelin", + "cherubi": "Kikugi", + "cherrim": "Kinoso", + "shellos": "Schalellos", "gastrodon": "Gastrodon", - "ambipom": "Ambipom", - "drifloon": "Drifloon", - "drifblim": "Drifblim", - "buneary": "Buneary", - "lopunny": "Lopunny", - "mismagius": "Mismagius", - "honchkrow": "Honchkrow", - "glameow": "Glameow", - "purugly": "Purugly", - "chingling": "Chingling", - "stunky": "Stunky", + "ambipom": "Ambidifel", + "drifloon": "Driftlon", + "drifblim": "Drifzepeli", + "buneary": "Haspiror", + "lopunny": "Schlapor", + "mismagius": "Traunmagil", + "honchkrow": "Kramshef", + "glameow": "Charmian", + "purugly": "Shnurgarst", + "chingling": "Klingplim", + "stunky": "Skunkapuh", "skuntank": "Skuntank", - "bronzor": "Bronzor", + "bronzor": "Bronzel", "bronzong": "Bronzong", - "bonsly": "Bonsly", - "mime_jr": "Mime Jr.", - "happiny": "Happiny", - "chatot": "Chatot", - "spiritomb": "Spiritomb", - "gible": "Gible", - "gabite": "Gabite", - "garchomp": "Garchomp", - "munchlax": "Munchlax", + "bonsly": "Mobai", + "mime_jr": "Pantimimi", + "happiny": "Wonneira", + "chatot": "Plaudagei", + "spiritomb": "Kryppuk", + "gible": "Kaumalat", + "gabite": "Knarksel", + "garchomp": "Knackrack", + "munchlax": "Mampfaxo", "riolu": "Riolu", "lucario": "Lucario", "hippopotas": "Hippopotas", - "hippowdon": "Hippowdon", - "skorupi": "Skorupi", - "drapion": "Drapion", - "croagunk": "Croagunk", - "toxicroak": "Toxicroak", - "carnivine": "Carnivine", + "hippowdon": "Hippoterus", + "skorupi": "Pionskora", + "drapion": "Piondragi", + "croagunk": "Glibunkel", + "toxicroak": "Toxiquak", + "carnivine": "Venuflibis", "finneon": "Finneon", "lumineon": "Lumineon", - "mantyke": "Mantyke", - "snover": "Snover", - "abomasnow": "Abomasnow", - "weavile": "Weavile", + "mantyke": "Mantirps", + "snover": "Shnebedeck", + "abomasnow": "Rexblisar", + "weavile": "Snibunna", "magnezone": "Magnezone", - "lickilicky": "Lickilicky", - "rhyperior": "Rhyperior", - "tangrowth": "Tangrowth", - "electivire": "Electivire", - "magmortar": "Magmortar", + "lickilicky": "Schlurplek", + "rhyperior": "Rihornior", + "tangrowth": "Tangoloss", + "electivire": "Elevoltek", + "magmortar": "Magbrant", "togekiss": "Togekiss", "yanmega": "Yanmega", - "leafeon": "Leafeon", - "glaceon": "Glaceon", - "gliscor": "Gliscor", - "mamoswine": "Mamoswine", + "leafeon": "Folipurba", + "glaceon": "Glaziola", + "gliscor": "Skorgro", + "mamoswine": "Mamutel", "porygon_z": "Porygon-Z", - "gallade": "Gallade", - "probopass": "Probopass", - "dusknoir": "Dusknoir", - "froslass": "Froslass", + "gallade": "Galagladi", + "probopass": "Voluminas", + "dusknoir": "Zwirrfinst", + "froslass": "Frosdedje", "rotom": "Rotom", - "uxie": "Uxie", - "mesprit": "Mesprit", - "azelf": "Azelf", + "uxie": "Selfe", + "mesprit": "Vesprit", + "azelf": "Tobutz", "dialga": "Dialga", "palkia": "Palkia", "heatran": "Heatran", @@ -495,116 +495,116 @@ export const pokemon: SimpleTranslationEntries = { "shaymin": "Shaymin", "arceus": "Arceus", "victini": "Victini", - "snivy": "Snivy", - "servine": "Servine", - "serperior": "Serperior", - "tepig": "Tepig", - "pignite": "Pignite", - "emboar": "Emboar", - "oshawott": "Oshawott", - "dewott": "Dewott", - "samurott": "Samurott", - "patrat": "Patrat", - "watchog": "Watchog", - "lillipup": "Lillipup", - "herdier": "Herdier", - "stoutland": "Stoutland", - "purrloin": "Purrloin", - "liepard": "Liepard", - "pansage": "Pansage", - "simisage": "Simisage", - "pansear": "Pansear", - "simisear": "Simisear", - "panpour": "Panpour", - "simipour": "Simipour", - "munna": "Munna", - "musharna": "Musharna", - "pidove": "Pidove", - "tranquill": "Tranquill", - "unfezant": "Unfezant", - "blitzle": "Blitzle", - "zebstrika": "Zebstrika", - "roggenrola": "Roggenrola", - "boldore": "Boldore", - "gigalith": "Gigalith", - "woobat": "Woobat", - "swoobat": "Swoobat", - "drilbur": "Drilbur", - "excadrill": "Excadrill", - "audino": "Audino", - "timburr": "Timburr", - "gurdurr": "Gurdurr", - "conkeldurr": "Conkeldurr", - "tympole": "Tympole", - "palpitoad": "Palpitoad", - "seismitoad": "Seismitoad", - "throh": "Throh", - "sawk": "Sawk", - "sewaddle": "Sewaddle", - "swadloon": "Swadloon", - "leavanny": "Leavanny", - "venipede": "Venipede", - "whirlipede": "Whirlipede", - "scolipede": "Scolipede", - "cottonee": "Cottonee", - "whimsicott": "Whimsicott", - "petilil": "Petilil", - "lilligant": "Lilligant", - "basculin": "Basculin", - "sandile": "Sandile", - "krokorok": "Krokorok", - "krookodile": "Krookodile", - "darumaka": "Darumaka", - "darmanitan": "Darmanitan", - "maractus": "Maractus", - "dwebble": "Dwebble", - "crustle": "Crustle", - "scraggy": "Scraggy", - "scrafty": "Scrafty", - "sigilyph": "Sigilyph", - "yamask": "Yamask", - "cofagrigus": "Cofagrigus", - "tirtouga": "Tirtouga", - "carracosta": "Carracosta", - "archen": "Archen", - "archeops": "Archeops", - "trubbish": "Trubbish", - "garbodor": "Garbodor", + "snivy": "Serpifeu", + "servine": "Efoserp", + "serperior": "Serpiroyal", + "tepig": "Floink", + "pignite": "Ferkokel", + "emboar": "Flambirex", + "oshawott": "Ottaro", + "dewott": "Zwottronin", + "samurott": "Admurai", + "patrat": "Nagelotz", + "watchog": "Kukmarda", + "lillipup": "Yorkleff", + "herdier": "Terribark", + "stoutland": "Bissbark", + "purrloin": "Felilou", + "liepard": "Kleoparda", + "pansage": "Vegimak", + "simisage": "Vegichita", + "pansear": "Grillmak", + "simisear": "Grillchita", + "panpour": "Sodamak", + "simipour": "Sodachita", + "munna": "Somniam", + "musharna": "Somnivora", + "pidove": "Dusslgurr", + "tranquill": "Navitaub", + "unfezant": "Fasasnob", + "blitzle": "Elezeba", + "zebstrika": "Zebritz", + "roggenrola": "Kiesling", + "boldore": "Sedimantur", + "gigalith": "Brockoloss", + "woobat": "Fleknoil", + "swoobat": "Fletiamo", + "drilbur": "Rotomurf", + "excadrill": "Stalobor", + "audino": "Ohrdoch", + "timburr": "Praktibalk", + "gurdurr": "Strepoli", + "conkeldurr": "Meistagriff", + "tympole": "Schallquap", + "palpitoad": "Membrana", + "seismitoad": "Branawarz", + "throh": "Juitesto", + "sawk": "Karadonis", + "sewaddle": "Strawickl", + "swadloon": "Folikon", + "leavanny": "Matrifol", + "venipede": "Toxiped", + "whirlipede": "Rollum", + "scolipede": "Cerapendra", + "cottonee": "Waumboll", + "whimsicott": "Elfun", + "petilil": "Lilminip", + "lilligant": "Dressella", + "basculin": "Barschuft", + "sandile": "Ganovil", + "krokorok": "Rokkaiman", + "krookodile": "Rabigator", + "darumaka": "Flampion", + "darmanitan": "Flampavian", + "maractus": "Maracamba", + "dwebble": "Lithomith", + "crustle": "Castellith", + "scraggy": "Zurrokex", + "scrafty": "Irokex", + "sigilyph": "Symvolara", + "yamask": "Makabaja", + "cofagrigus": "Echnatoll", + "tirtouga": "Galapaflos", + "carracosta": "Karippas", + "archen": "Flapteryx", + "archeops": "Aeropteryx", + "trubbish": "Unratütox", + "garbodor": "Deponitox", "zorua": "Zorua", "zoroark": "Zoroark", - "minccino": "Minccino", - "cinccino": "Cinccino", - "gothita": "Gothita", - "gothorita": "Gothorita", - "gothitelle": "Gothitelle", - "solosis": "Solosis", - "duosion": "Duosion", - "reuniclus": "Reuniclus", - "ducklett": "Ducklett", - "swanna": "Swanna", - "vanillite": "Vanillite", - "vanillish": "Vanillish", - "vanilluxe": "Vanilluxe", - "deerling": "Deerling", - "sawsbuck": "Sawsbuck", + "minccino": "Picochilla", + "cinccino": "Chillabell", + "gothita": "Mollimorba", + "gothorita": "Hypnomorba", + "gothitelle": "Morbitesse", + "solosis": "Monozyto", + "duosion": "Mitodos", + "reuniclus": "Zytomega", + "ducklett": "Piccolente", + "swanna": "Swaroness", + "vanillite": "Gelatini", + "vanillish": "Gelatroppo", + "vanilluxe": "Gelatwino", + "deerling": "Sesokitz", + "sawsbuck": "Kronjuwild", "emolga": "Emolga", - "karrablast": "Karrablast", - "escavalier": "Escavalier", - "foongus": "Foongus", - "amoonguss": "Amoonguss", - "frillish": "Frillish", - "jellicent": "Jellicent", - "alomomola": "Alomomola", - "joltik": "Joltik", - "galvantula": "Galvantula", - "ferroseed": "Ferroseed", - "ferrothorn": "Ferrothorn", - "klink": "Klink", - "klang": "Klang", - "klinklang": "Klinklang", - "tynamo": "Tynamo", - "eelektrik": "Eelektrik", - "eelektross": "Eelektross", + "karrablast": "Laukaps", + "escavalier": "Cavalanzas", + "foongus": "Tarnpignon", + "amoonguss": "Hutsassa", + "frillish": "Quabbel", + "jellicent": "Apoquallyp", + "alomomola": "Mamolida", + "joltik": "Wattzapf", + "galvantula": "Voltula", + "ferroseed": "Kastadur", + "ferrothorn": "Tentantel", + "klink": "Klikk", + "klang": "Kliklak", + "klinklang": "Klikdiklak", + "tynamo": "Zapplardin", + "eelektrik": "Zapplalek", + "eelektross": "Zapplarang", "elgyem": "Elgyem", "beheeyem": "Beheeyem", "litwick": "Litwick", diff --git a/src/locales/de/tutorial.ts b/src/locales/de/tutorial.ts index 2722c02ad45..7a27f2077e6 100644 --- a/src/locales/de/tutorial.ts +++ b/src/locales/de/tutorial.ts @@ -20,6 +20,10 @@ export const tutorial: SimpleTranslationEntries = { "pokerus": `A daily random 3 selectable starters have a purple border. $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, + "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. + $Your Pokémon are recalled before a trainer battle and before entering a new biome. + $You can also view the stat changes for the Pokémon on the field by holding C.`, + "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. $These range from consumables, to Pokémon held items, to passive permanent items. $Most non-consumable item effects will stack in various ways. diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index bce59c02c11..1d840a3eb03 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -78,4 +78,9 @@ export const menu: SimpleTranslationEntries = { "skipItemQuestion": "Are you sure you want to skip taking an item?", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", + "rankings": "Rankings", + "dailyRankings": "Daily Rankings", + "noRankings": "No Rankings", + "loading": "Loading…", + "playersOnline": "Players Online" } as const; \ No newline at end of file diff --git a/src/locales/en/tutorial.ts b/src/locales/en/tutorial.ts index 2722c02ad45..7a27f2077e6 100644 --- a/src/locales/en/tutorial.ts +++ b/src/locales/en/tutorial.ts @@ -20,6 +20,10 @@ export const tutorial: SimpleTranslationEntries = { "pokerus": `A daily random 3 selectable starters have a purple border. $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, + "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. + $Your Pokémon are recalled before a trainer battle and before entering a new biome. + $You can also view the stat changes for the Pokémon on the field by holding C.`, + "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. $These range from consumables, to Pokémon held items, to passive permanent items. $Most non-consumable item effects will stack in various ways. diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index dc1c50b3821..e72710cee37 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -61,5 +61,10 @@ export const menu: SimpleTranslationEntries = { "notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!", "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "eggHatching": "¿Y esto?", - "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?" + "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", + "rankings": "Rankings", + "dailyRankings": "Daily Rankings", + "noRankings": "No Rankings", + "loading": "Loading…", + "playersOnline": "Players Online" } as const; \ No newline at end of file diff --git a/src/locales/es/tutorial.ts b/src/locales/es/tutorial.ts index 2722c02ad45..7a27f2077e6 100644 --- a/src/locales/es/tutorial.ts +++ b/src/locales/es/tutorial.ts @@ -20,6 +20,10 @@ export const tutorial: SimpleTranslationEntries = { "pokerus": `A daily random 3 selectable starters have a purple border. $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, + "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. + $Your Pokémon are recalled before a trainer battle and before entering a new biome. + $You can also view the stat changes for the Pokémon on the field by holding C.`, + "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. $These range from consumables, to Pokémon held items, to passive permanent items. $Most non-consumable item effects will stack in various ways. diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.ts index 015132bc6c5..037f0f3b5e2 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -73,4 +73,9 @@ export const menu: SimpleTranslationEntries = { "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", "eggHatching": "Oh ?", "ivScannerUseQuestion": "Utiliser le Scanner d’IV sur {{pokemonName}} ?", + "rankings": "Classement", + "dailyRankings": "Classement du Jour", + "noRankings": "Pas de Classement", + "loading": "Chargement…", + "playersOnline": "Joueurs Connectés" } as const; diff --git a/src/locales/fr/tutorial.ts b/src/locales/fr/tutorial.ts index 2722c02ad45..e280ee2d5dc 100644 --- a/src/locales/fr/tutorial.ts +++ b/src/locales/fr/tutorial.ts @@ -1,38 +1,47 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. - $This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. - $The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. - $If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, - - "accessMenu": `To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.`, - - "menu": `From this menu you can access the settings. - $From the settings you can change game speed, window style, and other options. - $There are also various other features here, so be sure to check them all!`, + "intro": `Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite ! + $Ce jeu n’est pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright + $utilisés. + $Ce jeu est toujours en développement, mais entièrement jouable. + $Tout signalement de bugs passe par le serveur Discord. + $Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.`, - "starterSelect": `From this screen, you can select your starters.\nThese are your initial party members. - $Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10. - $You can also select gender, ability, and form depending on\nthe variants you've caught or hatched. - $The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!`, + "accessMenu": `Accédez au menu avec M ou Échap lors de l'attente d’une\naction. + $Il contient les paramètres et diverses fonctionnalités`, - "pokerus": `A daily random 3 selectable starters have a purple border. - $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, + "menu": `Vous pouvez accéder aux paramètres depuis ce menu. + $Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre. + $Il y a également toute une variété d’autres fonctionnalités, + $jetez-y un œil !`, - "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. - $These range from consumables, to Pokémon held items, to passive permanent items. - $Most non-consumable item effects will stack in various ways. - $Some items will only show up if they can be used, such as evolution items. - $You can also transfer held items between Pokémon using the transfer option. - $The transfer option will appear in the bottom right once you have obtained a held item. - $You may purchase consumable items with money, and a larger variety will be available the further you get. - $Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.`, + "starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ. + $Chacun possède une valeur. Votre équipe peut avoir jusqu’à\n6 membres, tant que vous ne dépassez pas un coût de 10. + $Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos. + $Les IVs d’un starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc d’en obtenir plusieurs !`, - "eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. - $Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch. - $Hatched Pokémon also won't be added to your party, they will\nbe added to your starters. - $Pokémon hatched from eggs generally have better IVs than\nwild Pokémon. - $Some Pokémon can only even be obtained from eggs. - $There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!`, + "pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour + $violet. Si un starter que vous possédez l’a, essayez de + $ l’ajouter à votre équipe. Vérifiez bien son résumé !`, + + "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. + $Your Pokémon are recalled before a trainer battle and before entering a new biome. + $You can also view the stat changes for the Pokémon on the field by holding C.`, + + "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un. + $Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents. + $La plupart des effets des objets non-consommables se cumuleront de diverses manières. + $Certains objets apparaîtront s’ils peuvent être utilisés, comme les objets d’évolution. + $Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert. + $L’option de transfert apparaît en bas à droite dès que vous avez obtenu un objet à faire tenir. + $Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera varié. + $Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.`, + + "eggGacha": `Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon. + $Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps. + $Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters. + $Les Pokémon issus d’Œufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages. + $Certains Pokémon ne peuvent être obtenus\nque dans des Œufs. + $Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !`, } as const; \ No newline at end of file diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index 872315d77c0..b9e288c26ce 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -6,5 +6,10 @@ export const menu: SimpleTranslationEntries = { "newGame": "Nuova Partita", "loadGame": "Carica Partita", "dailyRun": "Corsa Giornaliera (Beta)", - "selectGameMode": "Seleziona una modalità di gioco." + "selectGameMode": "Seleziona una modalità di gioco.", + "rankings": "Rankings", + "dailyRankings": "Daily Rankings", + "noRankings": "No Rankings", + "loading": "Loading…", + "playersOnline": "Players Online" } as const; \ No newline at end of file diff --git a/src/locales/it/tutorial.ts b/src/locales/it/tutorial.ts index 2722c02ad45..7a27f2077e6 100644 --- a/src/locales/it/tutorial.ts +++ b/src/locales/it/tutorial.ts @@ -20,6 +20,10 @@ export const tutorial: SimpleTranslationEntries = { "pokerus": `A daily random 3 selectable starters have a purple border. $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, + "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. + $Your Pokémon are recalled before a trainer battle and before entering a new biome. + $You can also view the stat changes for the Pokémon on the field by holding C.`, + "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. $These range from consumables, to Pokémon held items, to passive permanent items. $Most non-consumable item effects will stack in various ways. diff --git a/src/overrides.ts b/src/overrides.ts new file mode 100644 index 00000000000..732b1a5a45b --- /dev/null +++ b/src/overrides.ts @@ -0,0 +1,23 @@ +import { Species } from './data/enums/species'; +import { Abilities } from "./data/enums/abilities"; +import { Biome } from "./data/enums/biome"; +import { Moves } from "./data/enums/moves"; +import { WeatherType } from "./data/weather"; + +export const SEED_OVERRIDE = ''; +export const STARTER_SPECIES_OVERRIDE = 0; +export const STARTER_FORM_OVERRIDE = 0; +export const STARTING_LEVEL_OVERRIDE = 0; +export const STARTING_WAVE_OVERRIDE = 0; +export const STARTING_BIOME_OVERRIDE = Biome.TOWN; +export const STARTING_MONEY_OVERRIDE = 0; +export const WEATHER_OVERRIDE = WeatherType.NONE; + +export const ABILITY_OVERRIDE = Abilities.NONE; +export const MOVE_OVERRIDE = Moves.NONE; +export const OPP_SPECIES_OVERRIDE = 0; +export const OPP_ABILITY_OVERRIDE = Abilities.NONE; +export const OPP_MOVE_OVERRIDE = Moves.NONE; + +export const OPP_SHINY_OVERRIDE = false; +export const OPP_VARIANT_OVERRIDE = 0; diff --git a/src/phases.ts b/src/phases.ts index 1393355e3f5..ceba555f2ce 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,4 +1,4 @@ -import BattleScene, { STARTER_FORM_OVERRIDE, STARTER_SPECIES_OVERRIDE, bypassLogin, startingWave } from "./battle-scene"; +import BattleScene, { bypassLogin, startingWave } from "./battle-scene"; import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; import * as Utils from './utils'; import { Moves } from "./data/enums/moves"; @@ -57,6 +57,7 @@ import { fetchDailyRunSeed, getDailyRunStarters } from "./data/daily-run"; import { GameModes, gameModes } from "./game-mode"; import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import i18next from './plugins/i18n'; +import { STARTER_FORM_OVERRIDE, STARTER_SPECIES_OVERRIDE } from './overrides'; export class LoginPhase extends Phase { private showText: boolean; @@ -2547,7 +2548,7 @@ export class MoveEffectPhase extends PokemonPhase { : 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6)); } - applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier); + applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier, this.move.getMove()); const evasionMultiplier = new Utils.NumberHolder(1); applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this.getTarget(), BattleStat.EVA, evasionMultiplier); @@ -2670,7 +2671,6 @@ export class StatChangePhase extends PokemonPhase { let random = false; - const allStats = Utils.getEnumValues(BattleStat); if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) { this.stats[0] = this.getRandomStat(); random = true; @@ -2711,8 +2711,11 @@ export class StatChangePhase extends PokemonPhase { for (let stat of filteredStats) pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6); - applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget) - this.end(); + applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); + + pokemon.updateInfo(); + + handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end()); }; if (relLevels.filter(l => l).length && this.scene.moveAnimations) { @@ -3336,7 +3339,7 @@ export class TrainerVictoryPhase extends BattlePhase { const trainerType = this.scene.currentBattle.trainer.config.trainerType; if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss) - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.VOUCHER)); + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); } this.scene.ui.showText(i18next.t('menu:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index b12bda1f419..22a407c3b42 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -1,4 +1,6 @@ import i18next from 'i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + import { menu as enMenu } from '../locales/en/menu'; import { menu as esMenu } from '../locales/es/menu'; import { menu as itMenu } from '../locales/it/menu'; @@ -55,7 +57,6 @@ export interface SimpleTranslationEntries { [key: string]: string } - export interface MoveTranslationEntry { name: string, effect: string @@ -78,10 +79,8 @@ export interface Localizable { localize(): void; } -const DEFAULT_LANGUAGE_OVERRIDE = ''; - export function initI18n(): void { - let lang = 'en'; + let lang = ''; if (localStorage.getItem('prLang')) lang = localStorage.getItem('prLang'); @@ -92,18 +91,20 @@ export function initI18n(): void { * Q: How do I add a new language? * A: To add a new language, create a new folder in the locales directory with the language code. * Each language folder should contain a file for each namespace (ex. menu.ts) with the translations. + * Don't forget to declare new language in `supportedLngs` i18next initializer * * Q: How do I add a new namespace? * A: To add a new namespace, create a new file in each language folder with the translations. * Then update the `resources` field in the init() call and the CustomTypeOptions interface. - * + * * Q: How do I make a language selectable in the settings? * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. */ - i18next.init({ - lng: DEFAULT_LANGUAGE_OVERRIDE ? DEFAULT_LANGUAGE_OVERRIDE : lang, + i18next.use(LanguageDetector).init({ + lng: lang, fallbackLng: 'en', + supportedLngs: ['en', 'es', 'fr', 'it', 'de'], debug: true, interpolation: { escapeValue: false, diff --git a/src/tutorial.ts b/src/tutorial.ts index 918c68b9bb4..88e88fa809c 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -9,6 +9,7 @@ export enum Tutorial { Menu = "MENU", Starter_Select = "STARTER_SELECT", Pokerus = "POKERUS", + Stat_Change = "STAT_CHANGE", Select_Item = "SELECT_ITEM", Egg_Gacha = "EGG_GACHA" } @@ -42,6 +43,11 @@ const tutorialHandlers = { scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText('', null, () => resolve()), null, true); }); }, + [Tutorial.Stat_Change]: (scene: BattleScene) => { + return new Promise(resolve => { + scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:statChange"), null, () => scene.ui.showText('', null, () => scene.hideFieldOverlay(1000).then(() => resolve())), null, true)); + }); + }, [Tutorial.Select_Item]: (scene: BattleScene) => { return new Promise(resolve => { scene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => { diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index ae794a256fa..ae8f518e727 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -7,6 +7,9 @@ import { StatusEffect } from '../data/status-effect'; import BattleScene from '../battle-scene'; import { Type, getTypeRgb } from '../data/type'; import { getVariantTint } from '#app/data/variant'; +import { BattleStat } from '#app/data/battle-stat'; + +const battleStatOrder = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD ]; export default class BattleInfo extends Phaser.GameObjects.Container { private player: boolean; @@ -24,6 +27,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private lastLevelExp: integer; private lastLevel: integer; private lastLevelCapped: boolean; + private lastBattleStats: string; private box: Phaser.GameObjects.Sprite; private nameText: Phaser.GameObjects.Text; @@ -46,6 +50,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { public expMaskRect: Phaser.GameObjects.Graphics; + private statsContainer: Phaser.GameObjects.Container; + private statsBox: Phaser.GameObjects.Sprite; + private statValuesContainer: Phaser.GameObjects.Container; + private statNumbers: Phaser.GameObjects.Sprite[]; + constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) { super(scene, x, y); this.player = player; @@ -138,18 +147,6 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.levelNumbersContainer = this.scene.add.container(9.5, (this.scene as BattleScene).uiTheme ? 0 : -0.5); this.levelContainer.add(this.levelNumbersContainer); - this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type1`); - this.type1Icon.setOrigin(0, 0); - this.add(this.type1Icon); - - this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? 'player' : 'enemy'}_type2`); - this.type2Icon.setOrigin(0, 0); - this.add(this.type2Icon); - - this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type`); - this.type3Icon.setOrigin(0, 0); - this.add(this.type3Icon); - if (this.player) { this.hpNumbersContainer = this.scene.add.container(-15, 10); this.add(this.hpNumbersContainer); @@ -171,6 +168,46 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.expBar = expBar; this.expMaskRect = expMaskRect; } + + this.statsContainer = this.scene.add.container(0, 0); + this.statsContainer.setAlpha(0); + this.add(this.statsContainer); + + this.statsBox = this.scene.add.sprite(0, 0, `${this.getTextureName()}_stats`); + this.statsBox.setOrigin(1, 0.5); + this.statsContainer.add(this.statsBox); + + const statLabels: Phaser.GameObjects.Sprite[] = []; + this.statNumbers = []; + + this.statValuesContainer = this.scene.add.container(0, 0); + this.statsContainer.add(this.statValuesContainer); + + battleStatOrder.map((s, i) => { + const statX = i > 1 ? this.statNumbers[i - 2].x + this.statNumbers[i - 2].width + 4 : -this.statsBox.width + 8; + const statY = -this.statsBox.height / 2 + 4 + (i < battleStatOrder.length - 1 ? (i % 2 ? 10 : 0) : 5); + const statLabel = this.scene.add.sprite(statX, statY, 'pbinfo_stat', BattleStat[s]); + statLabel.setOrigin(0, 0); + statLabels.push(statLabel); + this.statValuesContainer.add(statLabel); + + const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, 'pbinfo_stat_numbers', '3'); + statNumber.setOrigin(0, 0); + this.statNumbers.push(statNumber); + this.statValuesContainer.add(statNumber); + }); + + this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type1`); + this.type1Icon.setOrigin(0, 0); + this.add(this.type1Icon); + + this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? 'player' : 'enemy'}_type2`); + this.type2Icon.setOrigin(0, 0); + this.add(this.type2Icon); + + this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type`); + this.type3Icon.setOrigin(0, 0); + this.add(this.type3Icon); } initInfo(pokemon: Pokemon) { @@ -258,7 +295,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.expMaskRect.x = (pokemon.levelExp / getLevelTotalExp(pokemon.level, pokemon.species.growthRate)) * 510; this.lastExp = pokemon.exp; this.lastLevelExp = pokemon.levelExp; + + this.statValuesContainer.setPosition(8, 7) } + + const battleStats = battleStatOrder.map(() => 0); + + this.lastBattleStats = battleStats.join(''); + this.updateBattleStats(battleStats); } getTextureName(): string { @@ -272,6 +316,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.mini = mini; this.box.setTexture(this.getTextureName()); + this.statsBox.setTexture(`${this.getTextureName()}_stats`); if (this.player) this.y -= 12 * (mini ? 1 : -1); @@ -284,21 +329,34 @@ export default class BattleInfo extends Phaser.GameObjects.Container { el.y += -8 * (mini ? 1 : -1); }); + this.statValuesContainer.x += 2 * (mini ? 1 : -1); + this.statValuesContainer.y += -7 * (mini ? 1 : -1); + const toggledElements = [ this.hpNumbersContainer, this.expBar ]; toggledElements.forEach(el => el.setVisible(!mini)); } + toggleStats(visible: boolean): void { + this.scene.tweens.add({ + targets: this.statsContainer, + duration: Utils.fixedInt(125), + ease: 'Sine.easeInOut', + alpha: visible ? 1 : 0 + }); + } + updateBossSegments(pokemon: EnemyPokemon): void { const boss = !!pokemon.bossSegments; if (boss !== this.boss) { this.boss = boss; - [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); + [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? '_boss' : ''}`); this.box.setTexture(this.getTextureName()); + this.statsBox.setTexture(`${this.getTextureName()}_stats`); } this.bossSegments = boss ? pokemon.bossSegments : 0; @@ -317,6 +375,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040) divider.setOrigin(0.5, 0); this.add(divider); + this.moveBelow(divider as Phaser.GameObjects.GameObject, this.statsContainer); divider.setPositionRelative(this.hpBar, dividerX, uiTheme ? 0 : 1); this.hpBarSegmentDividers.push(divider); @@ -439,6 +498,13 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastLevel = pokemon.level; } + if (pokemon.summonData) { + const battleStats = pokemon.summonData.battleStats.join(''); + + if (this.lastBattleStats !== battleStats) + this.updateBattleStats(pokemon.summonData.battleStats); + } + this.shinyIcon.setVisible(pokemon.isShiny()); resolve(); @@ -513,7 +579,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { }); } - setLevel(level: integer) { + setLevel(level: integer): void { const isCapped = level >= (this.scene as BattleScene).getMaxExpLevel(); this.levelNumbersContainer.removeAll(true); const levelStr = level.toString(); @@ -522,7 +588,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0)); } - setHpNumbers(hp: integer, maxHp: integer) { + setHpNumbers(hp: integer, maxHp: integer): void { if (!this.player || !this.scene) return; this.hpNumbersContainer.removeAll(true); @@ -535,6 +601,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container { for (let i = hpStr.length - 1; i >= 0; i--) this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', hpStr[i])); } + + updateBattleStats(battleStats: integer[]): void { + battleStatOrder.map((s, i) => { + this.statNumbers[i].setFrame(battleStats[s].toString()); + }); + } } export class PlayerBattleInfo extends BattleInfo { diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 7bf983c34ed..77144d6bbc0 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -1,5 +1,5 @@ import BattleScene, { Button } from "../battle-scene"; -import { addTextObject, TextStyle } from "./text"; +import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text"; import { Mode } from "./ui"; import * as Utils from "../utils"; import MessageUiHandler from "./message-ui-handler"; @@ -9,7 +9,7 @@ import { addWindow } from "./ui-theme"; export default class BattleMessageUiHandler extends MessageUiHandler { private levelUpStatsContainer: Phaser.GameObjects.Container; private levelUpStatsIncrContent: Phaser.GameObjects.Text; - private levelUpStatsValuesContent: Phaser.GameObjects.Text; + private levelUpStatsValuesContent: BBCodeText; private nameBox: Phaser.GameObjects.NineSlice; private nameText: Phaser.GameObjects.Text; @@ -29,7 +29,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textCallbackTimer = null; const bg = this.scene.add.sprite(0, 0, 'bg', this.scene.windowType); - bg.setOrigin(0, 1); + bg.setOrigin(0, 1); ui.add(bg); this.bg = bg; @@ -95,18 +95,19 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsContainer = levelUpStatsContainer; - const levelUpStatsBg = addWindow(this.scene, (this.scene.game.canvas.width / 6), -100, 128, 100); - levelUpStatsBg.setOrigin(1, 0); - levelUpStatsContainer.add(levelUpStatsBg); - - const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 121, -94, '', TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, '', TextStyle.WINDOW, { maxLines: 6 }); let levelUpStatsLabelText = ''; const stats = Utils.getEnumValues(Stat); for (let s of stats) levelUpStatsLabelText += `${getStatName(s)}\n`; - levelUpStatsLabelsContent.text = levelUpStatsLabelText; + levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth; + + const levelUpStatsBg = addWindow(this.scene, (this.scene.game.canvas.width / 6), -100, 80 + levelUpStatsLabelsContent.displayWidth, 100); + levelUpStatsBg.setOrigin(1, 0); + levelUpStatsContainer.add(levelUpStatsBg); + levelUpStatsContainer.add(levelUpStatsLabelsContent); const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, '+\n+\n+\n+\n+\n+', TextStyle.WINDOW, { maxLines: 6 }); @@ -114,7 +115,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsIncrContent = levelUpStatsIncrContent; - const levelUpStatsValuesContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, '', TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, '', TextStyle.WINDOW, { maxLines: 6 , lineSpacing: 5}); levelUpStatsValuesContent.setOrigin(1, 0); levelUpStatsValuesContent.setAlign('right'); levelUpStatsContainer.add(levelUpStatsValuesContent); @@ -208,7 +209,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { } else shownStats = stats; for (let s of stats) - levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s]) : '???'}\n`; + levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s) : '???'}\n`; this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsIncrContent.setVisible(false); this.levelUpStatsContainer.setVisible(true); @@ -221,18 +222,29 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } - getIvDescriptor(value: integer): string { + getIvDescriptor(value: integer, typeIv: integer): string { + let starterIvs: number[] = this.scene.gameData.dexData[this.scene.getEnemyPokemon().species.speciesId].ivs; + let uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible + + // Function to wrap text in color based on comparison + const coloredText = (text: string, isBetter: boolean) => { + const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY; + const color = getTextColor(textStyle, false, uiTheme); + return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`; + }; + if (value > 30) - return 'Best'; + return coloredText('Best', value > starterIvs[typeIv]); if (value === 30) - return 'Fantastic'; + return coloredText('Fantastic', value > starterIvs[typeIv]); if (value > 20) - return 'Very Good'; + return coloredText('Very Good', value > starterIvs[typeIv]); if (value > 10) - return 'Pretty Good'; - if (value) - return 'Decent'; - return 'No Good'; + return coloredText('Pretty Good', value > starterIvs[typeIv]); + if (value > 0) + return coloredText('Decent', value > starterIvs[typeIv]); + + return coloredText('No Good', value > starterIvs[typeIv]); } showNameText(name: string): void { @@ -244,4 +256,4 @@ export default class BattleMessageUiHandler extends MessageUiHandler { hideNameText(): void { this.nameBoxContainer.setVisible(false); } -} \ No newline at end of file +} diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index 90fef5ba5e4..1379ec6a8ef 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -2,6 +2,7 @@ import BattleScene from "../battle-scene"; import { TextStyle, addTextObject } from "./text"; import { WindowVariant, addWindow } from "./ui-theme"; import * as Utils from "../utils"; +import i18next from "i18next"; interface RankingEntry { rank: integer, @@ -39,7 +40,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN); this.add(titleWindow); - this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, 'Daily Rankings', TextStyle.WINDOW, { fontSize: '64px' }); + this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:dailyRankings'), TextStyle.WINDOW, { fontSize: '64px' }); this.titleLabel.setOrigin(0.5, 0.5); this.add(this.titleLabel); @@ -141,7 +142,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { update(category: ScoreboardCategory = this.category, page: integer = this.page) { this.rankingsContainer.removeAll(true); - this.loadingLabel.setText('Loading…'); + this.loadingLabel.setText(i18next.t('menu:loading')); this.loadingLabel.setVisible(true); if (category !== this.category) @@ -155,7 +156,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { .then(jsonResponse => { this.page = page; this.category = category; - this.titleLabel.setText(`${Utils.toReadableString(ScoreboardCategory[category])} Rankings`); + this.titleLabel.setText(`${Utils.toReadableString(ScoreboardCategory[category])} ${i18next.t("menu:rankings")}`); this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5); this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5); this.pageNumberLabel.setText(page.toString()); @@ -163,7 +164,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.loadingLabel.setVisible(false); this.updateRankings(jsonResponse); } else - this.loadingLabel.setText('No Rankings'); + this.loadingLabel.setText(i18next.t('menu:noRankings')); }); }); } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 30558b5bda0..29a4037f12f 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -383,6 +383,7 @@ export default class PartyUiHandler extends MessageUiHandler { } const slotCount = this.partySlots.length; + const battlerCount = this.scene.currentBattle.getBattlerCount(); switch (button) { case Button.UP: @@ -392,14 +393,20 @@ export default class PartyUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); break; case Button.LEFT: - if (this.cursor >= this.scene.currentBattle.getBattlerCount() && this.cursor < 6) + if (this.cursor >= battlerCount && this.cursor <= 6) success = this.setCursor(0); break; case Button.RIGHT: - const battlerCount = this.scene.currentBattle.getBattlerCount(); - if (slotCount > battlerCount && this.cursor < battlerCount) - success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + if (slotCount === battlerCount){ + success = this.setCursor(6); break; + } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1){ + success = this.setCursor(2); + break; + } else if (slotCount > battlerCount && this.cursor < battlerCount){ + success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + break; + } } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 2fd67ac0485..f1e058b12cf 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -203,7 +203,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.shinyOverlay); const starterContainerWindow = addWindow(this.scene, 141, 1, 178, 178); - + this.starterSelectContainer.add(addWindow(this.scene, 107, 1, 34, 58)); this.starterSelectContainer.add(addWindow(this.scene, 107, 59, 34, 91)); this.starterSelectContainer.add(addWindow(this.scene, 107, 145, 34, 34, true)); @@ -318,7 +318,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.genCursorObj.setVisible(false); this.genCursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.genCursorObj); - + this.valueLimitLabel = addTextObject(this.scene, 124, 150, '0/10', TextStyle.TOOLTIP_CONTENT); this.valueLimitLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(this.valueLimitLabel); @@ -333,7 +333,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.startCursorObj); const starterSpecies: Species[] = []; - + for (let g = 0; g < this.starterSelectGenIconContainers.length; g++) { let s = 0; this.genSpecies.push([]); @@ -498,7 +498,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const eggMovesLabel = addTextObject(this.scene, -46, 0, 'Egg Moves', TextStyle.WINDOW_ALT); eggMovesLabel.setOrigin(0.5, 0); - + this.pokemonEggMovesContainer.add(eggMovesLabel); for (let m = 0; m < 4; m++) { @@ -552,7 +552,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { species = getPokemonSpecies(randomSpeciesId); pokerusCursor = this.genSpecies[species.generation - 1].indexOf(species); }; - + let dupe = false; do { @@ -1049,7 +1049,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } } - + if (success) ui.playSelect(); else if (error) @@ -1086,7 +1086,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset.slice(0) as StarterMoveset; this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false); } - + updateInstructions(): void { let instructionLines = [ ]; let cycleInstructionLines = []; @@ -1212,7 +1212,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { setGenMode(genMode: boolean): boolean { this.genCursorObj.setVisible(genMode && !this.startCursorObj.visible); this.cursorObj.setVisible(!genMode && !this.startCursorObj.visible); - + if (genMode !== this.genMode) { this.genMode = genMode; @@ -1311,7 +1311,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - + this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature); } @@ -1319,7 +1319,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setTypeIcons(speciesForm.type1, speciesForm.type2); this.pokemonSprite.clearTint(); - if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.genCursor)) + if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.getGenCursorWithScroll())) handleTutorial(this.scene, Tutorial.Pokerus); } else { this.pokemonGrowthRateText.setText(''); @@ -1341,7 +1341,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); const props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - + this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature, true); this.pokemonSprite.setTint(0x808080); } @@ -1507,7 +1507,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.speciesStarterMoves.push(speciesEggMoves[species.speciesId][em]); } } - + const speciesMoveData = this.scene.gameData.starterData[species.speciesId].moveset; let moveData: StarterMoveset = speciesMoveData ? Array.isArray(speciesMoveData) @@ -1696,7 +1696,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.statsContainer.updateIvs(null); } } - + showStats(): void { if (!this.speciesStarterDexEntry) return; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 44003a7c8fc..cf5eb3639fd 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -364,9 +364,16 @@ export default class SummaryUiHandler extends UiHandler { case Button.LEFT: this.moveSelect = false; this.setCursor(Page.STATS); - this.hideMoveEffect(); - success = true; - break; + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE){ + this.hideMoveEffect(); + this.destroyBlinkCursor(); + success = true; + break; + } else { + this.hideMoveSelect(); + success = true; + break; + } } } } else { @@ -426,11 +433,9 @@ export default class SummaryUiHandler extends UiHandler { } setCursor(cursor: integer, overrideChanged: boolean = false): boolean { - let changed: boolean; + let changed: boolean = overrideChanged || this.moveCursor !== cursor; if (this.moveSelect) { - changed = overrideChanged || this.moveCursor !== cursor; - if (changed) { this.moveCursor = cursor; const selectedMove = this.getSelectedMove(); @@ -462,7 +467,6 @@ export default class SummaryUiHandler extends UiHandler { y: `-=${14.83 * (moveDescriptionLineCount - 3)}` }); } - } if (!this.moveCursorObj) { this.moveCursorObj = this.scene.add.sprite(-2, 0, 'summary_moves_cursor', 'highlight'); @@ -527,6 +531,11 @@ export default class SummaryUiHandler extends UiHandler { this.setCursor(0, true); this.showMoveEffect(); } + else if (this.cursor===Page.MOVES) { + this.moveCursorObj = null; + this.showMoveSelect(); + this.showMoveEffect(); + } } else this.summaryPageTransitionContainer.x -= 214; @@ -871,6 +880,12 @@ export default class SummaryUiHandler extends UiHandler { this.moveSelect = false; this.extraMoveRowContainer.setVisible(false); this.moveDescriptionText.setText(''); + + this.destroyBlinkCursor(); + this.hideMoveEffect(); + } + + destroyBlinkCursor(){ if (this.moveCursorBlinkTimer) { this.moveCursorBlinkTimer.destroy(); this.moveCursorBlinkTimer = null; @@ -883,8 +898,6 @@ export default class SummaryUiHandler extends UiHandler { this.selectedMoveCursorObj.destroy(); this.selectedMoveCursorObj = null; } - - this.hideMoveEffect(); } showMoveEffect(instant?: boolean) { diff --git a/src/ui/text.ts b/src/ui/text.ts index bfb02d06e27..a8cce878240 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -19,6 +19,7 @@ export enum TextStyle { SUMMARY_PINK, SUMMARY_GOLD, SUMMARY_GRAY, + SUMMARY_GREEN, MONEY, SETTINGS_LABEL, SETTINGS_SELECTED, @@ -82,6 +83,7 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio case TextStyle.SUMMARY_PINK: case TextStyle.SUMMARY_GOLD: case TextStyle.SUMMARY_GRAY: + case TextStyle.SUMMARY_GREEN: case TextStyle.WINDOW: case TextStyle.WINDOW_ALT: case TextStyle.MESSAGE: @@ -160,6 +162,8 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui return !shadow ? '#e8e8a8' : '#a0a060'; case TextStyle.SUMMARY_GRAY: return !shadow ? '#a0a0a0' : '#636363'; + case TextStyle.SUMMARY_GREEN: + return !shadow ? '#78c850' : '#306850'; case TextStyle.SETTINGS_LABEL: return !shadow ? '#f8b050' : '#c07800'; case TextStyle.SETTINGS_SELECTED: diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 6c96e475929..c430764e4da 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -5,6 +5,7 @@ import { Mode } from "./ui"; import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { battleCountSplashMessage, splashMessages } from "../data/splash-messages"; +import i18next from "i18next"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; @@ -37,7 +38,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.add(this.dailyRunScoreboard); - this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 90, '? Players Online', TextStyle.MESSAGE, { fontSize: '54px' }); + this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 90, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: '54px' }); this.playerCountLabel.setOrigin(1, 0); this.titleContainer.add(this.playerCountLabel); @@ -61,7 +62,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { Utils.apiFetch(`game/titlestats`) .then(request => request.json()) .then(stats => { - this.playerCountLabel.setText(`${stats.playerCount} Players Online`); + this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); if (this.splashMessage === battleCountSplashMessage) this.splashMessageText.setText(battleCountSplashMessage.replace('{COUNT}', stats.battleCount.toLocaleString('en-US'))); });