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
+
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')));
});