From 880a46b65942d7e537b52ab4c63441642110d486 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Sun, 15 Sep 2024 22:00:47 -0400 Subject: [PATCH 01/11] [Sprite] Fix Lycanroc Midday (#4274) * [Sprite] Midday Lycanroc back * [Sprite] Midday Lycanroc shiny front * [Sprite] Midday Lycanroc shiny back --- public/images/pokemon/exp/back/745.png | Bin 2859 -> 2997 bytes public/images/pokemon/exp/back/shiny/745.json | 670 ++++++----------- public/images/pokemon/exp/back/shiny/745.png | Bin 5983 -> 2997 bytes public/images/pokemon/exp/shiny/745.json | 691 +++++++++++++----- public/images/pokemon/exp/shiny/745.png | Bin 3117 -> 4748 bytes 5 files changed, 754 insertions(+), 607 deletions(-) diff --git a/public/images/pokemon/exp/back/745.png b/public/images/pokemon/exp/back/745.png index 46a354be8a4b0759b22735a04315106a04bd4a99..f49491351649a2493638dc51f159dcc6f570918f 100644 GIT binary patch delta 2991 zcmV;g3sCf{7PS|UB!2;OQb$4nuFf3k0000dP)t-s0001CP(pxjUhL@C$Frv=92bOd zQDI0n0001tT1v=~eB-;PbvQS+zWs6l000eiQchC<|NsC0|NsC0|NsC0Ed)WW000Xk zNkl(>AIsh3`DVkTtV*pKksgO)P1^~vt{>yGe_HI+=C;a%It^~C`Gd9- za$7fJv;Q=?f!chVpwr@}s%_j>HHl4X8~FKr_MPvibha5f4Q|RpSU0KuLmt}gbMBv( zD#0Y3me|Ten}4qQU*bF#IQRYY(;9k$PLG@UlW|i8`eC_AGm_bN=}Y0BA4F zObF>Vbg!&>NFhKr=v-T?m+t4 z&+|y#)GS4~GX+ARPs^X3r^Ah0b2Ix%&|moj=Qpj9h>x~t{!4=nJ9N$Ms*K-P)bW32 zcBxD_e*wD|V(BnLr!~sm_BH*4a#Ma`bCJ+~{&E$d4m_3)H#NiUdNnqS%7leho0w~8 zQx+}6(0}Ofy;NOe=!}HU-1h7Iy4hpNx_!S;lhNfAaG0U8 z)pdqKCvLDyb0DqPsrKsZ-B?;iol#Fesyd^oBexUcE5FsfciGXQ_4O!UXSmd{oAQ%( zF4hgy-gw&yLPnq3HonYgYQ*l;I|_)?T-3vl_J1=U073=q*v^wJ!w!x3QFd+!^$B%a zfh&NWdv?kYZuB0L?n|rYckx>X^|+qZ{+qhtqo+-o3uU|er#ruQagz4 z0Dlu%l)$mY8WU%0iw|W^0k@8oIiTlyiI+ODvzJk%U92Ml8U3XPk&J}aFYwGwGVRPslC(?CAtf1o zFpZ{W7pZKAP5#%3n4|kvxl~7DV?`qE3V&|MBJ2ugk&fQj+;hVHo;=`Cw{&;vO%D8k z2WjYnoi(fLxVdll+&2*B2cGNG_D-fhcUGj5oiW3$LLFh}?lQuyytg(Wt5fwt%MF1gGS-EOJidXv7Z)u>2S zJ71!#v3_4mWn}bdIh|_j4f?%hlYgBpQQlZ;^3m+)4XQ{5J2la)v2gtepueK@mj3Nx zvHMeBp_}aT#)A2|c1L*wj{(r-Eo!{O6 z6T5$Y%)?9H1XYLeQsHhT-UL;L@lxUL?Op*@Z__cn6dVfi0;n3mwS#!6WhZASF;W}2 zb_!k!+iRezg==TvrPF{{w%0a-m!in$!=P#_URsARp9NK;(0Fv8uICiJPTB?DR@ z(mKr8XlRnIr2$i*Qhy`F=P;*=Gr=TXOLMC6!9l}}CiH`xYSP*=r^*ILCvmD|>ZG-0 zP8DM(F$A;9VD_XgbE>NPEu1P%d=AHMV1kPA-6U4A6Qtf`ZdEyq1sxGBrYc8ZJTj0G(aP%22u9OVrR~YoF-tWa85t{3KmFvA3@hpA&ogCW84g z%{y(pO!H0~lY0B^qNKA%z-pUBo`Kz*)_x)zc_E68c4L#??>1cXBJo;F!`GsOjrMZ@F{!#HMdGy< zTT0eqqjE*D(eCv<$tsDUNW9h}h_2NUW-|;M?SEX~vr;8jBvxw)Fi`(mL}H_z3w##* z^cTimq-twPPBrF6Bigfbflup)wN@*;BC%Ra00(Gun#T*i&g2iJAVSZtF@d3cNxpFPEBq6I$FzPg1?4k9Ojr8 zv`QsAsTg?C8{) z3c`(E1ZEK%WyenZj0Z$TQuhS4B4vAs0~p7%rEcLy8)7%4 zzKc|dEn2wI-q=xd*+t6jVnm*trL5(jxi+f!VT{Y)@;F0k9VzTf|jtERso$QJ9YvTSj2;onvjVOEKN> zouRW_!4a#IDH7MtV7dhGYECLo{9V9koq#yYVG0J*rQaPnIg_eHoy-nD#VD?OE%buq lM%AhBe|dUk{H3w5@gGpy8{|JxG(rFX002ovPDHLkV1lYX;41(C delta 2852 zcmV+<3)}Ry7poSKB!47OOjJbx0000004E$5J~%R0R8wVENpDq3iIS3?jCsMz%Fn%} z_xJZQ*Jxh=0004WQchCC+Am;eWm&+9Fn)nxNC*rktCx zLp+X;^${P@HfWdfpiYC^VgF$4Q0YTk8}X;f4YWS=1f3Q)r8et!pgy!RHt^^35kj=+ z=ovZlxg&Hl-{{Q~;K za#Qw*M&F^sJAY!gyLyEZz<5z+i0b;qdww>DLIl;I!<;I(Zc6C`5sepQK1JLws%I8* z=Y)%yt;7Ay%Dee?_NRVs;wwp+?fRiWNC**?UD06{U2;3aF|NmPn3>?0Q0j(yLuI<= zq;4Tl8qEC0)oJ($thg!jpSmw3vF}nQMQij=CQk^=w14~&JRSDuU&YOyCtiOQ!v2jj zLKR)N-uSl$9d^+*w=K5&y)`?dRt=mnixkzd8_p zvjt11Giu6B-}8xQ7Q{pqt@UB=p=~Tih@sP8bmI0o=a=VvG+q(_%0*kDvzNcFF?2?X zPTa&fzkik$Df2YT{yAIRDc^owfPdEa*uPbofvBr?JM7ZTD!V^dD@tXP z(vyjGQW<{L9dxg9bnhbx123dCB!0l^W z>&bxD6J)xtMy?%%c0h@2KLM%3Uo6XTi{{$Nz)Z>w>QxJKhY_A=6`AH`1D2h%ZXmY} z1b&I!;DH&;1gw>d4OBMrG|n9rR?(haLnn3if^E zu{;i`U}q=EtX(vRlw{1sG+H$~q_Q0~c(LEN7c#uBv#N4h(G|Ob8!>p0vCKZLYSmzu zcOzs#YbB+-2(Al6-ea5^cG<3AM#^Y~_kTBy5T2^$3*AdM`H(Vp1+zd0uhj~8zNaKe zM0l#!N=?eTV&}~2I@j3sGjJ*g4zxzR?tcYLGsN1kZAhbbHhZPf`@(YyEeP9%G{Y{CF+%IY zPC{B?2X?ZYeQF~vwzF6H0={Xn9e~!K7t5Yy2LLaYJZx``;h)@X|Ly)nU98 zuSbbDLDgZr6t8EyS3uRrbPO+r3x#+ARQ2H6LA=zlliMqxs)K8%;HB^$sDJ9<+8KE1 zG~l)6QMey3C6Uj?plT~#T8A*#f~v$CFAFa%K$z1()mmR!c&S~LEkKx)K~+A=Tf$3G z>k5Q98&s{qwH!=U)sWBGplS`S<=~~L>k#HlP_+ivvhY$8o(v((si5k{f@|9`)fB>< z397ciwR}u9fiNe6s#u3>8Gm>w5BZ!1s!~WW1=p7G(gGOhL6~bn)flcFz*GYWb1|qI z!?iU`m5Y2%0#%U(*VgdToJz`IP61V!aBYn*CE&>%gE<3KMJ`-h=1W_U&v8(-0j@1! zswq3kU@-eZ)eg9p;!BY(x{P3UbE?FpUx#Z`zLd>Q&f!!uMVH}Pf`2dVs=A+3?SN}3 zzOh6PxH0kCG8EiGd`|eBA%ChS@md-RzSzlkh|lEW zui~}t%1?FFzd?MaRcG+plbcRd%z)k_J|Rf{zM`c3w)9IR1aOt?QKw%_dxd= z@fpyy{N9q_*=xk-S@qT0hTb;Jy$gs>&YHf}h zU9-LCtkzQ0=)&ziA7px{wG=hFZhKFMOpmuVM~$waCa;^239Til(dpD=n(eeE~m$ml9NJ(sTbbrr=-j-XdXxNp+Mt=vf$x28Ktwp3^R~j1~!Y2JH zHzK6A*6R4L*`rvZtQVWXYv#KUTs{Y_e%ueyyJolrHsQ|_03hJjqwZQLmPCIsoKgOI8xWTEO7Zgjlr z?0?p^>|J0NZURfC^w`O?wVVxi8QZc>t=jr^w3f#Ne=W;6%rVm`mF&KfBXhE9N=hGm z-NDJ|6;)fi#*nD72i&MpM1b=f!>fB~Z>?Pz(tg^p*xCnFjkwX1z${{;ePN^XfFPtD zR4pW+#_rKQM)4vri`Z!ADdOAlLy9R~i+`cz2+Rp($IXrGu8@pf5mHS$cEi?p4mW{W z*i5$b6d~;3!uOav?z)Dh+~`AKj_wnjG&i!lLUMMz9e2~J69O~Ojdq2NnUL;(+$0xL zKK@T-38N+A(;pu9UiKgBfww!i6akYXe6833>TuwYHqSJ@b* z*cg(n8tE%%P1q^`gZ+^Bb}^xU3yUMZv0000Px#Cs0gOMF0Q*VNgPVZ(i)^*T=J`Cma`qZ&6`LHUIzsJxFI~c(jYD%`P=nky~EU z0000DbW%=J0RR90|NsC0|NsC0|1AVTtpETEBS}O-RCt`_o$0!xI1EIwfm}iE`#gO)P1^~vt{>yGe_HI+=C;a%It^~C`Gd9-a$7fJv;Q=?f!chVpwr@}s%_j>HHl4X z8~FKr_MPvibha5f4Q|RpSU0KuLmt}gbMBv(D#0Y3me|Teo38p_;ye~O_xj2&>L z)o$pO#Af#iTV}QnGk3u)v@@U5X5RyqS=@&rA$6KaVpnvSp-XO8akQ)YfZ8o}g>pBs zsV^nnH7n(XRJTB%-?%#b&^0%y|B>!M`q|I(NZr&dMYuBsLZDB}pPi?}ja+jx`$^DW z`2*)St&xb2wrKuKgAO}%&F!j;-&fS}e`a>6OgMi5yB1>UFhi#`%H8%g{e*H;eqnQw z(0=}M6`&40mJT;H!|i%CHjB!Hg;txGYiLszEyU3251qMvteJO{#!Y=mKvBgCUA8&fNCv{JPm=$+~^NP?OQ+6mXcKvek8lLMLvpOLHKt*QxgE?A=&eMx9YlKdL&T zsUx=&;w!(^y?5Esq4o7BUuU?~v77Rfb}rTp)ZTd82|`An+BUw-Xllgn)H@1@(_GZU zkM=Vk073=q*v^wJ!w!x3QFd+!^$B%afh&NWdv?kYZuB0L?n|rYckx> zX^|+qZ{+qhtqo+-o3uU|er#ruQagz4025i1z_G;}mSwo1xpqfnrmoPSp8EGZ(;clM z!yRpQhj9aS%)`!;(dV~7ry?_)8npxJiXpy>4`ogPw~m!LpyzstmpZYtmr(lm5rayO9q>`O6 z!>vLcVdw5L!mYfzk6$-n-MNz@mF;Y7)CwXQHHp>zh8xPr{T8y%Z)MjHNlB5)cBK+Q zAOm4j%zkaz7Ws{vPQQlZ;^3m+) z4XQ{5J2la)v2gtepueK@mj3NxvHMeBp_}aT#)A2|c1L*wj{=;^i-`)QcyMKPn!%N=;Rfq9X;cg|~1XYLeQsM6HUIA5a(=ogh z918IQs2aevgLtWBCub-zQX9B-3SJ7^YoMxyYiHo4(|}jD*EWKeqR8jNplT~#T8A*7 z1y!Tae$?^O0)*M9)IJEfwv3mWr?LeIb26yPM|n$lsY+LYFlU3RHMo|8smdDi>54oH zRIS0a9K1B6O%MokCa7A2Ygu?H3Qxum=2TF1Dfe|>J2BN9!kh`JR{PqCsctERIT2LN z{W7@rnoVpK7m0^_P6JgjBp8Eh%Xn!43=AO5XF=5zt{uQsBM9?hP&I{XYnUn*`J4o* zl6DbXTf<8!m7Kwx0;)3M+8SSqz>^e%IRjKJ5XgK?wGH_k2UQ#3S~oCEHD@Oo3}!#5 z+5y*Md})3#G7!veP8B)y>u_z(m$KQ(icWW_8E`Gamv*J@=Ttl3T8uC4B|iH&)iiY{ zrpiVzr*NtrNHETq((ELLVA49w*l1{yuB8D}pi(2m=P;*=Gr=TXOLMC6!9l}}CiH`x zYSP*=r^*ILCvmD|>ZG-0P8DM(F$A;9VD_XgbE>NPEu1P%d=AHMV1kPA-6NR^T^wQtPBZY@3e3zUJ_kn11Xp@n;Jrz3^cgO$lp4iraVXfalkX6p z*}-4MYweMr>&QPreCDYMy!PUzGZj6d_lQp*Qd7OPP;mU+aAAQj5}(%rDc$*kVHc%x zV-kYN8zEiG?=1?Ry+(Xqsa$Ybk2<32Jh=E7NJI` zQ%|sI)qJzDT4sMNNufkpYd8cHj0goV3RI$TBD#y4XqV7?0P?HlN*YSZUgIk zIx)zc_E68c4L#??>1cXBJo;F!`GsO zjrMZ@F{!#HMdGyz>Zz6Cx@e%sd2T4Gh!A~)I#P8R$?P(?yp zOMs&#ZnS@aPtxxZ{a^traMv+s=*hQzKPEiWG+aX04@Dw{fErQsXP-e(`%4 z3>@v?M!Bi6DrH5g?vRDlE!^mMYI5mX_A0OsE&_{H>9#upyQ{UF1$P0aJj zV;2|cyzJ=InF_*7% zrEcLy8)7%4zKc|dEn2wI-q=xd*+t6jVnmF^uxd&^~BKiS=*|L~y zPizs|m5PMefrG}Eq>9e~*uihOBC28|?->EF;j|tBuooXqr8l1YtGn2!}(Mqu!r zV{NcYG2QT;p|f1U5v!9a64%aPx&-iQPAX6QUBGCafH=!x3I@}q-yJzQld43W%nm=r ru6r%?g5*ZksqcSzdS(2jv9R$UP}&>hKT$M700000NkvXXu0mjf`9ao_ literal 5983 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 L(pIdIw+j0|ARuq$ diff --git a/public/images/pokemon/exp/shiny/745.json b/public/images/pokemon/exp/shiny/745.json index 6cabccff28d..d0989a1ccd3 100644 --- a/public/images/pokemon/exp/shiny/745.json +++ b/public/images/pokemon/exp/shiny/745.json @@ -1,167 +1,524 @@ -{ - "textures": [ - { - "image": "745.png", - "format": "RGBA8888", - "size": { - "w": 189, - "h": 189 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 65, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 65, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 66, - "h": 57 - }, - "frame": { - "x": 65, - "y": 0, - "w": 66, - "h": 57 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 64, - "h": 58 - }, - "frame": { - "x": 65, - "y": 57, - "w": 64, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 64, - "h": 57 - }, - "frame": { - "x": 0, - "y": 58, - "w": 64, - "h": 57 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 65, - "h": 56 - }, - "frame": { - "x": 0, - "y": 115, - "w": 65, - "h": 56 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 62, - "h": 58 - }, - "frame": { - "x": 65, - "y": 115, - "w": 62, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 62, - "h": 58 - }, - "frame": { - "x": 127, - "y": 115, - "w": 62, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1b95a218abc87c12576165b943d3cb77:4d796dc75302ca2e18ce15e67dcf3f0f:f9304907e03a5223c5bc78c934419106$" - } -} +{ + "textures": [ + { + "image": "745.png", + "format": "RGBA8888", + "size": { + "w": 286, + "h": 286 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 60, + "h": 55 + }, + "frame": { + "x": 0, + "y": 0, + "w": 60, + "h": 55 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 60, + "h": 55 + }, + "frame": { + "x": 60, + "y": 0, + "w": 60, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 60, + "h": 55 + }, + "frame": { + "x": 120, + "y": 0, + "w": 60, + "h": 55 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 60, + "h": 55 + }, + "frame": { + "x": 180, + "y": 0, + "w": 60, + "h": 55 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 0, + "y": 55, + "w": 60, + "h": 57 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 60, + "y": 55, + "w": 60, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 120, + "y": 55, + "w": 60, + "h": 57 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 180, + "y": 55, + "w": 60, + "h": 57 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 180, + "y": 55, + "w": 60, + "h": 57 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 0, + "y": 112, + "w": 60, + "h": 57 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 60, + "y": 112, + "w": 60, + "h": 57 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 57 + }, + "frame": { + "x": 120, + "y": 112, + "w": 60, + "h": 57 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 180, + "y": 112, + "w": 60, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 180, + "y": 112, + "w": 60, + "h": 58 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 0, + "y": 169, + "w": 60, + "h": 58 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 0, + "y": 169, + "w": 60, + "h": 58 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 60, + "y": 169, + "w": 60, + "h": 58 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 120, + "y": 169, + "w": 60, + "h": 58 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 180, + "y": 170, + "w": 60, + "h": 58 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 0, + "y": 227, + "w": 60, + "h": 58 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 0, + "y": 227, + "w": 60, + "h": 58 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 60, + "y": 227, + "w": 60, + "h": 58 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 120, + "y": 227, + "w": 60, + "h": 58 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 60, + "h": 58 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 58 + }, + "frame": { + "x": 180, + "y": 228, + "w": 60, + "h": 58 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d67741bfb78b7ff0c920c5395dd91fc2:e78172ef76e3b6327173461a595a8a6b:f9304907e03a5223c5bc78c934419106$" + } +} diff --git a/public/images/pokemon/exp/shiny/745.png b/public/images/pokemon/exp/shiny/745.png index 7679c44ba13881947a41cf96c92624f0db570955..c3256cf3f64d028bbac48cdb82b7bee68dd19794 100644 GIT binary patch literal 4748 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 D7VmOK literal 3117 zcmV+|4AS$7P)b}8(I>~Vr|jt0`k#;f{{Bp$73%;100DGTPE!Ct z=GbNc01L56L_t(|+U=YPlH)cEMFml$6>xI@>qgx7MFwTpq|BO{^mLl|A0V~*HMZ@4 zHTEyhCyDN_{VVfn=AG!9>eTsE_g2+^p@#t4{40Wl54b;!=p}x5bulkpov$N&!ad`s zR^5-2GheoO>FRvt{WI?WaIMNt{^w+_Y?t(YjqGQ|;kkO|ZLfKZL&&3IMojdfDeHfrhwQcQ?Ng006+d&kL~bPX7}3cZG;>81eY#SIU!h zD%T1C(e1M=Hs3P$K^>6+yk3X1Z|~uy?7NQxU=kpNVDN-_CvLSF;{dOh+B!-UO6_9P zrU8&M8^HLs5$v5ZBCdVDjl=~aD$PrNXXesVXqW0y0MPDD0B$1a5S*jC8o=6z^Zfw# z@C??yl6TrXXg4l2SpaSS1n}<7e-`hU=-h9`(Unf`SAEuTmw$A%>jsG2>j>u38%22L zm8J;V;Ix%*d&!&-k0XFvKkzpOCcs1Xg)cqA#*Fsnu9!+(-=L4&`{TmAE78|v>)AeH zJ?7p$fr5Q%($`aeVTDoYgns~6KgG<=vWeh$Dn!^Y@Ze#KAP{-3y@l-#L-#rY2ekL#x%&t0n>PrB_8s?N ze;5k){x!;T)z7riyPww<@ehc1A`th!8yt}X(Y?90=HL5-d;1S@OPe0yi|*44n*M1~ z`QC%uzN0<7+LjS^%)j-Fdm+*{q+WZ@{k{vCy<}Apj(rc`5f9xf%xIevcSC%CT|X=Uv(+IAc6`DbkK zy!Qp#b|>!g18$$t)-k@|eU&zR$@_cS`}P-(uL7CW(tR1oB$loYWQq@&rB|cz(qI6q_g`EOA6Z0!CWHY5pVOY#*(jm}^mMUCs zpUA?_0i6K~T)YA2VP97tXjENYdUP$teSy;vzB=0=X8S$KA5y(4W zVFMD#uu{4yAT!usPxAIlSJ(EX8vvcWVSmjD{~illDcu0*0h*a zQVyNcr97s+eX4O}y-x?VTI|Z^@o)fD)=M;@fvmY0)6d%E)=65Q2 zLZf;bbB;zOx(DvmYvNNxAO}oo%o{u>%{>^Hw4{h<#kG5Ax_{EXIWS?fzXSP>xQKqc z;XN9ay7M=J_=rY*lEy61%iH2rcJo{A-+@WLNx~LFw?NjflCTw_d6<+;qmu428!#zO zf~@l-?0Wki;d>Wk{Wb}k!=$Ek2~64+pP^BYhe+5-m~?N$q-6km5PX1y-4=kXi)qvq zN5Q)wE15_-xYhQUX=l|D(3#KI zOSdTZu{dvcR&4;CDbHCk;6Ba1lY4M4=0M!kehq2NfKJ<1ZP43PqqIQIeMpmb`oj7v zmIFFRJZF@>^rw4D?y-2IF)Ac&U8{XjZLm8$XY`rC`?<&B-NvZZ&Z1dI-5v_d^Q{ND z{Cl}K)U(d2GrdVWJg1-EHZX$$_w4sNtDa{C$gI1cL}8()emnP~F)BNaI*U51c7e$xpU6O>=i`U2lN2p)V?$d(eA8rfy8i>#a@4eN}0>J9%v%-f6rPfnJhi1Pm8Ybk zu+^5bHx`}SMnZ^Nkd^5x0HPY$fTjL zx-WyY)TR42NV`!{*uM>={f*!FjoJHA4Z`>jF*=1|oVFRP00000NkvXX Hu0mjfyiFp< From 6c43e970010948bb229a465fa61c70c4d7c73974 Mon Sep 17 00:00:00 2001 From: sodam <66295123+sodaMelon@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:01:07 +0900 Subject: [PATCH 02/11] [Bug] fixed ME event ```trash to treasure``` wrong descriptions of the choices (#4273) * modified script (by ImperialSympathizer) * removed wrong word(healing) * removed wrong word --- .../en/mystery-encounters/trash-to-treasure-dialogue.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json index ae6e63ed800..fe2cb54f5b1 100644 --- a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json @@ -6,8 +6,8 @@ "option": { "1": { "label": "Dig for Valuables", - "tooltip": "(-) Lose Healing Items in Shops\n(+) Gain Amazing Items", - "selected": "You wade through the garbage pile, becoming mired in filth.$There's no way any respectable shopkeepers\nwill sell you anything in your grimy state!$You'll just have to make do without shop healing items.$However, you found some incredible items in the garbage!" + "tooltip": "(-) Items in Shops Cost 3x\n(+) Gain Amazing Items", + "selected": "You wade through the garbage pile, becoming mired in filth.$There's no way any respectable shopkeeper would\nsell you items at the normal rate in your grimy state!$You'll have to pay extra for items now.$However, you found some incredible items in the garbage!" }, "2": { "label": "Investigate Further", From 6c2880dc30e712ff3d756a10193d4973f3a4a218 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Mon, 16 Sep 2024 04:01:44 +0200 Subject: [PATCH 03/11] [Localization] Missing French entries (#4270) * Update battle.json * Update move-trigger.json * Update party-ui-handler.json * Update tutorial.json * Update tutorial.json * Update trainer-names.json * Update menu.json --- src/locales/fr/battle.json | 3 +++ src/locales/fr/menu.json | 2 +- src/locales/fr/move-trigger.json | 3 +++ src/locales/fr/party-ui-handler.json | 4 +++- src/locales/fr/trainer-names.json | 2 +- src/locales/fr/tutorial.json | 2 +- 6 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json index 7b78c963187..5f5e81350e1 100644 --- a/src/locales/fr/battle.json +++ b/src/locales/fr/battle.json @@ -44,7 +44,10 @@ "moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.", "moveNoPP": "Il n’y a plus de PP pour\ncette capacité !", "moveDisabled": "{{moveName}} est sous entrave !", + "canOnlyUseMove": "{{pokemonName}} ne peut utiliser\nque la capacité {{moveName}} !", + "moveCannotBeSelected": "La capacité {{moveName}}\nne peut pas être choisie !", "disableInterruptedMove": "Il y a une entrave sur la capacité {{moveName}}\nde{{pokemonNameWithAffix}} !", + "throatChopInterruptedMove": "Exécu-Son empêche {{pokemonName}}\nd’utiliser la capacité !", "noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.", "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !", "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !", diff --git a/src/locales/fr/menu.json b/src/locales/fr/menu.json index 277b0f5fd04..35cd06606a7 100644 --- a/src/locales/fr/menu.json +++ b/src/locales/fr/menu.json @@ -46,7 +46,7 @@ "yes": "Oui", "no": "Non", "disclaimer": "AVERTISSEMENT", - "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", + "disclaimerDescription": "Ce jeu n’est pas un produit fini.\nIl peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait à tout moment cesser d’être mis à jour.", "choosePokemon": "Sélectionnez un Pokémon.", "renamePokemon": "Renommer le Pokémon", "rename": "Renommer", diff --git a/src/locales/fr/move-trigger.json b/src/locales/fr/move-trigger.json index 3704bc90718..6f9d9d4dd63 100644 --- a/src/locales/fr/move-trigger.json +++ b/src/locales/fr/move-trigger.json @@ -7,6 +7,7 @@ "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !", "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !", "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !", + "shiftedStats": "{{pokemonName}} échange {{statToSwitch}} et {{statToSwitchWith}} !", "goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !", "regainedHealth": "{{pokemonName}}\nrécupère des PV !", "keptGoingAndCrashed": "{{pokemonName}}\ns’écrase au sol !", @@ -67,5 +68,7 @@ "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !", "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !", "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !", + "substituteOnOverlap": "{{pokemonName}} a déjà\nun clone !", + "substituteNotEnoughHp": "Mais il est trop faible\npour créer un clone !", "afterYou": "{{pokemonName}} accepte\navec joie !" } diff --git a/src/locales/fr/party-ui-handler.json b/src/locales/fr/party-ui-handler.json index 6adba2c8309..a11640c80b3 100644 --- a/src/locales/fr/party-ui-handler.json +++ b/src/locales/fr/party-ui-handler.json @@ -13,6 +13,7 @@ "ALL": "Tout", "PASS_BATON": "Relais", "UNPAUSE_EVOLUTION": "Réactiver Évolution", + "PAUSE_EVOLUTION": "Interrompre Évolution", "REVIVE": "Ranimer", "RENAME": "Renommer", "choosePokemon": "Sélectionnez un Pokémon.", @@ -23,6 +24,7 @@ "tooManyItems": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !", "anyEffect": "Cela n’aura aucun effet.", "unpausedEvolutions": "{{pokemonName}} peut de nouveau évoluer.", + "pausedEvolutions": "{{pokemonName}} ne peut plus évoluer.", "unspliceConfirmation": "Voulez-vous vraiment séparer {{fusionName}}\nde {{pokemonName}} ? {{fusionName}} sera perdu.", "wasReverted": "{{fusionName}} est redevenu {{pokemonName}}.", "releaseConfirmation": "Voulez-vous relâcher {{pokemonName}} ?", @@ -44,4 +46,4 @@ "untilWeMeetAgain": "À la prochaine, {{pokemonName}} !", "sayonara": "Sayonara, {{pokemonName}} !", "smellYaLater": "À la revoyure, {{pokemonName}} !" -} \ No newline at end of file +} diff --git a/src/locales/fr/trainer-names.json b/src/locales/fr/trainer-names.json index 5864976cc34..beec7e0c313 100644 --- a/src/locales/fr/trainer-names.json +++ b/src/locales/fr/trainer-names.json @@ -94,7 +94,7 @@ "caitlin": "Percila", "malva": "Malva", "siebold": "Narcisse", - "wikstrom": "Tileo", + "wikstrom": "Thyméo", "drasna": "Dracéna", "hala": "Pectorius", "molayne": "Molène", diff --git a/src/locales/fr/tutorial.json b/src/locales/fr/tutorial.json index 7936987457f..3236bdafea2 100644 --- a/src/locales/fr/tutorial.json +++ b/src/locales/fr/tutorial.json @@ -6,5 +6,5 @@ "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour violet.\n$Si un starter que vous possédez l’a, essayez de l’ajouter à votre équipe. Vérifiez bien son résumé !", "statChange": "Les changements de stats persistent à travers\nles combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de\nDresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats\nd’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire\nen maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans\nce combat sont consultables.", "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets n’apparaitront que s’ils ont une utilité immédiate, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre\nPokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès\nqu’un Pokémon de l’équipe porte un objet.\n$Vous pouvez acheter des consommables avec de\nl’argent. Plus vous progressez, plus le choix sera large.\n$Choisir un des objets gratuits déclenchera le prochain\ncombat, donc faites bien tous vos achats avant.", - "eggGacha": "Depuis cet écran, vous pouvez utiliser vos coupons\npour recevoir Œufs de Pokémon au hasard.\n$Les Œufs éclosent après avoir remporté un certain nombre de combats. Plus ils sont rares, plus ils mettent de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe, mais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de meilleurs IV que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus que dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !" + "eggGacha": "Depuis cet écran, vous pouvez utiliser vos coupons\npour recevoir Œufs de Pokémon au hasard.\n$Les Œufs éclosent après avoir remporté un certain nombre de combats.\n$Plus ils sont rares, plus ils mettent de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe, mais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de meilleurs IV que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus que dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !" } From 72439ffff7b003538ede14d306a927c2574b2b5a Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:58:28 -0400 Subject: [PATCH 04/11] [Move][Beta] Add back grounded condition to ground shaky moves and grassy terrain (#4276) --- src/data/move.ts | 6 +++--- src/test/arena/grassy_terrain.test.ts | 27 +++++++++++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 10c98e0a7f7..0c2f587d885 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -6952,7 +6952,7 @@ export function initMoves() { .makesContact(false), new AttackMove(Moves.EARTHQUAKE, Type.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1) .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, true) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), new AttackMove(Moves.FISSURE, Type.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) @@ -7346,7 +7346,7 @@ export function initMoves() { new AttackMove(Moves.MAGNITUDE, Type.GROUND, MoveCategory.PHYSICAL, -1, 100, 30, -1, 0, 2) .attr(PreMoveMessageAttr, magnitudeMessageFunc) .attr(MagnitudePowerAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), @@ -8221,7 +8221,7 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.BULLDOZE, Type.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5) diff --git a/src/test/arena/grassy_terrain.test.ts b/src/test/arena/grassy_terrain.test.ts index e8064676741..efb2539885d 100644 --- a/src/test/arena/grassy_terrain.test.ts +++ b/src/test/arena/grassy_terrain.test.ts @@ -26,16 +26,16 @@ describe("Arena - Grassy Terrain", () => { game.override .battleType("single") .disableCrits() - .enemyLevel(30) - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH) + .enemyLevel(1) + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.STURDY) + .enemyMoveset(Moves.FLY) .moveset([Moves.GRASSY_TERRAIN, Moves.EARTHQUAKE]) - .ability(Abilities.BALL_FETCH); + .ability(Abilities.NO_GUARD); }); it("halves the damage of Earthquake", async () => { - await game.classicMode.startBattle([Species.FEEBAS]); + await game.classicMode.startBattle([Species.TAUROS]); const eq = allMoves[Moves.EARTHQUAKE]; vi.spyOn(eq, "calculateBattlePower"); @@ -53,4 +53,19 @@ describe("Arena - Grassy Terrain", () => { expect(eq.calculateBattlePower).toHaveReturnedWith(50); }, TIMEOUT); + + it("Does not halve the damage of Earthquake if opponent is not grounded", async () => { + await game.classicMode.startBattle([Species.NINJASK]); + + const eq = allMoves[Moves.EARTHQUAKE]; + vi.spyOn(eq, "calculateBattlePower"); + + game.move.select(Moves.GRASSY_TERRAIN); + await game.toNextTurn(); + + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(eq.calculateBattlePower).toHaveReturnedWith(100); + }, TIMEOUT); }); From 2221afca817005496cfed52eac3dffac623a1ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Marques?= <44369723+tomasrggm@users.noreply.github.com> Date: Mon, 16 Sep 2024 19:44:11 +0100 Subject: [PATCH 05/11] [QoL] Slight Resize and Reallocate to IV graph in new game screen (#1928) * Resize and Reallocate to IV graph in new game * decrease moveset container size * fix to font shadow * fix to shadows * Remove unused variable * Revert IV text back to original size * fix eslint error check post merge * Update src/ui/stats-container.ts Reformat statLabel line. Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: tomasrggm Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/ui/starter-select-ui-handler.ts | 2 +- src/ui/stats-container.ts | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index ee56a3631dd..308614887e9 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -760,7 +760,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); this.pokemonMovesContainer = this.scene.add.container(102, 16); - this.pokemonMovesContainer.setScale(0.5); + this.pokemonMovesContainer.setScale(0.375); for (let m = 0; m < 4; m++) { const moveContainer = this.scene.add.container(0, 14 * m); diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index c6e0ea3a71c..06dd6e7c035 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -4,12 +4,15 @@ import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./t import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; import i18next from "i18next"; + const ivChartSize = 24; const ivChartStatCoordMultipliers = [[0, -1], [0.825, -0.5], [0.825, 0.5], [-0.825, -0.5], [-0.825, 0.5], [0, 1]]; const speedLabelOffset = -3; const sideLabelOffset = 1; const ivLabelOffset = [0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset]; +const ivChartLabelyOffset= [0, 5, 0, 5, 0, 0]; // doing this so attack does not overlap with (+N) const ivChartStatIndexes = [0, 1, 2, 5, 4, 3]; // swap special attack and speed + const defaultIvChartData = new Array(12).fill(null).map(() => 0); export class StatsContainer extends Phaser.GameObjects.Container { @@ -29,7 +32,6 @@ export class StatsContainer extends Phaser.GameObjects.Container { setup() { this.setName("stats"); const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); - const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); ivChartBg.setOrigin(0, 0); @@ -55,12 +57,19 @@ export class StatsContainer extends Phaser.GameObjects.Container { this.ivStatValueTexts = []; for (const s of PERMANENT_STATS) { - const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + ivLabelOffset[s], i18next.t(getStatKey(s)), TextStyle.TOOLTIP_CONTENT); + const statLabel = addTextObject( + this.scene, + ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325 + (this.showDiff ? 0 : ivLabelOffset[s]), + ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + (this.showDiff ? 0 : ivChartLabelyOffset[s]), + i18next.t(getStatKey(s)), + TextStyle.TOOLTIP_CONTENT + ); statLabel.setOrigin(0.5); - this.ivStatValueTexts[s] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); + this.ivStatValueTexts[s] = addBBCodeTextObject(this.scene, statLabel.x - (this.showDiff ? 0 : ivLabelOffset[s]), statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); this.ivStatValueTexts[s].setOrigin(0.5); + this.add(statLabel); this.add(this.ivStatValueTexts[s]); } From d5cce666d3483f14310374bf47a4b4a147d3e726 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:03:13 -0500 Subject: [PATCH 06/11] Remove Dragon Ascent Requirement (#4284) --- src/data/pokemon-forms.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 4fc833939e4..a904f497b0f 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -684,7 +684,7 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.GROUDON, "", SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.RED_ORB)) ], [Species.RAYQUAZA]: [ - new SpeciesFormChange(Species.RAYQUAZA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE), new SpeciesFormChangeMoveLearnedTrigger(Moves.DRAGON_ASCENT))) + new SpeciesFormChange(Species.RAYQUAZA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE)) ], [Species.DEOXYS]: [ new SpeciesFormChange(Species.DEOXYS, "normal", "attack", new SpeciesFormChangeItemTrigger(FormChangeItem.SHARP_METEORITE)), From 0dabf87815fee2454f1c7b980aad8df7aeea9482 Mon Sep 17 00:00:00 2001 From: podar <1999688+podarsmarty@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:08:50 -0500 Subject: [PATCH 07/11] Being explicit in vite configuration for relative paths (#4264) --- vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.ts b/vite.config.ts index 1fd85e2572f..946315c4b7b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -31,6 +31,7 @@ export default defineConfig(({mode}) => { return ({ ...defaultConfig, + base: '', esbuild: { pure: mode === 'production' ? ['console.log'] : [], keepNames: true, From 4605ed4c4fbafd99b9131f3ada47df10a4289dfc Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Mon, 16 Sep 2024 21:18:57 +0200 Subject: [PATCH 08/11] [Localization] Localized status condition icon (#4286) * Status Condition Icons now can be localized. Already added german * More --- public/images/statuses_ca_ES.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_ca_ES.png | Bin 0 -> 441 bytes public/images/statuses_de.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_de.png | Bin 0 -> 2857 bytes public/images/statuses_es.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_es.png | Bin 0 -> 441 bytes public/images/statuses_fr.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_fr.png | Bin 0 -> 2714 bytes public/images/statuses_it.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_it.png | Bin 0 -> 441 bytes public/images/statuses_ja.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_ja.png | Bin 0 -> 2936 bytes public/images/statuses_ko.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_ko.png | Bin 0 -> 441 bytes public/images/statuses_pt_BR.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_pt_BR.png | Bin 0 -> 519 bytes public/images/statuses_zh_CN.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_zh_CN.png | Bin 0 -> 441 bytes public/images/statuses_zh_TW.json | 188 ++++++++++++++++++++++++++++++ public/images/statuses_zh_TW.png | Bin 0 -> 441 bytes src/loading-scene.ts | 3 + src/ui/battle-info.ts | 2 +- src/ui/party-ui-handler.ts | 2 +- src/ui/summary-ui-handler.ts | 2 +- 24 files changed, 1886 insertions(+), 3 deletions(-) create mode 100644 public/images/statuses_ca_ES.json create mode 100644 public/images/statuses_ca_ES.png create mode 100644 public/images/statuses_de.json create mode 100644 public/images/statuses_de.png create mode 100644 public/images/statuses_es.json create mode 100644 public/images/statuses_es.png create mode 100644 public/images/statuses_fr.json create mode 100644 public/images/statuses_fr.png create mode 100644 public/images/statuses_it.json create mode 100644 public/images/statuses_it.png create mode 100644 public/images/statuses_ja.json create mode 100644 public/images/statuses_ja.png create mode 100644 public/images/statuses_ko.json create mode 100644 public/images/statuses_ko.png create mode 100644 public/images/statuses_pt_BR.json create mode 100644 public/images/statuses_pt_BR.png create mode 100644 public/images/statuses_zh_CN.json create mode 100644 public/images/statuses_zh_CN.png create mode 100644 public/images/statuses_zh_TW.json create mode 100644 public/images/statuses_zh_TW.png diff --git a/public/images/statuses_ca_ES.json b/public/images/statuses_ca_ES.json new file mode 100644 index 00000000000..be1b78e0e41 --- /dev/null +++ b/public/images/statuses_ca_ES.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_ca_ES.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_ca_ES.png b/public/images/statuses_ca_ES.png new file mode 100644 index 0000000000000000000000000000000000000000..d372b989be966007e5fccac5f54fe341457e598b GIT binary patch literal 441 zcmV;q0Y?6bP)_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?zvW;$NS#fE(5J*QH>;TO# zqj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~aG}z~@!Q2dSmt873PQXLU zg+O|T!QM`p^A|K=@Suc&?b@)04> jC;!H^NCF;OJ`4N>xriuwM360I00000NkvXXu0mjf67avU literal 0 HcmV?d00001 diff --git a/public/images/statuses_de.json b/public/images/statuses_de.json new file mode 100644 index 00000000000..90840b8eeb1 --- /dev/null +++ b/public/images/statuses_de.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_de.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_de.png b/public/images/statuses_de.png new file mode 100644 index 0000000000000000000000000000000000000000..ab85384d5914456bab1ba11f57f19743c522ca93 GIT binary patch literal 2857 zcmbVO3s4m29bYwY=oLw#MQRwmoK}Ibw~u?VTTTz|c$||1go~c2G<&;yk8pQ;+%9k+ zp~eYe4AF?FV}z*bq&8TjQ$cY!h#0lnqSR0y@mVWl&{i>MeMI84-yLuz#u&$)+5Nu# zzW?L*`#<*E)j3%ik&~uRf*>f;kg3lFV>Gz65#iuDgRcG(3==(>OLzzpPYK-Ppe+qC z5G1N_n9PFN_&P~*E*Zse7FOnSd4MzoCC~SHD7ugpBo@}@aBHNu{QIR62cwZLRvJ;G zN5|S7ndM$KuRO~{mlx6mBb`4_lI$aa0T(M!5}(WI=1HGM8njD-d0-ilN`fLnp+=e# za40bwb0j*>%Sx0o6-;9aT%smqmTM#IUyOjq`;e(v68v^ z^bud+O(V4nf`>$q($Z2{sa(c+Z3spX1cKrSj>A9#=F8jy<%8Y)tWgVkmZ!ZAkKo|k zl7L0Z!W9b|DL^_*!Q}~=b@L-(0s%vOln23NXn;~skfB3zo?@>v=$xSu*2%h9x4;8g zEF|l(a{|ZPxgRkd+Wwvc5L%-#V(>fKdX*R33N4ij>Wh8YWCp)eH3)fUUBzMi9t10^u3&j5V_OTyH0 z6$4upDhwu21p|X68pe|>v<0)GEXB~H`q^FwXhF*P+;%{#{67?8&BY?kb#BUy36ha^g7C%YRfu`0-=|DBJjC5q#@q~On3)E5lQacNb zKBdZsz4M$^D5bn?iVfucC%XvwG4MQ9@^t7pgR2-d1qujPD_~rqAYhA%#$mZqg(X>V zLaszZ)Sm<$SCF`RwCkP+`bb!5JLR^q;DkV=&rjyr`f3>E56C?J33(8JABV&%S$C%A_U++r?ySlox2iGkSMT*6d)54?E6EMQ@$wyK9T0VNz z^6{r{+e=HnzT?A-8Vr#3=BX3gR#a5$WjQx$X8-fV6?2T}jd&!kB&%fi>Sb?UweCy^ zdm~hweqO7tA_^tnYy)klTspjTm^rAb)9(P#WhPm-+1&evp4VV z*Zs-kYQ?j)9T$DO`WNW&o8i!-Po}pwFP$2bw~2kxPp1yOt83BGvHs=1XdUeA@4nnv zA1~@9nZCj)-R1)S!gTkEJ-565bfdZRE9cB#ixrm>yAyRK_Al<%RCpF8(vQskHOkYP zL*LFr-)-G%*gvGX_F)vX(wWb1?_RT{?(Ng}{_{f7gLHqwE2`2*&y+vdbtPxQyuIZo^8X>)^zy0n zf-adblw1k_`+m>4x_{m8*d6mdj zU#~p-m*_inyHgk5*uVA2xt>-R-|BL&QrEZG#NUpCZ1BU4pQjbf^tT;%@s)L#*Y%lP zji%;Bxr??AE-E_xpz;{mHzTh2P}p}n!z(Tw4x5otFleh7%3gM@ybaKvJhwZ21v$59 z{^S5~a|#x7=J)R$8A_Vok(2UGdD}gA*>&PnQpDEodqUFjhfSZ&nW{Z|!SsHHwsY-o z&aeOD;kG@mpqpletsF>6`ENT{@apfh_io*eQr(txn!uo{g}0+>exeqq7Yn^zYY3~5>V=F~S={SPbh|J48h literal 0 HcmV?d00001 diff --git a/public/images/statuses_es.json b/public/images/statuses_es.json new file mode 100644 index 00000000000..4b44aa117e4 --- /dev/null +++ b/public/images/statuses_es.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_es.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_es.png b/public/images/statuses_es.png new file mode 100644 index 0000000000000000000000000000000000000000..d372b989be966007e5fccac5f54fe341457e598b GIT binary patch literal 441 zcmV;q0Y?6bP)_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?zvW;$NS#fE(5J*QH>;TO# zqj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~aG}z~@!Q2dSmt873PQXLU zg+O|T!QM`p^A|K=@Suc&?b@)04> jC;!H^NCF;OJ`4N>xriuwM360I00000NkvXXu0mjf67avU literal 0 HcmV?d00001 diff --git a/public/images/statuses_fr.json b/public/images/statuses_fr.json new file mode 100644 index 00000000000..78f78a0856c --- /dev/null +++ b/public/images/statuses_fr.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_fr.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_fr.png b/public/images/statuses_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..95989cd5d97ee13dbb7cdca89204ec7bff3f4263 GIT binary patch literal 2714 zcmb_e4Nw&48D2Fak_bvV!uZF!F{6NY`*T0sZU6-i<-`LEXTWG0_jbSg(c9Z&Zx1+> z`qNf~NdkssL~DqI8WD*x;1Gx*Hm%VXqlTXuN|cdGBSRd)!C1A`*zfqcnwA)w>CWta z@9sX|`#$gcJ@0;7ye4hsjG#F|2!hNor06r?I2)eJ0|Vf70aw%phv}}Ab#4TC`dQyO z3E6)j96_dq*iG4TwsAGXiGq^lMKe(53oeL8kl1DUE|%L2WYi3-c4r(mbn+C2+W9yv zOJgLAt|VZyrxZvavmnjH6>R2c9$OZV#^y87fdFI{%@-U_Hp+I z7A8Z#Vk{QCi^FWP>|$^{FE3A-r&5ZN6(?z$#t90iCe>ysHkXY5X30dDDrlT_faUVAhjlvW(b-gzYm3i;aQpeQ83Rj7Euydn66!5tpIm9 ztr+SrB9kOKL{KHxj7G-bbjz%h0|tE@1~XRL?L5P(HBc>DvqD9wGzwa+CKP4> zbPApWK&_&*8f}b!zFy=!zI7d+&%^l?rPFA&7E-~*sCfkm)G-R$OwtMh0FEFDngtqe zJbt=lhkeC5ezG5^|9@vV?j-?cM@YvX6`vfcUWECBCn`Z;i>0{(K3UiAV zIggb>$C#+(Z;c#p30MT#ec8Cgnj-0N@YZzquRp%Q+6Zo9{H+|YZz`7 zKGVNP!5jZB2b{1<65PXD(d%0gWJ;JppJ2-VP0QYeWk-pbyS9bv`9-1Kv?nxYa?ZQM zi-s4~*Vn_#@Sj^-pItn2aanqg3EQ(rSGiI9@*6X411;Nj?c*En)psi+ry~dBI}5wy z{9o&_vIXsE@0Z_JY%2P==6yqEAHVpwDNiM;+CQ%OdD!j1t8>#!kAUm@gR7#Wq-*7e zPd~V;#P(LFD+51kK40>esno(_Jrx5_Cu5(q{bTt2SucXk3fw**^)*+f&NA$si^vhl zR~m1;Tbx*fZ}>fb+qq_^a%Zo$_UgS>UtVA$CYoey7Xo@KSR!a&zgbB{>_W&HlV5qVslD)~4;2b=A{qquPY}a-lW7b+Wx6{L|>b*7--H z+R7X1K6EITA-#3U58Lnjsg`qJx~%Q*pL%j$Ve=u=zMw-(m-e+>t^4agE7qQwvt;d4 z%a7c>oT%=OB0?wi9z0p)y;xmz?nLufFLzYMcXkbxG;gWAzQFni!vW3uvzd3AXfIx- zY`S=DYDeR}#MI@pE3VwyAocX!4G*(=hrA!{9?a`3MGh7ot9rw;G4kvSAs74Wv%U#B ze{25m))$^vUFaKn2Y=w&r_I{(_t;;0 z3qC*BakTR0gIfT)9eD3n#gtbnf6;&W@MkB4V6yt{dM`9S{W7#{YUK;1(`|!0&oq5^ v&U-(kxZ#yk>%(sBhQElxAlqOu8j&by2m1aQ;nAL1?i&orY5HS{8+ZN-$q?K2 literal 0 HcmV?d00001 diff --git a/public/images/statuses_it.json b/public/images/statuses_it.json new file mode 100644 index 00000000000..76fc9ae8b4b --- /dev/null +++ b/public/images/statuses_it.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_it.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_it.png b/public/images/statuses_it.png new file mode 100644 index 0000000000000000000000000000000000000000..d372b989be966007e5fccac5f54fe341457e598b GIT binary patch literal 441 zcmV;q0Y?6bP)_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?zvW;$NS#fE(5J*QH>;TO# zqj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~aG}z~@!Q2dSmt873PQXLU zg+O|T!QM`p^A|K=@Suc&?b@)04> jC;!H^NCF;OJ`4N>xriuwM360I00000NkvXXu0mjf67avU literal 0 HcmV?d00001 diff --git a/public/images/statuses_ja.json b/public/images/statuses_ja.json new file mode 100644 index 00000000000..8de633e8e43 --- /dev/null +++ b/public/images/statuses_ja.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_ja.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_ja.png b/public/images/statuses_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..305fbe9168c3845084f5537924ca404ae9deb412 GIT binary patch literal 2936 zcmb_e3se(V8XoY0#EPvH7PU$UVi$EXk347A@GyXaL^+5H!upuZOdu69F*6|%L=o|| zqD95}*lJxx%R!`|MeAd=>Q+>2ReWvbQ7a3yilVlfD(td1JW{*I+IG+8oXOmo`R@09 z|9}5~?yQcRHhG9>gb0G5A<Uusm%sngt_g z5<3|wJ!cg(65zBagbcHb*2MRw2_y`$Q)UE{qRx=Ifeh`!nXQ)eZgGZ2*mO37H3>Yx zVlJ#XjT1ONjr$pD*W;fEfYj=AE{&IZ$;fa?@IquJ2%|S4FGceS3(YJN&+?qrLbH*X zz-FK`8Z)W2u#~`A5;!isZ=vG)EQ_^T@$VCjCWf=|!7sqs2uffz5*)?lFsguYGy%m) zg@TmfAMoz&LhU;OaQm%jr zS}unb28^I(GD^)dMBn@fjrqAW|J7)nsAf_B#O zkIH>4;UGR9EF<6BE0d_y-ch6@dWA^Aw}g!NOkM8SDa= z195kSk`(RiJdK2QmK@7SdT$$Fwm!cm6TS0oX)GXpMKSiM^PEAjQ5H5l6|ChilsfWr z)_E%P)y6T5!6}&%ht+yi4-<0d65@m&mZ@b110$nQwI1&a{H4YTQm*c6jo)s(Hzjl$ zWlCkiD;$yh@1gv<9_jJ;Vkj@|^8Z&T-R0R+TgZQxUH7vW-tm1k3^oqu(6wWM3)h~< znn0E;U`K#etv)D_jD zGvzhzXO!l7^S;h?bL)qv@6oIk4e7UEOA&?7>MyO^_;l~Kw<8~2YHe*r5K}$lH}LqP zCBw6>E-Rcl{MPI>j#|zYl+&j3xCoKY}_$(>#?k>P0bxOg~Niae?Rx$b7*Hn zRih~TYT#OH{H*2+^HcIJ_!MB}4_49Rj_pbr({wpG`_Z?P+9C`6;`dpsV||mMEz(VQ z>jVCpQWE=4)eR^rbqsc_!TmsrJCsv7^5}!-i_Y#W$~(6&|8DU5(p@1Ql?PPnVY~l4 zqO|0Sb<}gcO0Az36OJ8tIJ)0ls|cEXVnD;UB2W8k9~9lumX*vaaLXJJvFXw{k>}>y zizbxTf7!fk>E?>~m;j;w+k5a2(xo$Fw$Cjbda!N_U8mhrw<@4GQPd0MI2eslb=KGB~)j_4i-JMzq9e4B6q>NqjNf23R1*3 z=dZeR>Y3Utx3qFu)l;QDxU%ltcZ*|-J3==dn-n*)eQ?c<kU8sXA6I_oUQ=zt zx7@N%@R)18<|8lk_M?5HwG;l`$?s~4w(lF1D4%-#P5H{8C*y;I%Bs8vG}EfTqJlQ=%(BKH}bRm`@8RsI?z@K zg~b%V8GEz-_L0?4F29F*eKtSdZ^l0lSKpaM^b$RHa#+Sb?Es7&8ckr z`xpIW_e3E9i8cOn+@XMH*`G!)Rrx!v4|HE(P1FvCJQ8(v+IvqgKRlX(`aVoQG^$yYeD9k_1-$Oi=VcdmR;?RdJ*8PuO*wL6Czp2dhf?w!r!1?B{A;9C z(8qq>m%Lg6-k6*yd~-RnD`2NA@L@|+%ZcIUz9y@L8c@P zCdZZVYhQGnIZ&lpSG^&}-=la|=I?_3VRDq*vt(MJ#?tNM?;h=s9$n@gmu)|pe}3>V zuh)DYdv3n=hdW0)VJbQ&W;!n|DWB>`S2R4By@Rliv_-i?^~2kj7rEPP*n44R$oi5BYaJclft|@n|>vsPlRLS4%qR+QXmthn@`iy5_@6 z_Qg4;=YAPdibst&eZM;N)-Y%+)4qI0XY_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?zvW;$NS#fE(5J*QH>;TO# zqj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~aG}z~@!Q2dSmt873PQXLU zg+O|T!QM`p^A|K=@Suc&?b@)04> jC;!H^NCF;OJ`4N>xriuwM360I00000NkvXXu0mjf67avU literal 0 HcmV?d00001 diff --git a/public/images/statuses_pt_BR.json b/public/images/statuses_pt_BR.json new file mode 100644 index 00000000000..b607991af8f --- /dev/null +++ b/public/images/statuses_pt_BR.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_pt_BR.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_pt_BR.png b/public/images/statuses_pt_BR.png new file mode 100644 index 0000000000000000000000000000000000000000..3073540e8a2a8a03f82d55fea92d339ec62d21ca GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^VnFP`!3-od_m)2fQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`bpw1tTu(HdIFNAQ2M}~*JSYhGQIYT>z+%RM4;>pGoH)_2V~50s4HFhD z=x8yk0qPKN(X9ni{3Stt!T(VJ!<9QT76PR>3p^r=85p>QL70(Y)*K0-BlJ97978Pp zdnb2qI%L4%a(TtpYp4F#zq=dzX~oH<%9B**ENhtSxoL|J8^^5TuxAsUb}4jeS1I){ z|I?1!AXXRGbIHKvUEtBLD?|l#nYqH4x7@DXFngxzr8yg4WW2JOD8>|6^qf7hmI2OGZKVy_l#eiWJ_a=%fXscL%d{$o#T6GUGwSABjt$1-6X z58IsgsY-0A=KB@vd=I>y`e^FP3eAY?ImaSW#3O!hTpA2ivE{qrjoA_+rV|2d*g-b* zJq}-^B))uq^r@Rh5(Yo47s%iE>FVdQ&MBb@08Px=4*&oF literal 0 HcmV?d00001 diff --git a/public/images/statuses_zh_CN.json b/public/images/statuses_zh_CN.json new file mode 100644 index 00000000000..28760650ecd --- /dev/null +++ b/public/images/statuses_zh_CN.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_zh_CN.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_zh_CN.png b/public/images/statuses_zh_CN.png new file mode 100644 index 0000000000000000000000000000000000000000..d372b989be966007e5fccac5f54fe341457e598b GIT binary patch literal 441 zcmV;q0Y?6bP)_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?zvW;$NS#fE(5J*QH>;TO# zqj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~aG}z~@!Q2dSmt873PQXLU zg+O|T!QM`p^A|K=@Suc&?b@)04> jC;!H^NCF;OJ`4N>xriuwM360I00000NkvXXu0mjf67avU literal 0 HcmV?d00001 diff --git a/public/images/statuses_zh_TW.json b/public/images/statuses_zh_TW.json new file mode 100644 index 00000000000..bf05b2ab0d5 --- /dev/null +++ b/public/images/statuses_zh_TW.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_zh_TW.png b/public/images/statuses_zh_TW.png new file mode 100644 index 0000000000000000000000000000000000000000..d372b989be966007e5fccac5f54fe341457e598b GIT binary patch literal 441 zcmV;q0Y?6bP)_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?zvW;$NS#fE(5J*QH>;TO# zqj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~aG}z~@!Q2dSmt873PQXLU zg+O|T!QM`p^A|K=@Suc&?b@)04> jC;!H^NCF;OJ`4N>xriuwM360I00000NkvXXu0mjf67avU literal 0 HcmV?d00001 diff --git a/src/loading-scene.ts b/src/loading-scene.ts index d0818aa1e19..c3cb494d497 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -241,12 +241,15 @@ export class LoadingScene extends SceneBase { const lang = i18next.resolvedLanguage; if (lang !== "en") { if (Utils.verifyLang(lang)) { + this.loadAtlas(`statuses_${lang}`, ""); this.loadAtlas(`types_${lang}`, ""); } else { // Fallback to English + this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } } else { + this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"]; diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 8e7e5bc4060..4fac75932ae 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -162,7 +162,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.splicedIcon); - this.statusIndicator = this.scene.add.sprite(0, 0, "statuses"); + this.statusIndicator = this.scene.add.sprite(0, 0, `statuses_${i18next.resolvedLanguage}`); this.statusIndicator.setName("icon_status"); this.statusIndicator.setVisible(false); this.statusIndicator.setOrigin(0, 0); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index a793dad6a73..b5c9e76bf8c 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1272,7 +1272,7 @@ class PartySlot extends Phaser.GameObjects.Container { } if (this.pokemon.status) { - const statusIndicator = this.scene.add.sprite(0, 0, "statuses"); + const statusIndicator = this.scene.add.sprite(0, 0, `statuses_${i18next.resolvedLanguage}`); statusIndicator.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase()); statusIndicator.setOrigin(0, 0); statusIndicator.setPositionRelative(slotLevelLabel, this.slotIndex >= battlerCount ? 43 : 55, 0); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 8ae72f08edd..d3796a096b9 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -214,7 +214,7 @@ export default class SummaryUiHandler extends UiHandler { this.statusContainer.add(statusLabel); - this.status = this.scene.add.sprite(91, 4, "statuses"); + this.status = this.scene.add.sprite(91, 4, `statuses_${i18next.resolvedLanguage}`); this.status.setOrigin(0.5, 0); this.statusContainer.add(this.status); From 128df1b6d2902e72aabc35f12c81ddf33f36d096 Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Mon, 16 Sep 2024 21:19:34 +0200 Subject: [PATCH 09/11] [QoL] [ui] Make tutorials darken background (#4283) * [ui] add prompt icon to the message boxes that don't have it * [ui] add background overlay during tutorials * add missing doc * Improve documentation based on suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/overrides.ts | 2 + src/tutorial.ts | 105 ++++++++++++++++++++++------ src/ui/awaitable-ui-handler.ts | 18 +++++ src/ui/battle-message-ui-handler.ts | 7 +- src/ui/egg-gacha-ui-handler.ts | 4 +- src/ui/evolution-scene-handler.ts | 7 +- src/ui/menu-ui-handler.ts | 6 ++ src/ui/message-ui-handler.ts | 19 ++++- src/ui/starter-select-ui-handler.ts | 7 ++ 9 files changed, 140 insertions(+), 35 deletions(-) diff --git a/src/overrides.ts b/src/overrides.ts index 6b550d152c2..ec0577ceb3d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -70,6 +70,8 @@ class DefaultOverrides { [PokeballType.MASTER_BALL]: 0, }, }; + /** Set to `true` to show all tutorials */ + readonly BYPASS_TUTORIAL_SKIP: boolean = false; // ---------------- // PLAYER OVERRIDES diff --git a/src/tutorial.ts b/src/tutorial.ts index c4482839779..18d8291d227 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -1,7 +1,9 @@ import BattleScene from "./battle-scene"; import AwaitableUiHandler from "./ui/awaitable-ui-handler"; +import UiHandler from "./ui/ui-handler"; import { Mode } from "./ui/ui"; import i18next from "i18next"; +import Overrides from "#app/overrides"; export enum Tutorial { Intro = "INTRO", @@ -39,7 +41,7 @@ const tutorialHandlers = { scene.ui.showText(i18next.t("tutorial:starterSelect"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); }, - [Tutorial.Pokerus]: (scene: BattleScene) => { + [Tutorial.Pokerus]: (scene: BattleScene) => { return new Promise(resolve => { scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); @@ -63,26 +65,87 @@ const tutorialHandlers = { }, }; -export function handleTutorial(scene: BattleScene, tutorial: Tutorial): Promise { - return new Promise(resolve => { - if (!scene.enableTutorials) { - return resolve(false); - } +/** + * Run through the specified tutorial if it hasn't been seen before and mark it as seen once done + * This will show a tutorial overlay if defined in the current {@linkcode AwaitableUiHandler} + * The main menu will also get disabled while the tutorial is running + * @param scene the current {@linkcode BattleScene} + * @param tutorial the {@linkcode Tutorial} to play + * @returns a promise with result `true` if the tutorial was run and finished, `false` otherwise + */ +export async function handleTutorial(scene: BattleScene, tutorial: Tutorial): Promise { + if (!scene.enableTutorials && !Overrides.BYPASS_TUTORIAL_SKIP) { + return false; + } - if (scene.gameData.getTutorialFlags()[tutorial]) { - return resolve(false); - } + if (scene.gameData.getTutorialFlags()[tutorial] && !Overrides.BYPASS_TUTORIAL_SKIP) { + return false; + } - const handler = scene.ui.getHandler(); - if (handler instanceof AwaitableUiHandler) { - handler.tutorialActive = true; - } - tutorialHandlers[tutorial](scene).then(() => { - scene.gameData.saveTutorialFlag(tutorial, true); - if (handler instanceof AwaitableUiHandler) { - handler.tutorialActive = false; - } - resolve(true); - }); - }); + const handler = scene.ui.getHandler(); + const isMenuDisabled = scene.disableMenu; + + // starting tutorial, disable menu + scene.disableMenu = true; + if (handler instanceof AwaitableUiHandler) { + handler.tutorialActive = true; + } + + await showTutorialOverlay(scene, handler); + await tutorialHandlers[tutorial](scene); + await hideTutorialOverlay(scene, handler); + + // tutorial finished and overlay gone, re-enable menu, save tutorial as seen + scene.disableMenu = isMenuDisabled; + scene.gameData.saveTutorialFlag(tutorial, true); + if (handler instanceof AwaitableUiHandler) { + handler.tutorialActive = false; + } + + return true; } + +/** + * Show the tutorial overlay if there is one + * @param scene the current BattleScene + * @param handler the current UiHandler + * @returns `true` once the overlay has finished appearing, or if there is no overlay + */ +async function showTutorialOverlay(scene: BattleScene, handler: UiHandler) { + if (handler instanceof AwaitableUiHandler && handler.tutorialOverlay) { + scene.tweens.add({ + targets: handler.tutorialOverlay, + alpha: 0.5, + duration: 750, + ease: "Sine.easeOut", + onComplete: () => { + return true; + } + }); + } else { + return true; + } +} + +/** + * Hide the tutorial overlay if there is one + * @param scene the current BattleScene + * @param handler the current UiHandler + * @returns `true` once the overlay has finished disappearing, or if there is no overlay + */ +async function hideTutorialOverlay(scene: BattleScene, handler: UiHandler) { + if (handler instanceof AwaitableUiHandler && handler.tutorialOverlay) { + scene.tweens.add({ + targets: handler.tutorialOverlay, + alpha: 0, + duration: 500, + ease: "Sine.easeOut", + onComplete: () => { + return true; + } + }); + } else { + return true; + } +} + diff --git a/src/ui/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index 2052c6e2ade..c6dc717aa3a 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -7,6 +7,7 @@ export default abstract class AwaitableUiHandler extends UiHandler { protected awaitingActionInput: boolean; protected onActionInput: Function | null; public tutorialActive: boolean = false; + public tutorialOverlay: Phaser.GameObjects.Rectangle; constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); @@ -24,4 +25,21 @@ export default abstract class AwaitableUiHandler extends UiHandler { return false; } + + /** + * Create a semi transparent overlay that will get shown during tutorials + * @param container the container to add the overlay to + */ + initTutorialOverlay(container: Phaser.GameObjects.Container) { + if (!this.tutorialOverlay) { + this.tutorialOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0x070707); + this.tutorialOverlay.setName("tutorial-overlay"); + this.tutorialOverlay.setOrigin(0, 0); + this.tutorialOverlay.setAlpha(0); + } + + if (container) { + container.add(this.tutorialOverlay); + } + } } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 9a694d50b29..c27c6974192 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -83,12 +83,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.nameBoxContainer.add(this.nameText); messageContainer.add(this.nameBoxContainer); - const prompt = this.scene.add.sprite(0, 0, "prompt"); - prompt.setVisible(false); - prompt.setOrigin(0, 0); - messageContainer.add(prompt); - - this.prompt = prompt; + this.initPromptSprite(messageContainer); const levelUpStatsContainer = this.scene.add.container(0, 0); levelUpStatsContainer.setVisible(false); diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 9497dfe58c6..b109eda5370 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -287,7 +287,6 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(this.eggGachaSummaryContainer); const gachaMessageBoxContainer = this.scene.add.container(0, 148); - this.eggGachaContainer.add(gachaMessageBoxContainer); const gachaMessageBox = addWindow(this.scene, 0, 0, 320, 32); gachaMessageBox.setOrigin(0, 0); @@ -301,8 +300,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.message = gachaMessageText; + this.initTutorialOverlay(this.eggGachaContainer); this.eggGachaContainer.add(gachaMessageBoxContainer); + this.initPromptSprite(gachaMessageBoxContainer); + this.setCursor(0); } diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index ffbd06afde3..76d148d083e 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -45,12 +45,7 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.message = message; - const prompt = this.scene.add.sprite(0, 0, "prompt"); - prompt.setVisible(false); - prompt.setOrigin(0, 0); - this.messageContainer.add(prompt); - - this.prompt = prompt; + this.initPromptSprite(this.messageContainer); } show(_args: any[]): boolean { diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index b8c3cfd1364..0af527e518f 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -157,6 +157,9 @@ export default class MenuUiHandler extends MessageUiHandler { menuMessageText.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageText); + this.initTutorialOverlay(this.menuContainer); + this.initPromptSprite(this.menuMessageBoxContainer); + this.message = menuMessageText; // By default we use the general purpose message window @@ -433,6 +436,9 @@ export default class MenuUiHandler extends MessageUiHandler { this.scene.playSound("ui/menu_open"); + // Make sure the tutorial overlay sits above everything, but below the message box + this.menuContainer.bringToTop(this.tutorialOverlay); + this.menuContainer.bringToTop(this.menuMessageBoxContainer); handleTutorial(this.scene, Tutorial.Menu); this.bgmBar.toggleBgmBar(true); diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 93e00cb6b70..54965a590fc 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -17,6 +17,23 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { this.pendingPrompt = false; } + /** + * Add the sprite to be displayed at the end of messages with prompts + * @param container the container to add the sprite to + */ + initPromptSprite(container: Phaser.GameObjects.Container) { + if (!this.prompt) { + const promptSprite = this.scene.add.sprite(0, 0, "prompt"); + promptSprite.setVisible(false); + promptSprite.setOrigin(0, 0); + this.prompt = promptSprite; + } + + if (container) { + container.add(this.prompt); + } + } + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } @@ -180,7 +197,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const lastLineWidth = lastLineTest.displayWidth; lastLineTest.destroy(); if (this.prompt) { - this.prompt.setPosition(lastLineWidth + 2, (textLinesCount - 1) * 18 + 2); + this.prompt.setPosition(this.message.x + lastLineWidth + 2, this.message.y + (textLinesCount - 1) * 18 + 2); this.prompt.play("prompt"); } this.pendingPrompt = false; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 308614887e9..0e101d30ce7 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -894,6 +894,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.message.setOrigin(0, 0); this.starterSelectMessageBoxContainer.add(this.message); + // arrow icon for the message box + this.initPromptSprite(this.starterSelectMessageBoxContainer); + this.statsContainer = new StatsContainer(this.scene, 6, 16); this.scene.add.existing(this.statsContainer); @@ -911,7 +914,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { y: this.scene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, }); this.starterSelectContainer.add(this.moveInfoOverlay); + + // Filter bar sits above everything, except the tutorial overlay and message box this.starterSelectContainer.bringToTop(this.filterBarContainer); + this.initTutorialOverlay(this.starterSelectContainer); + this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); this.scene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, (e) => this.onCandyUpgradeDisplayChanged(e)); From 009fd3fc5c3e180841017c60bcbe51f4ea456617 Mon Sep 17 00:00:00 2001 From: PigeonBar <56974298+PigeonBar@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:30:42 -0400 Subject: [PATCH 10/11] [Bug] Fix reloads erasing weather on first wave of biome (#4078) * [Bug] Fix reloads erasing weather on first wave of biome * Minor revisions * Minor revisions 2 * Update test --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/phases/encounter-phase.ts | 22 +++++++++++----- src/phases/new-biome-encounter-phase.ts | 9 +++++-- src/phases/next-encounter-phase.ts | 6 +++++ src/test/battle/battle.test.ts | 28 ++++++++++++-------- src/test/reload.test.ts | 35 ++++++++++++++++++++++--- src/test/utils/gameManager.ts | 11 +++----- src/test/utils/helpers/reloadHelper.ts | 19 ++++++++++++-- 7 files changed, 98 insertions(+), 32 deletions(-) diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 1d9567ee9b3..012738df9ab 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -216,8 +216,8 @@ export class EncounterPhase extends BattlePhase { this.scene.ui.setMode(Mode.MESSAGE).then(() => { if (!this.loaded) { - //@ts-ignore - this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 300).then(success => { // TODO: get rid of ts-ignore + this.trySetWeatherIfNewBiome(); // Set weather before session gets saved + this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || (this.scene.lastSavePlayTime ?? 0) >= 300).then(success => { this.scene.disableMenu = false; if (!success) { return this.scene.reset(true); @@ -250,10 +250,6 @@ export class EncounterPhase extends BattlePhase { } } - if (!this.loaded) { - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - } - const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), @@ -519,4 +515,18 @@ export class EncounterPhase extends BattlePhase { } return false; } + + /** + * Set biome weather if and only if this encounter is the start of a new biome. + * + * By using function overrides, this should happen if and only if this phase + * is exactly a NewBiomeEncounterPhase or an EncounterPhase (to account for + * Wave 1 of a Daily Run), but NOT NextEncounterPhase (which starts the next + * wave in the same biome). + */ + trySetWeatherIfNewBiome(): void { + if (!this.loaded) { + this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + } + } } diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts index 48d928402de..2a526a22ee2 100644 --- a/src/phases/new-biome-encounter-phase.ts +++ b/src/phases/new-biome-encounter-phase.ts @@ -17,8 +17,6 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { } } - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - for (const pokemon of this.scene.getParty().filter(p => p.isOnField())) { applyAbAttrs(PostBiomeChangeAbAttr, pokemon, null); } @@ -41,4 +39,11 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { } }); } + + /** + * Set biome weather. + */ + trySetWeatherIfNewBiome(): void { + this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + } } diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts index 7de2472dd35..d63823e4167 100644 --- a/src/phases/next-encounter-phase.ts +++ b/src/phases/next-encounter-phase.ts @@ -67,4 +67,10 @@ export class NextEncounterPhase extends EncounterPhase { } }); } + + /** + * Do nothing (since this is simply the next wave in the same biome). + */ + trySetWeatherIfNewBiome(): void { + } } diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 6e15bbd99d9..554692374d2 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -24,7 +24,8 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { Biome } from "#app/enums/biome"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -290,22 +291,27 @@ describe("Test Battle Phase", () => { expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); }, 20000); - it("to next wave with pokemon killed, single", async () => { + it("does not set new weather if staying in same biome", async () => { const moveToUse = Moves.SPLASH; - game.override.battleType("single"); - game.override.starterSpecies(Species.MEWTWO); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(Abilities.HYDRATION); - game.override.ability(Abilities.ZEN_MODE); - game.override.startingLevel(2000); - game.override.startingWave(3); - game.override.moveset([moveToUse]); + game.override + .battleType("single") + .starterSpecies(Species.MEWTWO) + .enemySpecies(Species.RATTATA) + .enemyAbility(Abilities.HYDRATION) + .ability(Abilities.ZEN_MODE) + .startingLevel(2000) + .startingWave(3) + .startingBiome(Biome.LAKE) + .moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - await game.startBattle(); + await game.classicMode.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; game.move.select(moveToUse); + + vi.spyOn(game.scene.arena, "trySetWeather"); await game.doKillOpponents(); await game.toNextWave(); + expect(game.scene.arena.trySetWeather).not.toHaveBeenCalled(); expect(game.scene.currentBattle.waveIndex).toBeGreaterThan(waveIndex); }, 20000); diff --git a/src/test/reload.test.ts b/src/test/reload.test.ts index a96a525ca2d..7c4523dd9ef 100644 --- a/src/test/reload.test.ts +++ b/src/test/reload.test.ts @@ -38,16 +38,15 @@ describe("Reload", () => { it("should not have RNG inconsistencies after a biome switch", async () => { game.override .startingWave(10) - .startingBiome(Biome.CAVE) // Will lead to biomes with randomly generated weather .battleType("single") - .startingLevel(100) - .enemyLevel(1000) + .startingLevel(100) // Avoid levelling up + .enemyLevel(1000) // Avoid opponent dying before game.doKillOpponents() .disableTrainerWaves() .moveset([Moves.KOWTOW_CLEAVE]) .enemyMoveset(Moves.SPLASH); await game.dailyMode.startBattle(); - // Transition from Daily Run Wave 10 to Wave 11 in order to trigger biome switch + // Transition from Wave 10 to Wave 11 in order to trigger biome switch game.move.select(Moves.KOWTOW_CLEAVE); await game.phaseInterceptor.to("DamagePhase"); await game.doKillOpponents(); @@ -63,6 +62,34 @@ describe("Reload", () => { expect(preReloadRngState).toBe(postReloadRngState); }, 20000); + it("should not have weather inconsistencies after a biome switch", async () => { + game.override + .startingWave(10) + .startingBiome(Biome.ICE_CAVE) // Will lead to Snowy Forest with randomly generated weather + .battleType("single") + .startingLevel(100) // Avoid levelling up + .enemyLevel(1000) // Avoid opponent dying before game.doKillOpponents() + .disableTrainerWaves() + .moveset([Moves.KOWTOW_CLEAVE]) + .enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle(); // Apparently daily mode would override the biome + + // Transition from Wave 10 to Wave 11 in order to trigger biome switch + game.move.select(Moves.KOWTOW_CLEAVE); + await game.phaseInterceptor.to("DamagePhase"); + await game.doKillOpponents(); + await game.toNextWave(); + expect(game.phaseInterceptor.log).toContain("NewBiomeEncounterPhase"); + + const preReloadWeather = game.scene.arena.weather; + + await game.reload.reloadSession(); + + const postReloadWeather = game.scene.arena.weather; + + expect(postReloadWeather).toStrictEqual(preReloadWeather); + }, 20000); + it("should not have RNG inconsistencies at a Daily run wild Pokemon fight", async () => { await game.dailyMode.startBattle(); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 452956ab466..36423c5e18f 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -31,7 +31,6 @@ import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { Button } from "#enums/buttons"; import { ExpNotification } from "#enums/exp-notification"; -import { GameDataType } from "#enums/game-data-type"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; @@ -371,13 +370,11 @@ export default class GameManager { * @returns A promise that resolves with the exported save data. */ exportSaveToTest(): Promise { + const saveKey = "x0i2O7WRiANTqPmZ"; return new Promise(async (resolve) => { - await this.scene.gameData.saveAll(this.scene, true, true, true, true); - this.scene.reset(true); - await waitUntil(() => this.scene.ui?.getMode() === Mode.TITLE); - await this.scene.gameData.tryExportData(GameDataType.SESSION, 0); - await waitUntil(() => localStorage.hasOwnProperty("toExport")); - return resolve(localStorage.getItem("toExport")!); // TODO: is this bang correct?; + const sessionSaveData = this.scene.gameData.getSessionSaveData(this.scene); + const encryptedSaveData = AES.encrypt(JSON.stringify(sessionSaveData), saveKey).toString(); + resolve(encryptedSaveData); }); } diff --git a/src/test/utils/helpers/reloadHelper.ts b/src/test/utils/helpers/reloadHelper.ts index c15347b08c9..e0e538120cc 100644 --- a/src/test/utils/helpers/reloadHelper.ts +++ b/src/test/utils/helpers/reloadHelper.ts @@ -5,11 +5,27 @@ import { vi } from "vitest"; import { BattleStyle } from "#app/enums/battle-style"; import { CommandPhase } from "#app/phases/command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { SessionSaveData } from "#app/system/game-data"; +import GameManager from "../gameManager"; /** * Helper to allow reloading sessions in unit tests. */ export class ReloadHelper extends GameManagerHelper { + sessionData: SessionSaveData; + + constructor(game: GameManager) { + super(game); + + // Whenever the game saves the session, save it to the reloadHelper instead + vi.spyOn(game.scene.gameData, "saveAll").mockImplementation((scene) => { + return new Promise((resolve, reject) => { + this.sessionData = scene.gameData.getSessionSaveData(scene); + resolve(true); + }); + }); + } + /** * Simulate reloading the session from the title screen, until reaching the * beginning of the first turn (equivalent to running `startBattle()`) for @@ -17,7 +33,6 @@ export class ReloadHelper extends GameManagerHelper { */ async reloadSession() : Promise { const scene = this.game.scene; - const sessionData = scene.gameData.getSessionSaveData(scene); const titlePhase = new TitlePhase(scene); scene.clearPhaseQueue(); @@ -25,7 +40,7 @@ export class ReloadHelper extends GameManagerHelper { // Set the last saved session to the desired session data vi.spyOn(scene.gameData, "getSession").mockReturnValue( new Promise((resolve, reject) => { - resolve(sessionData); + resolve(this.sessionData); }) ); scene.unshiftPhase(titlePhase); From 3ed2c74f38e808c271f9c64d35e323ae0fb52232 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 16 Sep 2024 18:44:03 -0400 Subject: [PATCH 11/11] [Enhancement] Add Met Wave to Pokemon Data (#4271) Co-authored-by: Lugiad Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Chapybara-jp --- src/field/pokemon.ts | 6 ++++++ src/locales/de/pokemon-summary.json | 2 +- src/locales/en/pokemon-summary.json | 2 +- src/locales/es/pokemon-summary.json | 4 ++-- src/locales/fr/pokemon-summary.json | 2 +- src/locales/it/pokemon-summary.json | 4 ++-- src/locales/ja/pokemon-summary.json | 2 +- src/locales/ko/pokemon-summary.json | 2 +- src/locales/pt_BR/pokemon-summary.json | 2 +- src/locales/zh_TW/pokemon-summary.json | 2 +- src/system/pokemon-data.ts | 7 ++++--- src/ui/summary-ui-handler.ts | 1 + 12 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 9c8c1e6ce46..ed36bcfe4b3 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -95,6 +95,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public metLevel: integer; public metBiome: Biome | -1; public metSpecies: Species; + public metWave: number; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -194,6 +195,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.luck = dataSource.luck; this.metBiome = dataSource.metBiome; this.metSpecies = dataSource.metSpecies ?? (this.metBiome !== -1 ? this.species.speciesId : this.species.getRootSpeciesId(true)); + this.metWave = dataSource.metWave ?? (this.metBiome === -1 ? -1 : 0); this.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; this.evoCounter = dataSource.evoCounter ?? 0; @@ -240,6 +242,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; this.metSpecies = species.speciesId; + this.metWave = scene.currentBattle ? scene.currentBattle.waveIndex : -1; this.pokerus = false; if (level > 1) { @@ -4081,6 +4084,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.metLevel = this.metLevel; newPokemon.metBiome = this.metBiome; newPokemon.metSpecies = this.metSpecies; + newPokemon.metWave = this.metWave; newPokemon.fusionSpecies = this.fusionSpecies; newPokemon.fusionFormIndex = this.fusionFormIndex; newPokemon.fusionAbilityIndex = this.fusionAbilityIndex; @@ -4088,6 +4092,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; + newPokemon.usedTMs = this.usedTMs; this.scene.getParty().push(newPokemon); newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); @@ -4779,6 +4784,7 @@ export class EnemyPokemon extends Pokemon { this.pokeball = pokeballType; this.metLevel = this.level; this.metBiome = this.scene.arena.biomeType; + this.metWave = this.scene.currentBattle.waveIndex; this.metSpecies = this.species.speciesId; const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); diff --git a/src/locales/de/pokemon-summary.json b/src/locales/de/pokemon-summary.json index 1790c6878b9..3104fc10151 100644 --- a/src/locales/de/pokemon-summary.json +++ b/src/locales/de/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Abbrechen", "memoString": "Wesen: {{natureFragment}}\n{{metFragment}}", "metFragment": { - "normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.", + "normal": "Herkunft: {{biome}} - Welle {{wave}}\nMit Lv. {{level}} erhalten.", "apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten." }, "natureFragment": { diff --git a/src/locales/en/pokemon-summary.json b/src/locales/en/pokemon-summary.json index 80e0cdab010..458fad0efe0 100644 --- a/src/locales/en/pokemon-summary.json +++ b/src/locales/en/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Cancel", "memoString": "{{natureFragment}} nature,\n{{metFragment}}", "metFragment": { - "normal": "met at Lv{{level}},\n{{biome}}.", + "normal": "met at Lv{{level}},\n{{biome}}, Wave {{wave}}.", "apparently": "apparently met at Lv{{level}},\n{{biome}}." }, "natureFragment": { diff --git a/src/locales/es/pokemon-summary.json b/src/locales/es/pokemon-summary.json index e47335c8394..fe33c9418cc 100644 --- a/src/locales/es/pokemon-summary.json +++ b/src/locales/es/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Salir", "memoString": "Naturaleza {{natureFragment}},\n{{metFragment}}", "metFragment": { - "normal": "encontrado al Nv. {{level}},\n{{biome}}.", + "normal": "encontrado al Nv. {{level}},\n{{biome}}, Oleada {{wave}}.", "apparently": "aparentemente encontrado al Nv. {{level}},\n{{biome}}." } -} \ No newline at end of file +} diff --git a/src/locales/fr/pokemon-summary.json b/src/locales/fr/pokemon-summary.json index 01e712c8468..a038b3a51f9 100644 --- a/src/locales/fr/pokemon-summary.json +++ b/src/locales/fr/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Annuler", "memoString": "{{natureFragment}} de nature,\n{{metFragment}}", "metFragment": { - "normal": "rencontré au N.{{level}},\n{{biome}}.", + "normal": "rencontré au N.{{level}},\n{{biome}}, Vague {{wave}}.", "apparently": "apparemment rencontré au N.{{level}},\n{{biome}}." }, "natureFragment": { diff --git a/src/locales/it/pokemon-summary.json b/src/locales/it/pokemon-summary.json index f6c9290f783..81cd9a278b8 100644 --- a/src/locales/it/pokemon-summary.json +++ b/src/locales/it/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Annulla", "memoString": "Natura {{natureFragment}},\n{{metFragment}}", "metFragment": { - "normal": "incontrato al Lv.{{level}},\n{{biome}}.", + "normal": "incontrato al Lv.{{level}},\n{{biome}}, Onda {{wave}}.", "apparently": "apparentemente incontrato al Lv.{{level}},\n{{biome}}." } -} \ No newline at end of file +} diff --git a/src/locales/ja/pokemon-summary.json b/src/locales/ja/pokemon-summary.json index cf35befe6fd..9465bcd346d 100644 --- a/src/locales/ja/pokemon-summary.json +++ b/src/locales/ja/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "キャンセル", "memoString": "{{natureFragment}}な性格。\n{{metFragment}}", "metFragment": { - "normal": "{{biome}}で\nLv.{{level}}の時に出会った。", + "normal": "ラウンド{{wave}}に{{biome}}で\nLv.{{level}}の時に出会った。", "apparently": "{{biome}}で\nLv.{{level}}の時に出会ったようだ。" }, "natureFragment": { diff --git a/src/locales/ko/pokemon-summary.json b/src/locales/ko/pokemon-summary.json index d9119623662..ca4b7a22b65 100644 --- a/src/locales/ko/pokemon-summary.json +++ b/src/locales/ko/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "그만둔다", "memoString": "{{natureFragment}}.\n{{metFragment}}", "metFragment": { - "normal": "{{biome}}에서\n레벨 {{level}}일 때 만났다.", + "normal": "{{biome}}에서 웨이브{{wave}},\n레벨 {{level}}일 때 만났다.", "apparently": "{{biome}}에서\n레벨 {{level}}일 때 만난 것 같다." }, "natureFragment": { diff --git a/src/locales/pt_BR/pokemon-summary.json b/src/locales/pt_BR/pokemon-summary.json index 4c427dbac4f..14b736a0cf2 100644 --- a/src/locales/pt_BR/pokemon-summary.json +++ b/src/locales/pt_BR/pokemon-summary.json @@ -11,7 +11,7 @@ "cancel": "Cancelar", "memoString": "Natureza {{natureFragment}},\n{{metFragment}}", "metFragment": { - "normal": "encontrado no Nv.{{level}},\n{{biome}}.", + "normal": "encontrado no Nv.{{level}},\n{{biome}}, Onda {{wave}}.", "apparently": "aparentemente encontrado no Nv.{{level}},\n{{biome}}." }, "natureFragment": { diff --git a/src/locales/zh_TW/pokemon-summary.json b/src/locales/zh_TW/pokemon-summary.json index ddbbea63a3a..331330f5bdd 100644 --- a/src/locales/zh_TW/pokemon-summary.json +++ b/src/locales/zh_TW/pokemon-summary.json @@ -12,7 +12,7 @@ "memoString": "{{natureFragment}} 性格,\n{{metFragment}}", "metFragment": { - "normal": "met at Lv{{level}},\n{{biome}}.", + "normal": "met at Lv{{level}},\n{{biome}}, Wave {{wave}}.", "apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。" }, "natureFragment": { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 5e6c0d93c8c..0fd90e448a1 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -38,8 +38,9 @@ export default class PokemonData { public status: Status | null; public friendship: integer; public metLevel: integer; - public metBiome: Biome | -1; + public metBiome: Biome | -1; // -1 for starters public metSpecies: Species; + public metWave: number; // 0 for unknown (previous saves), -1 for starters public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -90,14 +91,14 @@ export default class PokemonData { this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; this.metSpecies = source.metSpecies; + this.metWave = source.metWave ?? (this.metBiome === -1 ? -1 : 0); this.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; + this.evoCounter = source.evoCounter ?? 0; } this.pokerus = !!source.pokerus; - this.evoCounter = source.evoCounter ?? 0; - this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; this.fusionAbilityIndex = source.fusionAbilityIndex; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index d3796a096b9..0892bf8ab1b 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -824,6 +824,7 @@ export default class SummaryUiHandler extends UiHandler { metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1? "apparently": "normal"}`, { biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + wave: `${getBBCodeFrag((this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer")), TextStyle.SUMMARY_RED)}${closeFragment}`, }), natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) });