From 1424c5dc2f988431a83d63283d9058cf1e170962 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:38:26 -0400 Subject: [PATCH 01/40] [Sprite] Add rare Skiddo exp back Palette taken from png --- .../images/pokemon/variant/exp/back/672.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/public/images/pokemon/variant/exp/back/672.json b/public/images/pokemon/variant/exp/back/672.json index 8ee91469917..7282ef5e693 100644 --- a/public/images/pokemon/variant/exp/back/672.json +++ b/public/images/pokemon/variant/exp/back/672.json @@ -1,4 +1,20 @@ { + "1": { + "3d3128": "69112a", + "000000": "000000", + "67615b": "9e2c3d", + "615140": "89431b", + "7e6d5a": "b3743e", + "554538": "642509", + "efeded": "f8e2b7", + "beb8b6": "e3a378", + "0e5d58": "8c6859", + "09a77c": "f8f0e2", + "0d8374": "d2af94", + "c16a3f": "321512", + "c6b379": "552d30", + "a8905c": "4b2525" + }, "2": { "3d3128": "161526", "000000": "000000", @@ -15,4 +31,4 @@ "c6b379": "9f5f9b", "a8905c": "854d87" } -} \ No newline at end of file +} From fa1798f30b1269725fab891a789ad9b9cff6d3f5 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:39:49 -0400 Subject: [PATCH 02/40] [Sprite] Add rare Gogoat exp back Palette taken from png --- .../images/pokemon/variant/exp/back/673.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/public/images/pokemon/variant/exp/back/673.json b/public/images/pokemon/variant/exp/back/673.json index be9d3af3965..7e5bc69976d 100644 --- a/public/images/pokemon/variant/exp/back/673.json +++ b/public/images/pokemon/variant/exp/back/673.json @@ -1,4 +1,20 @@ { + "1": { + "3d3128": "5a0e24", + "000000": "000000", + "554538": "471405", + "67615b": "8f2837", + "0d835a": "d2af94", + "0e5d58": "8c6352", + "74593a": "61240a", + "09a766": "f8f0e2", + "cabfbb": "e3a378", + "efeded": "f8e2b7", + "a8905c": "9e4e21", + "c6b379": "ce8648", + "ae492a": "321512", + "c16a3f": "552d30" + }, "2": { "3d3128": "121123", "000000": "000000", @@ -15,4 +31,4 @@ "ae492a": "612c6b", "c16a3f": "9f5f9b" } -} \ No newline at end of file +} From 2022f43e0d7eb7fdc68ef814fb72e511ad5cf3de Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:40:38 -0400 Subject: [PATCH 03/40] Delete public/images/pokemon/variant/exp/back/672_2.png --- .../images/pokemon/variant/exp/back/672_2.png | Bin 28407 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/pokemon/variant/exp/back/672_2.png diff --git a/public/images/pokemon/variant/exp/back/672_2.png b/public/images/pokemon/variant/exp/back/672_2.png deleted file mode 100644 index a51b8cba11f4b5794b69e2b91ad72faeacbf91b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28407 zcmY(q1yodD)c1dBX`~U6kdh8*rInT(LQ+bpp-Wm6r8|dih7u5l2Blj;Kwzk$o1s(Q z>+gM@^?(1YHEWoed(S>|=A3=@{_O7w*LtNyOz?mJ003eYWknqTzzF{LxQ7eAQ`lGE z0X|{BmD7*|fSOpsn>RQBKp6AIeH3ML zxQgUhiIyO5kBYaTquIE3(InK)ZWZdG5+>X0yjnx&|4J0#OhEFjyX#sz@>(Tu3Vq;R z@dcKY2h0!0`3;B1D27OTMu%VXk+YV3p<_4E4U0~sh+G~U)7XgY85STBi++p}{F6>+ z^l;e?upPTGqV#p5t7Vb;BQ7B>;Kb|H&iOmY^ahr2?v-NpF=(Gok@2GI%pfqG82DOj zQ$KU{*~yLyFx|n>YPtP9V!;nY)V6z)1h_tG_BYe%M)ADmE=M9w)G%@!p73uTT;-4i zDVY0@>9o%utiAC$P83h@5L7S|gWA3?R_yK{MY&uOt>=8cV8r|D`H1@d4Qu-s{-hU* zL&fS$>M8Zc{S;qt(&fWsFLE+2NW1%T|64vEN^WI?BFMd1jDjqA3ybzQR#g4U{dIRSo_H^j(!yjN8!HK!=!s`3i8UB zRI)p{I;9WcVcU7Oo5q`*9uJxUVg*F5_B-+`s`q%01@Mc%zy5mP5vR^VQ~X}cN1E>g zheG0vd>;^<$u3y_WcwdAyHc0#8xqKbl-v&{yDym^DR7_q$4mKmA6ESP%;j<9g_w4- zvvH3K8Ji-M<4gLDDRE!C5Y$pnA{=C-`h?0)$I-)_Wa+gFhl_y= zMI&7+`2yKN6lu@#;Sk#9;-x=n;60g`9A-|6DEz9A%JN)qc=Hl|z7$t$RP&KzB|rW0 zs@o+$xG~I7<(c9$&4+C5Y}(4UtfEgsSec!e_c*dx=2_a95(i#dle#@KQeTjVvga@_ za&&0tav5@Aa~@LabN}Y_;4;znDgI*cRPRL3q#~`_FwaNPRT*7IZZ@DCUfHevx=63U zLvJf={F@MD=B0$5go1CKTjUYWni3^X&li-!vUUXLHRoGSE4`0!O&i^&-=4o;ZX0cj z6DtT8^7`AIx5;SN|e@@jw#+eTcyb8^mt&c6%j3$vtnr~7Wg>bSfzop-vS_iWbW$Yimp ze8X!j0Qwf%hnTbSp2)UmwCwoaKK(Z|v>>!UZ{*GRuTH^VHB)HZ$X)^~C)+GO4sE)U(cZ^@? zH5O?AX|_^g-^Y@&x9|oNjx9KUT6_}pEhz3z^o}0mH3l+xJ-AG^uQNF$K&~(sM{ZJ%^ux%97vG;VyC_@q zpT)Ht6K@c1cz^ovGx+CT-uaKHu9Qy!j4}A6gw^;#v~MW1$$oVNH(LyRNWrOQX=52; zIZ#YjRLOr|Kvh7I4=XV5^XW_KQ?{zKH0U*pnD|1`?b&CwQm_I;mC#)AAe&sCeV5J? zU%p~ldEpz$$1`P^*?w_B-ouv3rbPZLTriwB{6Hcv6L<7vJh-S{t)$U$pKqTc8_yZf zIpJWCe?ybCi9MO)xvH1OLiV$CRJKn1kzOaY9$|LLRmoIQ`zu0?xty~n&)M6aW2MHY zx#}t3FUG$Xsuw;M`dl|$7g1L@l$p9`BFaWUE@GoF6It8R^K@qHcW}32t(j29N{Vjc zF}s-LxpKB!wt%xm)69{^5XVu#afeyR>+hz&jB|~@HduHRZ46#Pe!`2&-y7^y^SyrF z-s?OPQvb2u&LN2N8y^q9e-odrsb;+XuZ;Yf)4(0$NUDezJz}Dbj-_*7W;y?eH`?tN z!!;PyeAsBzD%H4E7oFFk?H9=-2Fd0DvkBj9z7FR(j_D8UFHh~vArTCm27F`ujB}4_ z+uZT2lm=o_rBZiWwcZ$LBO<@5)vCRwGnp~9(WeB>Gb9ENJAaxk;s52JMEJD>=*kr=3Btq z3sWb&`hr4=ZIcCw$>ediy_lUx(hq#TA^M6+R{Vwz&KW13>${t*`OM(|2+ya;d9|LC zDV^-Oy|uMEVb!Mg{vb2_xqBsltMj4b&za*5|FNvC^IaL=h0~iF!cm$SGi%e`=2e$6 z_s+oF6})RkNn8e8sm~8TH}gxG?$c$9`J*DPlP3(?s(#K0Ae+Jye;B71~baHq&$I?dOt*7T-gqtdKPvGB$T7 zfvua&mv4GLjw&8Mo>S^$58&XJF}v`&QJG3iFX@rtzB9QVUY+so@VOBZppp{#YjSck zQ4KRM?f7#yzHf8j@#o~$fUersEVWfT$bE@-$LX#m&6`5F>7eF-TP7`V^OE)iyDeGtezu8FSKwR0n*iV`007$-03ewL05mR{&Dzhv z5Aa=-jobl%ko?~RV|+gF27Hs=pZ^QI6TA(7D5{iqtN^_pOrIVFwZ-dP$M z=Io8C#zK;+L%G%jP08~BUEl1R=OP#ETs=>j^fdx7f2E~m;=Y~>{z9&q*#FpmCa;;d zciaNWKXuR(SmkH#Fg09}UT-^6KazR zpyD@|!ON8ya1o%jKIb>mx`#U+pPp#we;l*miiNIqhZ?ak75N-+ARLDk)}X^cH_2=N zV-nzaQowVzWx@cXv#~&a@f95r?#$IEHS}b7k6EL_%Gy!SqvkKhdPGP-cGp0OuTYRQ zvqc*#&XY`Km(!wMKEX4gF^k2^ssDzxtN527@8tRq3OwX>exc|earkwlq1HTqdiIE6yPG&^65yugR%-GCL` z;hCPZp|gn>XCrq3`KR4l-os9f3bYOhPsA$ksYpWq293TdCz!d;NO6Gb=zcQe#$_t^ z@NuJfQzqQ=N{>x0A-wA!NB5EqAQ-U1rwqW~)*2IUDFC zwNeEVZdm<8qtE60d?Q9_N|TLRS!#6-mM7Cz|M0-_Vr?X!u9|-R`?Yx-DI7hjvj#3p zU8ro(+(V`f(Wb^(4;`}e4wb6DXNnW4H5~gW2UGW!v_&)G&f?I`Q~28NI`gYpfi3N~ z57Q;W3xw;srqNWG2d&_L(Xe1UwocYALrh+n-4I`GEeVZ2M1L$bbgDxp^bK7%-HzV)N2}rV8UA`CL#y!i%Y6cP%HQXnJsTF>DLAkYg^o4)%`M5l?R! zItY-Tw>A%E2?v+t_=wM)oVWwQ4923Qx0J>0|Z#-F)8)AkDge0^usE5pFKy*XTQGSz%an2HiMPaAzM9pI#Y zbyeHYxP-e44Z=RzEk;`V%c7|j(QP)pc%9ciSj(={3=a0@rcl{Hdb?!Hk|$6dqoXpR zbs^}ynPgkFGtzG~K&PpnTX*?EXS#t|f68JDb*KN^EZ?MWEeCXeg5uI`&+?ur%_Pvi%cghfGqVk3@5TG$>YmOji#|oIzKd*$ST=xA?Q`|K zGH)u+2%K)j5P#yOI+to=^qslq9sICCjlJm_ z-DHa&X14wsE^m!QnT{zAc4+3zKEp$L`ZZc{8;(6dH6&?NI0wh1SUOaXT?p8eo! zH2B+NScnTGQFgN`GjPmlQlx(A^p_WyNj&S(=qv6hcS(f1?C_~>N5#tMCmU0qc5Nw0 z0l!yL(iydof4Pm(7;9m7ClsV_`5K#+vD}fx1Hsl-SIvr?wW3Cw)<&WiCo5`3QOMe{ z2rZbYyK%k5P_0S6WWYNmW;)>XEX?-<0|RW>lg!)l5pB}F%{Hk9$KEMZJPb+-tb;=H zn_aw%f%71T-%kS8`Q{S&h1(^OH+RSj6PL*FoW@JRSpok!`I3E~#BR&aqr490%1GJ2 z`(-7Mf=Y!DRe$h5(aS=Icia-US%ZS<0MCR!J_#cU;ohU*xMDMP+_683?MC4E$ge|r zjq$aV_MQa-1&O3YjADX7DiT%GGpPCOQ5i9G=2CCZ!_MC%&rR&jg=bUs&2$hkaYt0! z4lkTR@w>;hYPGN0SwgCi6 zPiKzB6mU58roseK<^hvSHql^%F?}=9bt2Z1r_J*3+zgfY{mK|RXZ5Mq$zrGlZ; z130F8;>x=9nD!Fo3W*6g`!}x%W(g}oJ4a76h;uA|OdW1HGa`eLho)`_?M+~^QG<|y zNg7IFM-2Ql|CVnv0nYWXp|y$6UV0>fiQUW&eM5JPcijQ8&mw~EV(+j4WF1Ps6@A9r ztHwre`##&56gX|vV0DO0BieB}j{MeK!@fndnCvm!dE?bTc!#zD0*MyG<|Z#-E@F_) zxD3ui$0iK-l^rhcEcrggamJ5=Mnb>bUVN;Q!hcu$%j?5#Bm8^wH*b1?Hi$$viTE5` z8O-|FkRk$BbR*08e!VxUUFi{nwCxbDaC>c}UN z-{v1yzP0GWY8@R}Mg4b7xaVUo8%`pO%);)L5ccbn;msdBjOu#YY z9*2eNC7Ush$!rTTLZ)GUWV}=k%5)dXc$1hV2?Z2Z%7-+1l|l?oV3p| zFf!?p1u<~QN(NA)VX#6=+_*-D1xx~3T0jeVr^6=EZqOXKtmAlny8dH@b>Y6TH^VSn zkalfMqG=}2^;IaB(9DY0!0pyr_%e-Lx=Ui_0=;9WBRLkUpqCy}_SYc{B`V@iQMWON zdy+|9Hwc)}NVZ2lOhta1pHYJHkuqcDNWl#6KP}kNd8O)mP_~fpSvQ?GM zZsrE;y?uyEMZQHOX!(SKl8Shd?Hrs*UvH(x>U&K~`kAFihZzl2Y%W+3JMv047m!G) zM}&|x49Z3oX7^**8~OEhA)(-Z@%pp4CacttX3B%7lgaMp7?!n8Yig3v#oo787q!*) zRV;sD9i~fDbUD#_VPk8;y&=!U-r}NG&w7Zyb@2}R;4qcjXQ=<}H2FMmcDSh^RmI&E z7o}P6jo(O`VA#~->=V`YQw2FvY6s;ji0sthcwgnGk0bzmHg*?*VQ=aVO~1=Fhc@ib zgSW6vQVM8bU+_@dA#GEL#7Y6YN&}jXzFc1q(~O9QHMm@jj;wV9`$n!iEIoP@9X>eoeWa49u2^fm8!*^D`JtfTwoCbM9H>2qj7(XyJcldC{wQtmuB+>h zo$P70&(;37P@uEg>rQ%Fo85f*^$Wge&9ipe#vNL76iFz3oI4xT8)w0wJCN?v-FLN+7FRA0d|wz3ly!m2&#>w8xY;Ux7L~$=4KWU&lw<~J*%I5n zgvfW^!G2&fGF;teC6N6f-jg!58mL+36PBL8z8c;eylBi2l}@)@g4T7es3QOB4FPc0 z_vwQ%k9Rm1vvfbrHOMsgR_dU<3Z&iV*nf1-M}5QXG<92K{QG*7Cy``1uH;oKe?YX8 zJaFTcLI|b!)Jr^E*VoVRIuDC=f0o05Qy;2bPb7OT&V-kg9=uNrU-@PSH20~n_og-u z#mW)PA5wUmAPd2<*dKKnvUUP2H%ggoTv%(m1|?O!T8pu|lZ>bIb2HEbG0Bbd+)46E zUKQPYW>tg?x%5aOyC5=Lz(+|ViZ@PjrMGK?*-YEp4p^;4Ra&<5kzlMNQJ+|IdTF@D zmYgm78zH^k9=4*Y`_fcCHE!jFB7k67xg=pf2aYKRhI_cWe@8U_v&&(axZ7GWVjGZ! z=9f1*MUSPxVkSMIbKA;KZ`hjxs3kpa_}r!ir6mJVqva~lP3WfTY8QZLpUO`giOV|9Ooal4*J8b594`nN-DU6?LWGioB|*YwN4^kNba zm==VO>UyT|Fn^(lVpO|PWB{D6mx7;*-R9^e8$Ww%j1)?CoqG@rKM4NXc-h`T2umh4VYdpvN;9IFs}riLyad#rCrMP-ruK9 zySot9jPP%=yb`?f9vuxD+4D{fq@I|zO{RIi8Tz0wyymhafa7ELUJ5K>6HNc~P`Eej z*cnTi2EBYOTCY$vyCE!6Dz;ZZuH^xNSopr48qytHbZn2Y(%MB~eo#wCxvD(&$;Sfb z+UY#LdiZjw&rCU8t$d{UMyp`7`P~HlNw87;i!91;zgOXY?Zg4A`YP9QU%@O(y`nqV z5>t3ywCS6-@qW!5<6KqcyOLfdf@mp8;hlgS9@h=F72I|9Fk-))#-WBma&OdBmbrfg zJ~UmGc&Xyb?GL1o|{KM|8p^a5`+k#3%! zS{$#LT*scc4oy-czVUK_0a`d~DEFM`jQf7#8xDrK4pOPV7wE%F^e*FUz%o6JIrlSZ z$;)6dM8zO+|4b0NjuB8s7IvHJp+>n~#W>0^4qr(&1TpUWt^QhGg!@5;QXrw16NEdc79g5l*%Ecll6|4(s^mw5nWp^xhN8;`B*5 zfbFaZu>Sg`KA(Ua;jw~p5WgNj_Cd|atW?dhV*uAUZ)D&a2 z6F7K5_bV#u0HUnjU9~aNES>dt9;erv!;Z^_TG=G~e?rDsH$qLm5+nD2YEuVaX1)OL( zk>oqG?dOww-z7ChZVMsYu>>Z=UJTVP`rj;DfDEb$x7GjFq(n-ugf=}y0*nzsuJy-w zw6L(Mj0)>t)_Mj4BOmW8E--oQ{G9-4+6X#Hl{w{O?j0mz>bu@Qfq?fv42BxK;u;uc z_!64@+hAS#NYozi_+@23zy-n)Bjpc;?QHm?yc7RJt;_@ym&<-51XI!($_UE2WB&XR<*}FABVS=5?e|38t-xj+-_)V<0_=O2-57&7IS2jk49HFYmz%r*x zGcUfXxETujZJTT;I(m}X2>HRynIWEZF~m+R^KykMDdan>c93hRss=M0q1IaYKsH@X zM=7FOWN)}3x--caWOieLTMod{ux$ID=@Oq+@!ZxsH6l)-L?f-7IFH1zM-JmR>X8}n z3RWtI2{Dq=Uj3x%8jaTdwRzy;Fh5oomo`+^&9vM zF>Z0t{~VLarARGg$<7f&qT11sqS{Xc3cv$`u3*D*XVMcf{%30DiIR4SbIhX1R#VT$ zkTWhtih|VnYn~OV@}QX)A~S*)J>rWh`Klk{+B8?!a_}%B5EO%ko?*+X5CVyrYme4q zE11vxKsiR5zKRDoL$FEyde)Pj{@Rs#ZHX^?>|3)cJjKXnptg)`to2A97pU%d|Ipa% znO3>EI+3Qo1|5IgT^upf+jSi5dFG-FfvPkOV$HKweEwVNJ#frW#qOP#5?F^u z49TXl%M2SP?3olk8Pw(;CA-9|%#*$8R zGVsYC^qJ;2i5T;LBYA#tQg8GyE1fuOdhH^jl{v<_wAC|N7@*mI!WUHfep50C8so8Wb!%K3$mRgsTZ`kp;*(=v zp>!dvNeULN*rsi`ep1XSh=EN^u-t9UMI?SRSWTcSyB-c+V9u{pJ}$!e?W%bNBd;0w zBnVNO^~&FVj=J`R=^;hsx>Eg{pT9>xhcxzJzoCET--89R>tT&FFl+AxEvHapK=wb@ z2tJ28dM4%*+8QS!Y}W2*tYA?K-%4F2dZqhP|2j*xTS{53cozK-0cfb+6on}#3&mGPNZMX5$?&J`9tuZ zlQ=rsD6Rna2h04ex+P)aXcCoZxOdG zuF!n`_oqP2%RY9w0r`e;j5vBLqmbjRHGJN;5Hp6*C&EEvAU$$#m38%hVK#y06>g>V zF|~`cNw16ed9{jlIaZ}Qbmm}M`B8+cx^a$Jm1#GgGXrk$8=ml$Yp`CCE28lB;h=8xvF%_Edt!ERg$_bwNk?=T~b;)-e;3F z-H7jgg&o1Cx{*?^*|+!j-DYDedBd7M4v9>dohN4u*4ygZtMUZ07f`gPke6x%YietO zRbnsx28cc|;}+$U7&NWd!Xs!HGgIp@X^%2!Wnn8Vp3~oFK_^20xSE@|mWME3GJnH* zPs{UBxHl^K?y5R36my+s%L6I>A#4Z-;dDrZ8>((SWhauITbehuB8sLX?>%J z@#y$FH#La|q2QuEYo!U|Ngq5hYC0@=c6$9H!m2!R^pL#ToR~OwWLw$WOq-7)4<8Ym zYjnJ{{ljm^4eRW?l^X+)wiBAXBPyZs#YEEUweMicXe*cK%!8UWwym>F8n{dgH!`tbnrKg8O?(Svarc`_2Mk0BM2M1Pl4cp4i&U!1U^anHW#F|9Ez@N zOv3FihWJ-nI<7mC^`-MK(grL|ZBK-B#i%-ZUzR)O8a|0=b#4ua{3W*2{LsASYYm;b z4qdgqKj^UkQ8Ez-L%cdWp4Ne7I==TiIR*IO$Q&Uhf4@6=kK0t9720VkPbrhDWOWGQ z`VkG<&Rskgb>GWR@96kV`-5&LR}8_gi9D@=@1jiZ`-U{RvYSn?;FZd>I~_)>fZm(? zTuxwd^1i1n)s|#+IM={ad`x$w2DXMN)LyJ(X?P@Tbl}ce>doc>*Nr4aMIxDoFQkWL zgUz+K*|n;iGT>;uNqz|=bl0861~^#24MfQ^0V6l(p{(G2%t<)z{8=i#SXo&ikn48J zR2A$oZ3$=ZmQ1Kuuk#fWv%y3;7AIFj~3b*Y*lHEY{6TemN^XWwz9{u>B2 zJ3#h$QagFHC1?Qi*;O?EKM>W^an~1w`PEwsw!_HmmKd|QXwc-A>p+vgg>{UqB4-IA zJ!Q-?KFe4;uNny;`P9(){}858UsE_?DlT2UUYFU z*mECwL{Gnb*@0h?!Ndnb3=_5q5)UJ0j7hMkop~!2@2zdDLRKC#&nowfK+fJM(mNS` z<5@xX6UNjEy5$x7YV=NXc%x2-9133J0#9?u`VBKSJK;!A!=|&$YwShStC>s;(eLwK z@~m5p7~Z>JzEWPR<62qlV@1FC$H&Rq5xBW?^2*(w#a?R1QXt4IZuAwxp4I%qg7CTD z%7^Hm`vx){ZeS^^F38~%VhgR&8tCg}V-5VPE|yG_-5TPrm<6wxe=vDkSl$@DJ78^6;NeU4YA!FZ|FN)6BYokM}5@F>_l)P1x^I zRln0>l|HjUzxgq^xX8|5Z|py;Z%SvrFeQCBJ2(i)m&OI#O8$Ji^f8TAIgg{ewtBT8 zIU;q`e2Nt1;4!xIr{n0f1q0}qy}j1=fjt6an$Oevy|`q?c)i1IetTKt8?(w^K*EC! zwEi=uUW=y55fh;xuSw9qJyGUv)rfXRo%T7D58?tREm#3~G5dyv4VY+Jw*S=vG;aBY zssC1#znSJRrwl}&0`e>60e3zS+9 z?KvdqE!RV4T;(@BCrJytcVfZO!~LoFsZf`m;SaXAayUjm?6zIzroMAQUmpABYYVFA zEL#%YesbB4PI-b}pQLoAniL9__GZG-R1eV=ed7_E=mTrXCi9FfpM7H0uqCYXr8Riw zg5B&?P&rEgpdp#*MKRwT>ud93 z{d`X1fxxmNei-j(=@{~RN$im{DY{vUkvu=fp!I(KL2FI4Gow$rvK` zj3mjmk4&6J%sEGVosXOas0;yn8@NnuxOo1#+$ZG5aL2H$4Rt+45XSBkV%wX_Xk6UA zlZ}8^5Oo@SQtT7k>*UDsrBJFup6KIXy}^xfhQ`}~R2tB-DBJ*Dmn3`5^-{|GJp0kn z-GRh;xZuG*{$oKHBG!P84oASh;gYF>%@ks9ABzbq5I#hkXgJ<|$ro)_{}Swv!vw)0?-g`0HbwqszH_m3Vo1QEQY zO1Yi<;|1I2%q#=D;+(LJ^2d@56?*|I(N6vftCd^@4nXUQbrxrfiz>Mco83fsr^%XP z1}*Gvt_0(PIwdbOHy~EzU?C=OGxw_0o5HO*m@xD^`mh0_BukF(9e z>6lm%)9t#hgHEZ8`JX+2&8+8=qFQDFJ|0Ns2tp1DZY|k`kj|SI^7B&zMQw9ocO9V9 ze$A2jfDtS=f#qrM^NJr%hs)TN+rPyeJ1qaD8F=y&m5!-qxE7pW%(|4 zZ;_+zgHyAqHH@q=@>LXX=jaOFVcR6BpSQL#G{NrhBz$h|qg_S|LAAXUGn(B@+iAp# z{t2<{?z04VTYoP2ol0hRQYA-yDy> z?3dJ@^bPJHQAfJEa4d9l`)L~Z?kL*>wUIEJDlrfe-5&KVc1Jkhxm?iVWj$aVs3MXs zaqJ)94jMB}E*ZU^g4bWn4|H`+X9a9szU(07a6ONe0{1^@^py6N2tf7ppc~9>qZASp zON2eOAIOeJM^-O`1ZXAv?Ojw06ow7#%DAigN!c*4K?9_&e`NWr?Wwi8Z$EIRO8(2F zZp48}D~X&*&1RG=9p2i6i|C2M%1}ja zfy9UvBt}f0O#cxh#LK~?#+DJVY1P*G)%y5&j5Ou7Z{G8w;X90N2IUl6UR;6x+uh)c z>Fu`qaH;BcH;#o%FE%r&PyJGkFm5nV^2`qpMKndJB7IMjrO=~K(6dkU%sOi@fcJm2 zs{F6DP<-%MWVp9kIO5t33aI@1o7XD9{rcutEpouDJ&;6JCX4Dzq*%>atO)KXEv+Yr z8cGwZ|Cbek{KkHM3zZumc#QrmNAy~~HQe)6fMs-uFz!nVU$OrxF(BFD3E1x+R#E3Q z`s7_wjmhb4?)r1{w(viB&?qz^HD*FTj%`ZfH2gmk8f%ll<{8I!T94QPptZ}hV7JBauEXC+g(YA@X0duLYMV#W8q8L^*hC_MX+|t@4F7I2L4Ufw1S(zzX zaVv{&5G&l=&?yOF@7EB#@y}xKoHfs1o7*R*;u%qJ=lr{h&sF-iyK4q4>|z0CL8syk ztv;Ql=FQ!Il3Hnj?=UaXHl_8^{0TT;Kj6-|1}(31`k;39{(USlKSSt&(YD!vYPbl` z)W3us!)xGc#XPfHLUtf(*>PfG3DI81&lwXfbcX+FPPU%di#2XufxST!#Y+-I?( z7^Dl1RKe<(GH&Ho+NFG--CB$JsWeDA{t*zS646XMncPLz>9$4UIcfP2KQTlkDb_};dlPEtBOBkv@*(jKQjMU;38Xz|C`cz<`dU+I7>~~0KqVuk|1+Nue*VG&y8Zx#NG6> z#s^#rRRW^CMHr14PlJu#CSD|{dS(8<8XRh+x3KZ(elib0u zqLl@gN#hGU`k^F;R%RUtSXw&&gb_>w+v*Qy&LVfQjNmcs1ClY4S0Dn(oWpb<;+u%uN zcOg4R{#r*c3~iBglbhwNDJV-+$)6ifQ1hHi;gUNHP_(4t(3tsTIfKAY5j?*B^km6j zs709)Vq~LQv2TRYQfQc*=!`hB-b$oM>!>3G{w3x$K92_sTLe;^K!RYjr}Eg0l{tCd zvgfW^^`nRS`#|)F6afQq>3qXrVcs5pLfKX_F_)ms>4idBWnyiP^8kn8-&_J{&vrKd6egrMLWU_V zYDK^7dB$@Njw)2+A!D5_lXK{`40_;(Q?9eUd|Efdv81moDd%!6=bLw!9D5UT$}5zQ z1(oK0f|wvnrQo^Th@!GnzRC-7smp(x3^d5G1@b`)LXKj<1!=%6TbYWDsHA8*A(!N5 zuFIiDn_-#Dzs{9hdUJ}}y|b$q>{Be<)e)DM66KCK=Dl|0EgG(avxReIxp&U_X07_Nn|-5|MTmZI|hAl~bTCPo4nv|bHPBFxze{{Cyt8eMlVcE(Zs z;bYyqDp1eT$y23j4Q`;LA~O89&4j7pA7Ye(#3b6o>;H((!?TXTYX*#VF}E+)HavO; z<~XzaQj*1=%(zRB@;+!f_|M?d`|&@x6lFZQHbbg&F;fuoe4iE#eM~Udq2R_IRYeWM zA@@?n!yC8KtNdrxsS71nV1{dZ+>thkdt{R})-{BGda4Ou*)M`Ti;(+1pJhFru4#NP z-O$mCd5PJusA`Njb#6g(|o`H``DGHQ^9&5NzyR2n$J+bT?;}4O}PD!R?`S3>7-GuHyx1J~LPH0i+ zsOpC9d>XUvUp?%D}~I!yfXKO#%ybZzPzA?;t3ki(Tl z(Tq4<=SCS@;|_LQK3%nbBMcf@b1LlSREw|-DL}3E5ZrMBWM=EAsaJF%pw@wg58gEe{?;6H&E#zX$2G~7H?T# zooTDFNj(y9IFdgK(^&GnYoxM_%h))b9W z<&y}xba1TQW6bTJ!G5f@S~y1XXY^Nb(NjS7x!o)gyEeEY8bKw@-&>i#6teX(d@xzj z>rjYZik=4&sMr@Kd2aLtl__fpQAwrs#8EeGZwCA5nqb{RmFW&nIx+)i={2_)(Xt<@ z-_y@RpyDkmZ`9vQ{J3sf8SEasj zp1(K?Ngfj6)@rRG4EnO|0YwhgqhGgstH%USNBR-*>V0k?f$Z}40O`!sBek6IzpRBLg?3zNK>bAX z_Pd!L8B@OyRIKcmMXDdM|6m5vZ|hd}Z4MyR@~k+$~l`aQO#|X@)A& zhNhGP@M=-&MGjpG^c=1gRU)CpB~}V9nT`N@EoJD{BO=`Nh$8zV1l4WTCMe_nr;0I4 zSD-bQd_`2D(Onyh+51u>%I;niyr!@vSYGpQa0tf7pTA@U(;7_-!Zp~ggwRaKJr93e zjO$3@>UTQxeAeoW^N$8^Xs&sBDH)+<{S7ns6|qPffEaokc)$m=x}P~WO@k_|sUKF- z-!_mOKj)8;2ObF_-`RNi$~VQQHOIq)eO921CdDA0f1j1b(5xz)XtJguW9LYH`iw z3IW;A2FauF`GYzt23^uA=U!3YT-1CWe^l!*1;$M^ZT|a()j#cNRu2{p4V?&R7gG3os?}aHTFv-j0Z6>Ws)_#( zYM3ac-li#0O^N_B$HljOli2Qw1NnRC=uaYH7pLF*bE>6MqzQD*K_S9qVf=uSfHp@W z2sXZmVJ)>@|2>?R4~AqB34Q8(C||2wF+wM6j+*x3!3gkEU>IW8vj_O3ng{)?8Ahl+ zVEh^U_MYX^l0?MFg-zeRhYXxvDGcQUt*g4pAVsz~nry0FBA??Rl!W;GORldn$kG&E zQHR%O42pZk4$W?I1!63j=lG9Y>YG7cQcTjRrJAd)7^`BrNZ7T5h$ag+k)MJrouikU za<-U|&&U|`Oo?%nx?r~^^$@{Z@;70x3o!yCbT!fJ%;WQnp zLMga2D=#DVM2(AUUzcOS;E`^?7gjR&&k2{=!v^-bL< z$M7i)WJGbI?1)-o7SkfW6&H#G*Y0KW;U#jSVVWh?BbWe)1%OT$-?vv=?^HQ0U$8V} zF>0PMuq7q=v-U`H5bE$$Gz|PI{2~Dk&9eW7Bj9qEfCH+0Y?*(-E&ohAdw%)!po3;H zC0=cn_gXd6?15}fs7lg)dG)1)69qxsU5Ja(+!mHM5H@Y342oE?_<8@E|E8=;+WwHj z$TyP=p{&!mvORPvJmcM>TY5!WE4SNH{FfMIdolZe>z;eor=+yB!KKnT6sc)9Dz(8sd0&(X6)yb~nt0uy zSC$=m>w?}T_JDai)gwkw>uan-If($V*5p%(jEabDRwcga0l^fO$|p}`?olfUpxw2# z{wZ6|pC4@=I#2dw)&Bi=qy~;2Qyb$D#(*5*A?X3K#f#ofd)PyaQ#fb$Dy?q(RMI!x zpBonBV>qh^NKV2pAT!uamHErA?|=QdtIvl_9sIfmxH-Dn$E(R58x4;*OWW)1c>}$V z4i7!wn!jHd;vfQl5n97?R;6@#jTk{{I}H$G1dy^Pd#Jz=p8rHEDz7I+CxFLTEFe62 zFxr0dEZgU7tZ}D71?c=MToUG;rdI$nP+y_Pav&NI>;-)<6%kXI#dz5;Hb8`T_fNDE zsz#0d?LuXf6I=)zx-bD zG4(!e5BF?$l9frY%8C5OUUaL{Z}_1M?w=m4;?goJ6=UOXWvMZsJx^_~NfYsn9aOV1 z;pnD&+)ji8U*3VARgOQh*Ud?=nvQ(B2>Mux9&+^>u41%C#jRS5DgU_tU^oVV#!f5~ z<$0ara6U9WhHFUi?>uo++=*6B=i#=y+pc?_Z2>5U9{Y|x zd~l#sYxeIDRuA?lg#=EV^_pgKT=+Keh%Y=dd%O_UCIa6GtKPCP?U!`@(D^4)L+Vm5M*Bi)5`xpM;oZ{6R z`0s&dkzVhk!R~zyDkoY3PdB|hU<$V}v07&BiF;_p{d;hA1hBlvp1@OT{m|z7`M;{K zb2KX`7-SW?KdO1lEmh*sBUDx6;&%F6qF28(y}umeL?W$GQQwqh3Wu4L3!+ofqU+<9 zANbCl-1YR$zlJ@ZNMwU4I1$i(YgY z-yKi&+yDQzcf&l$$T%{>u|n2|i0pBU5E;ohGK;K3%Q%s}Bbi5tBBM^mv4xDRia6QQ zL1p`0$LDk3_xJui?*8(4ewHC-;K_x-Wm4R_l|* zgY`4Fu>T<`eA&r9eEljZ-xQn&6XveV^O~_BZVTsN= zQtSrojE60jmcg;8pVx1L8A#+5Ec@I!tK@f&0!sYVCobjExHFZiSplN|=0IVx`y2*# zZr6g(+JZr#c1LnYdz%ax6eHWc>vhmtwB5&1?4JNI+xCx{6IZEC+E*J%YaR>q1P=)3 zHa_N1&Cin<{my_JoH{@DcenZ8RHF|Z&5$f;8|jIcLn|)S8cD(dGU#$a4*tVS-vB}7 z9ECoIMPOeg!yK2O$QQb~BqcndYcr`7sGB$}DJ5armNwb;93F=Ho{*$i>EJy*OT!GV z{M8k*06xk_05se^gD^Q)s_W!)`i;kW1KleI6nMRaySp)uUI8M8_X8W3bVR*TJV^SQ zeAfif`)|KT^jbGrmdcAR$)k(Q>CDVqge+MUT3p&haZiu(wvm5n4@lvHFGq4dp-J!l zWQ=^p5Ju|JujMm%%>G=!`6pO6xV%8p%ZHbwc~mw^j7$y>nv(#L8tzslss1H`%8g0+f%ly2EI zDaz5Lr-CYfzaZ}$Nh#F@4>tWZFwstd-&&ijY3y__ut3{Bj1g&B6=|kBVt&kxORBkL#9_o z&nldPo6w=(&SAZ9lYOJ02+KwP?FtS4e)Rtz7kE982jUX2X4R zvj-CRQC02 zQx!FK5DKE`W0HH_if*>87RXR%*|*28u`E#6qCg_s)3EIKH1=Q>3)Z}24AQlqW;U%g zXS3Kp5~Ijpo&i$2dlAw!J}fRy=#M3OcX-tuT|ox@YOWJ&_E+ZWmroV>cK)$c2GOYn zOtS4yGS0Yre!6cZoL6q`A<~}cQ4+Noi;-L?s{&`mcQsn}-Za`<&x70|e|!!t*gSAn zTZ-I)SdQx0>~AGf!F;Fx5x*FTowI#Kf#uBU9`{S8SWUWbY+lv75^L^ti)S7jX33hV z1IX#kk-%r4UIWk#UoG4^WqadpsH14~xn=2zd_wtvFHGj~E>wACYf@Gi#4l zNaht^6EUqP2tBaFZ(oVuVuQIpzyr97E4!qUzP1=Cjkd14gjXOTfmGMRC2g8ks8hOy zSoX3-NO2iSxnd-BcPh)CC8qVZU0C+rb2){Baj>!OL=J4Bp|N^NPC0I&tQS12C=*0m zo|S)lJK!qfWvBryxNR=a3x+VQ-ARfuYb5~>0G$gF?ojBfG{9C1`&T6ic`1d-lK)WB zD}F0JhU&2|S@iQu`Oam9l`+-}WT=HBw`J-F%jrzjay|*Yw1})Ke?sQCcjqbhSJBq@ zT-J8-zA>M-o)t7=&zcJ(ZhvKa>?2&kcbq03zIq{4O?iyBw>mV+EfQA}j5z z`%&L07w~0oa-Kk67EMe%<7)e%=69XEG1-L&S-0FHm}N#hT1$qP$@ST{HHaZ!kPg3v zamMh8OS65AAq^;tvBl7e02gNli@ZyfO!k-$r;?uCy21aJP!9?#n220jb%*TD6he*3 zrs(r&$`fT-(7tko*h|aGDGM%E$xH89Yk>?0P#B5=*yaW5m$`BcDw8Qq@0wpw9v@u%&tlq~Hf*|6Pe50|HF=d_*r2dds zK*Xw48&eKW=wXGT>=JuxDr-&+-O>9eOHdbI{+p`M1}+?pwc}6DK-KQ3_O7oq* z5$Gc`3F1n1s>Tg2ne#8VUC2u&u2koO<99W=$xj2TtVWBgq2rE)0Twqhxrm|C_( zSC~9Nk40twX20<-EpPVfO98uASJ&g7G@z46r0q_mT4OczL!gFo|-fq*_ zSJ5ydcGeolB&xjCVEZRw-&gKXK;gA}f0X8HZe5p0j?%e^b2@O_+M|4W`o}I6!RTex zaVvyzg39^i0Wc9xPK_!3^UAoY^QVU#rMpP_;)L+IIGw6=Lown`jnKK+Bz5;upn%eO;fj>(!6FHV1|lq%hh=rb3LQqQM7C%On3vRUN}yrZc(Ogfy9m zK5SlGQ3xC9C-@mL28juxW|oH2o@T}I-bv;3>E!8EL0w5@0%97`Es#!D z-6@3+9*bUJ>t>Fb2Kj0hCV|WkuwiHY{4!HE z$FE9rb83y{VHK2_4xp)2Wz7sxu~UrzK`9Bhn&u>`5`z(TKI)mf8 zCLl835p#l+WO=LtjrjWTr7O3xq-xH5N)4VY1S>sk)~oQ+K#~iPKMsAOemat)_tGVr z6U8qu{3RAHeFAO%%F~aWI9FRcv~*F#Dp{LR-7>kaW*t6r`dqxRD1BYxLwGK`)>&!DI*Hp=t>0_;o1HAQx%J6jJ z@xtoqh6Se*+7m9zT>s?`;bLJ#MY~4AVp8USId2;zji}?lV1?};21JJ;@>ktp&LAoN zbN;khYO~A|_aSl;+g#vGDkS~L5#poHXU^@ty|IWDQI_H{MyhsywL)Tvh2d)qB|+W} z+8Cxc1BB8z2jUrp&6I0apDe$qd^z~0eldMNl9^(0FO9bBieu`p4}jR<<8_3)8d)U! zSWM>o>+=wFAoeI;591W2oAc{?dGy&Oth4eB7VW-~ZQYK93gt(Ar?fw+d~ZC4E{q;0 zFtQX|n^;Fu3an{6=1}2(^)! z#BqPWXJ6SqJW{WV$P2L2aE%UJ5M9Xm4}S664=Z9qwjbuIj}$mk1BvhogfDb+kLFQha5Rv&~uv|`y;K~P%Gu5y%= zg5f}DPqA?!Hl>y%g87%2=Gp7>=5vA*sVxgB3o60i*Bf$AIQ=&(!YKUYDHA6stOAbT zgbq%=z$=yDd}7xU+P4CnTc+dz$AXBns%=k6p8el?8m_N{W{)d_^*{nVdf%Y>cs?TP zZW6^-3U$y!6iI)hrDJ1zv*g>coCb?XYA5Hj&2M{8%Wf`zRxGXgO3uM70fqUn)q|fB z@C;$=-py3h145nU`*f^~{B<6h77~%Eikr*IB|mZs)v}%%VR0l}T1q(r4esG&lSsMp|Hw+nF~ z@g=NL0nbQO0E1ZDenu#|DJ$Q__iuxk9@RfUPP0Nd3+EfUrFQsoG#o?XNtiLhIVhZw zN??Mupqtflmbjt;9$-3BCS3j#G=RRhh`{;os>j3+>uf}mTG&k0?>hM*q(31AsR!L? zialB7T7cUKg@*6YX18&R$i^l?FobUmc*Afry(P_sbqbD^0;4=<2$n~~&IExi1F(fr zoDN|j^75)v^Kufk>Th6PQ-)vx)D89yT(%t}rjmpy_&6e4`FV#xMdGipzff!rd#mZV zw2=K{e-&(@ugkoP;GMtP0kuN#R6_T!+>fbmVHy%ABpBp4wQMwSKsmISZ5$KFOdi90 z(yauSnmb(NG=oV^1Sy1Ta$MxcqPLtHj3*@gmf=;B(!u#<%w%7#w?9tZZN31?`+uuB z91h>C+y2o`hn4>KK!FSl(~{$n?{-FAV|fn;+;b+#W}oj($C5Sb4%N9j0Z{0(>zLk={zuCu>fARrW%n zx+W#BMVu13pgJ%uUSl>hn6NsSuzV`6U(q$p{!z7lP9cf2asK_C3O3I%nEJuC8TI&M zw{(Mem);5Ojye#KE9)ENbD!w@6DxWh+Dz>rd3}%wBG9?L=KIN#50mR-5`$xGujBh8 z92bUrS=t~8TX|FN`a~<&RdNwP7@e|%_$}k{lcUwFoFq;}4RM6c+g`c>2Gas!I;RQt ziE39_^v->1~TkBUKna$V2l8pqP7X@` zZZ-BsJBS-XlN-WEmrHu&0g#p7LUcML{D7H-u+*Ts}CuEU#ENIf`)I<2f;B@O8& zQ`__Lqk@Ue8lQ{Fx2Bz4l3}i+n}GjtGcyn+t%nhF9`oIp8=4y_af*nK|8U@waLdT1 z{oEWue7y2;5uISVmqZx~sYn)leSV100~5vJ3yQ!P1%6|Ylg$-#O$$zR&(ENZVWia7 zTS-JLW@J6ZLf5HvyL})WofmraM(3|$=z^gE$3qC095?j{po35)bg_WuAY07M3x^Uw8=Zx|MT?H^%<;XJ*y6mfb6j0(f5 zeqRvC7}Ip=#eZ-NDORt4;}~gFobL}_Vf+KUY69YDGP30~4l4!vJ9n~Y15}@$jdx|! z$pr&a^2;}3;cl%rJqcnu9v3e(6vMQJ2O)#>j|x*%Lo9XmDeP0vrrd-Y3@|EPrMXz_ zWp*DhM8@8o4+D?Y7H{-y|AR_6w+Tu1>nGDeq*Q3e!qCeq2ivOcLfP}CPm@QV=ed+@ zy0A_)Pr*l|e1nXU6{aB3>r3Fv=B~|TPtsOEi}l{jw*@wMS?r3l`(0CqPTfw#cL`a)yA?MBkcRzi zC3Mfd0^2x|wlk72Eg(@re_%FWz%|^XsZW_lQEch8$suBq55*8Yg;U<<$TQ7$&F8O% zbCN_B8{#hwVUhdw(az%K#h+B_Co_ywVCI#Iy-7ZN9UC3BaStjKY;}~=VlsO%cI}`{ zq>MD^cWLiYDwp2y6cu=0Y2w!c%cAFqw6|#Ax)ZJM{?&+H0ryVWZ<$%pkbZZS(q6DE ziGSzt{H-{#8DNm21RdPr&6M6a>c!Z1+B~Xt@5dzw^Sq}MnfM_Gje*--CQX(#zAEqQv*&I&3BEyER`tQ<0_%^yme(2ehNd(Edky>? zCz!p!9rJpCZ`mxX*QH%+;aY*=`WwXz5 zMMBqmY%WVGk-a*9Uot`1gk&7@f`0-`6Qoz04^fgt4j5WK|`JGy{- z1wDD+8`pb0L1)4h9bPr(Y_mhS591V-UCj!IkWD_+UR79JRhB<3?vn{KR1YzQr{~lx zXzQ5P(9LIoLv;iJ7hFH#JSBEux@~>NdS5Lh{DOgvnR&Oi6JbonjxzJ45x1$PJz!2+ zs@4oKkXFKpGAZ#+Of|}#iJzT@#9V^6>5Evt?m#PWiNX@aA z_v4mt8Lz`IYfIn6!(#N2u2;=`zN*u!vcgh`*{dJrTp^sgyU`^fxAqUJ^T~DZ5 zQTk*ZfEr@&^dDCII9p+n25U!2aU{p)nR~^FhbzNOC%8J)d2y-gU%@<%q*3E{$aZ}r%3LbJ{W#1MYSqfiZmc+u&R!vxgZUi?_mAt z``dG#wnbpJ6ep?u)tL_#FW{_$`U9Ot3@d@L#6Kn*owmOP`HF{pdxWyRW;bgVdYGe+ zr+!1ws%4M#(vYgS3HYSmonuI#Yc|geI1_P8|hjiLmY4SDB27@}x zSy(Xb5SIp$=0}eiSC{`Wo;Thx@(Eg2^x;Sw z(io5V=!#DDUFJ=%C4$7asH*xqB|0K(Ltccm-dz|w6fBsn)}3&+E0YY`?Pv5AWxAgW z3llj}ZK!Nyv*+?cAxzt^owLpQVb6GB_Y&ZFOljNDCUI#<=)324^}N5DHS!Bj+XaXk zIO5OXXxoUIy2MMC$uUcwPVLfZ)m*_mI;q{Ysv=rX%mETXdqU#ciV2l=I*VZbJZq;T zfCo-V9o~5Wb}?qOYenYa4ZmkyQ;IM7Iq8r7a)-(~jz1$@E?-g1ESTFXFJgamwoGv;0~lOB zxhT?od3JHd+VZ-DIR>+J$F}{7t{E4)YK9g& zVZah_z)=Z^W)euJ>G)w-tzuyD^>SE84gK?&M3IjDo$QR{XS%_sVLtEe^KEa$c6#Na?=3!ySMp&gb^1j;v*Fm zS)6g_WjY$+90JdK@MM(W(gH>+SSipGVo2R+Cj3A21O`Q9K3O>2!a<3} z*@=}+%=xAnm&SDZ&~f7bM=>2qOG@>nBK8emZ2vy_D1n%t@sA=xWr3uKK;@a{hk1@( z-Ty)O_H6}l4Bif}lacR!$b_*tTfwxK4ey-q#R5@D4m}z&!-(cSinC!qzs;WH3t#zX8 z=0WSCdCxSZk-l_8C{>PL?Xb|T<8@wUWqvLNY8blu(y0LlL%+~7e>cb|0>pzNVQVw+ z?*eiPLcgY*0%jSNxg@VveoS41$?QtqZhyLky%9+A{poaAR+hV{fWjd)(l_ zNG!V2aL@%LF@S79*D6Afw3`*0V*%9uN}#1skm+W2m}SV6>ds9fvls*z^d~7hY}n)a z)%j6&Lz(I;!-mqwG=t;_Xc1I0^HG<9xQ0Cap%OXPlyz$nC8j6PK^ZyD#>O z;qvrZD!j@LNH&Pjpp}}_=YJV@awGm}v_(DRAJt7t?#snTwH3n|akt7t!jN^6M6%`* zJ_j!9b)a@vkZF`85)rF{4rY6?lTbhKfv5v|gSKuejf*V?>0_?zb8PHYmAZgz@S{cY z;+rnFY!!q4vmtrLxML|rGij>-l;+7YGVRiL3}8*o>8xo5vXEK})LeWe%}|YMZ{*Vt}iaC$3Za)Uhf#@9gHfJ9@M&wMIJjpU~A zgQ7)74Li#?wlqU>Q+vBPb&r8RM(zU^Zz=Ajecpc*2uw5)FB*F!Kb0}-z6kAIw-=Xx ziyu>SFtY~Fa%m^SQ3!`gJ3svYJ3q)jbrj$><_E@))M%s4k2|0uT@ zO7x7j8#GHGm(FpVb(v%7a|t%AN;Z^E@@gHV1Ofz*rF)XHbib%n;gga)wpQEQe++Zg zUJF|B_$N*TqV{{XcTeT%T^ALjc&W$l6qOS8yx>QZIVm~kwasyqYtVH{)z(LiuH8kl zxLEDDq$1Lnqr%zL!Urx2f52PiN{Om~@fBDYGqPQf-W5RZ9Mwu`jo#vl`fh@GQKmoSsecs*uv(UNMwT5cY6Z=K@ zzdR~s^19CH$2;-8X(>^D%An>jN7{mN5cB|AkkR9Ry(N|H80tsF#%41eWs98$JJWF? zD~~(ueXPD(;v@gM?mKgn?X8ar@paxHD`w}b@CIqL(D%7z!MrM>KE1vv7rL^MyhkKs zRk4vyN2a20$1EE@PU0)5T4vu~+J+9Uy&k`Y`_4kn_x|bGr*lBjFeGyV*dfT>a++n{ z(G}}2-mVV_on6p0*bZ>EPL~pu&_+Q>=4kKW^VyDKOFssmZ4O;t4^FKGmX~jVyJJtt z+rTmCk{Wi#H55i;@<7W%F@Q1%ALgw88saFFtK6A zulw)EMnsmvxgFCrpuO%6sYPGeS$!0E*pwTZxdZko>ruAI^?b$dn^B}#fcs?Lo2Pd81;OCxGtD^@rFDGxm6IwvW8YZb zR0OQOo;XqconizNBPDuCn8HV~1%K=y*>;jC6RwL>)rvVHIS;HQpsM5=vSuir>{Xu{ z#cJ;VlAqMV0gEwVwM0X=8qyWvG*xwhgO?`Od6-7+3wz@Ey!g|)eB>(y1q#p@9i@i% z27q8rk%~yG;5Zqjr07$d=cDHvBNf*BB1(1T_(oON0(T6OxN8$4)>V)EWPQDMn?=I& zjCDix*2Fo{ZIl9PQbv+@d0%EbB1NpYL+xZX5*|ps2Y!_>@}1BK!rZY0~d| zQ2a!+cok+j2D}fCro-!OO;wX*0@%xz^V_B570%vba~@Glx}kyFNv$S8z`Ow_gp1cK zIkm0(dC{)I=MqjKbvubJ0ND+Zn=sPd2ZdK};TL|9Dbo=rp!J*s+aL0OUewqA%n&E~ z|4vNkrExHWU7<#&XoTvjh-98Qx=J4|qK8ydJ{hxFT3;TWw*UnG`l0eWV6-jjQi&JsHKSJcM<@^7JV>gzo; zkoxZQQLpGUiSj;BGAB9rd@SQ7@lUU%pW)Amcn8{0z3b;ZC`z+5@MHBkj!vngI#DU_ zidTbkT|)PJ@z{+oAlTu4BQJFHxFlht11Y#OuXKm3dyF=FfC&>_l0(MiKek zh^ZO@2~(vf9C*67@pUOgVqGptbuS+?aMHm{@e1{+K}w3x1~rYLPE8h}3SpNvS}q{! zG$seY4)6ZZ0g8JR)1pSQG4cKzq^EzB?cBj6r>S3rx6YAFqo$yyph4kq-4p8KQ8Yb~lu< zE8P;haZEl>tJ`)Nvx@fo7bjg+d1B)uB8CX6&UjF%&Gnl8l}b7v)QrI!qrWIFDHFWXV zx4fDhxBWU$WWzU^GT+7P-arb|lZ4zCkV&^NDP$Oe@Kt*3A~va%0{T%-X;)sBVl{3q!U;k z=q}K+l+VX@vs_d}FC_9uDs?D>^D>a48IurU`qWd+RHm+G!09KkU=BN}=TJqK->eXZ z`qX_GG!4E7Gm!U~CxZas0#E)9rDm19>pwd7_IhB#sI12ik`hjJNjkG?}?j#@ErqESEd2f(EST7#Z@0>L9Nh-j`E3Y)&|)|D$@SH`Q&c~ z41N!nWB4vKfX5pLQa#+8-Ro}fuXk{TKCBgh5)kz()7WLWR`1Q1%Tv~PlDd3#d# z4C8iWQWpp?%L|e?%b?JJjmSy(7-&Tb7Pi8oklzG}4Dn|-eCq%^>Kn;A_^_f8eXWj* z#OwW=BJONaO$Ii8NNf+ZtJbpHe*wlQ!yhr_lqpJ@;`@E#h3eTU^^`hikU=%cZ0Bs` zh*a&X-m#A!|8GWkcS+7(Upnj40vR;U_$6+Ws8BwM=OiVvU#XLBUMhxPKG6T4dDpi? zVFnLW;4ct)ozZrM3XfZxP6cA1htvVU8SxRdh^#>4&9HzQbv_bETi38w&d9re`u>35 zX9W9S<4DAMdS~$rylPJ8(vW?dbmEJMn1t6yeWD`bjWU6$Qe|Oa@BaN;*t&a@exS1I zff)K?1gfk-;OCsLljUaMUG0l`P)M6jlRASUFmUSZ?IcZ08HnOnSk$lFsu$Vj#2*)q!AaO From 7895170bc7f461c422e2f5469a8a6892f3ea1e5f Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:40:45 -0400 Subject: [PATCH 04/40] Delete public/images/pokemon/variant/exp/back/673_2.png --- .../images/pokemon/variant/exp/back/673_2.png | Bin 18268 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/pokemon/variant/exp/back/673_2.png diff --git a/public/images/pokemon/variant/exp/back/673_2.png b/public/images/pokemon/variant/exp/back/673_2.png deleted file mode 100644 index be4e73acce41279b55d89e23cdc19dec9677d60d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18268 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 N22WQ%mvv4FO#s|xX;%OM From 6f8c232dba35941baa8f15c90a9eae5aec06394e Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:40:52 -0400 Subject: [PATCH 05/40] Delete public/images/pokemon/variant/exp/back/672_2.json --- .../pokemon/variant/exp/back/672_2.json | 965 ------------------ 1 file changed, 965 deletions(-) delete mode 100644 public/images/pokemon/variant/exp/back/672_2.json diff --git a/public/images/pokemon/variant/exp/back/672_2.json b/public/images/pokemon/variant/exp/back/672_2.json deleted file mode 100644 index 216c213bc12..00000000000 --- a/public/images/pokemon/variant/exp/back/672_2.json +++ /dev/null @@ -1,965 +0,0 @@ -{ - "textures": [ - { - "image": "672_2.png", - "format": "RGBA8888", - "size": { - "w": 282, - "h": 282 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 168, - "w": 41, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 205, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b36f1de558a8fa8ac8b56a9ba43a0dfd:5fe84a3f522e543bfbbfe0837355266b:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } -} \ No newline at end of file From 5034ad836fd81724fcc79417d98368ee3180c3b3 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:40:59 -0400 Subject: [PATCH 06/40] Delete public/images/pokemon/variant/exp/back/673_2.json --- .../pokemon/variant/exp/back/673_2.json | 965 ------------------ 1 file changed, 965 deletions(-) delete mode 100644 public/images/pokemon/variant/exp/back/673_2.json diff --git a/public/images/pokemon/variant/exp/back/673_2.json b/public/images/pokemon/variant/exp/back/673_2.json deleted file mode 100644 index b9c2b2d54e7..00000000000 --- a/public/images/pokemon/variant/exp/back/673_2.json +++ /dev/null @@ -1,965 +0,0 @@ -{ - "textures": [ - { - "image": "673_2.png", - "format": "RGBA8888", - "size": { - "w": 384, - "h": 384 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 124, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 186, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 248, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 248, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 310, - "y": 0, - "w": 62, - "h": 65 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 0, - "y": 65, - "w": 62, - "h": 65 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 65 - }, - "frame": { - "x": 62, - "y": 65, - "w": 62, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - }, - "frame": { - "x": 124, - "y": 65, - "w": 61, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - }, - "frame": { - "x": 124, - "y": 65, - "w": 61, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 185, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 245, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 305, - "y": 65, - "w": 60, - "h": 65 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 65 - }, - "frame": { - "x": 0, - "y": 130, - "w": 60, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 60, - "h": 62 - }, - "frame": { - "x": 60, - "y": 130, - "w": 60, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 60, - "y": 192, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 0, - "y": 195, - "w": 59, - "h": 65 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 179, - "y": 130, - "w": 59, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 130, - "w": 58, - "h": 64 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 130, - "w": 58, - "h": 64 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 238, - "y": 194, - "w": 58, - "h": 64 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 59, - "y": 257, - "w": 58, - "h": 64 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 0, - "y": 260, - "w": 58, - "h": 64 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 58, - "h": 64 - }, - "frame": { - "x": 117, - "y": 257, - "w": 58, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 58, - "h": 62 - }, - "frame": { - "x": 119, - "y": 195, - "w": 58, - "h": 62 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 57, - "h": 64 - }, - "frame": { - "x": 175, - "y": 257, - "w": 57, - "h": 64 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 58, - "h": 62 - }, - "frame": { - "x": 177, - "y": 195, - "w": 58, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 232, - "y": 258, - "w": 57, - "h": 63 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 289, - "y": 258, - "w": 57, - "h": 63 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 296, - "y": 130, - "w": 57, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 57, - "h": 63 - }, - "frame": { - "x": 296, - "y": 193, - "w": 57, - "h": 63 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 56, - "h": 63 - }, - "frame": { - "x": 58, - "y": 321, - "w": 56, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 56, - "h": 63 - }, - "frame": { - "x": 114, - "y": 321, - "w": 56, - "h": 63 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 62 - }, - "frame": { - "x": 170, - "y": 321, - "w": 56, - "h": 62 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 65 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 62 - }, - "frame": { - "x": 226, - "y": 321, - "w": 56, - "h": 62 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:05149e465b79b92adcb764d8f903ce8d:523fbed3890bc743f1863e6db3150ddb:5d92dd5d09b0875a1d8f3606df775958$" - } -} \ No newline at end of file From e286e5a317d149fdb125b9e9dcb5fff3a34f21f1 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 22 Aug 2024 23:42:13 -0400 Subject: [PATCH 07/40] [Sprite] Set Skiddo, Gogoat to variant maps --- public/images/pokemon/variant/_masterlist.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 11578f2e084..f68219d48df 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -9940,12 +9940,12 @@ ], "672": [ 0, - 2, + 1, 1 ], "673": [ 0, - 2, + 1, 1 ], "677": [ @@ -11095,4 +11095,4 @@ 1 ] } -} \ No newline at end of file +} From 443e4bd24cb2af28717b32628f29f9eeb548db27 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 25 Aug 2024 17:40:43 -0700 Subject: [PATCH 08/40] Multi-target damage reduction is now properly calculated (#3734) --- src/field/pokemon.ts | 5 +- src/test/moves/multi_target.test.ts | 207 +++++++++++----------------- 2 files changed, 82 insertions(+), 130 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 23d96c67d25..ff26f65a067 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2075,8 +2075,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); } - const targetCount = getMoveTargets(source, move.id).targets.length; - const targetMultiplier = targetCount > 1 ? 0.75 : 1; // 25% damage debuff on multi-target hits (even if it's immune) + // 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) + const { targets, multiple } = getMoveTargets(source, move.id); + const targetMultiplier = (multiple && targets.length > 1) ? 0.75 : 1; applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index b8c1f67b3df..16ccd5519b1 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -1,7 +1,7 @@ -import { getMoveTargets } from "#app/data/move"; +import { BattlerIndex } from "#app/battle"; import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; import { SPLASH_ONLY } from "#test/utils/testUtils"; @@ -10,7 +10,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const TIMEOUT = 20 * 1000; -describe("Moves - Multi target", () => { +describe("Multi-target damage reduction", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -21,160 +21,111 @@ describe("Moves - Multi target", () => { }); afterEach(() => { - afterTrial(game); + game.phaseInterceptor.restoreOg(); }); beforeEach(() => { - game = beforeTrial(phaserGame); + game = new GameManager(phaserGame); + game.override + .disableCrits() + .battleType("double") + .enemyLevel(100) + .startingLevel(100) + .enemySpecies(Species.POLIWAG) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH); }); - it("2v2 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, false, true), TIMEOUT); + it("should reduce d.gleam damage when multiple enemies but not tackle", async () => { + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); - it("2v2 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, false, true), TIMEOUT); + const [enemy1, enemy2] = game.scene.getEnemyField(); - it("2v1 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, true, true), TIMEOUT); + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase"); - it("2v1 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, true, true), TIMEOUT); + const gleam1 = enemy1.getMaxHp() - enemy1.hp; + enemy1.hp = enemy1.getMaxHp(); - it("1v2 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, true, false, true), TIMEOUT); + await game.phaseInterceptor.to("MoveEndPhase"); - it("1v2 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, true, false, true), TIMEOUT); + const tackle1 = enemy1.getMaxHp() - enemy1.hp; + enemy1.hp = enemy1.getMaxHp(); - it("1v1 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, true, true, false), TIMEOUT); + await game.killPokemon(enemy2); + await game.toNextTurn(); - it("2v2 (immune) - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, false, true, Abilities.LEVITATE), TIMEOUT); + game.move.select(Moves.DAZZLING_GLEAM); + game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); - it("2v2 (immune) - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, false, true, Abilities.LEVITATE), TIMEOUT); + await game.phaseInterceptor.to("MoveEndPhase"); - it("2v2 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, false, true), TIMEOUT); + const gleam2 = enemy1.getMaxHp() - enemy1.hp; + enemy1.hp = enemy1.getMaxHp(); - it("2v2 - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, false, true), TIMEOUT); + await game.phaseInterceptor.to("MoveEndPhase"); + const tackle2 = enemy1.getMaxHp() - enemy1.hp; - it("2v1 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, true, false), TIMEOUT); + // Single target moves don't get reduced + expect(tackle1).toBe(tackle2); + // Moves that target all enemies get reduced if there's more than one enemy + expect(gleam1).toBeLessThanOrEqual(Utils.toDmgValue(gleam2 * 0.75) + 1); + expect(gleam1).toBeGreaterThanOrEqual(Utils.toDmgValue(gleam2 * 0.75) - 1); + }, TIMEOUT); - it("2v1 - target all near enemies - no damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, true, false), TIMEOUT); + it("should reduce earthquake when more than one pokemon other than user is not fainted", async () => { + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); - it("1v2 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, true, false, true), TIMEOUT); + const player2 = game.scene.getParty()[1]; + const [enemy1, enemy2] = game.scene.getEnemyField(); - it("1v2 - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, true, false, true), TIMEOUT); - - it("1v1 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, true, true, false), TIMEOUT); - - it("2v2 (immune) - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, false, true, Abilities.SOUNDPROOF), TIMEOUT); - - it("2v2 (immune) - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, false, true, Abilities.SOUNDPROOF), TIMEOUT); - -}); - -async function checkTargetMultiplier(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldMultiplied: boolean, oppAbility?: Abilities) { - // play an attack and check target count - game.override.enemyAbility(oppAbility ? oppAbility : Abilities.BALL_FETCH); - await game.startBattle(); - - const playerPokemonRepr = game.scene.getPlayerField(); - - killAllyAndEnemy(game, killAlly, killSecondEnemy); - - const targetCount = getMoveTargets(playerPokemonRepr[0], attackMove).targets.length; - const targetMultiplier = targetCount > 1 ? 0.75 : 1; - - if (shouldMultiplied) { - expect(targetMultiplier).toBe(0.75); - } else { - expect(targetMultiplier).toBe(1); - } -} - -async function checkDamageDecrease(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldDecreased: boolean, ability?: Abilities) { - // Tested combination on first turn, 1v1 on second turn - await game.classicMode.runToSummon([Species.EEVEE, Species.EEVEE]); - - if (ability !== undefined) { - game.scene.getPlayerField()[1].abilityIndex = ability; - game.scene.getEnemyField()[1].abilityIndex = ability; - } - - game.move.select(Moves.SPLASH); - game.move.select(Moves.SPLASH, 1); - - - await game.phaseInterceptor.to(TurnEndPhase); - - killAllyAndEnemy(game, killAlly, killSecondEnemy); - await game.toNextTurn(); - - const initialHp = game.scene.getEnemyField()[0].hp; - game.move.select(attackMove); - if (!killAlly) { + game.move.select(Moves.EARTHQUAKE); game.move.select(Moves.SPLASH, 1); - } + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); - await game.phaseInterceptor.to(TurnEndPhase); - const afterHp = game.scene.getEnemyField()[0].hp; + await game.phaseInterceptor.to("MoveEndPhase"); - killAllyAndEnemy(game, true, true); - await game.toNextTurn(); + const damagePlayer2Turn1 = player2.getMaxHp() - player2.hp; + const damageEnemy1Turn1 = enemy1.getMaxHp() - enemy1.hp; - game.scene.getEnemyField()[0].hp = initialHp; + player2.hp = player2.getMaxHp(); + enemy1.hp = enemy1.getMaxHp(); - const initialHp1v1 = game.scene.getEnemyField()[0].hp; - game.move.select(attackMove); + await game.killPokemon(enemy2); + await game.toNextTurn(); - await game.phaseInterceptor.to(TurnEndPhase); - const afterHp1v1 = game.scene.getEnemyField()[0].hp; + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); - if (shouldDecreased) { - expect(initialHp - afterHp).toBeLessThan(0.75 * (initialHp1v1 - afterHp1v1) + 2); - expect(initialHp - afterHp).toBeGreaterThan(0.75 * (initialHp1v1 - afterHp1v1) - 2); - } else { - expect(initialHp - afterHp).toBeLessThan(initialHp1v1 - afterHp1v1 + 2); - expect(initialHp - afterHp).toBeGreaterThan(initialHp1v1 - afterHp1v1 - 2); - } + await game.phaseInterceptor.to("MoveEndPhase"); -} + const damagePlayer2Turn2 = player2.getMaxHp() - player2.hp; + const damageEnemy1Turn2 = enemy1.getMaxHp() - enemy1.hp; -// To simulate the situation where all of the enemies or the player's Pokemons dies except for one. -function killAllyAndEnemy(game: GameManager, killAlly: boolean, killSecondEnemy: boolean) { - if (killAlly) { - leaveOnePlayerPokemon(game); - expect(game.scene.getPlayerField().filter(p => p.isActive()).length).toBe(1); - } - if (killSecondEnemy) { - leaveOneEnemyPokemon(game); - expect(game.scene.getEnemyField().filter(p => p.isActive()).length).toBe(1); - } -} + enemy1.hp = enemy1.getMaxHp(); -function leaveOnePlayerPokemon(game: GameManager) { - const playerPokemons = game.scene.getParty(); - for (let i = 1; i < playerPokemons.length; i++) { - playerPokemons[i].hp = 0; - } - expect(playerPokemons.filter(pokemon => pokemon.hp > 0).length).toBe(1); -} + // Turn 1: 3 targets, turn 2: 2 targets + // Both should have damage reduction + expect(damageEnemy1Turn1).toBe(damageEnemy1Turn2); + expect(damagePlayer2Turn1).toBe(damagePlayer2Turn2); -function leaveOneEnemyPokemon(game: GameManager) { - const enemyPokemons = game.scene.getEnemyParty(); - for (let i = 1; i < enemyPokemons.length; i++) { - enemyPokemons[i].hp = 0; - } -} + await game.killPokemon(player2); + await game.toNextTurn(); -function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { - const game = new GameManager(phaserGame); - game.override - .battleType("double") - .moveset([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]) - .ability(Abilities.BALL_FETCH) - .passiveAbility(Abilities.UNNERVE) - .enemyMoveset(SPLASH_ONLY) - .disableCrits() - .startingLevel(50) - .enemyLevel(40) - .enemySpecies(Species.EEVEE); - return game; -} + game.move.select(Moves.EARTHQUAKE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); -function afterTrial(game: GameManager) { - game.phaseInterceptor.restoreOg(); -} + await game.phaseInterceptor.to("MoveEndPhase"); + + const damageEnemy1Turn3 = enemy1.getMaxHp() - enemy1.hp; + // Turn 3: 1 target, should be no damage reduction + expect(damageEnemy1Turn1).toBeLessThanOrEqual(Utils.toDmgValue(damageEnemy1Turn3 * 0.75) + 1); + expect(damageEnemy1Turn1).toBeGreaterThanOrEqual(Utils.toDmgValue(damageEnemy1Turn3 * 0.75) - 1); + }, TIMEOUT); +}); From 0221c9fabad05c134e1c3d2c19fc0c50a2310a7d Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sun, 25 Aug 2024 19:11:01 -0700 Subject: [PATCH 09/40] [Ability][Move] Rewrite Type Resolution and Effectiveness Calculation Functions (#3704) * Make type/category read-only * Fix protean/libero tests * Refactor Pokemon type effectiveness calculation * Merge getMoveEffectiveness and getAttackMoveEffectiveness * Move priority-blocking ability check * Fix incorrect early stopping implementation in MultiHitAttr * Fix Aerilate, etc. affecting variable-type moves * Thunder Wave now respects Attack type immunities * Use final move types for pre-defend abilities * Steal some things from flx's PR hehe * Fix Thousand Arrows + "No effect" messages * Fix status type effectiveness check * Another status move effectiveness update + some docs * changing status logic again... * Fix unnecessary "No Effect" message for Volt Absorb, etc * Add type effectiveness unit test * Add Galvanize integration tests * Add multi-hit test to galvanize tests * Add power check to first Galvanize test * Add missing doc line Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> * Resolve torranx's nits * Apply suggestions from Kev's code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * More suggestions I missed Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Optimize effectiveness test and make others more stylish (#3) * Resolve Kev's remaining nits and some test issues --------- Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: flx-sta Co-authored-by: frutescens --- src/data/ability.ts | 69 ++++---- src/data/move.ts | 202 +++++++++++++-------- src/field/pokemon.ts | 234 +++++++++++++------------ src/phases/move-effect-phase.ts | 2 - src/test/abilities/galvanize.test.ts | 133 ++++++++++++++ src/test/abilities/libero.test.ts | 6 +- src/test/abilities/protean.test.ts | 6 +- src/test/moves/effectiveness.test.ts | 70 ++++++++ src/test/moves/tera_blast.test.ts | 21 ++- src/test/moves/thunder_wave.test.ts | 102 +++++++++++ src/ui/challenges-select-ui-handler.ts | 2 +- src/ui/fight-ui-handler.ts | 17 +- src/ui/starter-select-ui-handler.ts | 6 +- src/ui/summary-ui-handler.ts | 20 ++- src/utils.ts | 9 + 15 files changed, 648 insertions(+), 251 deletions(-) create mode 100644 src/test/abilities/galvanize.test.ts create mode 100644 src/test/moves/effectiveness.test.ts create mode 100644 src/test/moves/thunder_wave.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index a4b27fb2899..d947bcddd99 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -8,7 +8,7 @@ import { Weather, WeatherType } from "./weather"; import { BattlerTag, GroundedTag, GulpMissileTag, SemiInvulnerableTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit } from "./move"; +import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "./move"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { Stat, getStatName } from "./pokemon-stat"; import { BerryModifier, PokemonHeldItemModifier } from "../modifier/modifier"; @@ -349,7 +349,7 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) { return false; } - if (attacker !== pokemon && move.type === this.immuneType) { + if (attacker !== pokemon && attacker.getMoveType(move) === this.immuneType) { (args[0] as Utils.NumberHolder).value = 0; return true; } @@ -372,7 +372,8 @@ export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { * Example: Levitate */ applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (move.category !== MoveCategory.STATUS) { + // this is a hacky way to fix the Levitate/Thousand Arrows interaction, but it works for now... + if (move.category !== MoveCategory.STATUS && !move.hasAttr(NeutralDamageAgainstFlyingTypeMultiplierAttr)) { return super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); } return false; @@ -392,6 +393,7 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Utils.toDmgValue(pokemon.getMaxHp() / 4), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + cancelled.value = true; // Suppresses "No Effect" message } return true; } @@ -415,7 +417,7 @@ class TypeImmunityStatChangeAbAttr extends TypeImmunityAbAttr { const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); if (ret) { - cancelled.value = true; + cancelled.value = true; // Suppresses "No Effect" message if (!simulated) { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); } @@ -440,7 +442,7 @@ class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); if (ret) { - cancelled.value = true; + cancelled.value = true; // Suppresses "No Effect" message if (!simulated) { pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); } @@ -456,8 +458,8 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { } applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (move instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.type, attacker) < 2) { - cancelled.value = true; + if (move instanceof AttackMove && pokemon.getAttackTypeEffectiveness(pokemon.getMoveType(move), attacker) < 2) { + cancelled.value = true; // Suppresses "No Effect" message (args[0] as Utils.NumberHolder).value = 0; return true; } @@ -764,7 +766,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { if (simulated) { return true; } - const type = move.type; + const type = attacker.getMoveType(move); const pokemonTypes = pokemon.getTypes(true); if (pokemonTypes.length !== 1 || pokemonTypes[0] !== type) { pokemon.summonData.types = [ type ]; @@ -1212,7 +1214,7 @@ export class FieldMultiplyBattleStatAbAttr extends AbAttr { } -export class MoveTypeChangeAttr extends PreAttackAbAttr { +export class MoveTypeChangeAbAttr extends PreAttackAbAttr { constructor( private newType: Type, private powerMultiplier: number, @@ -1221,11 +1223,14 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr { super(true); } + // TODO: Decouple this into two attributes (type change / power boost) applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if (this.condition && this.condition(pokemon, defender, move)) { - move.type = this.newType; if (args[0] && args[0] instanceof Utils.NumberHolder) { - args[0].value *= this.powerMultiplier; + args[0].value = this.newType; + } + if (args[1] && args[1] instanceof Utils.NumberHolder) { + args[1].value *= this.powerMultiplier; } return true; } @@ -1257,22 +1262,12 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { attr instanceof CopyMoveAttr ) ) { - // TODO remove this copy when phase order is changed so that damage, type, category, etc. - // TODO are all calculated prior to playing the move animation. - const moveCopy = new Move(move.id, move.type, move.category, move.moveTarget, move.power, move.accuracy, move.pp, move.chance, move.priority, move.generation); - moveCopy.attrs = move.attrs; + const moveType = pokemon.getMoveType(move); - // Moves like Weather Ball ignore effects of abilities like Normalize and Refrigerate - if (move.findAttr(attr => attr instanceof VariableMoveTypeAttr)) { - applyMoveAttrs(VariableMoveTypeAttr, pokemon, null, moveCopy); - } else { - applyPreAttackAbAttrs(MoveTypeChangeAttr, pokemon, null, moveCopy); - } - - if (pokemon.getTypes().some((t) => t !== moveCopy.type)) { + if (pokemon.getTypes().some((t) => t !== moveType)) { if (!simulated) { - this.moveType = moveCopy.type; - pokemon.summonData.types = [moveCopy.type]; + this.moveType = moveType; + pokemon.summonData.types = [moveType]; pokemon.updateInfo(); } @@ -2978,16 +2973,20 @@ function getAnticipationCondition(): AbAttrCondition { return (pokemon: Pokemon) => { for (const opponent of pokemon.getOpponents()) { for (const move of opponent.moveset) { - // move is super effective - if (move!.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move!.getMove().type, opponent, true) >= 2) { // TODO: is this bang correct? + // ignore null/undefined moves + if (!move) { + continue; + } + // the move's base type (not accounting for variable type changes) is super effective + if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent, true) >= 2) { return true; } // move is a OHKO - if (move?.getMove().hasAttr(OneHitKOAttr)) { + if (move.getMove().hasAttr(OneHitKOAttr)) { return true; } // edge case for hidden power, type is computed - if (move?.getMove().id === Moves.HIDDEN_POWER) { + if (move.getMove().id === Moves.HIDDEN_POWER) { const iv_val = Math.floor(((opponent.ivs[Stat.HP] & 1) +(opponent.ivs[Stat.ATK] & 1) * 2 +(opponent.ivs[Stat.DEF] & 1) * 4 @@ -5019,7 +5018,7 @@ export function initAbilities() { .conditionalAttr(pokemon => pokemon.status ? pokemon.status.effect === StatusEffect.PARALYSIS : false, BattleStatMultiplierAbAttr, BattleStat.SPD, 2) .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), BattleStatMultiplierAbAttr, BattleStat.SPD, 1.5), new Ability(Abilities.NORMALIZE, 4) - .attr(MoveTypeChangeAttr, Type.NORMAL, 1.2, (user, target, move) => { + .attr(MoveTypeChangeAbAttr, Type.NORMAL, 1.2, (user, target, move) => { return ![Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST].includes(move.id); }), new Ability(Abilities.SNIPER, 4) @@ -5260,7 +5259,7 @@ export function initAbilities() { new Ability(Abilities.STRONG_JAW, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5), new Ability(Abilities.REFRIGERATE, 6) - .attr(MoveTypeChangeAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL), + .attr(MoveTypeChangeAbAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SWEET_VEIL, 6) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(UserFieldBattlerTagImmunityAbAttr, BattlerTagType.DROWSY) @@ -5283,11 +5282,11 @@ export function initAbilities() { new Ability(Abilities.TOUGH_CLAWS, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 1.3), new Ability(Abilities.PIXILATE, 6) - .attr(MoveTypeChangeAttr, Type.FAIRY, 1.2, (user, target, move) => move.type === Type.NORMAL), + .attr(MoveTypeChangeAbAttr, Type.FAIRY, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.GOOEY, 6) .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), BattleStat.SPD, -1, false), new Ability(Abilities.AERILATE, 6) - .attr(MoveTypeChangeAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL), + .attr(MoveTypeChangeAbAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.PARENTAL_BOND, 6) .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) @@ -5359,11 +5358,11 @@ export function initAbilities() { new Ability(Abilities.LONG_REACH, 7) .attr(IgnoreContactAbAttr), new Ability(Abilities.LIQUID_VOICE, 7) - .attr(MoveTypeChangeAttr, Type.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), + .attr(MoveTypeChangeAbAttr, Type.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), new Ability(Abilities.TRIAGE, 7) .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.hasFlag(MoveFlags.TRIAGE_MOVE), 3), new Ability(Abilities.GALVANIZE, 7) - .attr(MoveTypeChangeAttr, Type.ELECTRIC, 1.2, (user, target, move) => move.type === Type.NORMAL), + .attr(MoveTypeChangeAbAttr, Type.ELECTRIC, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SURGE_SURFER, 7) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), BattleStatMultiplierAbAttr, BattleStat.SPD, 2), new Ability(Abilities.SCHOOLING, 7) diff --git a/src/data/move.ts b/src/data/move.ts index 78ddd790f75..f20d19723a8 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -9,7 +9,7 @@ import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAbAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability"; import { allAbilities } from "./ability"; import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier"; import { BattlerIndex, BattleType } from "../battle"; @@ -113,9 +113,8 @@ type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; export default class Move implements Localizable { public id: Moves; public name: string; - public type: Type; - public defaultType: Type; - public category: MoveCategory; + private _type: Type; + private _category: MoveCategory; public moveTarget: MoveTarget; public power: integer; public accuracy: integer; @@ -133,9 +132,8 @@ export default class Move implements Localizable { this.id = id; this.nameAppend = ""; - this.type = type; - this.defaultType = type; - this.category = category; + this._type = type; + this._category = category; this.moveTarget = defaultMoveTarget; this.power = power; this.accuracy = accuracy; @@ -158,6 +156,13 @@ export default class Move implements Localizable { this.localize(); } + get type() { + return this._type; + } + get category() { + return this._category; + } + localize(): void { const i18nKey = Moves[this.id].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join("") as unknown as string; @@ -733,7 +738,7 @@ export default class Move implements Localizable { const power = new Utils.NumberHolder(this.power); const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); - applyPreAttackAbAttrs(MoveTypeChangeAttr, source, target, this, simulated, typeChangeMovePowerMultiplier); + applyPreAttackAbAttrs(MoveTypeChangeAbAttr, source, target, this, true, null, typeChangeMovePowerMultiplier); const sourceTeraType = source.getTeraType(); if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !source.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { @@ -1083,15 +1088,12 @@ export class PreMoveMessageAttr extends MoveAttr { } } -export class StatusMoveTypeImmunityAttr extends MoveAttr { - public immuneType: Type; - - constructor(immuneType: Type) { - super(false); - - this.immuneType = immuneType; - } -} +/** + * Attribute for Status moves that take attack type effectiveness + * into consideration (i.e. {@linkcode https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) | Thunder Wave}) + * @extends MoveAttr + */ +export class RespectAttackTypeImmunityAttr extends MoveAttr { } export class IgnoreOpponentStatChangesAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -1851,19 +1853,11 @@ export class MultiHitAttr extends MoveAttr { * @returns True */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - let hitTimes: integer; + const hitType = new Utils.NumberHolder(this.multiHitType); + applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); + this.multiHitType = hitType.value; - if (target.getAttackMoveEffectiveness(user, new PokemonMove(move.id)) === 0) { - // If there is a type immunity, the attack will stop no matter what - hitTimes = 1; - } else { - const hitType = new Utils.IntegerHolder(this.multiHitType); - applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); - this.multiHitType = hitType.value; - hitTimes = this.getHitCount(user, target); - } - - (args[0] as Utils.IntegerHolder).value = hitTimes; + (args[0] as Utils.NumberHolder).value = this.getHitCount(user, target); return true; } @@ -3762,7 +3756,7 @@ export class VariableMoveCategoryAttr extends MoveAttr { export class PhotonGeyserCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const category = (args[0] as Utils.IntegerHolder); + const category = (args[0] as Utils.NumberHolder); if (user.getBattleStat(Stat.ATK, target, move) > user.getBattleStat(Stat.SPATK, target, move)) { category.value = MoveCategory.PHYSICAL; @@ -3775,7 +3769,7 @@ export class PhotonGeyserCategoryAttr extends VariableMoveCategoryAttr { export class TeraBlastCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const category = (args[0] as Utils.IntegerHolder); + const category = (args[0] as Utils.NumberHolder); if (user.isTerastallized() && user.getBattleStat(Stat.ATK, target, move) > user.getBattleStat(Stat.SPATK, target, move)) { category.value = MoveCategory.PHYSICAL; @@ -3791,18 +3785,21 @@ export class TeraBlastCategoryAttr extends VariableMoveCategoryAttr { * @extends VariablePowerAttr */ export class TeraBlastPowerAttr extends VariablePowerAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { /** - * @param user {@linkcode Pokemon} Pokemon using the move - * @param target {@linkcode Pokemon} N/A - * @param move {@linkcode Move} {@linkcode Move.TERA_BLAST} - * @param {any[]} args N/A - * @returns true or false + * Sets Tera Blast's power to 100 if the user is terastallized with + * the Stellar tera type. + * @param user {@linkcode Pokemon} the Pokemon using this move + * @param target n/a + * @param move {@linkcode Move} the Move with this attribute (i.e. Tera Blast) + * @param args + * - [0] {@linkcode Utils.NumberHolder} the applied move's power, factoring in + * previously applied power modifiers. + * @returns */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - if (user.isTerastallized() && move.type === Type.STELLAR) { - //200 instead of 100 to reflect lack of stellar being 2x dmg on any type - power.value = 200; + if (user.isTerastallized() && user.getTeraType() === Type.STELLAR) { + power.value = 100; return true; } @@ -3862,10 +3859,15 @@ export class VariableMoveTypeAttr extends MoveAttr { export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.ARCEUS) || [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.SILVALLY)) { const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; // TODO: is this bang correct? - move.type = Type[Type[form]]; + moveType.value = Type[Type[form]]; return true; } @@ -3875,24 +3877,29 @@ export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.GENESECT)) { const form = user.species.speciesId === Species.GENESECT ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Shock Drive - move.type = Type.ELECTRIC; + moveType.value = Type.ELECTRIC; break; case 2: // Burn Drive - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case 3: // Chill Drive - move.type = Type.ICE; + moveType.value = Type.ICE; break; case 4: // Douse Drive - move.type = Type.WATER; + moveType.value = Type.WATER; break; default: - move.type = Type.NORMAL; + moveType.value = Type.NORMAL; break; } return true; @@ -3904,15 +3911,20 @@ export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { export class AuraWheelTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.MORPEKO)) { const form = user.species.speciesId === Species.MORPEKO ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Hangry Mode - move.type = Type.DARK; + moveType.value = Type.DARK; break; default: // Full Belly Mode - move.type = Type.ELECTRIC; + moveType.value = Type.ELECTRIC; break; } return true; @@ -3924,18 +3936,23 @@ export class AuraWheelTypeAttr extends VariableMoveTypeAttr { export class RagingBullTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.PALDEA_TAUROS)) { const form = user.species.speciesId === Species.PALDEA_TAUROS ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Blaze breed - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case 2: // Aqua breed - move.type = Type.WATER; + moveType.value = Type.WATER; break; default: - move.type = Type.FIGHTING; + moveType.value = Type.FIGHTING; break; } return true; @@ -3947,25 +3964,30 @@ export class RagingBullTypeAttr extends VariableMoveTypeAttr { export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.OGERPON)) { const form = user.species.speciesId === Species.OGERPON ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { case 1: // Wellspring Mask case 5: // Wellspring Mask Tera - move.type = Type.WATER; + moveType.value = Type.WATER; break; case 2: // Hearthflame Mask case 6: // Hearthflame Mask Tera - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case 3: // Cornerstone Mask case 7: // Cornerstone Mask Tera - move.type = Type.ROCK; + moveType.value = Type.ROCK; break; case 4: // Teal Mask Tera default: - move.type = Type.GRASS; + moveType.value = Type.GRASS; break; } return true; @@ -3977,22 +3999,27 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { export class WeatherBallTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { switch (user.scene.arena.weather?.weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: - move.type = Type.FIRE; + moveType.value = Type.FIRE; break; case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: - move.type = Type.WATER; + moveType.value = Type.WATER; break; case WeatherType.SANDSTORM: - move.type = Type.ROCK; + moveType.value = Type.ROCK; break; case WeatherType.HAIL: case WeatherType.SNOW: - move.type = Type.ICE; + moveType.value = Type.ICE; break; default: return false; @@ -4015,10 +4042,15 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { * @param user {@linkcode Pokemon} using this move * @param target N/A * @param move N/A - * @param args [0] {@linkcode Utils.IntegerHolder} The move's type to be modified + * @param args [0] {@linkcode Utils.NumberHolder} The move's type to be modified * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if (!user.isGrounded()) { return false; } @@ -4026,16 +4058,16 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { const currentTerrain = user.scene.arena.getTerrainType(); switch (currentTerrain) { case TerrainType.MISTY: - move.type = Type.FAIRY; + moveType.value = Type.FAIRY; break; case TerrainType.ELECTRIC: - move.type = Type.ELECTRIC; + moveType.value = Type.ELECTRIC; break; case TerrainType.GRASSY: - move.type = Type.GRASS; + moveType.value = Type.GRASS; break; case TerrainType.PSYCHIC: - move.type = Type.PSYCHIC; + moveType.value = Type.PSYCHIC; break; default: return false; @@ -4044,8 +4076,17 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { } } +/** + * Changes type based on the user's IVs + * @extends VariableMoveTypeAttr + */ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + const iv_val = Math.floor(((user.ivs[Stat.HP] & 1) +(user.ivs[Stat.ATK] & 1) * 2 +(user.ivs[Stat.DEF] & 1) * 4 @@ -4053,7 +4094,7 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { +(user.ivs[Stat.SPATK] & 1) * 16 +(user.ivs[Stat.SPDEF] & 1) * 32) * 15/63); - move.type = [ + moveType.value = [ Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, @@ -4068,16 +4109,21 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { * @extends VariableMoveTypeAttr */ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { /** - * @param user {@linkcode Pokemon} the user's type is checked + * @param user {@linkcode Pokemon} the user of the move * @param target {@linkcode Pokemon} N/A - * @param move {@linkcode Move} {@linkcode Move.TeraBlastTypeAttr} - * @param {any[]} args N/A - * @returns true or false + * @param move {@linkcode Move} the move with this attribute + * @param args `[0]` the move's type to be modified + * @returns `true` if the move's type was modified; `false` otherwise */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } + if (user.isTerastallized()) { - move.type = user.getTeraType(); //changes move type to tera type + moveType.value = user.getTeraType(); // changes move type to tera type return true; } @@ -4087,14 +4133,18 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { export class MatchUserTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveType = args[0]; + if (!(moveType instanceof Utils.NumberHolder)) { + return false; + } const userTypes = user.getTypes(true); if (userTypes.includes(Type.STELLAR)) { // will not change to stellar type const nonTeraTypes = user.getTypes(); - move.type = nonTeraTypes[0]; + moveType.value = nonTeraTypes[0]; return true; } else if (userTypes.length > 0) { - move.type = userTypes[0]; + moveType.value = userTypes[0]; return true; } else { return false; @@ -4113,8 +4163,8 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; - //When a flying type is hit, the first hit is always 1x multiplier. Levitating pokemon are instantly affected by typing - if (target.isOfType(Type.FLYING) || target.hasAbility(Abilities.LEVITATE)) { + //When a flying type is hit, the first hit is always 1x multiplier. + if (target.isOfType(Type.FLYING)) { multiplier.value = 1; } return true; @@ -6505,7 +6555,7 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(StatusMoveTypeImmunityAttr, Type.GROUND), + .attr(RespectAttackTypeImmunityAttr), new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ff26f65a067..756ee2a44cd 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,7 +3,7 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, OneHitKOAccuracyAttr } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; @@ -22,7 +22,7 @@ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoo import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr } from "../data/ability"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -1208,60 +1208,83 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Calculates the effectiveness of a move against the Pokémon. - * - * @param source - The Pokémon using the move. - * @param move - The move being used. - * @returns The type damage multiplier or 1 if it's a status move + * Calculates the type of a move when used by this Pokemon after + * type-changing move and ability attributes have applied. + * @param move {@linkcode Move} The move being used. + * @param simulated If `true`, prevents showing abilities applied in this calculation. + * @returns the {@linkcode Type} of the move after attributes are applied */ - getMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier { - if (move.getMove().category === MoveCategory.STATUS) { - return 1; - } + getMoveType(move: Move, simulated: boolean = true): Type { + const moveTypeHolder = new Utils.NumberHolder(move.type); - return this.getAttackMoveEffectiveness(source, move, !this.battleData?.abilityRevealed); + applyMoveAttrs(VariableMoveTypeAttr, this, null, move, moveTypeHolder); + applyPreAttackAbAttrs(MoveTypeChangeAbAttr, this, null, move, simulated, moveTypeHolder); + + return moveTypeHolder.value as Type; } + + /** - * Calculates the effectiveness of an attack move against the Pokémon. + * Calculates the effectiveness of a move against the Pokémon. * - * @param source - The attacking Pokémon. - * @param pokemonMove - The move being used by the attacking Pokémon. - * @param ignoreAbility - Whether to check for abilities that might affect type effectiveness or immunity. + * @param source {@linkcode Pokemon} The attacking Pokémon. + * @param move {@linkcode Move} The move being used by the attacking Pokémon. + * @param ignoreAbility Whether to ignore abilities that might affect type effectiveness or immunity (defaults to `false`). + * @param simulated Whether to apply abilities via simulated calls (defaults to `true`) + * @param cancelled {@linkcode Utils.BooleanHolder} Stores whether the move was cancelled by a non-type-based immunity. + * Currently only used by {@linkcode Pokemon.apply} to determine whether a "No effect" message should be shown. * @returns The type damage multiplier, indicating the effectiveness of the move */ - getAttackMoveEffectiveness(source: Pokemon, pokemonMove: PokemonMove, ignoreAbility: boolean = false): TypeDamageMultiplier { - const move = pokemonMove.getMove(); - const typeless = move.hasAttr(TypelessAttr); - const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move, source)); - const cancelled = new Utils.BooleanHolder(false); - applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (!typeless && !ignoreAbility) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, true, typeMultiplier); + getMoveEffectiveness(source: Pokemon, move: Move, ignoreAbility: boolean = false, simulated: boolean = true, cancelled?: Utils.BooleanHolder): TypeDamageMultiplier { + if (move.hasAttr(TypelessAttr)) { + return 1; } - if (!cancelled.value && !ignoreAbility) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, true, typeMultiplier); + const moveType = source.getMoveType(move); + + const typeMultiplier = new Utils.NumberHolder((move.category !== MoveCategory.STATUS || move.hasAttr(RespectAttackTypeImmunityAttr)) + ? this.getAttackTypeEffectiveness(moveType, source, false, simulated) + : 1); + + applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); + if (this.getTypes().find(t => move.isTypeImmune(source, this, t))) { + typeMultiplier.value = 0; } - return (!cancelled.value ? Number(typeMultiplier.value) : 0) as TypeDamageMultiplier; + const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false); + if (!ignoreAbility) { + applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + + if (!cancelledHolder.value) { + applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + } + + if (!cancelledHolder.value) { + const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); + defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelledHolder)); + } + } + + const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); + for (const tag of immuneTags) { + if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { + typeMultiplier.value = 0; + break; + } + } + + return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; } /** * Calculates the type effectiveness multiplier for an attack type - * @param moveOrType The move being used, or a type if the move is unknown - * @param source the Pokemon using the move + * @param moveType {@linkcode Type} the type of the move being used + * @param source {@linkcode Pokemon} the Pokemon using the move * @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks) * @param simulated tag to only apply the strong winds effect message when the move is used * @returns a multiplier for the type effectiveness */ - getAttackTypeEffectiveness(moveOrType: Move | Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { - const move = (moveOrType instanceof Move) - ? moveOrType - : undefined; - const moveType = (moveOrType instanceof Move) - ? move!.type // TODO: is this bang correct? - : moveOrType; - + getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { if (moveType === Type.STELLAR) { return this.isTerastallized() ? 2 : 1; } @@ -1281,7 +1304,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (source) { const ignoreImmunity = new Utils.BooleanHolder(false); if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) { - applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, false, moveType, defType); + applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType); } if (ignoreImmunity.value) { return 1; @@ -1303,15 +1326,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.queueMessage(i18next.t("weather:strongWindsEffectMessage")); } } - - const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); - for (const tag of immuneTags) { - if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { - multiplier = 0; - break; - } - } - return multiplier as TypeDamageMultiplier; } @@ -1959,29 +1973,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let result: HitResult; const damage = new Utils.NumberHolder(0); const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); - const variableCategory = new Utils.IntegerHolder(move.category); + const variableCategory = new Utils.NumberHolder(move.category); applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, variableCategory); const moveCategory = variableCategory.value as MoveCategory; - applyMoveAttrs(VariableMoveTypeAttr, source, this, move); - const types = this.getTypes(true, true); + /** The move's type after type-changing effects are applied */ + const moveType = source.getMoveType(move); + /** If `value` is `true`, cancels the move and suppresses "No Effect" messages */ const cancelled = new Utils.BooleanHolder(false); - const power = move.calculateBattlePower(source, this); - const typeless = move.hasAttr(TypelessAttr); - const typeMultiplier = new Utils.NumberHolder(!typeless && (moveCategory !== MoveCategory.STATUS || move.getAttrs(StatusMoveTypeImmunityAttr).find(attr => types.includes(attr.immuneType))) - ? this.getAttackTypeEffectiveness(move, source, false, false) - : 1); - applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (typeless) { - typeMultiplier.value = 1; - } - if (types.find(t => move.isTypeImmune(source, this, t))) { - typeMultiplier.value = 0; - } + /** + * The effectiveness of the move being used. Along with type matchups, this + * accounts for changes in effectiveness from the move's attributes and the + * abilities of both the source and this Pokemon. + */ + const typeMultiplier = this.getMoveEffectiveness(source, move, false, false, cancelled); switch (moveCategory) { case MoveCategory.PHYSICAL: @@ -1989,27 +1997,44 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const isPhysical = moveCategory === MoveCategory.PHYSICAL; const sourceTeraType = source.getTeraType(); - if (!typeless) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier); - applyMoveAttrs(NeutralDamageAgainstFlyingTypeMultiplierAttr, source, this, move, typeMultiplier); - } - if (!cancelled.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, false, typeMultiplier)); - } + const power = move.calculateBattlePower(source, this); if (cancelled.value) { + // Cancelled moves fail silently source.stopMultiHit(this); - result = HitResult.NO_EFFECT; + return HitResult.NO_EFFECT; } else { - const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === move.type) as TypeBoostTag; + const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === moveType) as TypeBoostTag; if (typeBoost?.oneUse) { source.removeTag(typeBoost.tagType); } - const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(move.type, source.isGrounded())); + /** Combined damage multiplier from field effects such as weather, terrain, etc. */ + const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(moveType, source.isGrounded())); applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); + /** + * Whether or not this Pokemon is immune to the incoming move. + * Note that this isn't fully resolved in `getMoveEffectiveness` because + * of possible type-suppressing field effects (e.g. Desolate Land's effect on Water-type attacks). + */ + const isTypeImmune = (typeMultiplier * arenaAttackTypeMultiplier.value) === 0; + if (isTypeImmune) { + // Moves with no effect that were not cancelled queue a "no effect" message before failing + source.stopMultiHit(this); + result = (move.id === Moves.SHEER_COLD) + ? HitResult.IMMUNE + : HitResult.NO_EFFECT; + + if (result === HitResult.IMMUNE) { + this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: this.name })); + } else { + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); + } + + return result; + } + const glaiveRushModifier = new Utils.IntegerHolder(1); if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { glaiveRushModifier.value = 2; @@ -2059,13 +2084,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!isCritical) { this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier); } - const isTypeImmune = (typeMultiplier.value * arenaAttackTypeMultiplier.value) === 0; const sourceTypes = source.getTypes(); - const matchesSourceType = sourceTypes[0] === move.type || (sourceTypes.length > 1 && sourceTypes[1] === move.type); + const matchesSourceType = sourceTypes[0] === moveType || (sourceTypes.length > 1 && sourceTypes[1] === moveType); const stabMultiplier = new Utils.NumberHolder(1); if (sourceTeraType === Type.UNKNOWN && matchesSourceType) { stabMultiplier.value += 0.5; - } else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === move.type) { + } else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { stabMultiplier.value += 0.5; } @@ -2095,7 +2119,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const randomMultiplier = ((this.scene.randBattleSeedInt(16) + 85) / 100); damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value - * typeMultiplier.value + * typeMultiplier * arenaAttackTypeMultiplier.value * screenMultiplier.value * twoStrikeMultiplier.value @@ -2129,7 +2153,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } - if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && move.type === Type.DRAGON) { + if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === Type.DRAGON) { damage.value = Utils.toDmgValue(damage.value / 2); } @@ -2143,22 +2167,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { result = result!; // telling TS compiler that result is defined! if (!result) { - if (!typeMultiplier.value) { - result = move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; + const isOneHitKo = new Utils.BooleanHolder(false); + applyMoveAttrs(OneHitKOAttr, source, this, move, isOneHitKo); + if (isOneHitKo.value) { + result = HitResult.ONE_HIT_KO; + isCritical = false; + damage.value = this.hp; + } else if (typeMultiplier >= 2) { + result = HitResult.SUPER_EFFECTIVE; + } else if (typeMultiplier >= 1) { + result = HitResult.EFFECTIVE; } else { - const isOneHitKo = new Utils.BooleanHolder(false); - applyMoveAttrs(OneHitKOAttr, source, this, move, isOneHitKo); - if (isOneHitKo.value) { - result = HitResult.ONE_HIT_KO; - isCritical = false; - damage.value = this.hp; - } else if (typeMultiplier.value >= 2) { - result = HitResult.SUPER_EFFECTIVE; - } else if (typeMultiplier.value >= 1) { - result = HitResult.EFFECTIVE; - } else { - result = HitResult.NOT_VERY_EFFECTIVE; - } + result = HitResult.NOT_VERY_EFFECTIVE; } } @@ -2225,15 +2245,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case HitResult.NOT_VERY_EFFECTIVE: this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); break; - case HitResult.NO_EFFECT: - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); - break; - case HitResult.IMMUNE: - this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: this.name })); - break; case HitResult.ONE_HIT_KO: this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); break; + case HitResult.IMMUNE: + case HitResult.NO_EFFECT: + console.error("Unhandled move immunity!"); + break; } } @@ -2245,23 +2263,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (damage) { - const attacker = this.scene.getPokemonById(source.id)!; // TODO: is this bang correct? - destinyTag?.lapse(attacker, BattlerTagLapseType.CUSTOM); + destinyTag?.lapse(source, BattlerTagLapseType.CUSTOM); } } break; case MoveCategory.STATUS: - if (!typeless) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier); - } - if (!cancelled.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, false, typeMultiplier)); - } - if (!typeMultiplier.value) { + if (!cancelled.value && typeMultiplier === 0) { this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); } - result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; + result = (typeMultiplier === 0) ? HitResult.NO_EFFECT : HitResult.STATUS; break; } @@ -3918,7 +3928,7 @@ export class EnemyPokemon extends Pokemon { * Attack moves are given extra multipliers to their base benefit score based on * the move's type effectiveness against the target and whether the move is a STAB move. */ - const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove); + const effectiveness = target.getMoveEffectiveness(this, move, !target.battleData?.abilityRevealed); if (target.isPlayer() !== this.isPlayer()) { targetScore *= effectiveness; if (this.isOfType(move.type)) { diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 12018656458..f100a763219 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -311,8 +311,6 @@ export class MoveEffectPhase extends PokemonPhase { } end() { - const move = this.move.getMove(); - move.type = move.defaultType; const user = this.getUserPokemon(); /** * If this phase isn't for the invoked move's last strike, diff --git a/src/test/abilities/galvanize.test.ts b/src/test/abilities/galvanize.test.ts new file mode 100644 index 00000000000..4b0ddc14d7c --- /dev/null +++ b/src/test/abilities/galvanize.test.ts @@ -0,0 +1,133 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { Type } from "#app/data/type"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { HitResult } from "#app/field/pokemon"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Galvanize", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .startingLevel(100) + .ability(Abilities.GALVANIZE) + .moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES]) + .enemySpecies(Species.DUSCLOPS) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(100); + }); + + it("should change Normal-type attacks to Electric type and boost their power", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + const move = allMoves[Moves.TACKLE]; + vi.spyOn(move, "calculateBattlePower"); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.EFFECTIVE); + expect(move.calculateBattlePower).toHaveReturnedWith(48); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }, TIMEOUT); + + it("should cause Normal-type attacks to activate Volt Absorb", async () => { + game.override.enemyAbility(Abilities.VOLT_ABSORB); + + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + enemyPokemon.hp = Math.floor(enemyPokemon.getMaxHp() * 0.8); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, TIMEOUT); + + it("should not change the type of variable-type moves", async () => { + game.override.enemySpecies(Species.MIGHTYENA); + + await game.startBattle([Species.ESPEON]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + game.move.select(Moves.REVELATION_DANCE); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getMoveType).not.toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, TIMEOUT); + + it("should affect all hits of a Normal-type multi-hit move", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveType"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + game.move.select(Moves.FURY_SWIPES); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(playerPokemon.turnData.hitCount).toBeGreaterThan(1); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + + while (playerPokemon.turnData.hitsLeft > 0) { + const enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + + expect(enemyPokemon.apply).not.toHaveReturnedWith(HitResult.NO_EFFECT); + }, TIMEOUT); +}); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 16597e90285..7895e7de6bf 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -76,7 +76,7 @@ describe("Abilities - Libero", () => { expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.LIBERO)).toHaveLength(1); const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].defaultType]; + const moveType = Type[allMoves[Moves.AGILITY].type]; expect(leadPokemonType).not.toBe(moveType); await game.toNextTurn(); @@ -249,7 +249,7 @@ describe("Abilities - Libero", () => { const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - leadPokemon.summonData.types = [allMoves[Moves.SPLASH].defaultType]; + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -357,6 +357,6 @@ function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Mov expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); expect(pokemon.getTypes()).toHaveLength(1); const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].defaultType]; + moveType = Type[allMoves[move].type]; expect(pokemonType).toBe(moveType); } diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index a7c6799132f..6ecabbfade0 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -76,7 +76,7 @@ describe("Abilities - Protean", () => { expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.PROTEAN)).toHaveLength(1); const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].defaultType]; + const moveType = Type[allMoves[Moves.AGILITY].type]; expect(leadPokemonType).not.toBe(moveType); await game.toNextTurn(); @@ -249,7 +249,7 @@ describe("Abilities - Protean", () => { const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - leadPokemon.summonData.types = [allMoves[Moves.SPLASH].defaultType]; + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -357,6 +357,6 @@ function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Mov expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); expect(pokemon.getTypes()).toHaveLength(1); const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].defaultType]; + moveType = Type[allMoves[move].type]; expect(pokemonType).toBe(moveType); } diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts new file mode 100644 index 00000000000..af44586b69d --- /dev/null +++ b/src/test/moves/effectiveness.test.ts @@ -0,0 +1,70 @@ +import { allMoves } from "#app/data/move"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import * as Messages from "#app/messages"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; + +function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, + expected: number, targetAbility: Abilities = Abilities.BALL_FETCH): void { + // Suppress getPokemonNameWithAffix because it calls on a null battle spec + vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); + game.override.enemyAbility(targetAbility); + const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); + const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); + + expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); +} + +describe("Moves - Type Effectiveness", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + game.override.ability(Abilities.BALL_FETCH); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("Normal-type attacks are neutrally effective against Normal-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.SNORLAX, 1) + ); + + it("Normal-type attacks are not very effective against Steel-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.REGISTEEL, 0.5) + ); + + it("Normal-type attacks are doubly resisted by Steel/Rock-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.AGGRON, 0.25) + ); + + it("Normal-type attacks have no effect on Ghost-type Pokemon", + () => testMoveEffectiveness(game, Moves.TACKLE, Species.DUSCLOPS, 0) + ); + + it("Normal-type status moves are not affected by type matchups", + () => testMoveEffectiveness(game, Moves.GROWL, Species.DUSCLOPS, 1) + ); + + it("Electric-type attacks are super-effective against Water-type Pokemon", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.BLASTOISE, 2) + ); + + it("Electric-type attacks are doubly super-effective against Water/Flying-type Pokemon", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 4) + ); + + it("Electric-type attacks are negated by Volt Absorb", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB) + ); +}); diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index d261d4b856b..bd7df8403d1 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -62,9 +62,6 @@ describe("Moves - Tera Blast", () => { it("increases power if user is Stellar tera type", async () => { game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - const stellarTypeMultiplier = 2; - const stellarTypeDmgBonus = 20; - const basePower = moveToCheck.power; await game.startBattle(); @@ -72,9 +69,25 @@ describe("Moves - Tera Blast", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); - expect(moveToCheck.calculateBattlePower).toHaveReturnedWith((basePower + stellarTypeDmgBonus) * stellarTypeMultiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); }, 20000); + it("is super effective against terastallized targets if user is Stellar tera type", async () => { + game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); + + await game.startBattle(); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + vi.spyOn(enemyPokemon, "isTerastallized").mockReturnValue(true); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }); + // Currently abilities are bugged and can't see when a move's category is changed it.skip("uses the higher stat of the user's Atk and SpAtk for damage calculation", async () => { game.override.enemyAbility(Abilities.TOXIC_DEBRIS); diff --git a/src/test/moves/thunder_wave.test.ts b/src/test/moves/thunder_wave.test.ts new file mode 100644 index 00000000000..0c91be29714 --- /dev/null +++ b/src/test/moves/thunder_wave.test.ts @@ -0,0 +1,102 @@ +import { StatusEffect } from "#app/data/status-effect"; +import { Abilities } from "#app/enums/abilities"; +import { EnemyPokemon } from "#app/field/pokemon"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Thunder Wave", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .starterSpecies(Species.PIKACHU) + .moveset([Moves.THUNDER_WAVE]) + .enemyMoveset(SPLASH_ONLY); + }); + + // References: https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) + + it("paralyzes non-statused Pokemon that are not Ground types", async () => { + game.override.enemySpecies(Species.MAGIKARP); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + it("does not paralyze if the Pokemon is a Ground-type", async () => { + game.override.enemySpecies(Species.DIGLETT); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status).toBeUndefined(); + }, TIMEOUT); + + it("does not paralyze if the Pokemon already has a status effect", async () => { + game.override.enemySpecies(Species.MAGIKARP).enemyStatusEffect(StatusEffect.BURN); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + it("affects Ground types if the user has Normalize", async () => { + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.DIGLETT); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).toBe(StatusEffect.PARALYSIS); + }, TIMEOUT); + + it("does not affect Ghost types if the user has Normalize", async () => { + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.HAUNTER); + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDER_WAVE); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status).toBeUndefined(); + }, TIMEOUT); +}); diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index 42e5e902315..f1ba0da6c51 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -143,7 +143,7 @@ export default class GameChallengesUiHandler extends UiHandler { }; } - this.monoTypeValue = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.monoTypeValue = this.scene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); this.monoTypeValue.setName("challenge-value-monotype-sprite"); this.monoTypeValue.setScale(0.86); this.monoTypeValue.setVisible(false); diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 977daf3dc7a..0beaddbb517 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -44,7 +44,7 @@ export default class FightUiHandler extends UiHandler { this.moveInfoContainer.setName("move-info"); ui.add(this.moveInfoContainer); - this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, "unknown"); + this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36, Utils.getLocalizedSpriteKey("types"), "unknown"); this.typeIcon.setVisible(false); this.moveInfoContainer.add(this.typeIcon); @@ -179,15 +179,20 @@ export default class FightUiHandler extends UiHandler { if (hasMove) { const pokemonMove = moveset[cursor]!; // TODO: is the bang correct? - this.typeIcon.setTexture(`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[pokemonMove.getMove().type].toLowerCase()).setScale(0.8); - this.moveCategoryIcon.setTexture("categories", MoveCategory[pokemonMove.getMove().category].toLowerCase()).setScale(1.0); + const moveType = pokemon.getMoveType(pokemonMove.getMove()); + const textureKey = Utils.getLocalizedSpriteKey("types"); + this.typeIcon.setTexture(textureKey, Type[moveType].toLowerCase()).setScale(0.8); + const moveCategory = pokemonMove.getMove().category; + this.moveCategoryIcon.setTexture("categories", MoveCategory[moveCategory].toLowerCase()).setScale(1.0); const power = pokemonMove.getMove().power; const accuracy = pokemonMove.getMove().accuracy; const maxPP = pokemonMove.getMovePp(); const pp = maxPP - pokemonMove.ppUsed; - this.ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); + const ppLeftStr = Utils.padInt(pp, 2, " "); + const ppMaxStr = Utils.padInt(maxPP, 2, " "); + this.ppText.setText(`${ppLeftStr}/${ppMaxStr}`); this.powerText.setText(`${power >= 0 ? power : "---"}`); this.accuracyText.setText(`${accuracy >= 0 ? accuracy : "---"}`); @@ -231,7 +236,7 @@ export default class FightUiHandler extends UiHandler { * Returns undefined if it's a status move */ private getEffectivenessText(pokemon: Pokemon, opponent: Pokemon, pokemonMove: PokemonMove): string | undefined { - const effectiveness = opponent.getMoveEffectiveness(pokemon, pokemonMove); + const effectiveness = opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData?.abilityRevealed); if (effectiveness === undefined) { return undefined; } @@ -274,7 +279,7 @@ export default class FightUiHandler extends UiHandler { } const moveColors = opponents - .map((opponent) => opponent.getMoveEffectiveness(pokemon, pokemonMove)) + .map((opponent) => opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData.abilityRevealed)) .sort((a, b) => b - a) .map((effectiveness) => getTypeDamageMultiplierColor(effectiveness ?? 0, "offense")); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a96434efc65..5c9ce61979f 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -410,7 +410,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (index === 0 || index === 19) { return; } - const typeSprite = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + const typeSprite = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("types")); typeSprite.setScale(0.5); typeSprite.setFrame(type.toLowerCase()); typeOptions.push(new DropDownOption(this.scene, index, new DropDownLabel("", typeSprite))); @@ -668,12 +668,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); this.starterSelectContainer.add(this.pokemonSprite); - this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type1Icon = this.scene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); this.type1Icon.setScale(0.5); this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type2Icon = this.scene.add.sprite(26, 98, Utils.getLocalizedSpriteKey("types")); this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 3b789954f66..e5def3a1961 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -716,7 +716,8 @@ export default class SummaryUiHandler extends UiHandler { const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; const typeIcon = !tera - ? this.scene.add.sprite(xCoord, 42, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[type].toLowerCase()) : this.scene.add.sprite(xCoord, 42, "type_tera"); + ? this.scene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), Type[type].toLowerCase()) + : this.scene.add.sprite(xCoord, 42, "type_tera"); if (tera) { typeIcon.setScale(0.5); const typeRgb = getTypeRgb(type); @@ -934,10 +935,14 @@ export default class SummaryUiHandler extends UiHandler { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.extraMoveRowContainer.setVisible(true); - const newMoveTypeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[this.newMove?.type!].toLowerCase()); // TODO: is this bang correct? - newMoveTypeIcon.setOrigin(0, 1); - this.extraMoveRowContainer.add(newMoveTypeIcon); + if (this.newMove && this.pokemon) { + const spriteKey = Utils.getLocalizedSpriteKey("types"); + const moveType = this.pokemon.getMoveType(this.newMove); + const newMoveTypeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + newMoveTypeIcon.setOrigin(0, 1); + this.extraMoveRowContainer.add(newMoveTypeIcon); + } const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); ppOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(ppOverlay); @@ -956,8 +961,11 @@ export default class SummaryUiHandler extends UiHandler { const moveRowContainer = this.scene.add.container(0, 16 * m); this.moveRowsContainer.add(moveRowContainer); - if (move) { - const typeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[move.getMove().type].toLowerCase()); typeIcon.setOrigin(0, 1); + if (move && this.pokemon) { + const spriteKey = Utils.getLocalizedSpriteKey("types"); + const moveType = this.pokemon.getMoveType(move.getMove()); + const typeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + typeIcon.setOrigin(0, 1); moveRowContainer.add(typeIcon); } diff --git a/src/utils.ts b/src/utils.ts index a9bbc93d684..173ea25b17c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -574,3 +574,12 @@ export function isNullOrUndefined(object: any): boolean { export function toDmgValue(value: number, minValue: number = 1) { return Math.max(Math.floor(value), minValue); } + +/** + * Helper method to localize a sprite key (e.g. for types) + * @param baseKey the base key of the sprite (e.g. `type`) + * @returns the localized sprite key + */ +export function getLocalizedSpriteKey(baseKey: string) { + return `${baseKey}${verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; +} From ff09b31ffb27623b66361e463a6ea0a7903cd4c6 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:42:03 +0900 Subject: [PATCH 10/40] Translate bgm-name.json via GitLocalize (#3770) Co-authored-by: returntoice --- src/locales/ko/bgm-name.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/locales/ko/bgm-name.json b/src/locales/ko/bgm-name.json index 5c35987b878..7b66c136cbd 100644 --- a/src/locales/ko/bgm-name.json +++ b/src/locales/ko/bgm-name.json @@ -45,6 +45,7 @@ "battle_legendary_lake_trio": "ORAS 호수의 수호신 배틀", "battle_legendary_sinnoh": "ORAS 신오 전설 조우 배틀", "battle_legendary_dia_pal": "ORAS 디아루가 & 펄기아 배틀", + "battle_legendary_origin_forme": "LA 오리진 디아루가 & 펄기아 배틀", "battle_legendary_giratina": "ORAS 기라티나 배틀", "battle_legendary_arceus": "HGSS 아르세우스 배틀", "battle_legendary_unova": "BW 하나 전설 조우 배틀", @@ -59,6 +60,7 @@ "battle_legendary_zac_zam": "SWSH 자시안 & 자마젠타 배틀", "battle_legendary_glas_spec": "SWSH 블리자포스 & 레이스포스 배틀", "battle_legendary_calyrex": "SWSH 버드렉스 배틀", + "battle_legendary_riders": "SWSH 백마 & 흑마 버드렉스 배틀", "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", "battle_legendary_ruinous": "SV 재앙의 보물 배틀", "battle_legendary_kor_mir": "SV 에리어 제로 배틀", @@ -135,4 +137,4 @@ "heal": "BW 포켓몬 센터", "menu": "불가사의 던전 하늘의 탐험대 포켓몬 세계에 온 것을 환영한다!", "title": "불가사의 던전 하늘의 탐험대 메뉴 테마" -} \ No newline at end of file +} From 530ed1067f8716039606bd5f71fbbfc4e647091e Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:57:04 +0900 Subject: [PATCH 11/40] Translate menu.json via GitLocalize (#3771) Co-authored-by: Enoch --- src/locales/ko/menu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/locales/ko/menu.json b/src/locales/ko/menu.json index 4369e8baaae..7976e0bedcf 100644 --- a/src/locales/ko/menu.json +++ b/src/locales/ko/menu.json @@ -41,6 +41,7 @@ "score": "점수", "wave": "웨이브", "loading": "로딩 중…", + "loadingAsset": "리소스 로드 중: {{assetName}}", "playersOnline": "플레이어 온라인", "yes": "예", "no": "아니오", @@ -51,4 +52,4 @@ "rename": "닉네임 바꾸기", "nickname": "닉네임", "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다." -} \ No newline at end of file +} From 26376175ae8695e6dabe84d99f484c581ccb6ccd Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:57:53 +0900 Subject: [PATCH 12/40] Translate run-history.json via GitLocalize (#3774) Co-authored-by: Enoch --- src/locales/ko/run-history.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/locales/ko/run-history.json b/src/locales/ko/run-history.json index 387ed5fdeb5..340b0c98439 100644 --- a/src/locales/ko/run-history.json +++ b/src/locales/ko/run-history.json @@ -1,9 +1,9 @@ { "victory": "승리!", - "defeatedWild": "야생에서 패배: ", - "defeatedTrainer": "트레이너에게 패배: ", - "defeatedTrainerDouble": "더블 배틀에서 패배", - "defeatedRival": "라이벌에게 패배", + "defeatedWildM": "야생에서 패배: ", + "defeatedTrainerM": "트레이너에게 패배: ", + "defeatedTrainerDoubleM": "더블 배틀에서 패배", + "defeatedRivalM": "라이벌에게 패배", "defeatedM": "패배", "defeatedWildF": "야생에서 패배: ", "defeatedTrainerF": "트레이너에게 패배: ", @@ -34,4 +34,4 @@ "hallofFameTextF": "전당 등록을 축하합니다!", "viewHallOfFame": "전당 보기", "viewEndingSplash": "엔딩 화면 보기" -} \ No newline at end of file +} From 76e7297596007b3888ebed67fd1540e590b48993 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:17:39 +0200 Subject: [PATCH 13/40] Translate pokemon-info.json via GitLocalize (#3772) Co-authored-by: Leo Kim --- src/locales/ko/pokemon-info.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/locales/ko/pokemon-info.json b/src/locales/ko/pokemon-info.json index d23f90eab6e..1e26af64d0f 100644 --- a/src/locales/ko/pokemon-info.json +++ b/src/locales/ko/pokemon-info.json @@ -13,7 +13,8 @@ "SPD": "스피드", "SPDshortened": "스피드", "ACC": "명중률", - "EVA": "회피율" + "EVA": "회피율", + "HPStat": "HP" }, "Type": { "UNKNOWN": "Unknown", @@ -37,4 +38,4 @@ "FAIRY": "페어리", "STELLAR": "스텔라" } -} \ No newline at end of file +} From 656a8bf646341cb0cf64a63d20d10cefbc8f0cc7 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:22:12 +0800 Subject: [PATCH 14/40] Translate bgm-name.json via GitLocalize (#3736) Co-authored-by: Jannik Tappert --- src/locales/de/bgm-name.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/locales/de/bgm-name.json b/src/locales/de/bgm-name.json index d5f64a93338..2d2a5bfbab3 100644 --- a/src/locales/de/bgm-name.json +++ b/src/locales/de/bgm-name.json @@ -45,6 +45,7 @@ "battle_legendary_lake_trio": "ORAS Vs. Seen-Trio", "battle_legendary_sinnoh": "ORAS Vs. Legendäres Sinnoh Pokémon", "battle_legendary_dia_pal": "ORAS Vs. Dialga & Palkia", + "battle_legendary_origin_forme": "PLA Vs. Urform Dialga & Palkia", "battle_legendary_giratina": "ORAS Vs. Giratina", "battle_legendary_arceus": "HGSS Vs. Arceus", "battle_legendary_unova": "SW Vs. Legendäres Einall Pokémon", @@ -59,6 +60,7 @@ "battle_legendary_zac_zam": "SWSH Vs. Zacian & Zamazenta", "battle_legendary_glas_spec": "SWSH Vs. Polaross & Phantoross", "battle_legendary_calyrex": "SWSH Vs. Coronospa", + "battle_legendary_riders": "SWSH Vs. Schimmelreiter & Rappenreiter Coronospa", "battle_legendary_birds_galar": "SWSH Vs. Legendäre Galar-Vögel", "battle_legendary_ruinous": "KAPU Vs. Schätze des Unheils", "battle_legendary_kor_mir": "KAPU Die Tiefen von Zone Null", @@ -135,4 +137,4 @@ "heal": "SW Pokémon-Heilung", "menu": "PMD Erkundungsteam Himmel Willkommen in der Welt der Pokémon!", "title": "PMD Erkundungsteam Himmel Top-Menü-Thema" -} \ No newline at end of file +} From 2d445c9661fd48b679269beb023e40aca75230b1 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:23:30 +0200 Subject: [PATCH 15/40] Translate move.json via GitLocalize (#3759) Co-authored-by: Jannik Tappert --- src/locales/de/move.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locales/de/move.json b/src/locales/de/move.json index 3cf7c747826..3c81ccfd7df 100644 --- a/src/locales/de/move.json +++ b/src/locales/de/move.json @@ -2913,7 +2913,7 @@ }, "zippyZap": { "name": "Britzelturbo", - "effect": "Ein stürmischer Blitz-Angriff mit hoher Erstschlag- und Volltrefferquote." + "effect": "Ein stürmischer Blitz-Angriff mit garantierter Erstschlag- und Volltrefferquote.\n" }, "splishySplash": { "name": "Plätschersurfer", @@ -3807,4 +3807,4 @@ "name": "Giftkettung", "effect": "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet." } -} \ No newline at end of file +} From 2744ede93c92b1e480ef7ed625724579291d4933 Mon Sep 17 00:00:00 2001 From: Asdar Date: Mon, 26 Aug 2024 16:24:11 +0200 Subject: [PATCH 16/40] Re-Added localisation for Meloetta Pirouette (#3779) --- src/locales/de/pokemon-form.json | 1 + src/locales/en/pokemon-form.json | 1 + src/locales/es/pokemon-form.json | 3 ++- src/locales/fr/pokemon-form.json | 1 + src/locales/it/pokemon-form.json | 1 + src/locales/ko/pokemon-form.json | 1 + src/locales/pt_BR/pokemon-form.json | 1 + src/locales/zh_CN/pokemon-form.json | 1 + src/locales/zh_TW/pokemon-form.json | 4 +++- 9 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/locales/de/pokemon-form.json b/src/locales/de/pokemon-form.json index de2e80154fe..d621e3165fa 100644 --- a/src/locales/de/pokemon-form.json +++ b/src/locales/de/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "Inkarnationsform", "keldeoOrdinary": "Standardform", "meloettaAria": "Gesangsform", + "meloettaPirouette": "Tanzform", "froakieBattleBond": "Ash-Form", "scatterbugMeadow": "Blumenmeermuster", "scatterbugIcySnow": "Frostmuster", diff --git a/src/locales/en/pokemon-form.json b/src/locales/en/pokemon-form.json index 1b2992cd6b3..ea7e0f60c90 100644 --- a/src/locales/en/pokemon-form.json +++ b/src/locales/en/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "Incarnate", "keldeoOrdinary": "Ordinary", "meloettaAria": "Aria", + "meloettaPirouette": "Pirouette", "froakieBattleBond": "Battle Bond", "scatterbugMeadow": "Meadow", "scatterbugIcySnow": "Icy Snow", diff --git a/src/locales/es/pokemon-form.json b/src/locales/es/pokemon-form.json index 91c49e30ca7..c46521d78da 100644 --- a/src/locales/es/pokemon-form.json +++ b/src/locales/es/pokemon-form.json @@ -56,7 +56,8 @@ "deerlingSummer": "Verano", "deerlingAutumn": "Otoño", "deerlingWinter": "Invierno", - "meloettaAria": "Aria", + "meloettaAria": "Lírica", + "meloettaPirouette": "Danza", "froakieBattleBond": "Fuerte Afecto", "scatterbugMeadow": "Floral", "scatterbugIcySnow": "Polar", diff --git a/src/locales/fr/pokemon-form.json b/src/locales/fr/pokemon-form.json index 3a2557fb747..44f2bcecf2c 100644 --- a/src/locales/fr/pokemon-form.json +++ b/src/locales/fr/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "Avatar", "keldeoOrdinary": "Normal", "meloettaAria": "Chant", + "meloettaPirouette": "Danse", "froakieBattleBond": "Synergie", "scatterbugMeadow": "Floraison", "scatterbugIcySnow": "Blizzard", diff --git a/src/locales/it/pokemon-form.json b/src/locales/it/pokemon-form.json index d51c038b83a..505173e4c8a 100644 --- a/src/locales/it/pokemon-form.json +++ b/src/locales/it/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "Incarnazione", "keldeoOrdinary": "Normale", "meloettaAria": "Canto", + "meloettaPirouette": "Danza", "froakieBattleBond": "Morfosintonia", "scatterbugMeadow": "Giardinfiore", "scatterbugIcySnow": "Nevi perenni", diff --git a/src/locales/ko/pokemon-form.json b/src/locales/ko/pokemon-form.json index aad63a4df3a..885f9a9b891 100644 --- a/src/locales/ko/pokemon-form.json +++ b/src/locales/ko/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "화신폼", "keldeoOrdinary": "평상시 모습", "meloettaAria": "보이스폼", + "meloettaPirouette": "스텝폼", "froakieBattleBond": "유대변화", "scatterbugMeadow": "화원의 모양", "scatterbugIcySnow": "빙설의 모양", diff --git a/src/locales/pt_BR/pokemon-form.json b/src/locales/pt_BR/pokemon-form.json index 83169a44414..fd418e2ada2 100644 --- a/src/locales/pt_BR/pokemon-form.json +++ b/src/locales/pt_BR/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "Materializado", "keldeoOrdinary": "Comum", "meloettaAria": "Ária", + "meloettaPirouette": "Pirueta", "froakieBattleBond": "Vínculo de Batalha", "scatterbugMeadow": "Prado", "scatterbugIcySnow": "Neve Congelada", diff --git a/src/locales/zh_CN/pokemon-form.json b/src/locales/zh_CN/pokemon-form.json index b0f3c05d1d4..09ec54be804 100644 --- a/src/locales/zh_CN/pokemon-form.json +++ b/src/locales/zh_CN/pokemon-form.json @@ -64,6 +64,7 @@ "landorusIncarnate": "化身", "keldeoOrdinary": "通常", "meloettaAria": "歌声", + "meloettaPirouette": "舞步形态", "froakieBattleBond": "牵绊变身", "scatterbugMeadow": "花园花纹", "scatterbugIcySnow": "冰雪花纹", diff --git a/src/locales/zh_TW/pokemon-form.json b/src/locales/zh_TW/pokemon-form.json index 9e26dfeeb6e..b98a1e946b8 100644 --- a/src/locales/zh_TW/pokemon-form.json +++ b/src/locales/zh_TW/pokemon-form.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "meloettaPirouette": "舞步形態" +} \ No newline at end of file From bbbb6d6f79cc441f65647d737f048c23f69e6b55 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:26:36 +0800 Subject: [PATCH 17/40] [Localization] [DE] Rest of german translation (#3714) * Translate dialogue-misc-female.json via GitLocalize * Translate dialogue-misc-male.json via GitLocalize * Translate run-history.json via GitLocalize * Translate settings.json via GitLocalize * Update src/locales/de/settings.json --------- Co-authored-by: Jannik Tappert Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> --- src/locales/de/dialogue-misc-female.json | 6 ++++-- src/locales/de/dialogue-misc-male.json | 6 ++++-- src/locales/de/run-history.json | 7 ++++--- src/locales/de/settings.json | 7 ++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/locales/de/dialogue-misc-female.json b/src/locales/de/dialogue-misc-female.json index a28a5524b4f..1529831d7c5 100644 --- a/src/locales/de/dialogue-misc-female.json +++ b/src/locales/de/dialogue-misc-female.json @@ -1,4 +1,6 @@ { "ending": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.", - "ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?" -} \ No newline at end of file + "ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?", + "ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.", + "ending_name": "Entwickler" +} diff --git a/src/locales/de/dialogue-misc-male.json b/src/locales/de/dialogue-misc-male.json index a28a5524b4f..1529831d7c5 100644 --- a/src/locales/de/dialogue-misc-male.json +++ b/src/locales/de/dialogue-misc-male.json @@ -1,4 +1,6 @@ { "ending": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.", - "ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?" -} \ No newline at end of file + "ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?", + "ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.", + "ending_name": "Entwickler" +} diff --git a/src/locales/de/run-history.json b/src/locales/de/run-history.json index 43342c61908..77c8fcb6170 100644 --- a/src/locales/de/run-history.json +++ b/src/locales/de/run-history.json @@ -25,13 +25,14 @@ "challengeMonoGen9": "Gen IX", "playerItems": "Spielergegenstände", "personalBest": "Persönlicher Bestwert!", - "SPDshortened": "Geschw.", + "SPDshortened": "Init.", "runInfo": "Durchlauf Informationen", "money": "Geld", "runLength": "Durchlauf Dauer", "viewHeldItems": "Getragene Items", - "hallofFameTextM": "Willkommen in der Ruhmeshalle", + "hallofFameTextM": "Willkommen in der Ruhmeshalle!", "hallofFameTextF": "Willkommen in der Ruhmeshalle", "viewHallOfFame": "Ruhmeshalle ansehen!", "viewEndingSplash": "Endgrafik anzeigen!" -} \ No newline at end of file +} + diff --git a/src/locales/de/settings.json b/src/locales/de/settings.json index b2a2b3d743c..f3c4ba5b40e 100644 --- a/src/locales/de/settings.json +++ b/src/locales/de/settings.json @@ -97,5 +97,10 @@ "gamepadSupport": "Controllerunterstützung", "showBgmBar": "Musiknamen anzeigen", "moveTouchControls": "Bewegung Touch Steuerung", - "shopOverlayOpacity": "Shop Overlay Deckkraft" + "shopOverlayOpacity": "Shop Overlay Deckkraft", + "shopCursorTarget": "Shop-Cursor Ziel", + "items": "Items", + "reroll": "Neu rollen", + "shop": "Shop", + "checkTeam": "Team überprüfen" } From 2d0a4326b60a0c207110250f77dc80f2d0be0a60 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 27 Aug 2024 00:14:59 +0800 Subject: [PATCH 18/40] fix failing belly drum test (#3768) --- src/test/moves/belly_drum.test.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts index 631de952a58..e4956c6e83a 100644 --- a/src/test/moves/belly_drum.test.ts +++ b/src/test/moves/belly_drum.test.ts @@ -6,6 +6,8 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { Abilities } from "#app/enums/abilities"; const TIMEOUT = 20 * 1000; // RATIO : HP Cost of Move @@ -29,12 +31,14 @@ describe("Moves - BELLY DRUM", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.starterSpecies(Species.MAGIKARP); - game.override.enemySpecies(Species.SNORLAX); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([Moves.BELLY_DRUM]); - game.override.enemyMoveset([Moves.SPLASH]); + game.override + .starterSpecies(Species.MAGIKARP) + .enemySpecies(Species.SNORLAX) + .startingLevel(100) + .enemyLevel(100) + .moveset([Moves.BELLY_DRUM]) + .enemyMoveset(SPLASH_ONLY) + .enemyAbility(Abilities.BALL_FETCH); }); // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) From 392bb1803cfb3706fca42f6b656256f7756def55 Mon Sep 17 00:00:00 2001 From: Asdar Date: Mon, 26 Aug 2024 20:49:39 +0200 Subject: [PATCH 19/40] =?UTF-8?q?ReAdd=20Portuguese=20Pok=C3=A9mon=20Names?= =?UTF-8?q?=20(#3790)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/pt_BR/pokemon.json | 1085 +++++++++++++++++++++++++++++++- 1 file changed, 1084 insertions(+), 1 deletion(-) diff --git a/src/locales/pt_BR/pokemon.json b/src/locales/pt_BR/pokemon.json index 9e26dfeeb6e..f780d2accbd 100644 --- a/src/locales/pt_BR/pokemon.json +++ b/src/locales/pt_BR/pokemon.json @@ -1 +1,1084 @@ -{} \ No newline at end of file +{ + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Tipo Nulo", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Presa Grande", + "scream_tail": "Cauda Brado", + "brute_bonnet": "Capuz Bruto", + "flutter_mane": "Juba Sopro", + "slither_wing": "Asa Rasteira", + "sandy_shocks": "Choque Areia", + "iron_treads": "Trilho Férreo", + "iron_bundle": "Pacote Férreo", + "iron_hands": "Mãos Férreas", + "iron_jugulis": "Jugulares Férreas", + "iron_moth": "Mariposa Férrea", + "iron_thorns": "Espinhos Férreos", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Lua Estrondo", + "iron_valiant": "Valentia Férrea", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Onda Ando", + "iron_leaves": "Folhas Férreas", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Fogo Corrosão", + "raging_bolt": "Raio Fúria", + "iron_boulder": "Rocha Férrea", + "iron_crown": "Chifres Férreos", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna" +} \ No newline at end of file From f688ed73294b032f23986144b5e8191080cd0f15 Mon Sep 17 00:00:00 2001 From: Taylor Le Lievre <78890517+tlelievre26@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:01:54 -0400 Subject: [PATCH 20/40] [QoL] Add setting to control volume of UI sound efffects (#3354) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added settings option to toggle UI sound effects * Added text to other locales * Localizations except es and it * New language locales * Added italian translation Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Refactored on top of PR #3527 * Rebased and updated setting name * Added comments for the included sound effects --------- Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> --- src/battle-scene.ts | 7 ++++++- src/locales/en/settings.json | 1 + src/system/settings/settings.ts | 11 +++++++++++ src/ui/settings/settings-audio-ui-handler.ts | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 922a145780b..0ffa7c95196 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -126,6 +126,7 @@ export default class BattleScene extends SceneBase { public bgmVolume: number = 1; public fieldVolume: number = 1; public seVolume: number = 1; + public uiVolume: number = 1; public gameSpeed: integer = 1; public damageNumbersMode: integer = 0; public reroll: boolean = false; @@ -1799,11 +1800,15 @@ export default class BattleScene extends SceneBase { config["volume"] *= 0.5; } break; - case "se": case "ui": + //As of, right now this applies to the "select", "menu_open", "error" sound effects + config["volume"] = this.masterVolume * this.uiVolume; + break; + case "se": default: config["volume"] = this.masterVolume * this.seVolume; break; + } this.sound.play(key, config); return this.sound.get(key) as AnySound; diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 947dfe98bb4..6528f0368fe 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -63,6 +63,7 @@ "bgmVolume": "BGM Volume", "fieldVolume": "Field Volume", "seVolume": "SE Volume", + "uiVolume": "UI Volume", "musicPreference": "Music Preference", "mixed": "Mixed", "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index a7ad3f6697e..7b0fea95a98 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -119,6 +119,7 @@ export const SettingKeys = { BGM_Volume: "BGM_VOLUME", Field_Volume: "FIELD_VOLUME", SE_Volume: "SE_VOLUME", + UI_Volume: "UI_SOUND_EFFECTS", Music_Preference: "MUSIC_PREFERENCE", Show_BGM_Bar: "SHOW_BGM_BAR", Move_Touch_Controls: "MOVE_TOUCH_CONTROLS", @@ -556,6 +557,13 @@ export const Setting: Array = [ default: 10, type: SettingType.AUDIO }, + { + key: SettingKeys.UI_Volume, + label: i18next.t("settings:uiVolume"), + options: VOLUME_OPTIONS, + default: 10, + type: SettingType.AUDIO + }, { key: SettingKeys.Music_Preference, label: i18next.t("settings:musicPreference"), @@ -670,6 +678,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): scene.seVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; + case SettingKeys.UI_Volume: + scene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + break; case SettingKeys.Music_Preference: scene.musicPreference = value; break; diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts index 27ca7e35354..4a895fc3170 100644 --- a/src/ui/settings/settings-audio-ui-handler.ts +++ b/src/ui/settings/settings-audio-ui-handler.ts @@ -15,6 +15,6 @@ export default class SettingsAudioUiHandler extends AbstractSettingsUiHandler { super(scene, SettingType.AUDIO, mode); this.title = "Audio"; this.localStorageKey = "settings"; - this.rowsToDisplay = 5; + this.rowsToDisplay = 6; } } From fe575da036f0063816401a74fa88dd57b1b246fe Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:11:24 -0700 Subject: [PATCH 21/40] [Localisation] [ES] Review and finish up of ability-trigger.json (#3784) * Translate ability-trigger.json via GitLocalize * Translate ability-trigger.json via GitLocalize --------- Co-authored-by: Rafa Co-authored-by: Asdar --- src/locales/es/ability-trigger.json | 57 +++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/locales/es/ability-trigger.json b/src/locales/es/ability-trigger.json index f49b0a784db..8bbcc80662c 100644 --- a/src/locales/es/ability-trigger.json +++ b/src/locales/es/ability-trigger.json @@ -1,11 +1,62 @@ { "blockRecoilDamage": "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", "badDreams": "¡{{pokemonName}} está atormentado!", + "costar": "¡{{pokemonName}} copió los cambios de características de {{allyName}}!", "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "perishBody": "¡{{abilityName}} de {{pokemonName}} debilitará a ambos Pokémon en 3 turnos!", + "poisonHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", "trace": "¡{{pokemonName}} ha copiado la habilidad {{abilityName}} \nde {{targetName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", "quickDraw": "¡{{pokemonName}} ataca primero gracias a la habilidad Mano Rápida!", "disguiseAvoidedDamage": "¡El disfraz de {{pokemonNameWithAffix}} se ha roto!", - "preventBerryUse": "{{pokemonNameWithAffix}} está muy nervioso y no puede comer bayas!", - "weatherEffectDisappeared": "El tiempo atmosférico ya no ejerce ninguna influencia." -} \ No newline at end of file + "blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!", + "typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!", + "moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!", + "reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!", + "postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!", + "postDefendContactDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} ha herido a su atacante!", + "postDefendAbilitySwap": "¡{{pokemonNameWithAffix}} intercambió su habilidad con su objetivo!", + "postDefendAbilityGive": "¡{{pokemonNameWithAffix}} cambió la habilidad del objetivo por {{abilityName}}!", + "postDefendMoveDisable": "¡{{moveName}} de {{pokemonNameWithAffix}} ha sido anulado!", + "pokemonTypeChange": "¡{{pokemonNameWithAffix}} ha cambiado a tipo {{moveType}}!", + "postAttackStealHeldItem": "¡{{pokemonNameWithAffix}} robó {{stolenItemType}} de {{defenderName}}!", + "postDefendStealHeldItem": "¡{{pokemonNameWithAffix}} robó {{stolenItemType}} de {{attackerName}}!", + "copyFaintedAllyAbility": "¡{{abilityName}} de {{pokemonNameWithAffix}} fue copiada!", + "intimidateImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita que sea intimidado!", + "postSummonAllyHeal": "¡{{pokemonNameWithAffix}} se ha bebido el té que ha preparado {{pokemonName}}!", + "postSummonClearAllyStats": "¡Los cambios de características de {{pokemonNameWithAffix}} fueron eliminados!", + "postSummonTransform": "¡{{pokemonNameWithAffix}} se transformó en {{targetName}}!", + "protectStat": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita que baje su {{statName}}!", + "statusEffectImmunityWithName": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita {{statusEffectName}}!", + "statusEffectImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} evita los problemas de estado!", + "battlerTagImmunity": "¡{{abilityName}} de {{pokemonNameWithAffix}} previene {{battlerTagName}}!", + "forewarn": "¡{{pokemonNameWithAffix}} ha detectado el movimiento {{moveName}}!", + "frisk": "¡{{pokemonNameWithAffix}} ha cacheado {{opponentAbilityName}} de {{opponentName}}!", + "postWeatherLapseHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "postWeatherLapseDamage": "¡{{pokemonNameWithAffix}} se hizo daño por su {{abilityName}}!", + "postTurnLootCreateEatenBerry": "¡{{pokemonNameWithAffix}} recogió una {{berryName}}!", + "postTurnHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", + "fetchBall": "¡{{pokemonNameWithAffix}} encontró {{pokeballName}}!", + "healFromBerryUse": "¡{{pokemonNameWithAffix}} se curó gracias a {{abilityName}}!", + "arenaTrap": "¡{{pokemonNameWithAffix}} impide el cambio con {{abilityName}}!", + "postBattleLoot": "¡{{pokemonNameWithAffix}} recogió {{itemName}}!", + "postFaintContactDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} hizo daño a su atacante!", + "postFaintHpDamage": "¡{{abilityName}} de {{pokemonNameWithAffix}} hizo daño a su atacante!", + "postSummonPressure": "¡{{pokemonNameWithAffix}} ejerce Presión!", + "weatherEffectDisappeared": "El tiempo atmosférico ya no ejerce ninguna influencia.", + "postSummonMoldBreaker": "¡{{pokemonNameWithAffix}} rompió el molde!", + "postSummonAnticipation": "¡{{pokemonNameWithAffix}} se anticipó!", + "postSummonTurboblaze": "¡{{pokemonNameWithAffix}} irradia un aura llameante!", + "postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!", + "postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!", + "postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!", + "postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!", + "postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", + "postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", + "postSummonVesselOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Caldero Debacle!", + "postSummonSwordOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Espada Debacle!", + "postSummonTabletsOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Tablilla Debacle!", + "postSummonBeadsOfRuin": "¡{{pokemonNameWithAffix}} ha mermado {{statName}} de los demás Pokémon con Abalorio Debacle!", + "preventBerryUse": "{{pokemonNameWithAffix}} está muy nervioso y no puede comer bayas!" +} From 00917b6de165672c36c599e191ddbda6a6183458 Mon Sep 17 00:00:00 2001 From: Asdar Date: Mon, 26 Aug 2024 22:12:53 +0200 Subject: [PATCH 22/40] [Localisation] [JA] Japanese backlog localisation to json (#3782) * Re-Added localisation for Meloetta Pirouette * "Refactored Japanese backlog (json migration)" * Update pokemon-form.json IT Mixed with Meloetta PR * Fixed Meloetta changes sneaking in the JA PR * Fixed Meloetta changes sneaking in the JA PR again * Update src/locales/ja/menu-ui-handler.json This is why translation PRs should not sit for 2 weeks Co-authored-by: Mumble <171087428+frutescens@users.noreply.github.com> --------- Co-authored-by: Mumble <171087428+frutescens@users.noreply.github.com> --- src/locales/ja/battle-info.json | 4 +- src/locales/ja/game-stats-ui-handler.json | 43 ++++- src/locales/ja/menu-ui-handler.json | 23 ++- .../ja/modifier-select-ui-handler.json | 13 +- src/locales/ja/pokemon-form-battle.json | 15 +- src/locales/ja/pokemon-form.json | 171 +++++++++++++++++- 6 files changed, 256 insertions(+), 13 deletions(-) diff --git a/src/locales/ja/battle-info.json b/src/locales/ja/battle-info.json index 9e26dfeeb6e..2959cdda332 100644 --- a/src/locales/ja/battle-info.json +++ b/src/locales/ja/battle-info.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "generation": "{{generation}}世代" +} diff --git a/src/locales/ja/game-stats-ui-handler.json b/src/locales/ja/game-stats-ui-handler.json index 9e26dfeeb6e..25bb21f701a 100644 --- a/src/locales/ja/game-stats-ui-handler.json +++ b/src/locales/ja/game-stats-ui-handler.json @@ -1 +1,42 @@ -{} \ No newline at end of file +{ + "stats": "統計", + "playTime": "プレー時間", + "totalBattles": "合計バトル数", + "starters": "スターター数", + "shinyStarters": "色違いスターター数", + "speciesSeen": "合計発見数", + "speciesCaught": "合計捕獲数", + "ribbonsOwned": "リボン数", + "classicRuns": "クラシックラン", + "classicWins": "クラシック勝利", + "dailyRunAttempts": "デイリーラン", + "dailyRunWins": "デイリーラン勝利", + "endlessRuns": "エンドレスラン", + "highestWaveEndless": "エンドレス最高ウェーブ", + "highestMoney": "最大貯金", + "highestDamage": "最大ダメージ", + "highestHPHealed": "最大HP回復", + "pokemonEncountered": "遭遇したポケモン", + "pokemonDefeated": "倒したポケモン", + "pokemonCaught": "捕まえたポケモン", + "eggsHatched": "ふかしたタマゴ", + "subLegendsSeen": "見つけた順伝説", + "subLegendsCaught": "捕まえた順伝説", + "subLegendsHatched": "ふかした順伝説", + "legendsSeen": "見つけた伝説", + "legendsCaught": "捕まえた伝説", + "legendsHatched": "ふかした伝説", + "mythicalsSeen": "見つけた幻ポケモン", + "mythicalsCaught": "捕まえた幻ポケモン", + "mythicalsHatched": "ふかした幻ポケモン", + "shiniesSeen": "見つけた色違い", + "shiniesCaught": "捕まえた色違い", + "shiniesHatched": "ふかした色違い", + "pokemonFused": "合体したポケモン", + "trainersDefeated": "倒したトレーナー", + "eggsPulled": "引いたタマゴ", + "rareEggsPulled": "引いたレアタマゴ", + "epicEggsPulled": "引いた超レアタマゴ", + "legendaryEggsPulled": "引いた伝説タマゴ", + "manaphyEggsPulled": "引いたマナフィタマゴ" +} \ No newline at end of file diff --git a/src/locales/ja/menu-ui-handler.json b/src/locales/ja/menu-ui-handler.json index e9bec2cf0ae..beb014b84a9 100644 --- a/src/locales/ja/menu-ui-handler.json +++ b/src/locales/ja/menu-ui-handler.json @@ -1,19 +1,26 @@ { - "GAME_SETTINGS": "せってい", - "ACHIEVEMENTS": "じっせき", - "STATS": "とうけい", - "RUN_HISTORY":"ラン履歴", + "GAME_SETTINGS": "設定", + "ACHIEVEMENTS": "実績", + "STATS": "統計", "EGG_LIST": "タマゴリスト", "EGG_GACHA": "タマゴガチャ", - "MANAGE_DATA": "データかんり", + "MANAGE_DATA": "データ管理", "COMMUNITY": "コミュニティ", + "SAVE_AND_QUIT": "保存して終了", "LOG_OUT": "ログアウト", "slot": "スロット {{slotNumber}}", "importSession": "セッションのインポート", + "importSlotSelect": "インポート先の スロットを 選んでください", "exportSession": "セッションのエクスポート", - "importRunHistory":"ラン履歴インポート", - "exportRunHistory":"ラン履歴エクスポート", + "exportSlotSelect": "エクスポート元の スロットを 選んでください", "importData": "データのインポート", "exportData": "データのエクスポート", - "cancel": "キャンセル" + "consentPreferences": "同意設定", + "linkDiscord": "Discord連携", + "unlinkDiscord": "Discord連携解除", + "linkGoogle": "Google連携", + "unlinkGoogle": "Google連携解除", + "cancel": "キャンセル", + "losingProgressionWarning": "戦闘開始からの データが 保存されません。\nよろしいですか?", + "noEggs": "現在 タマゴを ふかしていません!" } \ No newline at end of file diff --git a/src/locales/ja/modifier-select-ui-handler.json b/src/locales/ja/modifier-select-ui-handler.json index 9e26dfeeb6e..9370f01491e 100644 --- a/src/locales/ja/modifier-select-ui-handler.json +++ b/src/locales/ja/modifier-select-ui-handler.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "transfer": "アイテム移行", + "reroll": "選択肢変更", + "lockRarities": "レア度の固定", + "checkTeam": "チームを確認", + "transferDesc": "ポケモンの 手持ちアイテムを 移行する", + "rerollDesc": "お金を 使って アイテムの 選択肢を 変更する", + "lockRaritiesDesc": "選択肢を 変更するときの レア度を 固定する\n(選択肢変更金額を影響する)", + "checkTeamDesc": "チームの 状態を 確認する\nフォルムチェンジアイテムを 有効・無効にする", + "rerollCost": "{{formattedMoney}}円", + "itemCost": "{{formattedMoney}}円" +} diff --git a/src/locales/ja/pokemon-form-battle.json b/src/locales/ja/pokemon-form-battle.json index 9e26dfeeb6e..adbc7b4b3da 100644 --- a/src/locales/ja/pokemon-form-battle.json +++ b/src/locales/ja/pokemon-form-battle.json @@ -1 +1,14 @@ -{} \ No newline at end of file +{ + "mega": "メガ{{pokemonName}}", + "mega-x": "メガ{{pokemonName}}X", + "mega-y": "メガ{{pokemonName}}Y", + "primal": "ゲンシ{{pokemonName}}", + "gigantamax": "キョダイ{{pokemonName}}", + "eternamax": "E・{{pokemonName}}", + "megaChange": "{{preName}}は\nメガ{{pokemonName}}に メガシンカした!", + "gigantamaxChange": "{{preName}}は\nキョダイマックスした!", + "eternamaxChange": "{{preName}}は\nムゲンダイマックスした!", + "revertChange": "{{pokemonName}}は\n元の姿に 戻った!", + "formChange": "{{preName}}は\n姿を 変えた!", + "disguiseChange": "ばけのかわが みがわりに なった!" +} diff --git a/src/locales/ja/pokemon-form.json b/src/locales/ja/pokemon-form.json index 9e26dfeeb6e..76124904456 100644 --- a/src/locales/ja/pokemon-form.json +++ b/src/locales/ja/pokemon-form.json @@ -1 +1,170 @@ -{} \ No newline at end of file +{ + "pikachuCosplay": "コスプレ", + "pikachuCoolCosplay": "クールなコスプレ", + "pikachuBeautyCosplay": "きれいなコスプレ", + "pikachuCuteCosplay": "かわいいコスプレ", + "pikachuSmartCosplay": "かしこいコスプレ", + "pikachuToughCosplay": "パワフルなコスプレ", + "pikachuPartner": "パートナー", + "eeveePartner": "パートナー", + "pichuSpiky": "ギザみみ", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + "castformSunny": "たいよう", + "castformRainy": "あまみず", + "castformSnowy": "ゆきぐも", + "deoxysNormal": "ノーマル", + "burmyPlant": "くさき", + "burmySandy": "すなち", + "burmyTrash": "ゴミ", + "shellosEast": "ひがし", + "shellosWest": "にし", + "rotomHeat": "ヒート", + "rotomWash": "ウォッシュ", + "rotomFrost": "フロスト", + "rotomFan": "スピン", + "rotomMow": "カット", + "giratinaAltered": "アナザー", + "shayminLand": "ランド", + "basculinRedStriped": "赤筋", + "basculinBlueStriped": "青筋", + "basculinWhiteStriped": "白筋", + "deerlingSpring": "春", + "deerlingSummer": "夏", + "deerlingAutumn": "秋", + "deerlingWinter": "冬", + "tornadusIncarnate": "けしん", + "thundurusIncarnate": "けしん", + "landorusIncarnate": "けしん", + "keldeoOrdinary": "いつも", + "meloettaAria": "ボイス", + "meloettaPirouette": "ステップ", + "froakieBattleBond": "きずなへんげ", + "scatterbugMeadow": "はなぞの", + "scatterbugIcySnow": "ひょうせつ", + "scatterbugPolar": "ゆきぐに", + "scatterbugTundra": "せつげん", + "scatterbugContinental": "たいりく", + "scatterbugGarden": "ていえん", + "scatterbugElegant": "みやび", + "scatterbugModern": "モダン", + "scatterbugMarine": "マリン", + "scatterbugArchipelago": "ぐんとう", + "scatterbugHighPlains": "こうや", + "scatterbugSandstorm": "さじん", + "scatterbugRiver": "たいが", + "scatterbugMonsoon": "スコール", + "scatterbugSavanna": "サバンナ", + "scatterbugSun": "たいよう", + "scatterbugOcean": "オーシャン", + "scatterbugJungle": "ジャングル", + "scatterbugFancy": "ファンシー", + "scatterbugPokeBall": "ボール", + "flabebeRed": "赤", + "flabebeYellow": "黄", + "flabebeOrange": "オレンジ", + "flabebeBlue": "青", + "flabebeWhite": "白", + "furfrouHeart": "ハート", + "furfrouStar": "スター", + "furfrouDiamond": "ダイア", + "furfrouDebutante": "レディ", + "furfrouMatron": "マダム", + "furfrouDandy": "ジェントル", + "furfrouLaReine": "クイーン", + "furfrouKabuki": "カブキ", + "furfrouPharaoh": "キングダム", + "pumpkabooSmall": "ちいさい", + "pumpkabooLarge": "おおきい", + "pumpkabooSuper": "とくだい", + "xerneasNeutral": "リラックス", + "xerneasActive": "アクティブ", + "zygarde50": "50%フォルム", + "zygarde10": "10%フォルム", + "zygarde50Pc": "50%フォルム スワームチェンジ", + "zygarde10Pc": "10%フォルム スワームチェンジ", + "zygardeComplete": "パーフェクトフォルム", + "oricorioBaile": "めらめら", + "oricorioPompom": "ぱちぱち", + "oricorioPau": "ふらふら", + "oricorioSensu": "まいまい", + "rockruffOwnTempo": "マイペース", + "miniorRedMeteor": "赤 りゅうせい", + "miniorOrangeMeteor": "オレンジ りゅうせい", + "miniorYellowMeteor": "黄 りゅうせい", + "miniorGreenMeteor": "緑 りゅうせい", + "miniorBlueMeteor": "水色 りゅうせい", + "miniorIndigoMeteor": "青 りゅうせい", + "miniorVioletMeteor": "紫 りゅうせい", + "miniorRed": "赤", + "miniorOrange": "オレンジ", + "miniorYellow": "黄", + "miniorGreen": "緑", + "miniorBlue": "水色", + "miniorIndigo": "青", + "miniorViolet": "紫", + "mimikyuDisguised": "ばけたすがた", + "mimikyuBusted": "ばれたすがた", + "magearnaOriginal": "500ねんまえ", + "marshadowZenith": "Zパワー", + "sinisteaPhony": "がんさく", + "sinisteaAntique": "しんさく", + "eiscueNoIce": "ナイスなし", + "indeedeeMale": "オス", + "indeedeeFemale": "メス", + "morpekoFullBelly": "まんぷく", + "zacianHeroOfManyBattles": "れきせんのゆうしゃ", + "zamazentaHeroOfManyBattles": "れきせんのゆうしゃ", + "zarudeDada": "とうちゃん", + "enamorusIncarnate": "けしん", + "squawkabillyGreenPlumage": "グリーンフェザー", + "squawkabillyBluePlumage": "ブルーフェザー", + "squawkabillyYellowPlumage": "イエローフェザー", + "squawkabillyWhitePlumage": "ホワイトフェザー", + "tatsugiriCurly": "そったすがた", + "tatsugiriDroopy": "たれたすがた", + "tatsugiriStretchy": "のびたすがた", + "gimmighoulChest": "はこ", + "gimmighoulRoaming": "とほ", + "koraidonApexBuild": "かんぜんけいたい", + "koraidonLimitedBuild":"せいげんけいたい", + "koraidonSprintingBuild":"しっそうけいたい", + "koraidonSwimmingBuild":"ゆうえいけいたい", + "koraidonGlidingBuild":"かっくうけいたい", + "miraidonUltimateMode":"コンプリートモード", + "miraidonLowPowerMode":"リミテッドモード", + "miraidonDriveMode":"ドライブモード", + "miraidonAquaticMode":"フロートモード", + "miraidonGlideMode":"グライドモード", + "poltchageistCounterfeit": "マガイモノ", + "poltchageistArtisan": "タカイモノ", + "paldeaTaurosCombat": "コンバット", + "paldeaTaurosBlaze": "ブレイズ", + "paldeaTaurosAqua": "ウォーター" +} \ No newline at end of file From 290cb01f17fbb83b6a6bd4ba39f20b0cc2f54da9 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:13:31 +0200 Subject: [PATCH 23/40] Translate pokemon-summary.json via GitLocalize (#3773) Co-authored-by: Enoch --- src/locales/ko/pokemon-summary.json | 33 +++-------------------------- 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/src/locales/ko/pokemon-summary.json b/src/locales/ko/pokemon-summary.json index 5742058e45c..3deec35c62d 100644 --- a/src/locales/ko/pokemon-summary.json +++ b/src/locales/ko/pokemon-summary.json @@ -11,34 +11,7 @@ "cancel": "그만둔다", "memoString": "{{natureFragment}}.\n{{metFragment}}", "metFragment": { - "normal": "{{biome}}에서\nLv{{level}}일 때 만났다.", - "apparently": "{{biome}}에서\nLv{{level}}일 때 만난 것 같다." - }, - "natureFragment": { - "Hardy": "{{nature}}하는 성격", - "Lonely": "{{nature}}을 타는 성격", - "Brave": "{{nature}}한 성격", - "Adamant": "{{nature}}스러운 성격", - "Naughty": "{{nature}}같은 성격", - "Bold": "{{nature}}한 성격", - "Docile": "{{nature}}한 성격", - "Relaxed": "{{nature}}한 성격", - "Impish": "{{nature}}같은 성격", - "Lax": "{{nature}}거리는 성격", - "Timid": "{{nature}}같은 성격", - "Hasty": "{{nature}}한 성격", - "Serious": "{{nature}}한 성격", - "Jolly": "{{nature}}한 성격", - "Naive": "{{nature}}한 성격", - "Modest": "{{nature}}스러운 성격", - "Mild": "{{nature}}한 성격", - "Quiet": "{{nature}}한 성격", - "Bashful": "{{nature}}을 타는 성격", - "Rash": "{{nature}}거리는 성격", - "Calm": "{{nature}}한 성격", - "Gentle": "{{nature}}한 성격", - "Sassy": "{{nature}}진 성격", - "Careful": "{{nature}}한 성격", - "Quirky": "{{nature}}스러운 성격" + "normal": "{{biome}}에서\n레벨 {{level}}일 때 만났다.", + "apparently": "{{biome}}에서\n레벨 {{level}}일 때 만난 것 같다." } -} \ No newline at end of file +} From d7226459328215f8a828dd35ec1fad8ec8fdbd15 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:15:02 +0200 Subject: [PATCH 24/40] Translate bgm-name.json via GitLocalize (#3764) Co-authored-by: Lugiad --- src/locales/fr/bgm-name.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/locales/fr/bgm-name.json b/src/locales/fr/bgm-name.json index f97523e109b..975ddcad7b2 100644 --- a/src/locales/fr/bgm-name.json +++ b/src/locales/fr/bgm-name.json @@ -45,6 +45,7 @@ "battle_legendary_lake_trio": "ROSA - Vs. Gardiens des Lacs", "battle_legendary_sinnoh": "ROSA - Vs. Légendaire de Sinnoh", "battle_legendary_dia_pal": "ROSA - Vs. Dialga/Palkia", + "battle_legendary_origin_forme": "LPA - Vs. Dialga/Palkia Originel", "battle_legendary_giratina": "ROSA - Vs. Giratina", "battle_legendary_arceus": "HGSS - Vs. Arceus", "battle_legendary_unova": "NB - Vs. Légendaire d’Unys", @@ -59,6 +60,7 @@ "battle_legendary_zac_zam": "ÉB - Vs. Zacian/Zamazenta", "battle_legendary_glas_spec": "ÉB - Vs. Blizzeval/Spectreval", "battle_legendary_calyrex": "ÉB - Vs. Sylveroy", + "battle_legendary_riders": "ÉB - Vs. Sylveroy Cavalier du Froid/d’Effroi", "battle_legendary_birds_galar": "ÉB - Vs. Oiseaux Légendaires de Galar", "battle_legendary_ruinous": "ÉV - Vs. Trésors du fléau", "battle_legendary_kor_mir": "ÉV - Profondeurs de la Zone Zéro (Combat)", From f2dd9b943560139fc9b3f76b4bf7b6a1c5aed4b6 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:19:16 -0400 Subject: [PATCH 25/40] [Sprite] Recolour shiny exp Galarian Ponyta (#3765) Recolour by koda_want_to_sleep --- public/images/pokemon/exp/shiny/4077.png | Bin 3401 -> 4070 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/exp/shiny/4077.png b/public/images/pokemon/exp/shiny/4077.png index f2f5891883d7b988e90b6f448035c33ddb904eec..ab414e058e103d390b42f73ffa2b9d6c233ff473 100644 GIT binary patch literal 4070 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 From 9f1c0a92b55f50e966df5c1d8081b88c114d2fab Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:20:55 +0200 Subject: [PATCH 26/40] Clearly define the pichu evolutions (this does not change the behaviour just makes it clea in the code!) (#3781) --- src/data/pokemon-evolutions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 0c91263f1f3..315e75e53e1 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1582,7 +1582,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) ], [Species.PICHU]: [ - new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT) + new SpeciesFormEvolution(Species.PIKACHU, "spiky", "partner", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), + new SpeciesFormEvolution(Species.PIKACHU, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), ], [Species.CLEFFA]: [ new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) From 856d468c35f72de76f914539ce10b3ce3428fe67 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:26:47 +0200 Subject: [PATCH 27/40] Translate pokemon-info.json via GitLocalize (#3789) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Ricardo --- src/locales/pt_BR/pokemon-info.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/locales/pt_BR/pokemon-info.json b/src/locales/pt_BR/pokemon-info.json index 3d374f62bba..a7a46b7a24e 100644 --- a/src/locales/pt_BR/pokemon-info.json +++ b/src/locales/pt_BR/pokemon-info.json @@ -13,7 +13,8 @@ "SPD": "Veloc.", "SPDshortened": "Veloc.", "ACC": "Precisão", - "EVA": "Evasão" + "EVA": "Evasão", + "HPStat": "PS" }, "Type": { "UNKNOWN": "Desconhecido", @@ -37,4 +38,4 @@ "FAIRY": "Fada", "STELLAR": "Estelar" } -} \ No newline at end of file +} From fddf6cb76c795266dc500f1409247119bd250419 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:28:37 +0200 Subject: [PATCH 28/40] Translate trainer-classes.json via GitLocalize (#3788) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Ricardo --- src/locales/pt_BR/trainer-classes.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/locales/pt_BR/trainer-classes.json b/src/locales/pt_BR/trainer-classes.json index 72742dccf82..fd1f36aae71 100644 --- a/src/locales/pt_BR/trainer-classes.json +++ b/src/locales/pt_BR/trainer-classes.json @@ -4,10 +4,10 @@ "ace_duo": "Dupla Ás", "artist": "Artista", "artist_female": "Artista", - "backpackers": "Mochileiros", "backers": "Torcedores", "backpacker": "Mochileiro", "backpacker_female": "Mochileira", + "backpackers": "Mochileiros", "baker": "Padeira", "battle_girl": "Lutadora", "beauty": "Modelo", @@ -30,8 +30,8 @@ "doctor": "Doutor", "doctor_female": "Doutora", "firebreather": "Cospe-Fogo", - "fishermen": "Pescador", - "fishermen_female": "Pescadora", + "fisherman": "Pescador", + "fisherman_female": "Pescadora", "gentleman": "Cavalheiro", "guitarist": "Guitarrista", "guitarist_female": "Guitarrista", @@ -101,8 +101,8 @@ "workers": "Operários", "youngster": "Jovem", "rocket_grunt": "Capanga da Equipe Rocket", - "rocket_grunt_female": "Capanga da Equipe Rocket", "rocket_grunts": "Capangas da Equipe Rocket", + "rocket_grunt_female": "Capanga da Equipe Rocket", "magma_grunt": "Capanga da Equipe Magma", "magma_grunt_female": "Capanga da Equipe Magma", "magma_grunts": "Capangas da Equipe Magma", @@ -118,4 +118,4 @@ "flare_grunt": "Capanga da Equipe Flare", "flare_grunt_female": "Capanga da Equipe Flare", "flare_grunts": "Capangas da Equipe Flare" -} \ No newline at end of file +} From de2abac09d63479a3aef51365bc833f137d4b557 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:42:33 +0200 Subject: [PATCH 29/40] Translate bgm-name.json via GitLocalize (#3791) Co-authored-by: Asdar --- src/locales/pt_BR/bgm-name.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/locales/pt_BR/bgm-name.json b/src/locales/pt_BR/bgm-name.json index bfce77e3a69..7049ecefa9d 100644 --- a/src/locales/pt_BR/bgm-name.json +++ b/src/locales/pt_BR/bgm-name.json @@ -45,6 +45,7 @@ "battle_legendary_lake_trio": "ORAS Batalha do Trio dos Lagos", "battle_legendary_sinnoh": "ORAS Batalha dos Lendários de Sinnoh", "battle_legendary_dia_pal": "ORAS Batalha do Dialga & Palkia", + "battle_legendary_origin_forme": "LA Origin Batalha com Dialga & Palkia", "battle_legendary_giratina": "ORAS Batalha do Giratina", "battle_legendary_arceus": "HGSS Batalha do Arceus", "battle_legendary_unova": "BW Batalha dos Lendários de Unova", @@ -59,6 +60,7 @@ "battle_legendary_zac_zam": "SWSH Batalha do Zacian & Zamazenta", "battle_legendary_glas_spec": "SWSH Batalha do Glastrier & Spectrier", "battle_legendary_calyrex": "SWSH Batalha do Calyrex", + "battle_legendary_riders": "SWSH Batalha com Ice & Shadow Rider Calyrex", "battle_legendary_birds_galar": "SWSH Batalha dos Pássaros Lendários de Galar", "battle_legendary_ruinous": "SV Batalha dos Lendários Ruinosos", "battle_legendary_kor_mir": "SV Batalha das Cavernas da Área Zero", @@ -135,4 +137,4 @@ "heal": "BW Centro Pokémon", "menu": "PMD EoS Bem-vindo ao Mundo dos Pokémon!", "title": "PMD EoS Menu Principal" -} \ No newline at end of file +} From c52f439dc14e43f5b2ac8cee811cc1c23a334a24 Mon Sep 17 00:00:00 2001 From: Mumble <171087428+frutescens@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:50:19 -0700 Subject: [PATCH 30/40] Corrections and adjustments (#3831) Co-authored-by: frutescens --- src/battle-scene.ts | 13 +++++++++++-- src/field/pokemon.ts | 7 ++++--- src/ui/egg-gacha-ui-handler.ts | 2 +- src/ui/starter-select-ui-handler.ts | 4 ++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0ffa7c95196..1455994ce48 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1756,6 +1756,7 @@ export default class BattleScene extends SceneBase { } else { const soundDetails = sound.key.split("/"); switch (soundDetails[0]) { + case "battle_anims": case "cry": if (soundDetails[1].startsWith("PRSFX- ")) { @@ -1792,6 +1793,16 @@ export default class BattleScene extends SceneBase { try { const keyDetails = key.split("/"); switch (keyDetails[0]) { + case "level_up_fanfare": + case "item_fanfare": + case "minor_fanfare": + case "heal": + case "evolution": + case "evolution_fanfare": + // These sounds are loaded in as BGM, but played as sound effects + // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() + config["volume"] = this.masterVolume * this.bgmVolume; + break; case "battle_anims": case "cry": config["volume"] = this.masterVolume * this.fieldVolume; @@ -1805,10 +1816,8 @@ export default class BattleScene extends SceneBase { config["volume"] = this.masterVolume * this.uiVolume; break; case "se": - default: config["volume"] = this.masterVolume * this.seVolume; break; - } this.sound.play(key, config); return this.sound.get(key) as AnySound; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 756ee2a44cd..a8dfb9d6c48 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2641,7 +2641,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } private fusionFaintCry(callback: Function): void { - const key = this.getSpeciesForm().getCryKey(this.formIndex); + const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`; let i = 0; let rate = 0.85; const cry = this.scene.playSound(key, { rate: rate }) as AnySound; @@ -2649,7 +2649,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const tintSprite = this.getTintSprite(); let duration = cry.totalDuration * 1000; - let fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), { rate: rate }) as AnySound; + const fusionCryKey = `cry/${this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex)}`; + let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound; fusionCry.stop(); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); @@ -2693,7 +2694,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (i === transitionIndex) { SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2))); - fusionCry = this.scene.playSound(this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex), Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); + fusionCry = this.scene.playSound(fusionCryKey, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0); } rate *= 0.99; diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index a4a57e25924..9497dfe58c6 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -359,7 +359,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.scene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { this.scene.playSound("se/gacha_dispense"); this.scene.time.delayedCall(this.getDelayValue(750), () => { - this.scene.sound.stopByKey("gacha_running"); + this.scene.sound.stopByKey("se/gacha_running"); this.scene.tweens.add({ targets: egg, duration: this.getDelayValue(350), diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5c9ce61979f..f9b40dd96e6 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1701,7 +1701,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound("buy"); + this.scene.playSound("se/buy"); return true; } @@ -1753,7 +1753,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterAttributes.shiny = starterAttributes.shiny ? !starterAttributes.shiny : true; this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); if (starterAttributes.shiny) { - this.scene.playSound("sparkle"); + this.scene.playSound("se/sparkle"); // Set the variant label to the shiny tint const tint = getVariantTint(newVariant); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); From 6b38c7213acecf843dc5a9d57fa68370a33f4971 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:00:19 +0200 Subject: [PATCH 31/40] [Localization] [DE] ReRemove the event text (#3739) * Translate dialogue-female.json via GitLocalize * Translate dialogue-male.json via GitLocalize --------- Co-authored-by: Jannik Tappert --- src/locales/de/dialogue-female.json | 54 +++++++++++++-------------- src/locales/de/dialogue-male.json | 58 ++++++++++++++--------------- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/locales/de/dialogue-female.json b/src/locales/de/dialogue-female.json index e71e03453a7..e6ab044d002 100644 --- a/src/locales/de/dialogue-female.json +++ b/src/locales/de/dialogue-female.json @@ -355,6 +355,30 @@ "1": "Ich werde für das nächste Rennen tunen." } }, + "firebreather": { + "encounter": { + "1": "Meine Flammen werden dich verschlingen!", + "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", + "3": "Komm näher und sieh dir meine Flammen an!" + }, + "victory": { + "1": "Verbrannt bis zur Asche...", + "2": "Yow! Das ist heiß!", + "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" + } + }, + "sailor": { + "encounter": { + "1": "Matrose, du gehst über Bord, wenn du verlierst!", + "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", + "3": "Ahoj! Bist du seekrank?" + }, + "victory": { + "1": "Argh! Von einem Kind besiegt!", + "2": "Dein Geist hat mich versenkt!", + "3": "Ich glaube, ich bin der der seekrank ist..." + } + }, "archer": { "encounter": { "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!", @@ -535,30 +559,6 @@ "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert." } }, - "firebreather": { - "encounter": { - "1": "Meine Flammen werden dich verschlingen!", - "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", - "3": "Komm näher und sieh dir meine Flammen an!" - }, - "victory": { - "1": "Verbrannt bis zur Asche...", - "2": "Yow! Das ist heiß!", - "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" - } - }, - "sailor": { - "encounter": { - "1": "Matrose, du gehst über Bord, wenn du verlierst!", - "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", - "3": "Ahoj! Bist du seekrank?" - }, - "victory": { - "1": "Argh! Von einem Kind besiegt!", - "2": "Dein Geist hat mich versenkt!", - "3": "Ich glaube, ich bin der der seekrank ist..." - } - }, "rocket_grunt": { "encounter": { "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!", @@ -2455,7 +2455,7 @@ "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!" }, "victory": { - "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf und genieße das Event!" + "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!" } }, "rival_2_female": { @@ -2463,7 +2463,7 @@ "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!" }, "victory": { - "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark und genieße das Event!" + "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark!" }, "defeat": { "1": "Es ist Ok manchmal zu verlieren…" @@ -2542,4 +2542,4 @@ "1": "@c{smile_ehalf}Ich… Ich denke ich habe meine Aufgabe erfüllt.\n$@c{smile_eclosed}Versprich mir… Nachdem du die Welt geheilt hast… Komm bitte sicher nach Hause. \n$@c{smile_ehalf}…Danke." } } -} \ No newline at end of file +} diff --git a/src/locales/de/dialogue-male.json b/src/locales/de/dialogue-male.json index 0f8e0122c8c..f8d062ceb8d 100644 --- a/src/locales/de/dialogue-male.json +++ b/src/locales/de/dialogue-male.json @@ -355,6 +355,30 @@ "1": "Ich werde für das nächste Rennen tunen." } }, + "firebreather": { + "encounter": { + "1": "Meine Flammen werden dich verschlingen!", + "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", + "3": "Komm näher und sieh dir meine Flammen an!" + }, + "victory": { + "1": "Verbrannt bis zur Asche...", + "2": "Yow! Das ist heiß!", + "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" + } + }, + "sailor": { + "encounter": { + "1": "Matrose, du gehst über Bord, wenn du verlierst!", + "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", + "3": "Ahoj! Bist du seekrank?" + }, + "victory": { + "1": "Argh! Von einem Kind besiegt!", + "2": "Dein Geist hat mich versenkt!", + "3": "Ich glaube, ich bin der der seekrank ist..." + } + }, "archer": { "encounter": { "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!", @@ -535,30 +559,6 @@ "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert." } }, - "firebreather": { - "encounter": { - "1": "Meine Flammen werden dich verschlingen!", - "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!", - "3": "Komm näher und sieh dir meine Flammen an!" - }, - "victory": { - "1": "Verbrannt bis zur Asche...", - "2": "Yow! Das ist heiß!", - "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!" - } - }, - "sailor": { - "encounter": { - "1": "Matrose, du gehst über Bord, wenn du verlierst!", - "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!", - "3": "Ahoj! Bist du seekrank?" - }, - "victory": { - "1": "Argh! Von einem Kind besiegt!", - "2": "Dein Geist hat mich versenkt!", - "3": "Ich glaube, ich bin der der seekrank ist..." - } - }, "rocket_grunt": { "encounter": { "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!", @@ -2439,7 +2439,7 @@ "1": "@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen,\n$aber hättest ja wenigstens Tschüss sagen können...\n$@c{smile_eclosed}Du verfolgst also wirklich deinen Traum?\nIch kann es kaum glauben.\n$@c{serious_smile_fists}Da wir schon einmal hier sind, wie wäre es mit einem Kampf?\nImmerhin muss ich doch sicherstellen, dass du bereit bist.\n$@c{serious_mopen_fists}Halte dich nicht zurück, zeig mir alles was du hast!" }, "victory": { - "1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!\n$@c{smile}Oh-und genieße das Event!" + "1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!" } }, "rival_female": { @@ -2447,7 +2447,7 @@ "1": "@c{smile_wave}Da bist du! Ich habe schon überall nach dir gesucht!\n@c{angry_mopen}Hast du etwas vergessen\n$deiner besten Freundin Tschüss zu sagen?\n$@c{smile_ehalf}Du folgst deinem Traum, oder?\nDas ist wirklich heute…\n$@c{smile}Naja, ich vergeben dir, dass du mich vergessen hast, aber nur unter einer Bedingung. @c{smile_wave_wink}Du musst gegen mich kämpfen!\n$@c{angry_mopen}Gib alles! Wir wollen doch nicht, dass dein Abenteuer endet bevor es begonnen hat, richtig?" }, "victory": { - "1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!\n$@c{smile}Oh-und genieße das Event!" + "1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!" } }, "rival_2": { @@ -2455,7 +2455,7 @@ "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!" }, "victory": { - "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf und genieße das Event!" + "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!" } }, "rival_2_female": { @@ -2463,7 +2463,7 @@ "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!" }, "victory": { - "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark und genieße das Event!" + "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark" }, "defeat": { "1": "Es ist Ok manchmal zu verlieren…" @@ -2542,4 +2542,4 @@ "1": "@c{smile_ehalf}Ich… Ich denke ich habe meine Aufgabe erfüllt.\n$@c{smile_eclosed}Versprich mir… Nachdem du die Welt geheilt hast… Komm bitte sicher nach Hause. \n$@c{smile_ehalf}…Danke." } } -} \ No newline at end of file +} From f5757f0a3aa0c00ac28e0dda197e747e218f6182 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:03:57 -0400 Subject: [PATCH 32/40] [Sprite] Fix exp back epic Bombirdier (#3688) * [Sprite] Add Bombirdier exp back epic palette Taken from static back palette * [Sprite] Use Bombirdier exp back epic palette * Delete public/images/pokemon/variant/exp/back/962_3.png * Delete public/images/pokemon/variant/exp/back/962_3.json --- .../images/pokemon/variant/_masterlist.json | 4 +- .../images/pokemon/variant/exp/back/962.json | 17 +- .../pokemon/variant/exp/back/962_3.json | 167 ------------------ .../images/pokemon/variant/exp/back/962_3.png | Bin 12765 -> 0 bytes 4 files changed, 18 insertions(+), 170 deletions(-) delete mode 100644 public/images/pokemon/variant/exp/back/962_3.json delete mode 100644 public/images/pokemon/variant/exp/back/962_3.png diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index ff28e68160e..757630ab6b5 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -10806,7 +10806,7 @@ "962": [ 1, 1, - 2 + 1 ], "967": [ 0, @@ -11095,4 +11095,4 @@ 1 ] } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/962.json b/public/images/pokemon/variant/exp/back/962.json index 860c4515df7..118a0f26768 100644 --- a/public/images/pokemon/variant/exp/back/962.json +++ b/public/images/pokemon/variant/exp/back/962.json @@ -28,5 +28,20 @@ "fffbff": "edf8e6", "7b827b": "6a856a", "a7aba7": "98a798" + }, + "2": { + "342930": "754156", + "0f0f0f": "0f0f0f", + "4a3942": "a5777f", + "937d85": "2f2655", + "b9aaaf": "453863", + "665b60": "211f45", + "efe3e1": "67548a", + "a7aba7": "ddac84", + "fffbff": "f7e5d0", + "e64c62": "aba7a8", + "993e49": "797877", + "501d25": "545151", + "7b827b": "a96c4b" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/962_3.json b/public/images/pokemon/variant/exp/back/962_3.json deleted file mode 100644 index 397453d3274..00000000000 --- a/public/images/pokemon/variant/exp/back/962_3.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "textures": [ - { - "image": "962_3.png", - "format": "RGBA8888", - "size": { - "w": 224, - "h": 224 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 82, - "h": 86 - }, - "frame": { - "x": 0, - "y": 0, - "w": 82, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 87, - "h": 79 - }, - "frame": { - "x": 0, - "y": 86, - "w": 87, - "h": 79 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 92, - "h": 74 - }, - "frame": { - "x": 82, - "y": 0, - "w": 92, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 38, - "w": 91, - "h": 59 - }, - "frame": { - "x": 0, - "y": 165, - "w": 91, - "h": 59 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 1, - "y": 36, - "w": 91, - "h": 60 - }, - "frame": { - "x": 87, - "y": 74, - "w": 91, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 0, - "y": 41, - "w": 101, - "h": 41 - }, - "frame": { - "x": 91, - "y": 134, - "w": 101, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 101, - "h": 97 - }, - "spriteSourceSize": { - "x": 0, - "y": 40, - "w": 100, - "h": 38 - }, - "frame": { - "x": 91, - "y": 175, - "w": 100, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ee54d59ae73a6775b5d1d9b10f273445:828dff0b1dc45966e927a7a1419412f2:1e70eb3d02dd5c47565da4b5d26e2400$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/962_3.png b/public/images/pokemon/variant/exp/back/962_3.png deleted file mode 100644 index 9356040a0e90afe6954279a7fec4f47143827fd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12765 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 Date: Mon, 26 Aug 2024 14:05:16 -0700 Subject: [PATCH 33/40] =?UTF-8?q?[Balance]=20Make=20sure=20trainers=20are?= =?UTF-8?q?=20using=20fully=20evolved=20Pok=C3=A9mon=20by=20gym=203=20(#34?= =?UTF-8?q?99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make sure trainers are using fully evolved Pokemon by gym 3 * Expand comment info Co-authored-by: Mumble * Implement suggestions * Update `getPokemonSpecies()` to throw an error if passed `undefined` --------- Co-authored-by: Mumble --- src/data/daily-run.ts | 3 ++- src/data/pokemon-species.ts | 50 ++++++++++++++++++++++--------------- src/data/trainer-config.ts | 6 ++--- src/field/trainer.ts | 8 +++--- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index b875877f99e..0a02defe052 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -49,7 +49,8 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[] const costSpecies = Object.keys(speciesStarters) .map(s => parseInt(s) as Species) .filter(s => speciesStarters[s] === cost); - const starterSpecies = getPokemonSpecies(getPokemonSpecies(Utils.randSeedItem(costSpecies)).getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); + const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); + const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); } }, 0, seed); diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index dc12ca402cd..14779688fc2 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1,24 +1,21 @@ - +import { Localizable } from "#app/interfaces/locales"; +import { Abilities } from "#enums/abilities"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import { Species } from "#enums/species"; +import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; +import i18next from "i18next"; import BattleScene, { AnySound } from "../battle-scene"; -import { Variant, variantColorCache } from "./variant"; -import { variantData } from "./variant"; +import { GameMode } from "../game-mode"; +import { StarterMoveset } from "../system/game-data"; +import * as Utils from "../utils"; +import { uncatchableSpecies } from "./biomes"; +import { speciesEggMoves } from "./egg-moves"; import { GrowthRate } from "./exp"; import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; import { Type } from "./type"; import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; -import { uncatchableSpecies } from "./biomes"; -import * as Utils from "../utils"; -import { StarterMoveset } from "../system/game-data"; -import { speciesEggMoves } from "./egg-moves"; -import { GameMode } from "../game-mode"; -import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; -import { VariantSet } from "./variant"; -import i18next from "i18next"; -import { Localizable } from "#app/interfaces/locales"; import { Stat } from "./pokemon-stat"; -import { Abilities } from "#enums/abilities"; -import { PartyMemberStrength } from "#enums/party-member-strength"; -import { Species } from "#enums/species"; +import { Variant, VariantSet, variantColorCache, variantData } from "./variant"; export enum Region { NORMAL, @@ -28,7 +25,15 @@ export enum Region { PALDEA } -export function getPokemonSpecies(species: Species | Species[]): PokemonSpecies { +/** + * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given + * @param species The species to fetch + * @returns The associated {@linkcode PokemonSpecies} object + */ +export function getPokemonSpecies(species: Species | Species[] | undefined): PokemonSpecies { + if (!species) { + throw new Error("`species` must not be undefined in `getPokemonSpecies()`"); + } // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block if (Array.isArray(species)) { // Pick a random species from the list @@ -648,8 +653,8 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); } - getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength): Species { - return this.getSpeciesForLevel(level, allowEvolving, true, strength); + getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { + return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave); } private getStrengthLevelDiff(strength: PartyMemberStrength): integer { @@ -669,7 +674,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER): Species { + getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -730,6 +735,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); } } + /* (Most) Trainers shouldn't be using unevolved Pokemon by the third gym leader / wave 80. Exceptions to this include Breeders, whose large teams are balanced by the use of weaker pokemon */ + if (currentWave >= 80 && forTrainer && strength > PartyMemberStrength.WEAKER) { + evolutionChance = 1; + noEvolutionChance = 0; + } if (evolutionChance > 0) { if (isRegionalEvolution) { @@ -754,7 +764,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const weight of evolutionPool.keys()) { if (randValue < weight) { - return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel(level, true, forTrainer, strength); // TODO: is the bang correct? + return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); } } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 5f47ce42a62..36f75a60c49 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -142,7 +142,7 @@ export const trainerPartyTemplates = { FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), - SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), @@ -965,7 +965,7 @@ function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSl return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); if (!ignoreEvolution) { - species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); + species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex); } return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); }; @@ -975,7 +975,7 @@ function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilt const originalSpeciesFilter = speciesFilter; speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { - const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess); + const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex)), level, trainerSlot, undefined, undefined, postProcess); return ret; }; } diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 68ebabbbe23..02827d0d69d 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -359,12 +359,12 @@ export default class Trainer extends Phaser.GameObjects.Container { let species = useNewSpeciesPool ? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)]) : template.isSameSpecies(index) && index > offset - ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset))) + ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex)) : this.genNewPartyMemberSpecies(level, strength); // If the species is from newSpeciesPool, we need to adjust it based on the level and strength if (newSpeciesPool) { - species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength)); + species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength, this.scene.currentBattle.waveIndex)); } ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); @@ -393,7 +393,7 @@ export default class Trainer extends Phaser.GameObjects.Container { species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); } - let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); + let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); let retry = false; console.log(ret.getName()); @@ -412,7 +412,7 @@ export default class Trainer extends Phaser.GameObjects.Container { console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { - ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); + ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); console.log(ret.name); if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { retry = false; From 17faea0eed44b6fe49d09b0ddae5295e9c7d46e8 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:10:38 +0200 Subject: [PATCH 34/40] Translate pokemon-form.json via GitLocalize (#3792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Ricardo --- src/locales/pt_BR/pokemon-form.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/locales/pt_BR/pokemon-form.json b/src/locales/pt_BR/pokemon-form.json index fd418e2ada2..aa8f32a5d36 100644 --- a/src/locales/pt_BR/pokemon-form.json +++ b/src/locales/pt_BR/pokemon-form.json @@ -152,10 +152,19 @@ "tatsugiriStretchy": "Reto", "gimmighoulChest": "Baú", "gimmighoulRoaming": "Perambulante", - "koraidonGlidingBuild": "Gliding Build", + "koraidonApexBuild": "Forma Plena", + "koraidonLimitedBuild": "Forma Limitada", + "koraidonSprintingBuild": "Forma de Corrida", + "koraidonSwimmingBuild": "Forma de Nado", + "koraidonGlidingBuild": "Forma de Voo", + "miraidonUltimateMode": "Modo Pleno", + "miraidonLowPowerMode": "Modo Limitado", + "miraidonDriveMode": "Modo Terrestre", + "miraidonAquaticMode": "Modo Aquático", + "miraidonGlideMode": "Modo Aéreo", "poltchageistCounterfeit": "Imitação", "poltchageistArtisan": "Artesão", "paldeaTaurosCombat": "Combate", "paldeaTaurosBlaze": "Chamas", "paldeaTaurosAqua": "Aquático" -} \ No newline at end of file +} From b0933007d86726872e9be0a7c05fd67419fa6e42 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:19:11 +0200 Subject: [PATCH 35/40] Translate settings.json via GitLocalize (#3833) Co-authored-by: Lugiad --- src/locales/fr/settings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/locales/fr/settings.json b/src/locales/fr/settings.json index 3b0794c502d..181a593cc99 100644 --- a/src/locales/fr/settings.json +++ b/src/locales/fr/settings.json @@ -63,6 +63,7 @@ "bgmVolume": "Vol. musique", "fieldVolume": "Vol. combats", "seVolume": "Vol. effets", + "uiVolume": "Vol. menus", "musicPreference": "Préf. musicale", "mixed": "Mixte", "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton.", From 6ccb6fc776975733a8987fd26f7961a6ef65e463 Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:19:26 +0200 Subject: [PATCH 36/40] Translate settings.json via GitLocalize (#3832) Co-authored-by: Jannik Tappert --- src/locales/de/settings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/locales/de/settings.json b/src/locales/de/settings.json index f3c4ba5b40e..d72a026cf5a 100644 --- a/src/locales/de/settings.json +++ b/src/locales/de/settings.json @@ -63,6 +63,7 @@ "bgmVolume": "Hintergrundmusik", "fieldVolume": "Rufe & Attacken", "seVolume": "Spezialeffekte", + "uiVolume": "Benutzeroberfläche", "musicPreference": "Musik Präferenz", "mixed": "Gemischt", "gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.", From 1a76a238cb417d8ca2cb683152d03e9bfdb0a3fe Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:43:35 +0200 Subject: [PATCH 37/40] [Localizatio] [pt_BR] Updated many translations (#3830) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translate ability.json via GitLocalize * Translate arena-flyout.json via GitLocalize * Translate dialogue-female.json via GitLocalize * Translate modifier-type.json via GitLocalize * Translate move.json via GitLocalize * Translate settings.json via GitLocalize * Translate tutorial.json via GitLocalize --------- Co-authored-by: José Ricardo --- src/locales/pt_BR/ability.json | 16 +++++++----- src/locales/pt_BR/arena-flyout.json | 25 ++++++++++++++++-- src/locales/pt_BR/dialogue-female.json | 36 +++++++++++++++++++++++++- src/locales/pt_BR/modifier-type.json | 12 ++++----- src/locales/pt_BR/move.json | 6 ++--- src/locales/pt_BR/settings.json | 9 ++++--- src/locales/pt_BR/tutorial.json | 4 +-- 7 files changed, 84 insertions(+), 24 deletions(-) diff --git a/src/locales/pt_BR/ability.json b/src/locales/pt_BR/ability.json index 5b885504bd1..c4180ff01dd 100644 --- a/src/locales/pt_BR/ability.json +++ b/src/locales/pt_BR/ability.json @@ -257,7 +257,7 @@ }, "overgrow": { "name": "Overgrow", - "description": "Fortalece os movimentos do tipo Planta quando o Pokémon está com poucos PS." + "description": "Fortalece os movimentos do tipo Grama quando o Pokémon está com poucos PS." }, "blaze": { "name": "Blaze", @@ -625,7 +625,7 @@ }, "sapSipper": { "name": "Sap Sipper", - "description": "Se for atingido por um movimento do tipo Planta, ao invés de receber dano, aumenta seu Ataque." + "description": "Se for atingido por um movimento do tipo Grama, ao invés de receber dano, aumenta seu Ataque." }, "prankster": { "name": "Prankster", @@ -661,7 +661,7 @@ }, "flowerVeil": { "name": "Flower Veil", - "description": "Pokémon aliados do tipo Planta são protegidos de mudanças de estado e diminuição de seus atributos." + "description": "Pokémon aliados do tipo Grama são protegidos de mudanças de estado e diminuição de seus atributos." }, "cheekPouch": { "name": "Cheek Pouch", @@ -927,6 +927,10 @@ "name": "Prism Armor", "description": "Reduz o dano recebido por movimentos supereficazes." }, + "neuroforce": { + "name": "Neuroforce", + "description": "Fortalece movimentos supereficazes." + }, "intrepidSword": { "name": "Intrepid Sword", "description": "Aumenta o atributo de Ataque ao entrar em batalha." @@ -1055,9 +1059,9 @@ "name": "Grim Neigh", "description": "Quando o Pokémon derrota um alvo, emite um relincho assustador que aumenta seu Ataque Esp." }, - "asOneGlacier": { + "asOneGlastrier": { "name": "As One", - "description": "Essa Habilidade combina os efeitos das Habilidades Enervar de Calyrex e Relincho Branco de Glastrier." + "description": "Esta habilidade combina os efeitos da habilidade Unnerve de Calyrex e da habilidade Chilling Neigh de Glastrier." }, "asOneSpectrier": { "name": "As One", @@ -1235,4 +1239,4 @@ "name": "Poison Puppeteer", "description": "Pokémon envenenados pelos movimentos de Pecharunt também ficarão confusos." } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/arena-flyout.json b/src/locales/pt_BR/arena-flyout.json index 7ef11bea17f..e221fa6c0a5 100644 --- a/src/locales/pt_BR/arena-flyout.json +++ b/src/locales/pt_BR/arena-flyout.json @@ -15,5 +15,26 @@ "misty": "Terreno Enevoado", "electric": "Terreno Elétrico", "grassy": "Terreno de Planta", - "psychic": "Terreno Psíquico" -} \ No newline at end of file + "psychic": "Terreno Psíquico", + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "happyHour": "Happy Hour" +} diff --git a/src/locales/pt_BR/dialogue-female.json b/src/locales/pt_BR/dialogue-female.json index 7f4dfe8865d..65b3aad9962 100644 --- a/src/locales/pt_BR/dialogue-female.json +++ b/src/locales/pt_BR/dialogue-female.json @@ -1218,6 +1218,40 @@ "3": "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos." } }, + "chili": { + "encounter": { + "1": "Yeeeeeooow! Hora de brincar com FOGO!! Eu sou o mais forte de nós irmãos!", + "2": "Tcharan! O escaldante Chili tipo Fogo (sou eu) será seu oponente!", + "3": "Vou te mostrar o que eu e meus ardentes tipo Fogo podemos fazer!" + }, + "victory": { + "1": "Você me pegou. Eu estou… queimado… esgotado…", + "2": "Uau! Você tá pegando fogo!", + "3": "Ai! Você me pegou!" + }, + "defeat": { + "1": "Estou pegando fogo! Brinque comigo e você vai se queimar!", + "2": "Quando você brinca com fogo, você se queima!", + "3": "Quero dizer, fala sério, seu oponente era eu! Você não teve chance!" + } + }, + "cilan": { + "encounter": { + "1": "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\n$Hum... Nós iremos batalhar, aconteça o que acontecer.", + "2": "Então, hum, se você estiver bem comigo, eu vou, hum, dar tudo o que tenho para ser, hum, você sabe, seu oponente.", + "3": "OK... Então, eu sou Cilan, eu gosto de Pokémon do tipo Grama." + }, + "victory": { + "1": "Er… Já acabou?", + "2": "…Que surpresa. Você é muito forte, não é? \n$Eu acho que meus irmãos também não conseguiriam derrotar você…", + "3": "…Huh. Parece que meu timing estava, hum, errado?" + }, + "defeat": { + "1": "Hein? Eu ganhei?", + "2": "Eu acho... \n$Eu acho que ganhei, porque eu estava competindo com meus irmãos Chili e Cress, e todos nós conseguimos ficar mais fortes.", + "3": "Foi… foi uma experiência bastante emocionante…" + } + }, "roark": { "encounter": { "1": "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!", @@ -2508,4 +2542,4 @@ "1": "@c{smile_ehalf}Eu… acho que cumpri meu propósito…\n$@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa.\n$@c{smile_ehalf}…Obrigada." } } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json index 722da8d2dbf..1787360b51e 100644 --- a/src/locales/pt_BR/modifier-type.json +++ b/src/locales/pt_BR/modifier-type.json @@ -505,8 +505,8 @@ "BLASTOISINITE": "Blastoisinita", "BLAZIKENITE": "Blazikenita", "CAMERUPTITE": "Cameruptita", - "CHARIZARDITE X": "Charizardita X", - "CHARIZARDITE Y": "Charizardita Y", + "CHARIZARDITE_X": "Charizardita X", + "CHARIZARDITE_Y": "Charizardita Y", "DIANCITE": "Diancita", "GALLADITE": "Galladita", "GARCHOMPITE": "Garchompita", @@ -525,12 +525,12 @@ "MAWILITE": "Mawilita", "MEDICHAMITE": "Medichamita", "METAGROSSITE": "Metagrossita", - "MEWTWONITE X": "Mewtwonita X", - "MEWTWONITE Y": "Mewtwonita Y", + "MEWTWONITE_X": "Mewtwonita X", + "MEWTWONITE_Y": "Mewtwonita Y", "PIDGEOTITE": "Pidgeotita", "PINSIRITE": "Pinsirita", - "SABLENITE": "Sablenita", "RAYQUAZITE": "Rayquazita", + "SABLENITE": "Sablenita", "SALAMENCITE": "Salamencita", "SCEPTILITE": "Sceptilita", "SCIZORITE": "Scizorita", @@ -606,4 +606,4 @@ "FAIRY_MEMORY": "Memória de Fada", "BLANK_MEMORY": "Memória Vazia" } -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/move.json b/src/locales/pt_BR/move.json index f3ba21a637d..c463665f1ad 100644 --- a/src/locales/pt_BR/move.json +++ b/src/locales/pt_BR/move.json @@ -39,9 +39,9 @@ "name": "Scratch", "effect": "Garras duras, pontiagudas e afiadas rasgam o alvo para causar dano." }, - "viceGrip": { - "name": "Vice Grip", - "effect": "O alvo é agarrado pelos lados e espremido." + "viseGrip": { + "name": "Vise Grip", + "effect": "O alvo é agarrado e espremido de ambos os lados para causar dano." }, "guillotine": { "name": "Guillotine", diff --git a/src/locales/pt_BR/settings.json b/src/locales/pt_BR/settings.json index e2fd6d5c8d2..58ccb45f86d 100644 --- a/src/locales/pt_BR/settings.json +++ b/src/locales/pt_BR/settings.json @@ -59,11 +59,12 @@ "fusionPaletteSwaps": "Cores da Paleta de Fusão", "playerGender": "Gênero do Jogador", "typeHints": "Dicas de Tipo", - "masterVolume": "Volume Geral", + "masterVolume": "Volume Mestre", "bgmVolume": "Músicas", "fieldVolume": "Ambiente", "seVolume": "Ef. Sonoros", - "musicPreference": "Estilo da Música", + "uiVolume": "Interface", + "musicPreference": "Preferência de Música", "mixed": "Misto", "gamepadPleasePlug": "Conecte um controle ou pressione um botão", "delete": "Deletar", @@ -96,11 +97,11 @@ "controller": "Controle", "gamepadSupport": "Suporte para Controle", "showBgmBar": "Exibir Nomes das Músicas", - "moveTouchControls": "Move Touch Controls", + "moveTouchControls": "Mover Controles de Toque", "shopOverlayOpacity": "Opacidade da Loja", "shopCursorTarget": "Alvo do Cursor da Loja", "items": "Itens", "reroll": "Atualizar", "shop": "Loja", "checkTeam": "Checar Time" -} \ No newline at end of file +} diff --git a/src/locales/pt_BR/tutorial.json b/src/locales/pt_BR/tutorial.json index 7184f8538f1..e347ca6fbee 100644 --- a/src/locales/pt_BR/tutorial.json +++ b/src/locales/pt_BR/tutorial.json @@ -5,6 +5,6 @@ "starterSelect": "Aqui você pode escolher seus iniciais apertando a tecla Z ou\na Barra de Espaço.\n$Esses serão os primeiro Pokémon da sua equipe.\n$Cada inicial tem seu custo. Sua equipe pode ter até 6\nmembros, desde que a soma dos custos não ultrapasse 10. \n$Você pode escolher o gênero, a habilidade\ne até a forma do seu inicial.\n$Essas opções dependem das variantes dessa\nespécie que você já capturou ou chocou. \n$Os IVs de cada inicial são os melhores de todos os Pokémon\ndaquela espécie que você já capturou ou chocou.\n$Sempre capture vários Pokémon de várias espécies!", "pokerus": "Todo dia, 3 Pokémon iniciais ficam com uma borda roxa.\n$Caso veja um inicial que você possui com uma dessa, tente\nadicioná-lo a sua equipe. Lembre-se de olhar seu sumário!", "statChange": "As mudanças de atributos se mantém após a batalha desde que o Pokémon não seja trocado.\n$Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma.\n$Para ver as mudanças de atributos dos Pokémon em campo, mantena C ou Shift pressionado durante a batalha.", - "selectItem": "Após cada batalha, você pode escolher entre 3 itens aleatórios.\n$Você pode escolher apenas um deles.\n$Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes.\n$A maioria dos efeitos de itens não consumíveis podem ser acumulados.\n$Alguns itens só aparecerão se puderem ser usados, como os itens de evolução.\n$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção \"Transfer\".\n$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.\n$Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe.\n$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.", + "selectItem": "Após cada batalha, você pode escolher entre 3 itens aleatórios.\n$Você pode escolher apenas um deles.\n$Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes.\n$A maioria dos efeitos de itens não consumíveis podem ser acumulados.\n$Alguns itens só aparecerão se puderem ser usados, como os itens de evolução.\n$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção \"Alterar\".\n$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.\n$Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe.\n$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.", "eggGacha": "Aqui você pode trocar seus vouchers\npor ovos de Pokémon.\n$Ovos ficam mais próximos de chocar após cada batalha.\nOvos mais raros demoram mais para chocar.\n$Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais.\n$Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens.\n$Alguns Pokémon só podem ser obtidos através de seus ovos.\n$Temos 3 máquinas, cada uma com seu bônus específico,\nentão escolha a que mais lhe convém!" -} \ No newline at end of file +} From 264d7f584af8bd58c8442a0ef929aa8cc75ec2bc Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:10:38 -0700 Subject: [PATCH 38/40] Translate settings.json via GitLocalize (#3835) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Niccolò --- src/locales/it/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/it/settings.json b/src/locales/it/settings.json index 002ea6ad4db..381503f21bd 100644 --- a/src/locales/it/settings.json +++ b/src/locales/it/settings.json @@ -2,9 +2,9 @@ "boy": "Ragazzo", "girl": "Ragazza", "general": "Generale", + "uiVolume": "Volume UI ", "gamepadSupport": "Supporto Gamepad", "showBgmBar": "Mostra Nomi Musica", - "fieldVolume": "Volume Campo", "moveTouchControls": "Move Touch Controls", "shopOverlayOpacity": "Opacità Finestra Negozio", "shopCursorTarget": "Target Cursore Negozio", From 71b45f0c46937bd9ad85e9c84c5b94dea625003c Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:43:32 -0700 Subject: [PATCH 39/40] Translate pokemon-info.json via GitLocalize (#3756) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Niccolò --- src/locales/it/pokemon-info.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/locales/it/pokemon-info.json b/src/locales/it/pokemon-info.json index 015cbd77ad0..4b655dbe1ce 100644 --- a/src/locales/it/pokemon-info.json +++ b/src/locales/it/pokemon-info.json @@ -13,7 +13,8 @@ "SPD": "Velocità", "SPDshortened": "Vel", "ACC": "Precisione", - "EVA": "Elusione" + "EVA": "Elusione", + "HPStat": "PS" }, "Type": { "UNKNOWN": "Sconosciuto", @@ -37,4 +38,4 @@ "FAIRY": "Folletto", "STELLAR": "Astrale" } -} \ No newline at end of file +} From 5b400af5b797faecd3e5e0ef92bf91d5d5c133ce Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 26 Aug 2024 20:17:27 -0700 Subject: [PATCH 40/40] Fix daily mode test being unreliable (#3840) --- src/test/utils/helpers/dailyModeHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/src/test/utils/helpers/dailyModeHelper.ts index 8f60981f4d8..d68edf43647 100644 --- a/src/test/utils/helpers/dailyModeHelper.ts +++ b/src/test/utils/helpers/dailyModeHelper.ts @@ -28,7 +28,7 @@ export class DailyModeHelper extends GameManagerHelper { uihandler.processInput(Button.ACTION); // select first slot. that's fine }); - await this.game.phaseInterceptor.run(EncounterPhase); + await this.game.phaseInterceptor.to(EncounterPhase); if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { this.game.removeEnemyHeldItems();