From 6fd5709b13adfc71f6bf7b402df82af3f983477a Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 30 Apr 2024 23:02:16 -0400 Subject: [PATCH] Reapply stat change feature with fixes --- index.css | 4 + index.html | 3 + public/images/pbinfo_stat_numbers.json | 293 ++++++++++++++++++ .../ui/legacy/pbinfo_enemy_boss_stats.png | Bin 0 -> 435 bytes .../ui/legacy/pbinfo_enemy_mini_stats.png | Bin 0 -> 666 bytes .../ui/legacy/pbinfo_player_mini_stats.png | Bin 0 -> 674 bytes .../images/ui/legacy/pbinfo_player_stats.png | Bin 0 -> 285 bytes public/images/ui/legacy/pbinfo_stat.json | 188 +++++++++++ public/images/ui/legacy/pbinfo_stat.png | Bin 0 -> 263 bytes .../images/ui/legacy/pbinfo_stat_numbers.json | 293 ++++++++++++++++++ .../images/ui/legacy/pbinfo_stat_numbers.png | Bin 0 -> 392 bytes public/images/ui/pbinfo_enemy_boss.png | Bin 554 -> 526 bytes public/images/ui/pbinfo_enemy_boss_stats.png | Bin 0 -> 257 bytes public/images/ui/pbinfo_enemy_mini.png | Bin 888 -> 851 bytes public/images/ui/pbinfo_enemy_mini_stats.png | Bin 0 -> 642 bytes public/images/ui/pbinfo_enemy_type.png | Bin 1502 -> 3599 bytes public/images/ui/pbinfo_enemy_type1.png | Bin 1360 -> 3305 bytes public/images/ui/pbinfo_enemy_type2.png | Bin 1340 -> 3197 bytes public/images/ui/pbinfo_player.png | Bin 654 -> 619 bytes public/images/ui/pbinfo_player_mini.png | Bin 898 -> 860 bytes public/images/ui/pbinfo_player_mini_stats.png | Bin 0 -> 648 bytes public/images/ui/pbinfo_player_stats.png | Bin 0 -> 312 bytes public/images/ui/pbinfo_player_type1.png | Bin 1340 -> 3197 bytes public/images/ui/pbinfo_player_type2.png | Bin 1360 -> 3305 bytes public/images/ui/pbinfo_stat.json | 188 +++++++++++ public/images/ui/pbinfo_stat.png | Bin 0 -> 278 bytes public/images/ui/pbinfo_stat_numbers.json | 293 ++++++++++++++++++ public/images/ui/pbinfo_stat_numbers.png | Bin 0 -> 430 bytes src/battle-scene.ts | 72 +++-- src/data/splash-messages.ts | 3 +- src/field/pokemon.ts | 4 + src/loading-scene.ts | 6 + src/locales/de/tutorial.ts | 4 + src/locales/en/tutorial.ts | 4 + src/locales/es/tutorial.ts | 4 + src/locales/fr/tutorial.ts | 4 + src/locales/it/tutorial.ts | 4 + src/phases.ts | 10 +- src/tutorial.ts | 6 + src/ui/battle-info.ts | 102 +++++- 40 files changed, 1442 insertions(+), 43 deletions(-) create mode 100644 public/images/pbinfo_stat_numbers.json create mode 100644 public/images/ui/legacy/pbinfo_enemy_boss_stats.png create mode 100644 public/images/ui/legacy/pbinfo_enemy_mini_stats.png create mode 100644 public/images/ui/legacy/pbinfo_player_mini_stats.png create mode 100644 public/images/ui/legacy/pbinfo_player_stats.png create mode 100644 public/images/ui/legacy/pbinfo_stat.json create mode 100644 public/images/ui/legacy/pbinfo_stat.png create mode 100644 public/images/ui/legacy/pbinfo_stat_numbers.json create mode 100644 public/images/ui/legacy/pbinfo_stat_numbers.png create mode 100644 public/images/ui/pbinfo_enemy_boss_stats.png create mode 100644 public/images/ui/pbinfo_enemy_mini_stats.png create mode 100644 public/images/ui/pbinfo_player_mini_stats.png create mode 100644 public/images/ui/pbinfo_player_stats.png create mode 100644 public/images/ui/pbinfo_stat.json create mode 100644 public/images/ui/pbinfo_stat.png create mode 100644 public/images/ui/pbinfo_stat_numbers.json create mode 100644 public/images/ui/pbinfo_stat_numbers.png diff --git a/index.css b/index.css index 9a507ad67..dd47387ad 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 bd316330a..177a92efc 100644 --- a/index.html +++ b/index.html @@ -74,6 +74,9 @@
V
+
+ C +
Menu
diff --git a/public/images/pbinfo_stat_numbers.json b/public/images/pbinfo_stat_numbers.json new file mode 100644 index 000000000..32170690a --- /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/ui/legacy/pbinfo_enemy_boss_stats.png b/public/images/ui/legacy/pbinfo_enemy_boss_stats.png new file mode 100644 index 0000000000000000000000000000000000000000..94c9f2a181736d88c6752f2c97ed0bbbee23ebcc GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^n}ArJgAGVJb4-r_QjEnx?oJHr&dIz4vU5FM978JR zyuG8?cgR7a?csXf_7^8kc|Ex$m-yBz<$7q-n^RU*Eb9Vy3q^L$xwlCBgn&~-ln2-0 zC$%D(Zao#Zd6NElh+n&%^Pj+>91Q?jM7YZ*~R6rK6tBHXtJ>3o}%+B70Tit?}|9LLp3388Oyx(ny$dZ`X4n6UD>PshjO%e?;W3et7Lx@QEIV2LHO-ZhLc6eY9Ry zIQ|Mdb1{9R)SaoXcSRIE<`z6H%nuWjbE9V$ zXGWbr(B0xb=lC1f6GDcM4fWFUoyzXm2QNAn5;^S^|FUJBo0|`=UT>R$XHs^CNV z##av>ty$f?T7lzV!;W1Rn!7wYzpJ*28OBxY>HqxBa!BncE&SaXRbV6dDO(__3L?7E8i*EoZkKZ{HwqsHRc+nk205eyDOS2sxDu$ zd@tM{5g62QzVkTGE`^WE*Hfq8w-A>Rt4KTHq5izn`AE{j-lt}1uFk6Sl=!q)x&3rH zmfHGREPZQC>e=c~;%vpYyt-a*X%jpw^vJ`ZrANz4IZ?ukeBYJTaNN^-KBA z)J%%Y&U~o6pj>*#j=aoIas@k?dF)+-(V{Q3XI{exr|Grpv%NI5;(qK@ xp0+UKM9$<@NoVioZhp6Q^O64&v*v`HV4ZIk%FUH_dOOew44$rjF6*2UngE&&E5rZ* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dd2b7e65ba3522986e78d6844a6be8823c3382ae GIT binary patch literal 674 zcmV;T0$u%yP)EX>4Tx04R}tkv&MmKpe$iQ%gl!9Lyl%kfA!+MMWJ;6^me@v=v%)FuC*#nzSS- zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya# zo%24i$jY)xd`>)J&;^MfxvseU#<}FMz%xZ7o1P~YiKS8xD?QB0hDJP198oo$@`aqs zD(5ZETD8GC_v9}O74(%1*J+L-fh8o7qK*_aP(c+IqO|Iym`Kxp+`~WO_*3Lk$W;L& z#{z25AUl5WKlt6PS)7`5lR|MI@M7B^V?b~hXg6*9``EVICxHJMxYE1+S__!_B)!?y zB1gdBHgIv>)s#Kpat9cGs>_D#NPe0^u?W1M(KqFRp<7^J&F!tTkJASrOIK2l+uOfqI{p0s^F(smE#4Fv0000mP)t-s0001cl!Q`iV>wbnAvplXy>s5y zwg3O#*3P|BYg+%cd;kCcN$J_5c5S*Us$?%8vTKwfg`6|6Wc}-=`Gc19G2( z)VthFjRI1_B|(0{3_xi#U}t|v7bsoq>Eaj?(fam=p-_VZhjU<>!iIbQ4@G5d*>KA2 zr+S66yVASV%+m`tUAT0h%_Vu-2F6#OE9N=hF1aYEASTnz@k_ZzU>c{|jD#j+;!l_T zYhIRn;@{452VTh2;XbSE{bIVBSPWaCe#7lsobz5x%h_{T;XlZgp00i_>zopr0I}G2 ADF6Tf literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/pbinfo_stat.json b/public/images/ui/legacy/pbinfo_stat.json new file mode 100644 index 000000000..b7da47fc1 --- /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 0000000000000000000000000000000000000000..62ec3758772daea6013a4de5532575a66caf8116 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^1whQk!3-pITwg5(Qk(%kA+A8$!NK9)wXI7Q-Kzj{ z7)yfuf*Bm1-ADteDDa3ZW?Ec4QuN(io6fN32b;e=)XJ@8wjxa57 z6;5`pyz#?~2;;a-r4XYn{3?!Y<6HKbItN$2xk}gw>0y zUzy)p<5e-!w)Vy<(87aih3;8-LtI=7KLTHk<}Jk-^i|&t;uc GLK6T7%VuW) literal 0 HcmV?d00001 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 000000000..9c74ee86d --- /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 0000000000000000000000000000000000000000..ee1453b21070f8de40a299a2d0c82c49093799cc GIT binary patch literal 392 zcmV;30eAk1P)NeVolC?^B79yfh4NP^lrY9U!*DY-V@3rV{hYdQ>YK;=1YJaz3T;`<^$DGJL<5 z0VRW87@CHmA>NuYKzH1TLC5xSzn%dVgI*Y#hCzM2e@<+(--30)Oref_gmu$R&9E*Q zKCPUg&65~>rQzm$c=)wGxON}pkE{!ZPit-h_?q;dhMV)@;n(^|U!-Qgl_%A@VDM** z28vT)T`)O@Pln{f8%r6yr(x9i(DP6xH!0n5bN5`F;gccxJgbFgqhZwe(DRg7RCba7 mA?H5)Du%PaS?j+(7uOe-FYwO$9P0Z30000Ik&UmVKT0GxPa8d!07jZZ!ddIBQBbh_PFZe&65JuT|9nKq=MA`2Ra01f-NW z91f+QE2Xg6Y_!guHF6k+mXtE_eP3^s9ZQpWyFcUJ3~9SRW4V~*j$cQ1WnC#{?2Y{H zp1HO|plBRLh_0>&dpk(u@=|B3Ul!cn-d9Bu|Irn<2(MATii<NL1q8595j002ovPDHLkV1ifd@6!MP delta 515 zcmV+e0{s1s1gZp(F@NMqL_t(|obB6BYQjJm1@M;=C_;s9>aGx7IS8(W?BZR#K+fR> zdKYIGa4pEV(m;21BcvdOLb@oX#w6N||Hk-!EB%ba5WYMoi2;a+$P89q(Q(?bWqnK1js?_P5*2T3V0acimCcp71_vhnu(jb5jIunqv- zU|m?J^YT3J;D0uwQBe98btaL0--i&Q%orEbYPFKro2Hw%bs$(LP1z0Bn7Fmy_dE4% zMRfpBN}Xl?_f7}_DJACfdG6;*DGY~0t+A6v4#Sx>8X@+5UvHKdwn^skG{U|W(s&x7 z*QuwrAFS-cx>Cy61NqkdXW#0iF_3fBLidQcv~I9QcYG^xiwstFvMunJ#6@+wo@071 z6=j=LzJ;IG-9*kySisI*Q}3$_A-J?SlT8{I?O!P+!f>JWs8i-krl0glDKjDTt88$>!uSb_l5uf002ovPDHLk FV1lYA{=)zO 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 0000000000000000000000000000000000000000..7148a7af4759141abb5e2b39c02a17b45af905e5 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^n}ArJgAGVJb4-r_QjEnx?oJHr&dIz4a&~*VIEGZr zd3$>`-ysJ9)(e`BNfSH%{_kJqko58BL=U^z3cqSH|eR)57 zW1&p?=O4X~e>-L8TFuvct=1%`yX>BUe4QLNkl8GRYx|2)P*70tlomTy+AL)kaKVi zE&#J{fxIOH3ldw!o(@eA9|jTwfke-5G6qF2@~g-B0uhl?&o>!GQQmYRa=R?cyz5!T z`|(5+MftElx~(F4j)*+88Q$()i?q{0_b3h8Z?jzmZ4pWY0rr0qL21w(A*rB55THl| zr9t=9O$8-_0MJt!bXT2JP$CGRMv#IUK>#&^6m9ha8#1%t_N<261?l{K=~*1pAjk_btXV2r7AjK;-r zyc-`ce5q`T&+mUP){_|k&bdbFdlX{~)>_gu^?vW1V>+D%9edXZS(f#zwRw^xVO733 z=iJLT_%&7jLr5Bc=c*yJqh3v!6wCSI$(1zcmbE+B8p>2?Q-u1?3(9$bLGjrb(}}GC z&Tny{X#k#=SKD&ZXsreQPoB<=eZOzJOKWr2MgYCV+*TmByu~acA|fIpa@iluDW|ek SO(V4c0000wNkl)q|N~u!nI~O4Yq?Ab0 z)cUDa4A$g)|GB+zjjyH$DNlu{Sp;D;RZA6(J^uv|5`cGRUYNim(gR9s1U zPC0iQQ-etbpCZ(@E->2xpqYObLeyev0QOIDQc7gm-04MCwVfaNvS^f20{C4#?Hk+n z_uXHMMb~Ko*z*>1x7*b&2cv4u=Wc00L_|bHM0D5>)LE${MNRhx00000NkvXXu0mjf DZ|lEX>4Tx04R}tkv&MmP!xqvQ>7vm5sQd8WT;LSL`4J_sbUc+7C6sqP{?%e(K->QQng1AHR!9McVpc!PL) z)6zNb6Ngw)Qi#uq#|*k4@gvt|m)|%S92R(H$VeyWi9^IW<^6Ko+1t_sz&)j z#$|=`7H73wWzBo?7Y1|MN{Z{Wh7rRO;z&S*j4Dbf!$O31jT93}I*)qzha7)`Tr#;z zVB}ap1u7)R5B>+gXKUssC)}i96zF`h?T-;4unRP5w*7r<+l>>z{|sDdEq|pB%zTnw zYiZ#lpm!U%xNd3k9&ot>3_j_SAvuztmXOZ_?`QN)S)l(G=w5T@);!1Q1CXX!E#CkK zhrnoove!M{-PJy~e|wtq`vH(aagbUB zzo-t5uI_cI;7<`vL}@r@>=fw7Q_>^>xEhuomQto)FNAjEI4-`=cWfUYlv1Ys?$EX( z{-b279fr-f*TOp8O^+I^-|2j;`a~!KNp6au2K}h1f+CP)E`l2L=hG@E0!flV4f^#- z6%>Ia27#GDAc;X>X8YJF+efPS#oQskn5pI%x-*WUY4S8Vs<2+QHAobJnOn>qX}QG= c008jX1y1rsg=?D3Y5)KL07*qoM6N<$f~t=qVE_OC literal 0 HcmV?d00001 diff --git a/public/images/ui/pbinfo_enemy_type.png b/public/images/ui/pbinfo_enemy_type.png index 021a120070c1872b54405196e4bcb2cec9920d06..9bac63e5e72ba305c0c7769d72bc39d72aa8202e 100644 GIT binary patch literal 3599 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 diff --git a/public/images/ui/pbinfo_enemy_type1.png b/public/images/ui/pbinfo_enemy_type1.png index 89b84d7f6305169db2e227aa33a9e2202cdeebfa..6d94871e8da1dfd56a0271a6a8ef1ae8e9d6c3c4 100644 GIT binary patch literal 3305 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 delta 1332 zcmV-41K;roK6x|8rVOt-T?ULCa%fweLZBshW_&&HC;* zO0vk;&DMDOm4U9|mAs4J&B(p@`1tjx^{$}s^^2`iam|Lp|9@hcy`Z4dqs6<(m4=$( z@Ycwh|J;Giu7~bbDWAdC&0W2FNPBZod$Y)zgQZ%P*Yx1fkon7G_No9%p+S^Ti}|f> zm8jtMc@R>*?(~L`sg$n0l(@~ZN?llm^Z)<=0d!JMQvg8b*k%9#010qNS#tmY4#WTe z4#WYKD-Ig~0DlAzNkl(^Y-#Wr6(Oj4xVAPdRD7!nD#iAB*BzHNIOCF7+K!2!Mo?4Ma{y?`n4?k5THGfPb znjaf?PygBd=;)}=AC3b1KsV?cB*s@ciU)rw57cPk>(CnArfu-@+b7_eU=Lj1OnvNcwffW0-uP_mXO_l4S!y5_eP^JhH)c@!3IEp%o=Epqlf^Q zdl4vm%oVI6jAf-z5$|I$U2Dmtnyz&NU|gM1Tovo?z9%sl038k@0T?JGHsIL@QDnrd zDzX{HYQ?=uvO=g-#FB$Nsuv5}+iLfdlS^uKdBRa(`I~AmiC0_`**#%3i+m|xZDaqP znSbbOs;KIv6AN{%B`!mDz1^R4OyqbTAb6NW0}$>+AUJ_2A{5z+2=NU>5xD9kiW7b_ ziQ3*&JDtuMz*$E^ zq5Oy)WOl}~7tbVB4ihDjPFJx4ljiYZ^SDMTc5Eak+VETLetdjNB~Onz3M4|@U_y^2 zIZTv9KC>90ws`^*7o%$YR54G)Z&akbQ~r1nO{!**|rqpNJ<0!EF`8Alxn}7E5 z(}~lmd`(2y!z<9KqCiv?B4ap}nkwRT+RHPkNNQz9jwytB>h0bPVUU_P&kYuaaOFk$ z8LiIGod{VZ7{z9D<;CVoyik#-*^P(`O#DR2_+sU8C^NhOn2+~R33uoA15d^47ggKu*i{Slh@`p?1>g%h%6Cw5J!=T0U*R1MnDJ6|U#*Z*JkoesN4y6h&V9 zS^IL#rHNpS$$z3KVzb$F)3Ol+L9lnip}Z&_gDU{iG###yJqW`PfbDi$yYFhX!dhEB z4IRgEH!YixG)-SW$f;^_3~?M|t<_*LPlNlL+mTx`uF6D6l4LfiP&6*cw*!3q`#KE6 z*>nv)$B`rn;PGFB@1WyQS!;op!Bg3K(f(8CKUlOl=YJNph0sZ>!pgJLse-2Lyi&dt}*K+!0R$E0vTWLUzE`_5mXrc zsQaRf);@*cL$jCTsXOrp#Tb)a{=Cd~yPcLDF5CP8>Nk1daueF@H!&L_t(|obBAdPTNo%hT%6=r7mDtOmVaZ|#D^=AwA$T>{|y z{`MMK0n4%gn9t{_=Z;1rTz8s03~k$XIW5~GzVAQ(BKK9E&tTg&t~=GuVw47V*Ecn{ zq+W@M;5bfWQX%fXAUY0k`1iGCS&iu$vV0E5aexf}HGd3;XC*YPKAz_Re{P;O?Z=(J z@3P-4P6>ipC$SJTFR}T;@LhT#Kr@~tNIX4Rlr7F3ih1JlvSD0}h;CUMrfz+?^FUrW92r7(fqb;z7>41Gsv{dh>cWt0R&T-FUZ9s?$T_$M z7l7HfK;Dvp1&OUH5K*IY>CJ^)^|N88NNC4pVs+=4}QGTmJ(3~vGe$D%9 z=$A!Nln?u(Y8Bx=BIU(qc)3?Ccq~Cn18LBHo9*gki69XmDIk9lNQ3S;P6ZMHlCDey z(x7{MDv$_}bVVYN2HmyUuGk}Bhem)T8UcGW0wi(y`1JhcWAML^ZL!&|BuT^msC0bn znVUT57V~&KuA`Qlv)1Y@{gNcD<5}t0Th136Ouiehu`ZX)k+t@4i#a$Ek|dEaCiL`1 z#BqEW7bo8HP4R#J`Jwe>CP{M6HBw()j4`s-DoxYU_nmW^PNyfwu5N@Z%X-$@JV}zU zDj%G4?%^B!KbQQ5<1~;eTs0Iss;zudEa!_mSJIraxeHnvd@8glLd*6A{^x002ovPDHLkV1g-F&x8N~ delta 473 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 delta 1332 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 Wt8RFN+!3I289ZJ6T-G@yGywokWokPB literal 0 HcmV?d00001 diff --git a/public/images/ui/pbinfo_stat_numbers.json b/public/images/ui/pbinfo_stat_numbers.json new file mode 100644 index 000000000..ec4f7117b --- /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 0000000000000000000000000000000000000000..c778ba992734421a718b2c49db1db0ae77a28e09 GIT binary patch literal 430 zcmV;f0a5;mP)X}UpFSFJe%YMSjb zvz=}Te=dw_+OM;>zwNiTz<(WGW!%j?&)@0VTARh5OWbc`j(J{Tok%Zt#$YoH;sBj7 z0D#IlJRc6p%*|?r>-8D{#_^;+F^22I1yqy`_PebZNKrNbfWEEq_WF{{oLyYu^!yS4 z#PO(4jM4P@WGYS8UqlLVGYqiSvW&F&OBuS>FtHC$Vz?0ZyX|CN5<3@SjG<>5X2}?8 zQ)v+?7z&xQg%~oUa!zD?QzeEgj_Hh<7_VVM6DZ`EEo4UD)*|DZy2Lt;DavMIyoRBA zxP2Ty%KN9gENZI8IE_78Q^T$GD~(@jhsGYQsdI~*V!X;!+J?fg{Gd2S+NQZaWGcsm zi<{b~a&9zLI&@IbQb7LyuD?x7eaKXf@hzMCJ+VH0TaTtDpMHPh p)) + p.toggleStats(pressed); + if (pressed) + this.setLastProcessedMovementTime(Button.STATS); + } else + return; + } if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined') navigator.vibrate(vibrationLength || 10); } @@ -1443,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; @@ -1463,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/splash-messages.ts b/src/data/splash-messages.ts index 11629cf05..198ff07ce 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/pokemon.ts b/src/field/pokemon.ts index 9a7bfb486..7072875d3 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1179,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; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 2f37b900a..875d618ec 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/tutorial.ts b/src/locales/de/tutorial.ts index 2722c02ad..7a27f2077 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/tutorial.ts b/src/locales/en/tutorial.ts index 2722c02ad..7a27f2077 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/tutorial.ts b/src/locales/es/tutorial.ts index 2722c02ad..7a27f2077 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/tutorial.ts b/src/locales/fr/tutorial.ts index c9f8a392e..e280ee2d5 100644 --- a/src/locales/fr/tutorial.ts +++ b/src/locales/fr/tutorial.ts @@ -25,6 +25,10 @@ export const tutorial: SimpleTranslationEntries = { $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. diff --git a/src/locales/it/tutorial.ts b/src/locales/it/tutorial.ts index 2722c02ad..7a27f2077 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/phases.ts b/src/phases.ts index 8eda33de2..ceba555f2 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2671,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; @@ -2712,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) { @@ -3337,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/tutorial.ts b/src/tutorial.ts index 918c68b9b..88e88fa80 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 ae794a256..ae8f518e7 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 {