From 389036a56f1304ee6a14eabed002c90235451aea Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Mon, 8 Apr 2024 23:29:07 -0400 Subject: [PATCH 01/19] Temporarily add back data import --- src/ui/menu-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 26103f51ed8..6ef28d526ce 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -114,7 +114,7 @@ export default class MenuUiHandler extends MessageUiHandler { }); }; - if (Utils.isLocal) { + if (/*Utils.isLocal*/true) { manageDataOptions.push({ label: 'Import Session', handler: () => confirmSlot('Select a slot to import to.', () => true, slotId => this.scene.gameData.importData(GameDataType.SESSION, slotId)), @@ -140,7 +140,7 @@ export default class MenuUiHandler extends MessageUiHandler { }, keepOpen: true }); - if (Utils.isLocal) { + if (/*Utils.isLocal*/true) { manageDataOptions.push({ label: 'Import Data', handler: () => this.scene.gameData.importData(GameDataType.SYSTEM), From d226f4f56470991dc700babf1120fa92247a864b Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 01:43:12 -0400 Subject: [PATCH 02/19] Add a new splash message --- src/data/splash-messages.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index 02e33a12c78..32a48d03063 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -27,6 +27,7 @@ splashMessages.push(...[ 'Mostly Consistent Seeds!', 'Achievement Points Don\'t Do Anything!', 'You Do Not Start at Level 2000!', + 'Don\'t Talk About the Manaphy Egg Incident!', 'Also Try Pokéngine!', 'Also Try Emerald Rogue!', 'Also Try Radical Red!', From 78dc98eb56aabca84d0ab95f1d31c1646ad0345e Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Tue, 9 Apr 2024 02:00:30 -0500 Subject: [PATCH 03/19] Add former HMs as TMs This adds Cut, Strength, Flash, Rock Smash, Rock Climb, and Defog as new potential TMs. Also adds Spiky-eared Pichu into the game for implementation at a later time. --- public/images/pokemon/172-spiky.json | 41 + public/images/pokemon/172-spiky.png | Bin 0 -> 419 bytes public/images/pokemon/back/172-spiky.json | 41 + public/images/pokemon/back/172-spiky.png | Bin 0 -> 383 bytes .../images/pokemon/back/shiny/172-spiky.json | 41 + .../images/pokemon/back/shiny/172-spiky.png | Bin 0 -> 388 bytes public/images/pokemon/icons/172-spiky.png | Bin 0 -> 338 bytes public/images/pokemon/icons/172s-spiky.png | Bin 0 -> 338 bytes public/images/pokemon/shiny/172-spiky.json | 41 + public/images/pokemon/shiny/172-spiky.png | Bin 0 -> 419 bytes public/images/pokemon_icons_2.json | 4564 +++++++++-------- public/images/pokemon_icons_2.png | Bin 41917 -> 42091 bytes src/data/pokemon-evolutions.ts | 2 +- src/data/pokemon-species.ts | 7 +- src/data/tms.ts | 1749 +++++++ 15 files changed, 4222 insertions(+), 2264 deletions(-) create mode 100644 public/images/pokemon/172-spiky.json create mode 100644 public/images/pokemon/172-spiky.png create mode 100644 public/images/pokemon/back/172-spiky.json create mode 100644 public/images/pokemon/back/172-spiky.png create mode 100644 public/images/pokemon/back/shiny/172-spiky.json create mode 100644 public/images/pokemon/back/shiny/172-spiky.png create mode 100644 public/images/pokemon/icons/172-spiky.png create mode 100644 public/images/pokemon/icons/172s-spiky.png create mode 100644 public/images/pokemon/shiny/172-spiky.json create mode 100644 public/images/pokemon/shiny/172-spiky.png diff --git a/public/images/pokemon/172-spiky.json b/public/images/pokemon/172-spiky.json new file mode 100644 index 00000000000..e867ae07125 --- /dev/null +++ b/public/images/pokemon/172-spiky.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "172-spiky.png", + "format": "RGBA8888", + "size": { + "w": 37, + "h": 37 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 37, + "h": 37 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a54544be532be719321d616d8c7aced5:a2bb30b1b8b6f639fce8842f57cfa1b1:9ae51c05debb17f5b4855b9604caf349$" + } +} diff --git a/public/images/pokemon/172-spiky.png b/public/images/pokemon/172-spiky.png new file mode 100644 index 0000000000000000000000000000000000000000..5e79da2b379c67c5de61593665f235471e071140 GIT binary patch literal 419 zcmV;U0bKrxP)O3}I17;kghC!i^$A+$$ui@SS>ujtpNQ0JME40APE80RF4X`mT7U z#)ig24b4=O?S85%W3UmU;6OJ;e;#hlt~q??h4Q=R%)l%nx6R{Fn)^^XIVgQ%wish$ zJY&@Ui>2TcznnI+-pT9yh%A~RituP91S#qK4O)aY)>%+G=1QZS(Cbls_{$ckC}HbC zu&$0)Vs&sN4|R>gkrG>pL_r_Eo#Q7ts2%0$8`F9kbg$SG);iezT#RIWbHr5l=!h0f zZ6qN@Etq!Xsw}x+%3M(kY_X(yV8vv}^?tD+w~021_1$M+3H!Q4^$Shw2Xj|+fcO9a N002ovPDHLkV1jgeuu}j4 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/back/172-spiky.json b/public/images/pokemon/back/172-spiky.json new file mode 100644 index 00000000000..ddc0fe9b943 --- /dev/null +++ b/public/images/pokemon/back/172-spiky.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "172-spiky.png", + "format": "RGBA8888", + "size": { + "w": 37, + "h": 37 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 37, + "h": 37 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 28, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 28, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:0d1cec69240ba50d6a304f627a54acaf:827b2992c2d340b0dc5f851caeb6463e:9ae51c05debb17f5b4855b9604caf349$" + } +} diff --git a/public/images/pokemon/back/172-spiky.png b/public/images/pokemon/back/172-spiky.png new file mode 100644 index 0000000000000000000000000000000000000000..fdff8ac772a7c2e2fbc1ddbbc9a077fab2394239 GIT binary patch literal 383 zcmV-_0f7FAP)t0F%S?CQbI!a=2C=ODW!V|V@eR#b7SUvl&)Ula{vGU0d!JMQvg8b*k%9#010qN zS#tmY4#WTe4#WYKD-Ig~008$%L_t(I%Z<}n7Q-M21<=4lu-*TH3uZQG!|9i~l|fyW zG#JbOU=h4QFIC2vd(>AJg0FvN;Rtm5`_e`67D&oCb7l%2a%Id3!@APC!cgt(SkIN` zyszhK>69}`dOVqbP!BdA>SOk&QY{`r27MmT&YCHO$Vz##tpVAQN5F z4E{5tl20D-nuD#SQ?X37i;BHR88m=Ul{SWP@o`4BZlyYzR;7w4&aYw}t4QZgoy|s% dmKW&H=Lfz01@S?Vt}_4t002ovPDHLkV1f~$p?m-U literal 0 HcmV?d00001 diff --git a/public/images/pokemon/back/shiny/172-spiky.json b/public/images/pokemon/back/shiny/172-spiky.json new file mode 100644 index 00000000000..06ab4320bcc --- /dev/null +++ b/public/images/pokemon/back/shiny/172-spiky.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "172-spiky.png", + "format": "RGBA8888", + "size": { + "w": 37, + "h": 37 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 37, + "h": 37 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 28, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 28, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d29f82d65f41d6a2345d138505688bcf:878f83394f1d74e94db8f5e999befc35:9ae51c05debb17f5b4855b9604caf349$" + } +} diff --git a/public/images/pokemon/back/shiny/172-spiky.png b/public/images/pokemon/back/shiny/172-spiky.png new file mode 100644 index 0000000000000000000000000000000000000000..89815c11d769dc4372b91d11f124375e505e6f20 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^svyk43?x4}TrdPuDgizru0ENC_vTnBDuM)poSgn& zW9ac>*jvpYARrK>$Z(BA^1q?e|Ma~(fYOX5L4Lsu4$p3+0Xdun9+AZi417mGm~pB$ zpEOYLr>Bc!h{fsN%Yj0N6*yP|5(Sg0|Nj>Aoh;RCX8p71UWbyWCXe!8{_Y2yRV$Q^ z*(~~)61pL0?;|Om-@k*F|Bz-m{^M%Tm1h&@8M5cx4!^b5Ae7zudh%1#^{+R2H5aKJ zlohsGDrc7eYVCLXrL%0E*!J3AI5_L%%o9cXjNkb1J?Wfb?eM~6YNm~WQ*F_ibs5`k zuDJKfVQ-S@hU+PxK6=E?^r@Gd!?)W0EQ{_Yg{1*kwkwXeEv=Mueg_@~CSovWVSS-Cm% g^~G0AkAK%NY(L9p;T4to7#Ii)p00i_>zopr06}S@xc~qF literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/172-spiky.png b/public/images/pokemon/icons/172-spiky.png new file mode 100644 index 0000000000000000000000000000000000000000..40e0ea45e1dec3f3bab1ad2c90d8538a85f51dbd GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{174DbnYRZvg}3JN+p$Lat7?3QA~|Ns9V^$L1+)a!rsQlOG0mrC9MDXx+r zzhIyg1TbtmqjMf8%30tMS>i#qGdY_f2{H|sB8fIj(q@aA&ncX5w_Q@Nn{174DbnYRZvg}3JTiYq5th+P+f}h|NsAwdIjBCWB9*%DNxBl;{{AWimN2Z zFBm8V0SueY=$r?Nau#?*7BevL9R^{>Ppy z!`3lAB@QOP_e`Dz>b04LMw3bDA-$WvS7T<$cqH{w1yVlbq&~BT;rT=lz+p4{Y=k&&7L& Wt9t#5=7|A1nZeW5&t;ucLK6Vf!iEI^ literal 0 HcmV?d00001 diff --git a/public/images/pokemon/shiny/172-spiky.json b/public/images/pokemon/shiny/172-spiky.json new file mode 100644 index 00000000000..db03d79673f --- /dev/null +++ b/public/images/pokemon/shiny/172-spiky.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "172-spiky.png", + "format": "RGBA8888", + "size": { + "w": 37, + "h": 37 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 37, + "h": 37 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 37 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:49a07db3effcc103cbb05f5e4fcb1155:fe0e8884b0d24f136e2bc354b3a1bb1b:9ae51c05debb17f5b4855b9604caf349$" + } +} diff --git a/public/images/pokemon/shiny/172-spiky.png b/public/images/pokemon/shiny/172-spiky.png new file mode 100644 index 0000000000000000000000000000000000000000..78d09474b284ab664b2661b5fb7d1e297b397a2c GIT binary patch literal 419 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

KkV)n>F*wBHVzAaeYu z>UO(RNaDWRvigZ`_cV~`wMu%CxN35=I|0Ps7^NpdSm;^2;4}An;yNh&h}&nlfPx{s z$(UmDEm7)hv5MIE=rhui^vjyrQRQ`R>#o55*9)Ff?QeBPq~CQ$D7DMb@@Mx$a~k`X ze-q(v#HU&A6n$OpE{qtigo99)r0t1)l;0YsdFqRWcOJsNBCml@oemAW#0p)C;LaNR z#g(nMTxr>DZ`_1^y7MV~j(8up%O zPBioeJ~`t3zbR&%;^4)VI<=ycE2#OLnF=0N@TJEjq+G=H{qEd1Z@2yk=!lfY*VOa~ z`8XB9Nj8^fQ2=YUyzG;L6CXUUy&~aV0OdDu-U8n2fW$(|+lCXw2{Kn^qjAh;xiVJq z{c2U8V=J#eEmK%-1`F&Z4O1o(iAHhY`YglQBpPo{gfg6C|K%qxRYZj)Ct!?=IA$9VB8L*r<9zwJXi)bPb-sBL?IhVNl zL?_kBX2qw{9$W^k7t#hfp|_~LR(M{hDtnx4+43iN_ns~ClLV+116 ziB_$ENtaAOr9WVvbuoJ6{AC7r%n`;2q|p}zBWz6Ss5-?b?we^2!ILWA&*pD`O`;}g z?m_{?^~%?~7eRhqciule%y?o;WCH~)en)$qtrftChv|sD2*m5fn|huH`r?Gcu@5)w zEL(Zgaawvx(cE9I+7D_2=3eixIBvs9ek^>44kO}Q?$JZ$qBCRLlV88AsAn(fA6ynL z3Z6v*wx(ZeO-!%{@*$dE)7IA(R6BbqCG&4j<)~L+k+xnpWS6X4XmrU9FqWC!1!Sz& z7mEM|Au+-bybETz{GAeiQ-;F&z_h#1r7VH&hjq9V7KyUEq@ zlg^3i_XJl3*Gfc#U%%G|WM+nv;od^)x7Y2}PdmvPve!d`(Uia^Al4mlzUe@kNeK`B zy)$6Wqx|qLILQb)OZ**J1Y39#2fK}W0~!i%OLH~%I9yvN_T}D>75k!cImS6 z!hKn{!+RIU)Hn~n!tPcG0Zam z8Z@bdgaeOe!1Psd8E4NuKi-JyzEj~*FybYt>Au#q`W|+BBCI(+_+KWO$P1})X-))0 zksTppAWeYZ1^n5v$xGj5M59HNoirEELUx?&oYJUh(CKyshb-9i{*16cbUzPCYBu>E zv==`vreBV{xwLCkho1i0bGsF%(ihh_(derM7#jSMvh7?^_WQTqg3Vpv)dpow3rAjo z#i>4=cwQC9@=>z@D}B4Hn6eKnPg=U_apcAqVx2IFT;%dhpbaN<+;%X|Nf_utu`(qW zc9wEI9pn5H&4I_lksjM^A_xqe9;chLV>o}PJ9OE5Ctz=O#;e}e($cvw7c(CRgsGt& zY=_e&U!|mlcX0liPrA9?k<|#}+|*gmsd*uwbuCo{%KvxVXHnZ7;?TtJlGk@9(Cz zLvF{OJ#OfD9#}KtWrqoV7opjHakKi1c#CV$)YIiz{_F6z@{oB4r`BN+FZw}ns5vl{ z>nB7ZecM>-TH``Wq z+-1{*UCT)UmoA7Gt7-yQyeVTy?n_NVBx+teqfD$&XO#A!8Bru6OPvkSFeZ+W%e1y&O=gYYE}NfXgcaOAY!8We(Rb7<)-(4nMI+bBJ}`uaYgS};s(_u$gUd8&|nGC zGXTkfKYTDGP1*;)>@jN+icBH~Az*rFR=?+jG{jXcOA0vFaDN%u1a)s3Vccf~E&bk; z0CXcceW#xGLsr&4oMWPVrUIb+d+(KQkyXtdP-Dk|haJ4>cgWbOD58A(q=fpI%yuqi+w3B0c zdNdmD^*d1YyzYXmeBG1&H!%Svg?dqcZ4Le)@ERfHbHoM!dMgaKczlu=J~7dRs#=U* z@Q_srXfa>B8Y7krygpxtscL38ua%r8V!LO!mggf zw>lxXa6`h#hx}NG=RdCgI^jriOhG541lP5HM9Hs>_tVc-V4M=am-^hDaMU7r7C}s; zxsz8A`S2j_pBF{D5jsnrckoT+UPOOBnLX50G)m`ta0LsYCNCx8>DQ>YwnZ34S~NLH z2`K#udOvcoCt0H`jxKa#Px}QANPrwb-jYxGaw>}V15ZEKN65eON23}~ZN!~zk-`U~ z@h!qx$zKI|4cH&-urzHbJ}t^d0eB7}0aKiR2MCTlQ4tseTLtXF$p;0-AMumOHO<0; z@HTC{v16u&{oU!Td(FY6>~~7PKhImb+)3$Qb24%VVCsLf_|Q{vAVw*vLY9B8)GR?b z`iq|jZZMdKhCUzFYt{46v@HH>zzJjKH!0rqpUGI0SnS1SwHy!`1+jg>6t{CE_ntkj zcMr2*5HtSES+%`zpwq|ryY1wNa=CrwdwzZdgr=OtPz@^hdQpD;Af9&!K1(W_G6vFG z<61%j@+V)hXAZvpz~Ylu)S@-q@sbfaEt__tRqo;7n75#k}Q$4_Qms zJ&-T-_H9(WW<9*z0(;gIKip7jn045TUp_u{bpNUl+DA;^Bt`2!?15j7+cX#Vj5dP5 z=8njJ9(|UpG&LN)b#U(^}Nip;a3`vxNax!aPrFKQ7 zk6fa?#!1Xpjku)`$wbriZ>!ULSyUnGe)ntdJx_dTw49?>O6D!@>YYoDf|1NiP1(m)GXd-4o7~=@0>ZJVSV|Z51CaaqSG{X2o{UbyqXPLlbAiqM^;9DOY@{IT5-S zT(J$D0KHim`eS`QyX7K&Hc7wb*)Z@9Rtr;7zv=Xqc?_cur;ty6FFMGRoQRV{ zrzVb$+p)>P)%)R>Vr?_fYqK+@PZ?1Z2{?1x9NiBiIpT#aGuBYl95l7_qqTTiKxDV`LImKWEo)I5` z4qn-h<*Of1fVu=;o`t0$>|^OB7+Yy^kxNdnxkL1@(QhOwcp=JfrjB%gP8zKRxRzIp z??^~CZ|V+dT>QC$THHeTqD`_CU9Qe6uDui0i<+Y|9$On_d7Q^@t6j~m?u*V(n4(Xv zQyWC?Sacyk5bn@f^(g(#pIs=HDOU(J%p4c3#|-+eDOv>Qa?k<(jfl?tf<@XnH3XhG zI;REg#Z#g!UJwm86z7FR5nMBj=g0!B;XHnP14G0n$KB%5m* z^uA}ia&Y41FdUX+ebhH8wjMuO<^J@`wV(JK)(TEo`w)mveA&D`cC7O^7FYWupnNDt zf*RzYccZP%_$fLO#Gj>oHp5K+`jr%WyG;knUM1ZsXql{&U}bURT5KhOH=k>)ztxVA zCh*dSNPr=At6 zViOBnOBvpgxzrDz`OZx&EiBeIEHgX$ClIYRSL#TwE5ZvicvE)?p-{waSYM-O|5 z=c7Q-7rR;kBM7oB5fXq?IESnPriY54(_VwG;ZbL4i-X^PXMRlYNi7@sSIknJ`aOw_ z2bQlF#$F*i!bpwgFcN_Ty)VQDpGxH?@oL1d+wDU0r?FFF>5i&hsn}DF-AxGRIbA$Q zhKV?w)`^vifyviM!<>bGi|B8=>KEg~h`&TK6RE|&i3BS)>&UwzGe3S05yqkcqV*^tnwiszm^kM4mvnOsX zAvTDW2Zz)0#3wE?;*6(qKs@~Hj5=_T^Tt~QbUf%HYsh`wYjIsd89N+1l<~Oz5WYVR zoC#4sNYzIX{Q^{k;t>eA5(wa>f{t7U#RGFz*M^jZ$zI=T0<{`DBMBmDHD@(;j+6~; zm=y~a?r)r;1wHS06t{=J*)OyHS{D(-br5h7u1;EuZ=pSnN|pYXp^BX_qA#Tq6OOB+%*nno_)hTq_Pi>Z zROiJ{;0;Re_rrGY@OBbxZ0t^mgeHaYgP~>%90=}|!a_ofXwiv1W_@xI@ZT`D?860^ zFtR_|uFd9V*JmfBE^VhFBwpx@lA7;@*L>7-OWX@QbtjY*+ zoyv%4M| z{UHkeTg-RH*N$~Ns#_h}F$6e-gM4Z@U-hgeNVt43b~N%)X=#5zM}ovzm75w#EkiBW z)(yhhMBxLzm9Kv;495IK+r6;R$ukbzclt`XsI-9o?Gg=WT4zT{VC^r5GR7tL z3xIv#;tI+WjF$6BM>_)K&Ef z!Ge47*eDa+PXTO)jBmBI2S{(xP}mtn2%oO!$m3;s@N0W(@&@y7-cbGe(JhL{Dx5XW~3zGdsaW5o=_EYcue)bQhV=xh96 zSN}#;9ae`&2!(jU6kQ{+WE=W&@j>1Bfqc}%WSGN8)aNwmBkfTk&INOZa@u3KXTFD_ zNv6U?u5$vRk(C@}^8E5BnXT)yAkV~$ky2xs&@Bj!-3DklJG0U5EtzhBzlZ~!$P<6j z5}LZmy7MNK0`}g{?+yNjWKAZjHBxC(jkYj{>E8MQ;K@O{bo)9BxDPiQ3vT~iZFG}* zB;+5DfkLez&3Ag@lWNb-yX-f%hpsn{MT2Z7uh}&ev_AWlsA?^KX`%UAm!kUNPyQCX z%Xi4L)I1biToYDI6Gw->FTHS<9CV)2(b577O3%9Ph>!D4EiO2T`?Dr*k9nXk z->oPFvZ2YcLAfRh%@z*m7HgX;*VhT50Lo)h30|8EUzD6=H;sI-P>+ZXiJ&kInzkYy zy)E?+67A0RaFXcgv{V{~*Jmh_(EYM9{y0tF?k7ke=W*g<9F0%FO2EBEJf;t$bD;=a+~u2C7dLOJ-E4p*zyITq9=#up~!xF|*@feRd+a%QREU{#CX4t?#dACs6z1ZcM@|pMQ{#9^YWB8S1hqkNqzP2j`BCn0|aT{MU zF`hS7z73k^VT1t85u>mn!Xr}=z}xJe`Nmrn9PoP9w34e)dwf$2{oC+X-wT? zpifV}@LKBT&TUoK?$2H9CpMSA#ox+-2BvU!B5&&(e@8-*Fx-c$r^EW}!||iiE%|@9 z!T;UC)%s#c50c98}!$UeBmaXJR-5wpE@z8d*)FEk_q6g)tM_M8)UcW^xx(o@~kN)!Rh+OB+GPWKCc;j!AM7s)CZ^P6nTzk!uq6b1&b?`2b3?cLYwkdYs` zV7c}swVI2n4?oPWV%#S7C$aj7ymNU#R-v3blV9P8CTY7*EglZ}t?hd3w7S2|58;5c zRY=@&)>F_zk-xU3REWORA&j~!NK0hBHTxy~=yIU@xyAv@g-UkNcxmaz&PbQfeQ4+# z3dl|0QZk9SC8LQ~pEazDW=$ZD1wFE7C2JU&Hz}NNhnd&%I@7}n6C)H5vw*g5Py{*Y z4hcJ22(x`*1`?L=r)k+TPluLX>k(X*AW$;jv7vYi|i*R!qNFf)H;D? zjdpJA)KDJ&rR}5Am{*rA_G*MtUK{sotvioK*1VQQZIxX%?c)S!nd`Unuc#kgT&HJu zJ^)fKNFDj`+4b5uk0X4O-2v|YR_AIG{Tq@YyFZ=y@q99Re+z(&nIiQ3UR@vZFFcAw z@q|x^D&-xYPy*4CTJA)BlM2Ug>LFR+K}t$G=UxCJ3=tknH~(e2cE4mB^K2#Zu6dzz z1u}NNY0Uy@pc_MQ#rs8cJXCa;qjvRBS4#~%;o?q)>YMURt{Z3JpF>X{W)j(Q*Ji%i zXDL*s3rx&6u?>s(thp|~T0K=Xy)iF~)<)!ee}8dNN%!QZ)3ptT8bZ54aeA11h*w}N z@ZRhdZtn%EVh&d+aLM#Mzx+!ebb>Z#dW(l}VhGmUdvo^5WA32Sn@73VT|H?*nPi4i zVxpt(0Vz6FK3FT60-KZbJ6(22xG_=FJuRl1|G0K)&JTx=Wd}}8TrKomPWWh3GTmY| zWt!+uA^fOhI7<_Vcu3w8z+L*iFUeP|r!J@e9nXpQ-h9vVf-Qg!&XjnU4;e1A)fi1m zR8IX6ybNTM`BNqgq#!v9&Tu1^{Ukm!|LM8$W+Ij3wJ_+SssDTlu5=`_eC%(dIV$q+0{kkAp&_4ObHD6QOFoy> z4f)(>qXM3LIx?E%!A%ntT%Pt2M}^{1!#lgVS^Cvo#DBBT#U0i*-gjM({OahPr|%WF zT|2L)CM5`Ubr5kvcp+H|0n!rNt4;~~N>p6{#udu&k>X_HTm%EmhEg3uVFiavq0&OCl)!$^! z$h`xEf!O(#qS?E_Wdw8k-;rWu*@?aMaU|qzp-rhn0}+d^ByaJ)?hcPAJ9gu7lIqWx zB;2|s)eY~NF6Tbb ziWvnioY>}@LO_`N0OD9d`35&kSIg*ei@&r`a1xKYv?rkYi?Lk>;wSLc-QFdKrV1Wvl*Sup7TCi2c%Bc2)LQc}WQQlpHkDt#B*6hC-ODGv;Kb?BQ8@?K^e>*zy^c zv4(`WYY5$Bthq9z<-y#k3O)YrA_Yc;P!LTbSE;lDR@tCrf&O2GCA;6P_eCrYrN*9H z58lU)r*^SQm|K7H{L@r9mLJTe10U7%Sb!EpPbK~AeqJcT@cZNf>ei$0&lU2%iusRh z3!OyDtV~jugp_@3G zx(I-%*%0)VEAc&gy*gexD6`qn)mUx(m$w5jojMkEW3mLjuoeg3OPIf5FV?K5`4diP zK&enM%v4TJZf>JP*zTG$$c6Y{I$YE1+8P2q=9}(``d=}2$@8V+sfKJA6P5x2s{r(N z{G}m-oTb)cXdZ;G-31nV8EZrObMF?_zjjuoxqCO9*JImOpuefv9yyQ+)l(6_Gzfrx zN>0gQ`ehX$Y5~dyB{Ko`b+%}L9lu+JJTMD+*9djMKbbfO{r0kJngT`%7bQ`&#!|3# z(50N*XzN%Ce}1X(%_1@d;Ou5u@N!X(N7J z_6z3FNvjbP$pMr?4Fq|!X!1c|ImU!CMu4qp^oaIyK!GXF;bEQ7%(lz6qv7VgPX6aw z18FcYe+Ds@&k2#Q_Vv<_^(q#O0`0nyoT>2KFb@CANiIVk@zMHa`Q zXd5BE{j@|*X)pegh;w5ME*S*&W+7dP%XFHsTbs9Mp}{s52rG3V)}67{2wrK~qIO_l z9s^ncx*8;D)ooruE!!d||1`q*Q*oPe)Y6Rq0 z+~iYA9CauNw?T|u!Lz~Gmkz?ywuAHrR_Nvf!^Bodd2S#9q8G!Vk|RqyvI#7-wX(#- zkvDT5EZBBkHCam2pi2ial9Wml6PwDUB$z&G{5zeujC<_w*l_M0yDTLHGFUw5tFfQo z*=~&_t&I#yneBN2hLUrby5uizIhHyT^07!m1O*LTuBodrI!#1+M94FI!9HX?p-;lf z!Y{GP%=Jjt({~Vkj--kUc6Cb%cCKu5W-isidnCS62Zv2K8IK?LXx!chKR;lv7Q+RmVjmiv+0*EH!+ zlV(3jlAz1Z^Z~g0i(rQOuB9QE;b^Sa?*hn2E07&Il(_z*pys7|42!hiJ82bp-8**u zQrZCq|HIK#>Od<5CMbNpIKoCKqLjxO4Q#!dfe+Lg@1i4MB= zIG!{L_EEZUnW<}>jB(_%N2-l%Ly*~5exH`!0F!6ZjGjxx;){`N{%0S)$)g{r!E}MB!)ttslZ0552vTfdtsK9U#Ve4)X*{g|~Q0J#4^rkf|?Tr6SV{ZQwKZE{+UvF-= zrMT|@jy)rMSBLQRJ5BJfTxF18G=hsCYe`B-ydRIS>T%BP`Y5K#Io~+JO}J6Nl3qiD z+u(6cB4p>idCN>&6y=I<1a4btYnu|ggc><8vQXYU4wDy{SIoX8ue!S5wpfoGF7l+8 z%2+zQ0cr%Vm95_sAMh@!)^L1~2x%OU00rINyk;$#0e@gDNP53Q*;i`5s8DIybN0=s zPyB;Ja}+!{se!53!vR^HlXx9mZtjkN-}!wL$-vJA^vmS8|M<5C9!W+(koR};f!BkdtbREu`$JJc9gKDP zuXm9vB;vuiM~cZm7Wr0|ehLP3buYAa)cpsY6gBySRE2yY_Pt7d|F!#*4d1}baXV|h z-j_G}zPuQDwFp#Z)#(dNZ`Gd@+0d^WRgIy$Q&sgEUN*HM=Q*A}8(KK}mR?fYMpii` z``{lTS1Wks2Y3Y*qctnqeS#i{0&J< z_oQVuvRCS@#|alygvXC?z6!=ZQ;S1PC$wJ3sUm{Zc*JQs<(c%|5Iy30DP&Y979;d_o4h+3qj!Ql6Ti z{|(lgA~2Meqp16)KAHF_Uyrif^YzDt%A4uZ?^|=YUF&=jtb-(l?!jWpiiqbrqF%4F(bJ0cUxrP(xT2F^XY3fkr7_Pd3CDWRkA6iU6lCqoi zCg<98K_`wyRqfv$ObnJ zIh)9zZJL^IC%ubb$J`hN+7vI7a*RNJ{6~RIga+wJzs%~ZnWC4U8vLW<+4l5og_IQ& znSb^4^i_6w-8ji4zjq5-_>Sv*%k5qdILBFdNxc1b{8wzR%!>WAQ+Tmh*%0H&#d3f= z20#1N0)8KBs6)b!ib3lUQ2c80k!(c!BgkKw{@aU^1$ysxGMy$<*>Nh=1bfk^Pp)DJSfDI-^gGZ9|2cC(y#;JxR4a6xV$S~jnN zXBgv!f=ac*z1M)n8FF;f`W`ETo!7FV)9ttBZHn(DaTa2(uC5iI116?_4lQWR{ukB% z?x+Mt&bnn`hiQ2bw`8Ac33i0(^}svK28#$l*j9K4Unl&9T##(W8a}!!5t_2v-aXkLT3Vid;j`Iy$}s?U4b! zwJKhbyIA(H5}eA$v}q^4x>kJs`WbWfaADy?ylu|sx~cKJPhpVR?Ba^V+!(EUyCk5r zN6ZS1d!_FZd2q*RWNn)~*`;VdS=wB089LKat}*HrQinxSix65zOr>Xe8b@!p2=9Ev z@^D(c?T{xN4F2|;L{WnDHMpB}q)drc3Dov$L)UMfQd#+453g(j*7@dbQ?`;wnpaEM zpzX1ye}5`9n!kL0iz7t#fZ_W>tjKyXAT96Tm&D-A+0dst51(>4Y`yVQip|#P@5^!C zXV>3f+9Em?7K~;9CSDK5lYP=`dt{z_>`tyYd*#-HQJI>8*{TJ2hOS1g*|q6W5nNv4 zPJ3xWp-95UR$Fljky_TM6UnxxZW+?7tyR89;JXvT>e=;6@0e317K3zuOv-@Mdbg~@ z1W!|_tfPU8$8O$|gkAP85B<~q*g$%mzy_(No08vxCG(Dcc|ipok%e_wox9S&E4c1D z22@xQmK@m;&Kw94%%^vpTVW*eC*_`T65oeCeIIdlIe!Ws9S>;D!OlKoy_FgGt!GhkY7=*PBO=k(v@ zq}}ZqXCb)Xj<7*Q*)4BikE60;RDa$hhHGPi;4h-%YC3c%|1fDf8laDyZB?QmI;<-U z-&u9H&B~Xx=vT6JM|m`^QoU5kt09L8uQA;5`5ELl z@HjJ){2HiaZCdv5@-p{0I`Z}LiG~xsM8ab}<6M_&bxHbzGMYnrrk@;`ddcW>i0x}E zU*?MCOKXbMOtN97KGHd1Qlf#=Zwkh zSG%5?Q3HaA#&mbnmjw$0EX5 z-vg*K-)P&T)T^@hU~wd~vEHVRwfP zyP2Q5r5Ti~7PgTA8O&?_9SG3zFCaFxh{O29Wt{#fsT2Vs@~vv<9x4bY!kyV?!gH!u zlQ#ED#nt1*m_ruRpOBr-35!%V%0wZ4;pZIFE6jI}RoXf*e0I=MX2wc|^8fa0BXIfx4>;%KTZgvQbYKk7X zJ@+o*vPie=v2MK!D29(5B6{VWIuY%}zhPA!vSwMH_@(8&zBG9vUa9`GT(}J3WJv{rED?_ev+2&c@OV>`eMSU7N0(%||fNPcszJ`{k zUZ+%}-7Mjf%_`VuDFTQ8GE6jK2xTHs3ZeoPDgZ~+J}N{X_H{r4REB;Tdi#V!eoc_R zQRPYphlwu@2;#@yGs%b-*`(h1KP^CJx;^S}zHia*IUPn8i=F_iS@)H+(}Q02!-PKK zySbdn>~qBs#P~&%=jCYGU$3TQh&6;C)t>XJ?^crEx^9s&HfdRb7{G(N7~HVKU{2Q| zGyjfP4UYh9)|XOdsLOfnuw@zvC$dQwOz2+RLX&8GN<)!{dpZ3&boh3~293huE7+}Z zk`DlI(qU`)VKe_Y+v|2SjTD@B&I@aC)Z6jY$@})2WTygzUrQSsAY?N5k!jMDKJLSM)uhKxQ z&mADV>>^;6lFUCrY~E!#MDi2_6T@AQ!OYGx6@oTax)LX-9DWVU`#jpJW`MlClD_Um z8Jz86DW82}gj(?8-Tz-seO&4smz)0mDq?EbLhslZt(ox%|2boWbvs!*D<}v% zhkdP1o+Jveh+7}0;|Ha|m_)l}Jpt6OT-gJfyDgphYLPr_S|$L6L$>1@*Q3YA`~`7~KtwipB@b5gV?B-M8XgX)j)0`~s63=i zK@Yy5@7{drQK&6L`!YL01>Dkd>)h|rAGuYnT)CJzl^C`Tfw*W0ZtJxR%}sM9*!6pc zX-DCzJ{bj75lx$rFw?(yc&J-d>&5Mm`~h>(lY`Fjyz%qx%c?osko|_Kmz=6z5=CCp zaBYf|g_tF@RGddYwP}_9KPoNF4ysNQ@Dl+=_NLB&`~t|^i0L%_S~FNK3kpdf1VEmQ zoOM#)xx$Zmwi{!#H?%IK3D_y5Ci@Nlo1AE|-u`3ehZRSILQ&k@xb`iVKMbgAFcf;m z{FU1kS(`Q%O?``Uqq6{Fn!<#)rz$f01A5%aWNnjQktnZg> z4Gb081xbOq`Sq!93GX?Btb0-tRqF`vcb;}cXD{7(B&`@&AN-||>cvG~F`H4jA*)~d z=srAy)zxgd3cv^i4(D@N6Lmqg=fmm8ej+b{G{rJbt*@X{)TqA&ssqyoUP@Rf$h#H_;B+Meu|vrMI&DuUc|W4m4T4~jpO)u zuA&?HB(xK!@lz8LuVImE~1t)kn3eLrQ49dA_7qoge( z%&S|fq07hX39{~#@mDul>@bs=w$-s`45+iI&nz5K;H>sT0cqtTkDZ!IyVcr=&_s|R z;1-aIN`f25rFU@YXm9W&0d{%!ZZ#hz;MjP;<&bEks0eDT4>#0wq9s~EBd(4~j9)C9`yMR`>qNFR+41p0Sy5BAq#QKLPo1N%)O3;b*wuy=L z?Aa|zdG~Qa5HsiiPGm7=0mgv>saxCHSx`1II1^Kh4d~VRhfAO4KcaiY6u_$=)T_~C z?}9#To4~_*coG1wT-wR1{cMKqE5+}#x-oIgzvD6K{GiW=YW%R5IAs&78!^|A$=#{w zvT-jYES5z)YYXb!>`&d}9tYyb45}ts9t)l1McOx>)o=<=Pxlxs&@S;plmxex|;sd(97cg4FPt)PNn=qQ4X9y3*qF1?eVsMjrC-YVKq7ioQxwtnm@$ih$IGg78z|h?ea7kY36ll5ZyZkQG;Z9fu(HEl6^Y8ri}mfQf7HBdnk}SgM%6AGUd|^< zg$fRCy>ybiGRaPSb>BLac` z{C+C;UQ*6$d3mZ(441N%B4-yjR(#vHrj|kI;N3S$6&>#fpJs@`CmrN`^G)Wt2&H&o za7%Xi$RPO1_&=VlwwU2Qzr_6uHPOh-kiCp`uz$cweILy$Ds&?IE09*~CJ!&|=lf7= z?P=Alo3s>5zr5Lt{C?;t2A>R)2UPs&A(!M^)8%z0CRRaJ>Okl_DB`1`6mD%3`?$A6 z$~zm$sIuMND&EYbY(2ZBGyr6@c@@1i$`cRd{VAHId$UvIU&Mn)SWmv@jH24yan%X= z@&|6j0d)13cxR-NoBMdrPbHjy&b$y;61O|%;MkRVZ#<`m_?at}BD8a9bUE$hoY3|s zRD+#K|NR3Gx*DYSx+1S;sG9GHxsv#(RZ<&GfS?cjv7?Bkv$T@mAU#k zKq1ip%-$4iEcePf3S|9*-vDs1di-^9`L}H>s?1AL8gY&!hV{J{*?*u(mVMClmMAB@ zU6$>BcjUS9aoNNC?pII1-c4GqN2Yw>6y+~by!R}|*qn%l#MdhIwib*Y2{{r>Jg>q0 zy~)O(RO|I<$10@f9Zr^GzupV^Y(UVc0}GO#j(}nDWfTR;LOO=_s}RCbGOHd_G_h&+ ze*OusasNgl1@c$+3#ET6jhjOmrcVvfnZzwAi(fNjh-S{1zFiB;FYgguw^O#-ge&EN z7yI^;Xc~&o>b%#QS2YTVLC1@k7LL83G718p#-d`Zd8A3a0|N#gm;e|tImzd84{7)< zu%BgIW^I~3KJ8!ebY;x|n-Ep_h=(wW?%JfTqMo7#ni^`EmdVj_-cz3bqk4fS1cJ84 z847+$Sq0H6z?cBoDSYJY|@7XgiodFk<}FyJ9fCw zPbu#0ZaoPJX)f!^hX!NMcBjVg3NzyV!fwjK-yL~{oSGQ|SY%y-mW6w*1MZTZRqaRQ z{?e9MroZ#zH$hIGP1bTfnLo}~>2>^RjNrTPk_tgV#ET^bmSAJ?j{vGR&X`kO0A+N} zv7y8F@81KT;Vz@+5+M>*e);v2sl4_g`99NfwTEk)n_tyEwZkMcnLqJ9wtNq2p%k~c z>BM&c-yQy z`DZfkBopQFDR7kRZgzC=g!uXqOf2Adg1wZ>^#uzguM$oao-2Ov4KQLY@dAT}|LzrB zdwU6CCYmJyLXmvm8kjHgn_C9xQqpyIJ$ZPmPOt4Kt7N_0(~E5meM`B=%hR3yBf>X( zfo2QOgH+kb$mr`^_~0z(h7SpcAs!}EjEHjrz8$@ZL`E6`3^i*szH@E8Xy)9K05BJn z=#9sPuTo4Rybo$<%J0gY^%@Svyzss+Oyu|r-{8P4$WfG4Nyx@IYo1329MG`IWyUd! zF}==Ebu1eHz?pHS3{0>U+=g!tI{@!-g4!>5a&NClh)+#_n74CdUoJsEB1nw-7wKu_Xoz$FNv3*?}(%61M6(<<1tz9 zVOe!aoj2d&LD1!VrbR_cG&8Xt8oXUX3wOeZ){-1DT*QN683$`d9EUyW!6)+yB(D?5 z-b*_4%WFaQwi!?H*t3lMEX~}o_Gd0Nw0?hKtWU=x>Rvd+Y|;HLQ!gfk()?c97H4?* zk^p*DX03BY(UBLIfd55kRjL8ajzi7PV`#asgv_#byAmx{)Rh*DoK6uOXB9ER6EiG? zNz_nGd0xnWvfs4n8hJhofV`g&+QxjV1jZOBv-qY=d{*ay;^<ZZ)KJvFPNH4@bt*Ny%zjX-viE?PDo%z}#N9%-F1T(L zkl>!@eTyFrs8{UWsL9__^ZR=Kev3du1eIBSZvHr!DBU%+WsLfV;BW~=KRCy zdxvWqP7bHr%q9T0ef6$v)%9NY7wW0YapnO3i;V?R+i(Fu3*KL&;<3;YNz6c;F@&G- z#gyY}!eA($0mnc;4bkHF`y z-7vZTjzNlvJS^c8>Tn2DlR^Oy{Yx&yl|m8*X~qATZ^r%3Qi3Q75ME#2Vg^)8N`8=d z^kmZRQS6AXkzdQ3+I~B&{O9@&X+{{<=L4yc({9b-vfBifCyjwTUWVMu@vo_NSQ(q+ z&uR_OY~Tqxvj?@U3k!o_1YZ_AF-yr9A_wy`ivB|kbLT%#CYhM!Ok#f`z)Oz2OqDOx zH%vitHkNSO&+|JTHr(gasDKqT_~joS8>f~%ZDjAmtg_r29yaN$FW2%#qOrTw{%qIj zYr;Mjo4>QW1k2{~qPPke9mwL7IUGy;b+KgSRWJ#N7-R|jN4uzr|IT{8_k}j?>o4>s zJMSo6gocxRd+^897l9dk9})7&g6#&}W%52RG$(FNe5cW?T!;*D zbu$)cXJjM{vHy{e^RIu!u1g1J^F7n&Gv5B??8_O!nFLcB3etrnF`50Y5yAbexpC1t zK3hRyw=eQ-O-KQH0->d1T@FiRmHt&zYpOgR$y4uncbM0wF@d|?aZwKy(c?7BA14xH z_$YnEE3^N@Ei1U7n{9}riL@)zwilZa>&3o$Df@RptzrHw>eyDC_way?6bRu0BY&w+ zzr%pV93{n#WCY189GXR#V3ua?qc27W)T8Y3mFVSQ0_|5$%>}h7bGxkG%A_*hDqWAK zaZD23KswCFD-0LHS*V)N>?=E zGYv8gO^uzjEJWlg%SU&oiu;q?{MARLh3TV{d0-Yt$7I9VeD^C9H7hA#)n@q*(EiRM zwML_~rd>?$=7ySH!qs$SRX?wnN6h)hONFywGCR`C_O4(=5|LPQO{0q$R06Z#Hq79Sw%q zwBcr){}Ny5`y)u($5_l`^S}^(QWW#aP#js*5nq?&eM(JkC<9ZlrY2W_0nGEMkK`zS=_me(ZlQr1|0q;~aRkXgJkqM= z^+5SNWDPY>UBtkDbtJyLHCeaA?5{xl>_Y5j&5?o@cyN#A|IGgbs4VxamLV${K+hGc zDuk&G!UAKi89&({;R*S{wzoSjuvU*BQ{dKG+RNpIXh+cZlb%!v7Qp+QL@4@=UsoWJ zh3&fs&*3M=IqIY2aGm!e$h7#^T{W}Swh3KflDy`742WVaV$rJvnG?=`FX;3II-?y( zT<$QU(%s1q#|fPQOxM-L%tq(J{bB(Z9A{9qM4^IWkRkpyf_~QL9rE@j;9w)Wl6Wfz zw1ltxRzCNj~qZ8@9Jb2i))(Wo8ue4*B7@gnbqj%NLdT)0!R7)7vp}7{`IfI!(Zvox0 zl7b*W75W?bm(L1+;PD7T^l~CFN~Ox1SrEXGvHb@_Z!w7^BeNZ@d|Qb zYHnIAFt{>_{^YRTms-;{?9SJ#N(i=sr$67t3_&U9Hd$Hn2eyQBbhiJI2KRZAH0WE6 zjPVN=(am+L?Q2Kc?6GRDG|_jCyXL)o*;WxvQ7T;IdjE~nVrDP481g$hfpG6Ao?nyP zHta^h*@V@;8+9u|s&Po@o!tPWGmBsmY0gP|53o0=a*&?JD@2ZdJw_#Q>C4Y$hNNd3 zc+ggInfXIyx2vpF>-8C8i6gevep)Cie(^Gfs404%u$V_$t`CHY>$AbUoqC% zFes1vHzWA%1oF;*_wnTLA5C**6kR+A%gPQ{KpdBoS-+^DU1YZSs=R6z9r?ZhJ|M)k zG2tV_9&R5@QyAfh>(pFl97!OWf8~-{%pG*+E~bjxz4qBXtRM9t_Zj*(t*Om|U9W}@ zN-N;DQqb|;0=BpTXP+cjoSEl6y^Q4}YqggfcRKIv`yeKS&*#qQ zrO`J6Bpuv3PHit{ctvE#=mG*Kk|r&?WgB>%1q%<=rH|R@@>B!SxQmZFJTH0xJs9$7`N0z}er~7z7k8#>Jx%T{B#h+B9Fpu*jkZK6` zyBY*$oL7EN%=+vNAfK|<1g$eS?=s$^c3l&lVQ+JIoH`y6k9oQ-db*KlOLX>b)`w_y z^aF-f9$PVAXXfq;KYC54to$i$$Q@Kd@fVhch+dV8;Nu@-TkK1JF7Mh!b*I^FD&e{e zg&x1CqeQ!jcLCb%{KK9}q?*_4_qf}vr+Y7QFHTgimjyQVni|=k_LVe27GR?ISmjQ# zx8{%KpkFhJ^&c$?TsE{aJrqweL2q(p_%El$(FQ0R*UBfU+@HK(b!TgUh@mA6T4)7g zS%Y!*kJkds0-ga69G0XbZ#e&{`Zb{mt0@jQLX?NwPBOyuB1Aifd)d^e?3Np!MU;FA zzGGRm8*lSB)Kg8HPaeG#{PnKJMB~zrX;I^ji&aM`+hzm$WLQNX_f?y(D(~sDiXTb0fo$mb=v7^kPE28xb~yYPt}1 z;!T+Gc>RiIb-S6o0IE@w9~Z^lhTr+hYMmg#L45E3c1Z>>fG+#;uxUg^6H0^C-T8bZ zTI5A+2j84#eXn-sFZt)MB7}*8cd<4rbf~UW!ZRpK|WR-mh!b{_E=^*}nW8 zLO7&^ETp<7AXl{m2T61wzut(v-iqR;kEMTvp6xd#0I&iOr}fzLlhdH3Hp?DEA^&>3vz; z1b&4r{`o5xO5d;YrAo;T=N*RoiT&ODkRkZawTSvi4pz>Oi6VYwjaa%X3ms){)RH5I z;ogY!5q4{uo$E`N74Q6EUjE+X@yk@R{dgTk7NYI(`ht)x2Ja=ogqqW{H#1r!8$`;nNL38qyw3GW zN_r=n04Hr@M)bzi+`|rr;{y>y2`!3`>vA$XOKytIj=zmxCB2OMaezX!Kvh~TUXm|Ce z@AlDZUchr3pCD|#^W}AHt}i_EC;iP=_5N$yOHw9*o_uLbgfw5P#~F`XeXOOvH^ zhm6>DzEC^zD^=JBNqO#x=#)k#zXzWt6y_5~Yu8ld81u+KDBMjORu($ds0&xj12pV^ zjc6kwqp_nx!9&&s0ltGQDQ=92dgtNJKWa>oDPA~M%amj0(C~%hs-nAwarf$^530vz z6+@psZ8o7cEEsf8~qmFp_T$e2jyLvm6<9thUO8n_f{mM zc-VreFRS#L{t;46S$-GI{c}1f~E)2*B_w-g-;q9|u<;-g6K1 zRxV#1nPmKPIcZZ20DK@62=`#LHn?f+J#pTap&{^F>g(%giVOq>;MQAN z{Bhhu38xValmY-(nj-vc0rd3=#(!L0r@p2a5lA&tN9NBo5n6aF1*Q{{iz9%vIb)i(tO0G=4fQLKe50=l1= zpUWK(z{GnE0o1q8o~c8Ef7Zqi_uPY{KWLv+A-IY2^m&p4zyIdVOn{>aIh%8>XDuzo zZ5|VVCjx+&4Q?Ry-$5hD2guA<393mEKt6Uk(^h|pVvVC2Q0Uyp4kwi({As|S(3f|* zJ~7|~+VZda?FH~>;EYL=?jiV-23J&62z-ozpF{wgRi$lh-pwA{KRpe^ZE$0I`;K7o zCSH#a!PSQkKXgu+H+hk!oF+@WkCn>}+S$^0BiG~w?m8PPMh(D)CuR&5zLOXbd@K43 zNB!Cw2q}~B=$YEu7BBul{@@1;KW>9tg#&g3cHgwh&9n&sAAZ@(F)FLW-Zdn@L2~@? z9wyNw5_|%F4=Fy00N&%{hlL9j0Wc&0&^BsRMhNltic!XhR-Xt#{)2|h@(>fRbmZiX zi0t$UCw{_UG6N*{qyzT;2W;+tbm4lgtfDK-1bcL&MllJZloiGQAjohDHn=tW*W&Qu z(j?3e0Qm7Q9kGR#G+ZUsDRRM$|4?HH1Sc6l*Hw4v(Fkueh7ZR4`wrfWc{4| z52O4@A0!3~`}-l1QSta$@ddy0r_}Nw{)lHZS(t9!S?Nj0RGOmdtQ^?^gqx~!{+6%UKTI~%%#CQ zqp|U>#u@ajH{NJ8Yw$3B1>f%aYxN6&qlib39>w(wkFLj~fr<_p($+R4VrIR?^c-y% z4Tc2!`vOZsAa?vK&&0o08vKYKLO4ZEy~BVbIN(NeaqF#fO`mlD_mU|!qjAQJyATQe z3?I24F#-oZ%>{$w%;!-V9FjbG)L#8X*l*Gs+ZMN_KHLDqhvz{k{^jFm)<6FEN*pD- zE3OA2PUVfNb+{qGTw-}M$$hhuFXs~O67-FYM1?@|O~gd2RKV=Pv3UWcb(cRO zq1q^nF#}15wHZ0M@EQM*q|OEb{QUG({SmDAm-Yp&Bcm!u1V*hu-L^YJdk{(-U<2{~ z#xtHK0C>0R(F`${0ma1IfnGO4EpNB56zlE zJP61T=^a4&e`bR>V1U%#*?8-$TW|HiSpCo?>%UL{XJGjByA4121XAMt7faV7mX2#L zEw%A~0q}*3p9sL4(V6*~kvs*HoGm#DR{V$IpT#eO97!idj?BNZfHxvf0y5))f4nw) z$(m1VQWgP|B%~8?tfPCddi5)>#Or=cqX+ek_Hm`91fM?Hr*pp`_+L2kFG;8p-p-HW zSL;9SS(usbwnW8Ed-X0HVN<0XOmx{-cifDbK>alo^06Kv3;2eEJ<2{VPdgj^4K|6KWzW-yu_8 zB;@0m|1Xx3A>gTiu_F@vKmzOqj*jr^^DM!NCUyKLnj!~B1}N|fe;Uj}oYj1*d7JR% zUCIDjI@iZJ{SL2SGW;}X`Ihh#0W6lX?@Rc{5%N-godU`iG88y>&Yj?#1&*10`eY#V zzFLn9k--yBGxQ@Q{;Eh7&YIOc7Xt-wE{Om_0ldp5fCYawzLE<6gcgE70q0Nf?Evt) z7vM!^JQ5k~6G`WU0+8mg-{0UDCtuAzxiv-89??MKgPoUMG*gtEO7kUC-4EFXlPN9 z(7;?5)3r0L@a<)82{`*C4m3AA=$gZ&(UkL>Bw)b!VYQRly_$v?5rJQ`6>H)=dMQF{ z6@c>|dyM89CIC+a0MP|br1lDIFPdJoy=dsr=_Z6+lv7k%R9u|n+JI$Vsv2g{oBp_$ z`I!*{tX>U4QPb6{pQ6DOAn+bcsHsVE%AS1Ke3@B=Js4NgqhwYzvnNfCs%moquEA^~-?)F1-%wOiDKjx>h( zzgosC2L7>QPuaO^SmQT(_!g4mzsCC~?Ay*MC&*slnE7A(@;(8!lL~m#SqHQMAQkX( zSO?5AEThrd3cmY(lgS>}0d>elo=#1YZ(h2;)WD$*eA6o3k2JdY#RLfa0Dlb$KT|;c zf}a@_8~+stm=*tAkW1xn@cS;Vd)x(Z`u6X)vldL(*Eyx%m$DY*m|m8E3}5ZMyS2L@ zBXFtxzVCigEfD*E{p+Eagg-EYu-aQayM6X*HUUqG=G*W+k6vq>Mh{8xUsim6x%^mu3RD^gLb02*H2+bdMdVDz9S)?JH2 z*UMU$EmQKp3;@Eb7kx6uN&MG;iQ#t2F64)_;e6S0nY?M zK6FC-7rZKNYk-jQNQ2vVlHdQ2{G!Cdy#|8sX$mNTa91y~It&v3Ifcxq+0b8i?Ii*X z4G|zu`=jaf!x}#@4S2*nH`I8V0P;9BHIO3ytJiMTRn>5<-U!rXdHMN*c{)1)Fg(lS zo`H0oL+eVy?alX?{jDHHIYX-#B0z4g9Z$&1^X05-FXLwdI2vG1#HO2B0DLc)ND+D1 znkQ+LZ|pPJgd&TLtjHl2|0e=vQ}wtr8J_C z3Wb@i3~M@c&b_C>UK(9pT|=E2z&RWo%}9-|ghcU zy7Y9AHGFthR$b5^E32+9D{HvA76P#Cvyv<%eHgXsyQk@bbMI;J{f51JiFQPQp)UXZ z6R~m69w7kKY_;&$K+5=U%vo=YhP?zmjczps6mhfgKl(bH<6MhJm6a7K;hLdjz?}}Q zbMI-ep=-n5TJZLEg)4>oCt_pc9j}BF4S4aNm9>=?LGCg@;=doYIJa&HKW9dUf50Qx zm(p$p9;_UNqUmmaM^O%>-oaK2Xm>ia4|_8KHtfCWroAlxt^(xyCt_m-ApW=w)@-eb zi~qLR@n6F4)+1KIOP&9fYm#)D5V04*fnK_iYXZ2_VMw$AN&CCd^#BzC65%KJl9K7q zy6%wp??)}xLY-%(tQ)}UODx%sLH?J><-kKY@W#Y-#I>#96agaBp)1-T=gzXDT~6ZS zZM_j3yigFZ*oV$_ReM+1lqspiJkecz|69McL`@ui6H{80q2>s%&E{KbISg{2{ zpBjEl{I`RUf5iOn(D7fIt7y{p@CMbthi##~d#mwpAl~12#xn#k;Xro+%d-y)Nor#s zQ!}EMVrXtSgjml5oK&+Y{5yMvZyyZP@!yV*2ze>L>i930Cn&kWyMg4NmD1Y1R=c;d zfdyv>KkwcR1bZ{eOm=z#v-eDe0KhVmq1XBGwjq8e7BJiIPe2RfbbFsg-@OxigD?1l zsEUgJb}-|S$YA2Xa08!AFG0ee#U*F`{7;?#MYfQhe<11qnGN2+f!$!uUpk~?CNO_H zMBFE}%fpd~K6cpLjqX5xUW%Re828ZUKHk|o{(?dx0TlEHJO10@#(#O`ELz-Wo05<L9yIJ z>zfKbq{wcB0s!uq2`S^hT+^+DTayz3_#ea+IDu|u{s(sJ-8*#}9CZaiHG#=lC{74f z)*-_>Htj4OvDt_36g>N_z!~dbYxCl`hmHmiemlMnvhG@Dwao(|K`-%Nbu{4ye}I$! zrF}shNEGNE=G@X@PCVA&xQgHu6r0F zfP|NfueWU3c^dv%4_J;+kW>@J^TOd=#N^||G zgYbvq<|exHh$H{3L@Vk22!0&?gq08Aon!_;h(Oc9GC99$?YK$Dyn=*+vG)69-JtZJ z=0NQR*oF*(-Md3(_s$m%JB!aGLj;LGk+=sTzd+y(0d$o&Nw*=J&mU(E0fP5VT=|H+ z->E~4%g*y5UJGkM|K(igZMl{IIrS98B@<&-mf$Zb0k?*dRht0dkhObfPJ;(FD!2sn zOZosRRq!2!=3if^Ap$fj0vO9KfnPpxFLj7kIt3J+T0k-Ii2w%v!Gq_W40r-xSg^bx zfPeG0smzn9Q$vOCcsgL)CuO{oI&2az4_Qm3Tz3mG&x%X<-Yq-(0zYtdFVrx8Ccq>9 z9&4U~FJonPI6`980*b>gCP3g@__?i6VZj|nY zZtoNR+&*@EEl8{Ruv7^9pPW2!+IYoXW-b;{vAPb|Kc1BxWV=PPKWinL+n# zyPvvQv!SNO1CI#M{D@QKEe$R*d=kIxm<@wi?o0f8+3bUNk}G)LeVRh)l&s1;S|KQJ zs*Ias@rM_jCc!;EKiw@w4v-hpsNC2<0c^Oip{AA=r57G~MDPceo$;ghTkqmZa0@5~ z)+I9gar|4{z_^7mNR7`w{DDJ|QtJy&!KtZJy+S4cr1Zpf1u82j>87hQKOL7YGcV+z zGXY}TI&auebJI;VEdRgu_gGcz7glCpO#ki0mB<-S;Rs2zT@a^=%cBc`Q=>kZ}QWs+x|msI@% z;#WdYSjIXa@MSZeL*j%QPZff&U*Q+@On@zJfdiBO!7@K$#8N9={ThOQPKJS=<`v{s z+1dQ>0tA*_`%T#^@$A{BxfEYosM!Z^kmqG)CI^*b2>@kf#RY}<>8F2yV9!bj!1zfI z#1DW$VFG|vfl?>91J_2YA~mQ&Qx+2*c)&?SbwZ7hZXbgdM|8%+VM(9zcvOS86@PP-49(Z7~dJlq+6DIs^!i2qU zCF8gSoJ4n4Mc2Rjn`g&HHk{?GsgrAZt?_Sw4;8buHRLTChHtf(gh7aeABF#x0$6K0 zCZIvD@D>&014S$WSj1Ir;fH_XgunfbBmjT-CqS6vkp*0Q!TZDwXW1WyB>nFt22_ZJ z?lDu9X6v8Cge^n>WCCp2vcR^0wr$!t;=qUz9{Ba)fVeLMi>0tD-~^pw4q$RqL!kgSHr(P;+)7K}3DC+q3K))0RGGuj?m%#qa@qUIhjvo)b);|c(+k{$=1x|*4rug)J_D>Z_ zK#-q4nXJF33BWh^lJ)mA0U*Nhm<1dsy(x!C;5T8vC6JsUDM=4WS%IspwC(ZZ$44p{ z$7Ur%7(cx(a3b0ZG5%o8N(6n}u2&B~Ys9LtxavwVVFF07xz zAL{aI65?Vaz}6eB3bNja0$w=j4`LVemIB}c!H)~vO;DFi2M`ZbjnKq+D+>sWPc8qy)Suz7o;*TXlfKZoLZSrCxz}EZRZCtAyB7p9J z3~?qh?k?kBuz=Xl0gK-t#_zfT9yn07)a0kbWYPY~Qq)i6U$mc7H*l{XALB)lB#*k4 z97Fu&bNt9>`9Dz$U%ShzPW4HM0Q-+7QV)=`3d~*++#6R%5h`QulGG6V1&aNMzflhF z>tXy=OP4MUWM(oGVEqH@ef&&-trNET_!ZkSCBByrN%&c-C+YFYBnW4U`uJlbz~=Z$ zP7baj0_5b#rQ-g*armLKGL|Zu{R>cg_s|KicSg7RtEw#1BCJQL=?Erk2a)0LwWC6r z>84&@YW#?r|4!g1z#kI44yd6GOI6a(FNiA?VD)#imQ)?%=>A=hWqOg}(^7Ymv$fdA&UiL) z0_UyAkI%{B`Hto&wtKj0RUmk?J#V%={&*hR)q~5~*_TxlBp$v4xMhJFXzV|H-Pw7y z^J}8U>#ujFs&`|RGu0%BSb5nLNso!&ai!ZljUT-x@8Tx_;nWx(zuI4M;3Lm<<5lR0 zWq_n0j2~u?S3}oPQuyJr?to^vyDc^UHk<9=YLctX%P7FGrl7Z1n{O>rsV0<{D+w1`TdMdF!L8MoAJ+{J^LAa zMlZdx;TT+I{Fg6Z{v1EIO+5t5|Eq$&vy-S0g6~1HX9W-&I8MlufgoZIpL}xBz_&LK z?2LEFixyD6=_VH8Riyo@sWZC$tbc*b|Jk!)_PzMbGe%2~A@l$8Ww>04pMP#Y=Yl}| z4f?OIUUi@}X4!vX&YXVs<)TG{G@iFrA2oIH-FM%)hXPHpb33~D$tU~w>$neEoio7q z`XFjR#L^4=yNLjIllkG8~z+*{QmDOLdLIJ>UDQ>DNb@X0^cdv3g%@F~{kEf{+@8wDo76Eqerl}As5jStv z53udFx`5ADzg85$udM}9BaMe1vXbWJ@aTu;auJU~(##9$>+vTN0wDlA{y6?bLO=uv z<~9y!=I3Yn9u4#(3b;F}HjMz1q8~&6xQRsIZlOd@#2!CG1Mj^TfANbqEIIz123A($ zv15WC>JE(DW;Hx#0l3Piujx~8nuFmtnhAi|FZj2DVZY!vIZN2w&CT>wJ4LMe@$v7z z`|&%wi2`|aM1#Pi16a~86!mgwlvHq^S3flKuOcGQOKhz-WM>G&Rv6hCGBY5KtdknN zNUzEOT>YAjFsVP!|1|9p^U)Fjn6q_`8uHYzsB4iLVgg|#Vl!fWy)d*4u?kTt0|av$ zc{Cx9E~XuTL!%UFfOiuC@b1JT|JoS}-PO*Je0|%tx;i{d=(p8r0$fG50Hy$AfJPYJ*rjen35fJF*_GxrnKA^x%|qClC-st7j5ld^g3s857Oi4=$==KhQL z>k!Y5#ky@H4=BrfRT)6Pw@qWCrzo&TpXL}hXX`h<0MO;4uGf44fadCvBk4bKKUt`% zE-Rz|SZ1;T)K+j(Hm{98WyZ5>1yY7aWBVe3in42cJv(;n*t1LktpQhs0(cd)>GS3j z0l3ANI?Vy&2>CdE;f}s^Nyx|X%OJ+TZlsK6!N0CdMwQ^lAnh|DqV1HK$iFuDy~aSH zx4SUb;|AQK0ZMAG^3dj?q=Xzlukj)OGzZi%e2=Ig9gU%m;nU?J38Z^4a^yPts8;ze zWo7H=LoQT7S?r}t?!S=V3^8pXBDZ3_@6hFK9b<_ESXZ~rj~)fiuMmK^Z%%VSKi2*_ zfI5P|6<`o+KVK63F5V#|`~X4#x*+^?!35A%Wu2Yl{5(k9JL^50{^w9m{~_fq-Up8m zd0B`=CyDzV+<`s5xpwF@2SC4mljh?MpcJ5rG@mX4{Gmca=@3eC4i5V9Yo>KBI41IS|9j=-p?&w7F6R~$ zs5D6T7du;t1kmZH3Z6Vm*6w5|zLKfaS!3-KZvEz)Z>;WLU9Y|Nnx65h*EKg2`+JO7 ztYrF5o+J@)S;G;`e26B$C;{Lzroo?njV?{I3|LoPy>4CeItVVR)A_ZW}6&6h^`K7m6Bw@~hXbH7&VnD!kNDqRY5aeJ)@S^}FxCC33iH_b9 z=jT~9>g@;W>_qzTV=*V282_3zO(z5Vy!uRclV6vyQkpGZyd(DPz;+=QRy35oIrh5(5IRLwax;D%F`sDe=IfKHt~(xLXAO*(~r5 z5di}HWcoT=JFgn^&kfJ#j-1OvaNvLml-Xxe-Q*XE%jM;%($CHj7iY$zr^(Hg???og zQUVX09kDAj^iWGy>6OM>@_uoH%{?C6t-?D&SO^tI4;8|ilY!dwS z<{pE;!)v8ahS_Uqx>60#g#g^)$Uc+mB)^#a5MBA0H>|iWh@A1@X^hj^@^yh^`i_u5 z5}4A{g#;o3ngBtU*L1(!h^o4lu3Bpe{QUUr*VCu(r^O_p4H(xc{Eux2bpoLqm3PglIWq$MCo3=pml z_VX>&zKPVJ%gZzAaUuBEU3cASk^yUS;#)l=13|Lp_G+xBQN4Z1l0)_Nx-dbf9+L2Oh>TjXs7yq=QuG@gt5f{To|4>H|%~On3^3SeL`XxKAAAD2i!sY3`V^xDBFBX3@ zQQ-dj?+5o*k9FJ|>bGO{_U+rN4-xzzbB)2{oH@LbYi)(N6i{=dhwnv_U(9JowYigP z9dR*YlNVDo!=FztG5XBROLk&_bq>bPh)c1rQjXX0IDJ2C1ou`?4SePk;LsrwKt^AW zxILJ&@M^1M#MfZQN+u2z+L4edZ9LUIvmB1P{~NN+NKzb&d+}!$n5V!zO^=fY?cXF|&5i`YYJ5 z3GYX%2|k`a&G@0q+^VU;o*sq&5LVZ3uit*?*+X{N zfiq*dJcsIx#<(^7Km)8J9iikGr!rbNQ`bs$a#9(5f9g{D&n}_CpO(D8*9-j98>dev zq=Xy|{GKkkMaa>IUyV!vdUclooEgj5_4@8zAN{-U2Ke**6g@Zj#i@)IUe{TYY^5^T ztJ+J-!M$`1G0K$qo2S#*sJO53%dIZO{T>~RKq>FW;_obhI5SqweQf$Qe0j0<1oKSs zS2y{^sf?Bae~`*xuWB!`gL~;x+P^oL0L{$=UkIR{k_gb;+{H(%P{R-Qv}g)EyS==GgoH$e;UFL&Qc_a?|NrUn|N7-Hq@<;l)&I=Q%=fK$(8E>wuE1+* zYU6j@b98g7udng+erUDr$B$*O^mTcFgGqtSVUeVyi$ccL+1R-t@{H;9_^{PqO8)d} z|H|PkZ_N0cA^P_(smJ_LgZ*)=|NGM`I#rb1vDHv&cJ^mYl=n)6gQuXuRsQR*@v;z@ zVKl;iMf&aKPHUC>k599gB>LrK&rQSmmcT)hf7O`JmvTtGqd(n?_hE_HkdS`YS~~y# zecQod;K4_w#09IZ(c{r-Yj>Ia|aO0LtTF-fq=9^JmE zvx#Wl;LeoIQ+O*^TEPG4 z6u-jcuVE4HyZLKtd253@);c)Ur%iM5|9ZXm^@s?gWJI)N)Y`&*iH(%PT$0J|I>JV; z|H7uVgtTAJ<;O`o@?&J$_hSEbb5?1!$GnZvwO{uBnE%B9gvD#wbm_n+HC}W6Jd!bS z)&J(k@QFVk$ZLMqorRoTr9{l0zo5>Kgcr{|arcXu>Av6dhit2~F@)(i+f8Tjq5tBE zxnQ30z|?eTM=6F~1*nPB@tUvua@}5-)SSWki}-)Y?CPU%7gndgSaZMOaA(2Yu7acp z?dg>NV|=D>{{N{eU4sPj&j~)fkizO@emy+N>H+WX8~I95&%#}^FnWYadSJ#>!+rs{ zn~3aIk(ZN4RSdfYPX!N zz1`ok$7i~PUZ5+T?rmTae_JM(#ldQwPE~SUl)i*g?q>gf(=IM9Se!X1bVH@czW1Vp z0IgmQn#p=e!o;00001bW%=J06^y0 zW&i*H32;bRa{vGi!~g&e!~vBn4jTXfAOJ~3K~#9!q`e7rmetkwjmaJMz67I$Ad^XC z3L-;@5{4ktA_ypzREdy+fj}`uL(bna+R_pLQ`o8U2-+%9OuIoD2aNmjjuFUt8`*-$m_SyRkojT>bh?2L^w|e}) z^(gwcpGg1qy-6?{=*4cLOlB5keI4?=4)D`??L3D1r#HI1eC{Vsnv~-K)TIk$XYbLY z2Sr*4@B=CO7{FIn;zuQ=y@GeqMeV)84$xC=f}U!mU4z$7Z(;&`c6DfS$9cWf!Uj zefqs%9??UDuNpw|W7hMy$W{7Ez|YF)HA~-LR564-9o{tvQu?g!gK7capCa;y)N3+I z&lJ&tNaI5Cyk`<8q;Ky9d36^~mA){8e%1(Sf?14j_?oq3Nen)t?3I-8 z^c*Pdy7SH}mKMmO0Kn${dIj!jck}(8}Pbq@$W9StaQfFSb&PqPv0ExMn(XcLwMg0P_bUzzgFmrFVjcWWNPp)q4!)9p*KH?`}6@~*REYzyq;)2 z{pvpQ%_h88yq;)2wPq+(IyBELD|wL3>M_DJ!&h8dT8ba`U%}cls`wfETZU&@{hvjl zXTB)#XS5F=3NJl@XX&lxpGUs`vmzHy=i|e=MfClPRr6ILK+aD-$r;733I3lpPS-x> z68Jr=YW^#}&&of%7x2~Q-d4^~=(3pA-r?>%HjWR!DtxKv02#>_f>p@DF5-rFu$|wm zpc%z1Ldkfu>n_4g-bKE+6dxD{-}QWCOq~qs?|<*rDt)niseuC#c0H*&SA&bJwx~0K z?1XI<^B$mcQy=zz#lK>{PsMNVJ;7WJbS}ret=uZFO5m5C$5I240v2g&i#7>Op z1Nus@&@<%f_bYw)(DUyzcIhjzsDclFk)dCwvR`+eZGv@Cdf}&Hs;%{EVR5180Y8vb z^!ndaZAd&J`0i8Ta?>iYZT!{*e7f&fbRRCUaJ{$uguS;M_>^fS|6PkLddw-8w$cN`D=NF*95}K7P-& zT&!M?p#E>a9g2S7lYm!|S^wJHoM~J9s@XKhF~RX)93J<0-kYS5hYv^j6L?5u(D^`S5}1$KmMiodjoaoA%h;zHv-P|`PF^DQg~e2 z1mui8GJRSztqPAzn;{??Vf9#WZyeI&P-{V<<2f$OH9lz+m z^RLD0iGLHP<<$lve$tF{#Qh`mMd)w;sfZd6g}z&tnDH{9wuz{5FZ4a--fT$9D?U%$ zUZ2Q7H`ZR2Ch)bscs4ms8A0AfG#ghi>XjakO|++jK9ZK;sJhj1|6;iOVu}up>B&t( z|D?MA3^d=Go0m~5C*$jl0cJvd$*7f+@%6ELv(ooj^1Qfs>GfguS+i9nUJrI(IV(Eu zxabM*3Gsp6?2Fie*FG;_h&A3JZH)MUv{uJ>%)V&_cRaaCe7E%bl4c>_NvJ4kRp9C) z&$0KO2wZ(Tc}e@2=bxV?LH}3WUKUf#UdDP6`OV(<#1s3p1N6`XT;!NNb8T%cn^;f1 zK73zv#8oSC9>d^kDL(p>H-m03l2^1nP$ttvS#25jmUk%K8a!>58R&e~u9`@$V^%cP zrSwniQ@3{!yP}s~K3@dB&i46a%s!GgC5?Pz^u(JsDG4+`If~9{%^k7z_&8gF{jZqY z^AOVOXW|-SgwL}@^`lnJB5MhHq|3LGiOJa5bN~Kv*_#K8*Gtl~-(9A&jj50}_{G|wmC>fp~?=ZtYulKDw`pQI+e|NVBU`Wz2kvP42!jBuWBr#2vM zRGA(P!SnSIjkqX|?>olxa%Xm7{~mRaggV+B)NVOMR0}=aEWGvSm-NY18(>wBEbvf% z?d56qMOh@gZr!@v_^Bzv4wg{pkw+#aZ~Q4;L+!z99$UkrJ_B<^IkU_lFnem+@AD+L0z~nMFUJErP`Atek2>WRed3u}IA7v#IGRo* zN$pQk{D^FXUaaw__~@tu{FWukf4@08x%CkmPdnqBO`J(^cA{UtbQbvE3>?adzr18h zT9f#sX#roNp#M+4{Br*3Pk-7WPZ6nNcBn*2LnucDHdiGQ_s+oOLyRB4Gp4069wv~)Z^g2%k)nL)heJdp8=DBryF(l3AM2lD3mlXwy|V5_vi zByj@LFOzU9{N-`II^&Fzk`mHiQmU98E>R8{!iJtYh0V}jCDLcNKS}A^c-}l7Ki;92 z96(dk(W5RWeFJ!Y^QB)}P5FzxQ%YKB08gqLVg(YrWI%q6s6X_dV(?XGi11YdNPd*K zRm_f+D2YB8GUNk=2Kom>BI%>-l}Ip`FdJ(8YGu#kS?Pn+P)6!G?=>B@oCkv8fk7wUSnko8A-7hkf|VZt-4%V!rt%gZ-9U zf~FFa-zxP5&~Ihyavo@7ejs!3rwRHJffwnYQB`8`mz2cmvzI6Xy$3x%^pGe4esjuT z`T2EPiR>~ZS&5{Q8GJRaFPv;}2IM{kHP-%!!}!S%Pqfz$9q$p z{w=qhIC0|55FZV2Ql!82WYB*9o4p6THqf_G1YWr1TNU61oxkJ~{D|UbFHweOFYpgN z#E?7`Axzk0>T*;fN$9`0`f68K9uR!yo%4M9haWx)kN2K9{f8f}s;YX=-2BU5f?Z@U z>@U4^B5O5B~2R81V>w#3l{6NSp)sFZqmX&Irai?Ug8fN`V)Ce0>no z2bIV!X_ZL&qW{%bd+R+1AM_2Pr3c3Q^yu-9f?Z@U>`hHoVMe~{&AJ`bRe_A)~6zRG)oj?bp5ssk?lOM0OZ0;g}p&W}6-6`&}58y`IA zKdh~-3aZ`)anqL`8wXG#Pc)*p^mI=c0>L=wCuX8D;zhvm)`5b)d@V9EG2Yl;aE`Jjr z5dFb75BjxnKBMFsZKo3X)Tl@3ORBDsTYS;qqwvl5WGzt&J+6ly@}?{O3h2H#e-Z;w z`YC{SE0J||nYud9##UGBWg-~00Gg*4H#9i*&}8W0`C|CO{}+jNLgA~=lQuvj81X|% ze0rn$5Ph5AUsD2Eiob)`E0HRuM1I-|R`kt2e3lX=ZlB02_#y8hzz-0w5Aj3&#rGL} zWsg=O>%9Cr|LMZcEZYBt&|CNhb|@8J_zy_5Ek616LVhX+qeDAr)GlfH4Ik6@1#-t_zA`+TK`;vXc( z@s*VL=vCKT<5n@xFk>IO$H4m~%6noZN<=3U1)r4Nz~gUG0sOR&nLJr4k#@?YQ;F1o z=L?t_gs1^AMUPZ5 z+k&x=sQEqKJ+?&IoG4K$zD5CxjtHy0zQfPzA$z# z_=eu;3gpea7s~}3NAhNBah6Y>Jjrg8?D)?CSI|KU+`fO8qDKSZwh~*#Y_~+|rzT+i z6UE}$lW#74tP<(iyu~-{2>Dg>C$Z8)@efc#B;91_6QqAhPcS0jkLG9~{~al5sbm#X z!~KB+5f!&zqO{Kx>o>8k)Z`yx7k-Kv=ZO19=!?+bsew>`?exC5S^_^+ze%E{I}aRa zU^>tc0XRV4B54#)+O(UIBjHt_CvLAz2fFQ+D5LZf#rh@cbrp2VWTBs;?mq*~cPc=z z1QL3gxa3{!XBZ~6jo%5@0|%&s$*~-{wGO`owP_VodwrO_-#OTRe!sWBb6SZq#7A#G zV8BFGf$0C7GFd8-((gN!$k1}WxcZBj=YsqvB}A3;t<#b$b$~qgpLH#woK?&c3HrZG zRxxRI=l%OTcTScleeWl(f4abP96qc>PDx$i0IllZ0WGCoy|O8<81)iL^L}NV=W1a= z&JrD!n1Rlh$+sx<`#UE~l)+e5W`j)^c(6Vct>R6dY{K3tQ`#@oWUmx(FYx0ttqe79 z$&w{I61niaym@(fd1cg5dI|bKpH`z&;ir@+!?CZ?W3~U-bZS55pF-KQ+4hFjtLLW6 zx0hZsdc~^Pc+X4hwS%I!=h>?)hyx2aM-|3*cv;k|Gp=NbGWj_1`qYt1q{dE#QPHmk z{@j#j_u*a(1wZV>zxVg=X{#;?Eg(5isr8u|pC+GUwRq!904j#V;!>!|ezC+pDVupNc##fVOp|f4_>^ zfd|M-&7Mu|-AkG`ISvKzju$$;(p;Vk4LB|>Fjt&_nc2$=nU!6?LVQT9YRQr+kG!gY zUhr}I!MwbKxcy*A-&Jg_pd%g3x2jM^Jp4Bj3sSawpAGJ%7E$`+g%|1Y`v3WxZ``SK z&HTzddz-MT%~$c=7%AzDB8xa3knf7~y}u-JXCUV^_6${z@S$CApuh%!-Frj?t28hN6%1WGz~2Je!NAbf4qgl7(#vCfL;q(y8S@-j2@47?}p7+EeQi* z%476+a(i|4!92eTA+e6H_)^O#DVeOv9Z~=EUYh9cJMOq!p@Dw)9Vx;eYp(C>HTIiW zKmCrmhUoQ91fCkZbz`vOAG?N6$JOAEA3yG@#6qE8H~<#VE1;J#yVw@gysAp{AG)CL zv@E#&;6c%U=mKsi&?cauj5XOLvQ_=%?_`l3dJp_N)bBzEve1th@qPaqJA&f$&CNsn z>z(FM51(n_#>U2$7U}j1gFzmGJz|izM9VP?7tWZWU+jtNvz9y$_#~-+(msDQ^uXkY z%KY24&##6aP(=1*;U%?gvzsMa#g=rRQ^*s^-@$X{h!Wtpv=AS<|9$6*3%{9%IG59~ z$0gr$TzrwzllOnfD1K0m34%ac*sxG){Nnp1khYEw_|oNzoE1Najpk{WFSjecVigoo z5k3{46y7Yd6yG;l>G3NWLvZi~e$E_*;D;}rNkNAx4UAMH@#_Z-nTN9x^Xk=5flvw!3(eKAkQ=zccl&l~&b)b5q@8~>*v9P#Njv{eM(4@uzt-+2 z+eMbf^!bd*lZ^&Uj#T0VUik5Kcbp#R#^lFx&;%o#KBd{1{5u>pL9_D$Cf-4(_e?i( zrZh^2e_T5~;QKc&Y_Rb7;)aHXn_d^ZvJJ@FR_3r?F$dFJ2!fqM89rH8tDPr+^ef4^9d13&^ zt@4xC;1P@;9$)d(3=o6-)WH=7`4slnssd-6QCK4Nn-Y<=h1NojzQD(7l-;?>OM+`h8xQK7jCJf^RQu zjnAbvvz1_SCH~9}9ozbK9arzKTfY3d>*$U-fSXleB6xh0r=GFP=;zXkNpJ8H-RpLJyI-%iemQHgD5FC89h6@PMq9@m^X z-cF^z4!SSSpIieF_V4rk_k-KO`!+!Sw2mP>dp5WYyl(^2Folf>_e23i@X->>anl4X z)PcFK6eL!iJi2rH7F^=)x_0eaP(VSCr{uz3qP8Hv$luQUSkBk+9B&Tb$BWm8_@Vyd z`yBT=Rt;Tp9_0Ez6Z*pH#n8Y0`fG6jp$)u4f#wjmw4@aoaC1vqjwrE>z#ptYCqDJm zQw~0zZExQ)eE9G!+SL;}yaKGiII_(9Lh z6T?Ki%8bTF9AEt2cVdpugx`(n3X6cBQpe!YT%r{?;3pb-d%FnSz;6+H5SrXxq~vGc zo-zCq?eomsxePBCd{TA;kH19)@RM?l?kV?dXrgajjv+b?SI?OL`U5`b54f~#g?{2w zq(VQN=xkhiyU=eL4*DV{8|)-f*;2jG`3sYM%U668FbO(3JR^E(6Z*CZ0Qxq$gJf3k zw9_uT%v=nMQr0Vvh=4#|FeJ_{)vAe!22#;zzzSFvkCBq zE_+VbQGybVj(16{-^98SV$X@|J$-a`xT@G_Tbx}kZcQoUq|g)4<+_zz(f2&fUU7OW z{)tfhFma&pY=pmMxZfsObGqSt1{3&F3jK1ieu;YHd>;kNwdtde#M&GuMK`s!-emZ1 zYE8}%-@hup0ZAw7XD^3-x#Cll9)tdgB6RRGz9u^J%D0Hn!O!^G;=gXzoNg%i$u^}!mqf}ZMDiJ{5RcnQ|nD}f46_X-@gpCY7oHR8Va9! zG8?@=?X+K$Q#YMBQI#GVFmWP>-8*mDqDl`9z#jp9)|{?0mu0e!^&;CXiR<4f@SFy( zb26=m=ur=Ro!}t+tqg@{gKsa2)3a*Heji@wQ&nGveWC)t4%>tq8+oE98o-gs5_0<% zPc(qHY}pdDR!UAcMf`|>BD!xYlsg3;Z(&YakxKQQsJ;huKL{*ajmGm$243F3i?7|$ zPNVXZjK^0Nw0rKd?rg+ zp%l%Jxp;il*K-fx*VpTx;Y7Zh*ciNFfBUk_-sX^AwH^wOHW?bgOA7c_m3{^Am-md81`OeAV-}w#&Nln;&QBK7#$+ZkMTA`$m>gzw^da!ek z`m;X@CUOP$x3;qAzRxaKxFN+*X*+RDtE2@?w;_EU-#X>iTjeVvfYX*c^g&nL*tqUY zy`Fk%of~{NHlF;BUc-lr zE*{O#_xv$pVWB*y2drLXkFR=Xvyeh%7JBmD_W9p_TeectWmXvlXB9sW9lDA@ukiCP zx#VlGUvi21KkG}D10Q|9X$05v6UgbQl=m&;nh1Rsc*-?kgNz_>dNkiCKz?m4KK)X* zZpaDv8sOJJ^J`puhSIZqdLnc-jp56l1^So26nZgw;Qx;r{;gAZ;3ei_?fT4Q7ZT{@ ztl;=1G6={rSfb=~H9xlzeO%vczCiRd1A5kJ#YDBjjvscGvBKAg*RQFO28iHOp*X#p zbag`^tHm?uZxZ_+y6Tru`^!9`{~u`mF}6{k^r}ZeE-fIU4>~?kO?COpBi-@0o5QF4 z--13LoS)_^zsR5SYl)%*?;bTZJ>c}@>cKTV>M2s(6?%=Xg&uOh>Ft{Y9$^RQc^K#k zVjl{ku*(;@qXoX^M8t156N?u`ST%G%Im11gf5{=We8@f)@pYn}QTToP zC`a~yq~b;GS$KAOadX2)D*VWiwOlLHbd#AG*@?9Wnm{(CjozjB8YJGNQg=pj;YLeF z?BQUS=07uEFP5l>a!l>pw@->xzuPxvOv<8hqK1ZEy-s%m)8WHYa}0fR;ggVi_+G2K zi+bV%<8P@(Hl?gdrY8M?O+X)YD)w#u&;F=~A`8zHkGNx*t>5`qcLjxH~eQ>OGueh_}E!B>^fVuSG<2brZT^W$y& z9f{eUMjG?GZezxT@c!uPs;l%Lo__l2;S_gten8(_8KF1+E}&1h3%I;biAU;!UJu

-;D^4Y!ed&}L(BQMWMxJpNQCNdNq&*cIqc?-fk6 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 Date: Mon, 8 Apr 2024 23:45:48 -0700 Subject: [PATCH 04/19] Revamp input handling --- src/battle-scene.ts | 78 ++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 2d19a0276e2..d6712f6571d 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,4 +1,4 @@ -import Phaser from 'phaser'; +import Phaser, { Time } from 'phaser'; import UI, { Mode } from './ui/ui'; import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from './phases'; import Pokemon, { PlayerPokemon, EnemyPokemon } from './field/pokemon'; @@ -78,6 +78,7 @@ const DEBUG_RNG = false; export const startingWave = STARTING_WAVE_OVERRIDE || 1; const expSpriteKeys: string[] = []; +const repeatInputDelayMillis = 250; export enum Button { UP, @@ -183,8 +184,10 @@ export default class BattleScene extends SceneBase { private playTimeTimer: Phaser.Time.TimerEvent; private buttonKeys: Phaser.Input.Keyboard.Key[][]; - - private blockInput: boolean; + private lastProcessedButtonPressTimes: Map = new Map(); + // movementButtonLock ensures only a single movement key is firing repeated inputs + // (i.e. by holding down a button) at a time. + private movementButtonLock: Button; public rngCounter: integer = 0; public rngSeedOverride: string = ''; @@ -1062,29 +1065,31 @@ export default class BattleScene extends SceneBase { } checkInput(): boolean { - if (this.blockInput) - return; let inputSuccess = false; let vibrationLength = 0; - if (this.isButtonPressed(Button.UP)) { + if (this.buttonJustPressed(Button.UP) || this.repeatInputDurationJustPassed(Button.UP)) { inputSuccess = this.ui.processInput(Button.UP); vibrationLength = 5; - } else if (this.isButtonPressed(Button.DOWN)) { + this.setLastProcessedMovementTime(Button.UP) + } else if (this.buttonJustPressed(Button.DOWN) || this.repeatInputDurationJustPassed(Button.DOWN)) { inputSuccess = this.ui.processInput(Button.DOWN); vibrationLength = 5; - } else if (this.isButtonPressed(Button.LEFT)) { + this.setLastProcessedMovementTime(Button.DOWN) + } else if (this.buttonJustPressed(Button.LEFT) || this.repeatInputDurationJustPassed(Button.LEFT)) { inputSuccess = this.ui.processInput(Button.LEFT); vibrationLength = 5; - } else if (this.isButtonPressed(Button.RIGHT)) { + this.setLastProcessedMovementTime(Button.LEFT) + } else if (this.buttonJustPressed(Button.RIGHT) || this.repeatInputDurationJustPassed(Button.RIGHT)) { inputSuccess = this.ui.processInput(Button.RIGHT); vibrationLength = 5; - } else if (this.isButtonPressed(Button.SUBMIT)) { + this.setLastProcessedMovementTime(Button.RIGHT) + } else if (this.buttonJustPressed(Button.SUBMIT)) { inputSuccess = this.ui.processInput(Button.SUBMIT) || this.ui.processInput(Button.ACTION); - } else if (this.isButtonPressed(Button.ACTION)) + } else if (this.buttonJustPressed(Button.ACTION)) { inputSuccess = this.ui.processInput(Button.ACTION); - else if (this.isButtonPressed(Button.CANCEL)) { + } else if (this.buttonJustPressed(Button.CANCEL)) { inputSuccess = this.ui.processInput(Button.CANCEL); - } else if (this.isButtonPressed(Button.MENU)) { + } else if (this.buttonJustPressed(Button.MENU)) { switch (this.ui?.getMode()) { case Mode.MESSAGE: if (!(this.ui.getHandler() as MessageUiHandler).pendingPrompt) @@ -1115,25 +1120,25 @@ export default class BattleScene extends SceneBase { return; } } else if (this.ui?.getHandler() instanceof StarterSelectUiHandler) { - if (this.isButtonPressed(Button.CYCLE_SHINY)) + if (this.buttonJustPressed(Button.CYCLE_SHINY)) { inputSuccess = this.ui.processInput(Button.CYCLE_SHINY); - else if (this.isButtonPressed(Button.CYCLE_FORM)) + } else if (this.buttonJustPressed(Button.CYCLE_FORM)) { inputSuccess = this.ui.processInput(Button.CYCLE_FORM); - else if (this.isButtonPressed(Button.CYCLE_GENDER)) + } else if (this.buttonJustPressed(Button.CYCLE_GENDER)) { inputSuccess = this.ui.processInput(Button.CYCLE_GENDER); - else if (this.isButtonPressed(Button.CYCLE_ABILITY)) + } else if (this.buttonJustPressed(Button.CYCLE_ABILITY)) { inputSuccess = this.ui.processInput(Button.CYCLE_ABILITY); - else if (this.isButtonPressed(Button.CYCLE_NATURE)) + } else if (this.buttonJustPressed(Button.CYCLE_NATURE)) { inputSuccess = this.ui.processInput(Button.CYCLE_NATURE); - else + } else return; - } else if (this.isButtonPressed(Button.SPEED_UP)) { + } else if (this.buttonJustPressed(Button.SPEED_UP)) { if (this.gameSpeed < 5) { this.gameData.saveSetting(Setting.Game_Speed, settingOptions[Setting.Game_Speed].indexOf(`${this.gameSpeed}x`) + 1); if (this.ui?.getMode() === Mode.SETTINGS) (this.ui.getHandler() as SettingsUiHandler).show([]); } - } else if (this.isButtonPressed(Button.SLOW_DOWN)) { + } else if (this.buttonJustPressed(Button.SLOW_DOWN)) { if (this.gameSpeed > 1) { this.gameData.saveSetting(Setting.Game_Speed, Math.max(settingOptions[Setting.Game_Speed].indexOf(`${this.gameSpeed}x`) - 1, 0)); if (this.ui?.getMode() === Mode.SETTINGS) @@ -1142,13 +1147,34 @@ export default class BattleScene extends SceneBase { } else return; if (inputSuccess && this.enableVibration && typeof navigator.vibrate !== 'undefined') - navigator.vibrate(vibrationLength || 10); - this.blockInput = true; - this.time.delayedCall(Utils.fixedInt(250), () => this.blockInput = false); + navigator.vibrate(vibrationLength || 10); } - isButtonPressed(button: Button): boolean { - return this.buttonKeys[button].filter(k => k.isDown).length >= 1; + buttonJustPressed(button: Button): boolean { + return this.buttonKeys[button].some(k => Phaser.Input.Keyboard.JustDown(k)); + } + + /** + * repeatInputDurationJustPassed returns true if @param button has been held down long + * enough to fire a repeated input. A button must claim the movementButtonLock before + * firing a repeated input - this is to prevent multiple buttons from firing repeatedly. + */ + repeatInputDurationJustPassed(button: Button): boolean { + if (this.movementButtonLock !== null && this.movementButtonLock !== button) { + return false; + } + if (this.buttonKeys[button].every(k => k.isUp)) { + this.movementButtonLock = null; + return false; + } + if (this.time.now - this.lastProcessedButtonPressTimes.get(button) >= repeatInputDelayMillis) { + return true; + } + } + + setLastProcessedMovementTime(button: Button) { + this.lastProcessedButtonPressTimes.set(button, this.time.now); + this.movementButtonLock = button; } isBgmPlaying(): boolean { From ec51ba7417b9d77a116a46743f3054cb51dab1fb Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 09:14:11 -0400 Subject: [PATCH 05/19] Add back ability to hold down confirm and cancel buttons --- src/battle-scene.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index d6712f6571d..4c71a537051 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1083,12 +1083,15 @@ export default class BattleScene extends SceneBase { inputSuccess = this.ui.processInput(Button.RIGHT); vibrationLength = 5; this.setLastProcessedMovementTime(Button.RIGHT) - } else if (this.buttonJustPressed(Button.SUBMIT)) { + } else if (this.buttonJustPressed(Button.SUBMIT) || this.repeatInputDurationJustPassed(Button.SUBMIT)) { inputSuccess = this.ui.processInput(Button.SUBMIT) || this.ui.processInput(Button.ACTION); - } else if (this.buttonJustPressed(Button.ACTION)) { + this.setLastProcessedMovementTime(Button.SUBMIT); + } else if (this.buttonJustPressed(Button.ACTION) || this.repeatInputDurationJustPassed(Button.ACTION)) { inputSuccess = this.ui.processInput(Button.ACTION); - } else if (this.buttonJustPressed(Button.CANCEL)) { + this.setLastProcessedMovementTime(Button.ACTION); + } else if (this.buttonJustPressed(Button.CANCEL)|| this.repeatInputDurationJustPassed(Button.CANCEL)) { inputSuccess = this.ui.processInput(Button.CANCEL); + this.setLastProcessedMovementTime(Button.CANCEL); } else if (this.buttonJustPressed(Button.MENU)) { switch (this.ui?.getMode()) { case Mode.MESSAGE: From 5ee95bcd174e9a0976997370f7841b9df9280d88 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 11:04:09 -0400 Subject: [PATCH 06/19] Add Super Fang target benefit score --- src/data/move.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/data/move.ts b/src/data/move.ts index 441dfa7778f..8b21818fed0 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -521,6 +521,10 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr { return true; } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { + return target.getHpRatio() > 0.5 ? Math.floor(((target.getHpRatio() - 0.5) * 24) * 12 - 4) : -20; + } } export class MatchHpAttr extends FixedDamageAttr { From a2e57bf1f74b9dc7778b27dbd0d34aac928ccb52 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 11:25:15 -0400 Subject: [PATCH 07/19] Add unsaved changes to Super Fang benefit score --- src/data/move.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 8b21818fed0..0d025de8c91 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -523,7 +523,7 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - return target.getHpRatio() > 0.5 ? Math.floor(((target.getHpRatio() - 0.5) * 24) * 12 - 4) : -20; + return target.getHpRatio() > 0.5 ? Math.floor(((target.getHpRatio() - 0.5) * -24) + 4) : -20; } } From 2623313970d27e302e4c001982a0ab7eeac6a92d Mon Sep 17 00:00:00 2001 From: LaukkaE Date: Tue, 9 Apr 2024 18:44:13 +0300 Subject: [PATCH 08/19] Toxic accuracy skip, fix thousand waves --- src/data/move.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 0d025de8c91..88e525a4f9c 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1832,6 +1832,19 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { } } +export class ToxicAccuracyAttr extends VariableAccuracyAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (user.isOfType(Type.POISON)) { + const accuracy = args[0] as Utils.NumberHolder; + accuracy.value = -1; + return true; + } + + return false; + } +} + + export class BlizzardAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { @@ -1871,8 +1884,11 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - if (target.isOfType(Type.WATER)) + if (target.isOfType(Type.WATER)) { multiplier.value *= 4; // Increased twice because initial reduction against water + return true; + } + return false; } } @@ -3060,7 +3076,8 @@ export function initMoves() { .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, 'dug a hole!', BattlerTagType.UNDERGROUND) .ignoresVirtual(), new StatusMove(Moves.TOXIC, "Toxic", Type.POISON, 90, 10, "A move that leaves the target badly poisoned. Its poison damage worsens every turn.", -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.TOXIC), + .attr(StatusEffectAttr, StatusEffect.TOXIC) + .attr(ToxicAccuracyAttr), new AttackMove(Moves.CONFUSION, "Confusion", Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, "The target is hit by a weak telekinetic force. This may also confuse the target.", 10, 0, 1) .attr(ConfuseAttr), new AttackMove(Moves.PSYCHIC, "Psychic", Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, "The target is hit by a strong telekinetic force. This may also lower the target's Sp. Def stat.", 10, 0, 1) @@ -4341,7 +4358,7 @@ export function initMoves() { .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.THOUSAND_WAVES, "Thousand Waves", Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, "The user attacks with a wave that crawls along the ground. Those it hits can't flee from battle.", -1, 0, 6) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.LANDS_WRATH, "Land's Wrath", Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, "The user gathers the energy of the land and focuses that power on opposing Pokémon to damage them.", -1, 0, 6) From 88de47d8d89131f3ead65ca3d4c6af0dd0a63f1e Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 11:52:34 -0400 Subject: [PATCH 09/19] Fix starter moveset logic for starters with forms --- src/ui/starter-select-ui-handler.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a566877834b..993a76b14ef 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -638,7 +638,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return { label: allMoves[sm].name, handler: () => { - this.swichMoveHandler(i, sm, m) + this.switchMoveHandler(i, sm, m) showSwapOptions(this.starterMoveset); } }; @@ -787,7 +787,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return success || error; } - swichMoveHandler(i: number, newMove: Moves, move: Moves) { + switchMoveHandler(i: number, newMove: Moves, move: Moves) { const speciesId = this.lastSpecies.speciesId; const existingMoveIndex = this.starterMoveset.indexOf(newMove); this.starterMoveset[i] = newMove; @@ -796,21 +796,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const props: DexAttrProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); // species has different forms if (pokemonFormLevelMoves.hasOwnProperty(speciesId)) { - // starterMoveData doesn't have base form moves - if (!this.scene.gameData.starterMoveData.hasOwnProperty(speciesId)){ - this.scene.gameData.starterMoveData[speciesId] = this.starterMoveset.slice(0) as StarterMoveset; - } - const starterMoveData = this.scene.gameData.starterMoveData[speciesId] + // starterMoveData doesn't have base form moves or is using the single form format + if (!this.scene.gameData.starterMoveData.hasOwnProperty(speciesId) || Array.isArray(this.scene.gameData.starterMoveData[speciesId])) + this.scene.gameData.starterMoveData[speciesId] = { [props.formIndex]: this.starterMoveset.slice(0) as StarterMoveset }; + const starterMoveData = this.scene.gameData.starterMoveData[speciesId][props.formIndex]; + // starterMoveData doesn't have active form moves - if (!starterMoveData.hasOwnProperty(props.formIndex)) { + if (!starterMoveData.hasOwnProperty(props.formIndex)) this.scene.gameData.starterMoveData[speciesId][props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset; - } + // does the species' starter move data have its form's starter moves and has it been updated - if (starterMoveData.hasOwnProperty(props.formIndex) && Array.isArray(starterMoveData[props.formIndex])) { + if (starterMoveData.hasOwnProperty(props.formIndex)) { // active form move hasn't been updated if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove) this.scene.gameData.starterMoveData[speciesId][props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset; - } + } } else this.scene.gameData.starterMoveData[speciesId] = this.starterMoveset.slice(0) as StarterMoveset; this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, false); From 093b95df41027a2e0d750b76e29fa0899b72f77e Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 12:08:38 -0400 Subject: [PATCH 10/19] Add auto hide timer for ability bar --- src/phase.ts | 2 ++ src/ui/ability-bar.ts | 18 +++++++++++++++++- src/ui/title-ui-handler.ts | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/phase.ts b/src/phase.ts index 052a957fa4c..a8fb7c68a12 100644 --- a/src/phase.ts +++ b/src/phase.ts @@ -9,6 +9,8 @@ export class Phase { start() { console.log(`%cStart Phase ${this.constructor.name}`, 'color:green;'); + if (this.scene.abilityBar.shown) + this.scene.abilityBar.resetAutoHideTimer(); } end() { diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index c5fb51feec0..1985844e919 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -12,6 +12,7 @@ export default class AbilityBar extends Phaser.GameObjects.Container { private abilityNameText: Phaser.GameObjects.Text; private tween: Phaser.Tweens.Tween; + private autoHideTimer: number; public shown: boolean; @@ -55,7 +56,10 @@ export default class AbilityBar extends Phaser.GameObjects.Container { x: shownX, duration: 500, ease: 'Sine.easeOut', - onComplete: () => this.tween = null + onComplete: () => { + this.tween = null; + this.resetAutoHideTimer(); + } }); this.setVisible(true); @@ -66,6 +70,9 @@ export default class AbilityBar extends Phaser.GameObjects.Container { if (!this.shown) return; + if (this.autoHideTimer) + clearInterval(this.autoHideTimer); + if (this.tween) this.tween.stop(); @@ -82,4 +89,13 @@ export default class AbilityBar extends Phaser.GameObjects.Container { this.shown = false; } + + resetAutoHideTimer(): void { + if (this.autoHideTimer) + clearInterval(this.autoHideTimer); + this.autoHideTimer = setTimeout(() => { + this.hide(); + this.autoHideTimer = null; + }, 2500); + } } \ No newline at end of file diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 48f6e0590a7..fde27788bd1 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -13,7 +13,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { private splashMessage: string; private splashMessageText: Phaser.GameObjects.Text; - private titleStatsTimer; + private titleStatsTimer: number; constructor(scene: BattleScene, mode: Mode = Mode.TITLE) { super(scene, mode); From 1301eeb0b903fb913959946505f9f46b4de5ca8d Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 12:34:28 -0400 Subject: [PATCH 11/19] Superficial change to trigger a new build --- src/battle-scene.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 4c71a537051..c680999fcdd 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -186,7 +186,7 @@ export default class BattleScene extends SceneBase { private buttonKeys: Phaser.Input.Keyboard.Key[][]; private lastProcessedButtonPressTimes: Map = new Map(); // movementButtonLock ensures only a single movement key is firing repeated inputs - // (i.e. by holding down a button) at a time. + // (i.e. by holding down a button) at a time private movementButtonLock: Button; public rngCounter: integer = 0; From b48dd1c7fc8c9abc2e3ad0c2b8eba07aea6f61ab Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 12:42:18 -0400 Subject: [PATCH 12/19] Fix some trap tag messages --- src/data/battler-tags.ts | 6 +++--- src/messages.ts | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 6c3c12dc263..f50ad87d61b 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,6 +1,6 @@ import { CommonAnim, CommonBattleAnim } from "./battle-anims"; import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage } from "../messages"; +import { getPokemonMessage, getPokemonPrefix } from "../messages"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import { Stat, getStatName } from "./pokemon-stat"; import { StatusEffect } from "./status-effect"; @@ -587,7 +587,7 @@ export class SandTombTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` became trapped\nby ${this.getMoveName()}!`); + return getPokemonMessage(pokemon, ` became trapped\nby ${this.getMoveName()}!`); } } @@ -607,7 +607,7 @@ export class ThunderCageTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` trapped the ${pokemon.name}!`); + return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` trapped\n${getPokemonPrefix(pokemon).toLowerCase()}${pokemon.name}!`); } } diff --git a/src/messages.ts b/src/messages.ts index aeffd361002..ffd9aa6efea 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -2,6 +2,10 @@ import { BattleSpec } from "./enums/battle-spec"; import Pokemon from "./field/pokemon"; export function getPokemonMessage(pokemon: Pokemon, content: string): string { + return `${getPokemonPrefix(pokemon)}${pokemon.name}${content}`; +} + +export function getPokemonPrefix(pokemon: Pokemon): string { let prefix: string; switch (pokemon.scene.currentBattle.battleSpec) { case BattleSpec.DEFAULT: @@ -11,5 +15,5 @@ export function getPokemonMessage(pokemon: Pokemon, content: string): string { prefix = !pokemon.isPlayer() ? 'Foe ' : ''; break; } - return `${prefix}${pokemon.name}${content}`; + return prefix; } \ No newline at end of file From eff64db70e21d901376a92f473c6527d41646499 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 13:59:46 -0400 Subject: [PATCH 13/19] Use bitmap text for modifier text for optimization --- public/fonts/item-count.png | Bin 0 -> 607 bytes public/fonts/item-count.xml | 1 + src/loading-scene.ts | 3 +++ src/modifier/modifier.ts | 22 +++++----------------- 4 files changed, 9 insertions(+), 17 deletions(-) create mode 100644 public/fonts/item-count.png create mode 100644 public/fonts/item-count.xml diff --git a/public/fonts/item-count.png b/public/fonts/item-count.png new file mode 100644 index 0000000000000000000000000000000000000000..85cfe88e902ffa2c2014e58317ec2ff68b5b0ace GIT binary patch literal 607 zcmV-l0-*hgP)Px%8A(JzR7gveR!f${APh5CBdfr9Lsrez=(9n_rqIrGQ$mS9vLqUah+>SDC=gNQ zM|z%zA1EHNQVkTS(hGZXmOp;~h_Tilg1`8DXn~1JDe_86slD5imAgMSR?K4N4ad>qOO5rVbgM+J1~c66%E3JSb0m2*31hXZS0 zX{P6SwK>En(6&mm&I1TAngf<2)^ZifDakl}r9E*@^t?RgsMyY;56f4+!`!vrCuh$h z7!SXcOXnut=MIasc^84xVh9FV7U`ZO3zX8SIV|J&=Z>Qvl(Z@wAGP_FC1BG9Xo_EW zPlse*_97bc`n5loqV!_1pv|3NtTLG`3RfT*_-Am#76{>+VA_yx#hTYSooWv@fm7&A z!xb~uYHaqffMtjX71_$0#RRDi^F;yXIV!UOpRND_kDl}PlSj>7`Iff}j@A91` z?u@BB \ No newline at end of file diff --git a/src/loading-scene.ts b/src/loading-scene.ts index c59a0224d58..5c8f879ebce 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -129,6 +129,9 @@ export class LoadingScene extends SceneBase { } }); + // Load bitmap fonts + this.load.bitmapFont('item-count', 'fonts/item-count.png', 'fonts/item-count.xml'); + // Load trainer images this.loadAtlas('trainer_m_back', 'trainer'); this.loadAtlas('trainer_m_back_pb', 'trainer'); diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 50f64c403e9..5c7d57ac974 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -183,26 +183,14 @@ export abstract class PersistentModifier extends Modifier { return container; } - getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.Text { + getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.BitmapText { if (this.getMaxStackCount(scene) === 1 || (virtual && !this.virtualStackCount)) return null; - const isStackMax = this.getStackCount() >= this.getMaxStackCount(scene); - const maxColor = '#f89890'; - const maxStrokeColor = '#984038'; - - if (virtual) { - const virtualText = addTextObject(scene, 27, 12, `+${this.virtualStackCount.toString()}`, TextStyle.PARTY, { fontSize: '66px', color: !isStackMax ? '#40c8f8' : maxColor }); - virtualText.setShadow(0, 0, null); - virtualText.setStroke(!isStackMax ? '#006090' : maxStrokeColor, 16) - virtualText.setOrigin(1, 0); - - return virtualText; - } - - const text = addTextObject(scene, 8, 12, this.stackCount.toString(), TextStyle.PARTY, { fontSize: '66px', color: !isStackMax ? '#f8f8f8' : maxColor }); - text.setShadow(0, 0, null); - text.setStroke('#424242', 16); + const text = scene.add.bitmapText(10, 15, 'item-count', this.stackCount.toString(), 11); + text.letterSpacing = -0.5; + if (this.getStackCount() >= this.getMaxStackCount(scene)) + text.setTint(0xf89890) text.setOrigin(0, 0); return text; From c9eff345cf365c9dd84a10726de2e64fb3725570 Mon Sep 17 00:00:00 2001 From: LaukkaE <73663099+LaukkaE@users.noreply.github.com> Date: Tue, 9 Apr 2024 21:02:41 +0300 Subject: [PATCH 14/19] Implement Aura Wheel and Raging Bull types (#69) * Implement Aura Wheel and Raging Bull types * Account for fusion --- src/data/move.ts | 62 +++++++++++++++++++++++++++++++++++++++++--- src/field/pokemon.ts | 3 ++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 88e525a4f9c..6922898570b 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -18,6 +18,7 @@ import { BattlerIndex } from "../battle"; import { Stat } from "./pokemon-stat"; import { TerrainType } from "./terrain"; import { SpeciesFormChangeActiveTrigger } from "./pokemon-forms"; +import { Species } from "./enums/species"; export enum MoveCategory { PHYSICAL, @@ -1844,7 +1845,6 @@ export class ToxicAccuracyAttr extends VariableAccuracyAttr { } } - export class BlizzardAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { @@ -1860,6 +1860,57 @@ export class BlizzardAccuracyAttr extends VariableAccuracyAttr { } } +export class VariableMoveTypeAttr extends MoveAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + return false; + } +} + +export class AuraWheelTypeAttr extends VariableMoveTypeAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.MORPEKO)) { + const form = user.species.speciesId === Species.MORPEKO ? user.formIndex : user.fusionSpecies.formIndex; + const type = (args[0] as Utils.IntegerHolder); + + switch (form) { + case 1: // Hangry Mode + type.value = Type.DARK; + break; + default: // Full Belly Mode + type.value = Type.ELECTRIC; + break; + } + return true; + } + + return false; + } +} + +export class RagingBullTypeAttr extends VariableMoveTypeAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if ([user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.PALDEA_TAUROS)) { + const form = user.species.speciesId === Species.PALDEA_TAUROS ? user.formIndex : user.fusionSpecies.formIndex; + const type = (args[0] as Utils.IntegerHolder); + + switch (form) { + case 1: // Blaze breed + type.value = Type.FIRE; + break; + case 2: // Aqua breed + type.value = Type.WATER; + break; + default: + type.value = Type.FIGHTING; + break; + } + return true; + } + + return false; + } +} + export class VariableMoveTypeMultiplierAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return false; @@ -4681,9 +4732,11 @@ export function initMoves() { new AttackMove(Moves.BEHEMOTH_BLADE, "Behemoth Blade", Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, "The user wields a large, powerful sword using its whole body and cuts the target in a vigorous attack.", -1, 0, 8) .slicingMove(), new AttackMove(Moves.BEHEMOTH_BASH, "Behemoth Bash", Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, "The user's body becomes a firm shield and slams into the target fiercely.", -1, 0, 8), - new AttackMove(Moves.AURA_WHEEL, "Aura Wheel (P)", Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, "Morpeko attacks and raises its Speed with the energy stored in its cheeks. This move's type changes depending on the user's form.", 100, 0, 8) + new AttackMove(Moves.AURA_WHEEL, "Aura Wheel", Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, "Morpeko attacks and raises its Speed with the energy stored in its cheeks. This move's type changes depending on the user's form.", 100, 0, 8) .attr(StatChangeAttr, BattleStat.SPD, 1, true) - .makesContact(false), + .makesContact(false) + .attr(AuraWheelTypeAttr) + .condition((user, target, move) => [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.MORPEKO)), // Missing custom fail message new AttackMove(Moves.BREAKING_SWIPE, "Breaking Swipe", Type.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, "The user swings its tough tail wildly and attacks opposing Pokémon. This also lowers their Attack stats.", 100, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(StatChangeAttr, BattleStat.ATK, -1), @@ -4976,7 +5029,8 @@ export function initMoves() { new AttackMove(Moves.AQUA_STEP, "Aqua Step", Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat.", 100, 0, 9) .attr(StatChangeAttr, BattleStat.SPD, 1, true) .danceMove(), - new AttackMove(Moves.RAGING_BULL, "Raging Bull (P)", Type.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, "The user performs a tackle like a raging bull. This move's type depends on the user's form. It can also break barriers, such as Light Screen and Reflect.", -1, 0, 9), + new AttackMove(Moves.RAGING_BULL, "Raging Bull (P)", Type.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, "The user performs a tackle like a raging bull. This move's type depends on the user's form. It can also break barriers, such as Light Screen and Reflect.", -1, 0, 9) + .attr(RagingBullTypeAttr), new AttackMove(Moves.MAKE_IT_RAIN, "Make It Rain", Type.STEEL, MoveCategory.SPECIAL, 120, 100, 5, "The user attacks by throwing out a mass of coins. This also lowers the user's Sp. Atk stat. Money is earned after the battle.", -1, 0, 9) .attr(MoneyAttr) .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, true) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 389e584425b..a38beb6a45e 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2,7 +2,7 @@ import Phaser from 'phaser'; import BattleScene, { ABILITY_OVERRIDE, AnySound, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE } from '../battle-scene'; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info'; import { Moves } from "../data/enums/moves"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from '../data/pokemon-species'; import * as Utils from '../utils'; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from '../data/type'; @@ -1088,6 +1088,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const variableType = new Utils.IntegerHolder(move.type); const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); + applyMoveAttrs(VariableMoveTypeAttr, source, this, move, variableType); // 2nd argument is for MoveTypeChangePowerMultiplierAbAttr applyAbAttrs(VariableMoveTypeAbAttr, source, null, variableType, typeChangeMovePowerMultiplier); const type = variableType.value as Type; From b892a8b40ef85c687fc0b18e25e0518795f7444b Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 15:06:47 -0400 Subject: [PATCH 15/19] Add option to disable move animations --- src/battle-scene.ts | 1 + src/data/battle-anims.ts | 66 +++++++++++++++++++++------------------- src/system/settings.ts | 6 ++++ 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c680999fcdd..13581b9e6d2 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -119,6 +119,7 @@ export default class BattleScene extends SceneBase { public uiTheme: UiTheme = UiTheme.DEFAULT; public windowType: integer = 0; public experimentalSprites: boolean = false; + public moveAnimations: boolean = true; public fusionPaletteSwaps: boolean = true; public enableTouchControls: boolean = false; public enableVibration: boolean = false; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 9583b47f18f..84bf6077449 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -722,6 +722,41 @@ export abstract class BattleAnim { const userSprite = user.getSprite(); const targetSprite = target.getSprite(); + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [] + }; + const spritePriorities: integer[] = []; + + const cleanUpAndComplete = () => { + userSprite.setPosition(0, 0); + userSprite.setScale(1); + userSprite.setAlpha(1); + userSprite.pipelineData['tone'] = [ 0.0, 0.0, 0.0, 0.0 ]; + userSprite.setAngle(0); + targetSprite.setPosition(0, 0); + targetSprite.setScale(1); + targetSprite.setAlpha(1); + targetSprite.pipelineData['tone'] = [ 0.0, 0.0, 0.0, 0.0 ]; + targetSprite.setAngle(0); + if (!this.isHideUser()) + userSprite.setVisible(true); + if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) + targetSprite.setVisible(true); + for (let ms of Object.values(spriteCache).flat()) { + if (ms) + ms.destroy(); + } + if (this.bgSprite) + this.bgSprite.destroy(); + if (callback) + callback(); + }; + + if (!scene.moveAnimations) + return cleanUpAndComplete(); + const anim = this.getAnim(); const userInitialX = user.x; @@ -735,13 +770,6 @@ export abstract class BattleAnim { let r = anim.frames.length; let f = 0; - const spriteCache: SpriteCache = { - [AnimFrameTarget.GRAPHIC]: [], - [AnimFrameTarget.USER]: [], - [AnimFrameTarget.TARGET]: [] - }; - const spritePriorities: integer[] = []; - scene.tweens.addCounter({ duration: Utils.getFrameMs(3), repeat: anim.frames.length, @@ -880,30 +908,6 @@ export abstract class BattleAnim { r--; }, onComplete: () => { - const cleanUpAndComplete = () => { - userSprite.setPosition(0, 0); - userSprite.setScale(1); - userSprite.setAlpha(1); - userSprite.pipelineData['tone'] = [ 0.0, 0.0, 0.0, 0.0 ]; - userSprite.setAngle(0); - targetSprite.setPosition(0, 0); - targetSprite.setScale(1); - targetSprite.setAlpha(1); - targetSprite.pipelineData['tone'] = [ 0.0, 0.0, 0.0, 0.0 ]; - targetSprite.setAngle(0); - if (!this.isHideUser()) - userSprite.setVisible(true); - if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) - targetSprite.setVisible(true); - for (let ms of Object.values(spriteCache).flat()) { - if (ms) - ms.destroy(); - } - if (this.bgSprite) - this.bgSprite.destroy(); - if (callback) - callback(); - }; for (let ms of Object.values(spriteCache).flat()) { if (ms && !ms.getData('locked')) ms.destroy(); diff --git a/src/system/settings.ts b/src/system/settings.ts index adeddd36751..6ce4a692d1c 100644 --- a/src/system/settings.ts +++ b/src/system/settings.ts @@ -14,6 +14,7 @@ export enum Setting { Tutorials = "TUTORIALS", Enable_Retries = "ENABLE_RETRIES", Sprite_Set = "SPRITE_SET", + Move_Animations = "MOVE_ANIMATIONS", Show_Stats_on_Level_Up = "SHOW_LEVEL_UP_STATS", Fusion_Palette_Swaps = "FUSION_PALETTE_SWAPS", Player_Gender = "PLAYER_GENDER", @@ -40,6 +41,7 @@ export const settingOptions: SettingOptions = { [Setting.Tutorials]: [ 'Off', 'On' ], [Setting.Enable_Retries]: [ 'Off', 'On' ], [Setting.Sprite_Set]: [ 'Consistent', 'Prioritize Animation' ], + [Setting.Move_Animations]: [ 'Off', 'On' ], [Setting.Show_Stats_on_Level_Up]: [ 'Off', 'On' ], [Setting.Fusion_Palette_Swaps]: [ 'Off', 'On' ], [Setting.Player_Gender]: [ 'Boy', 'Girl' ], @@ -58,6 +60,7 @@ export const settingDefaults: SettingDefaults = { [Setting.Tutorials]: 1, [Setting.Enable_Retries]: 0, [Setting.Sprite_Set]: 0, + [Setting.Move_Animations]: 1, [Setting.Show_Stats_on_Level_Up]: 1, [Setting.Fusion_Palette_Swaps]: 1, [Setting.Player_Gender]: 0, @@ -104,6 +107,9 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer) if (value) scene.initExpSprites(); break; + case Setting.Move_Animations: + scene.moveAnimations = settingOptions[setting][value] === 'On'; + break; case Setting.Show_Stats_on_Level_Up: scene.showLevelUpStats = settingOptions[setting][value] === 'On'; break; From d9849c5e709837d0292998f2f82860ec2ff470aa Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 15:17:42 -0400 Subject: [PATCH 16/19] Ignore stat change animations when move animations are disabled --- src/phases.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases.ts b/src/phases.ts index bd91b501e17..f768a118680 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2540,7 +2540,7 @@ export class StatChangePhase extends PokemonPhase { this.end(); }; - if (relLevels.filter(l => l).length) { + if (relLevels.filter(l => l).length && this.scene.moveAnimations) { pokemon.enableMask(); const pokemonMaskSprite = pokemon.maskSprite; From 2a6042ff7e41bd290e755eb000a5f48b55e88d4f Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 15:34:57 -0400 Subject: [PATCH 17/19] Add HP Bar Speed setting and fix Grip Claw HP skip bug --- src/battle-scene.ts | 1 + src/modifier/modifier.ts | 2 +- src/system/settings.ts | 6 ++++++ src/ui/battle-info.ts | 5 ++++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 13581b9e6d2..daf250b7c71 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -120,6 +120,7 @@ export default class BattleScene extends SceneBase { public windowType: integer = 0; public experimentalSprites: boolean = false; public moveAnimations: boolean = true; + public hpBarSpeed: integer = 0; public fusionPaletteSwaps: boolean = true; public enableTouchControls: boolean = false; public enableVibration: boolean = false; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 5c7d57ac974..c829d5a44b7 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1760,7 +1760,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { } const randItemIndex = pokemon.randSeedInt(itemModifiers.length); const randItem = itemModifiers[randItemIndex]; - heldItemTransferPromises.push(pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, false, false, true).then(success => { + heldItemTransferPromises.push(pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, false, false).then(success => { if (success) { transferredModifierTypes.push(randItem.type); itemModifiers.splice(randItemIndex, 1); diff --git a/src/system/settings.ts b/src/system/settings.ts index 6ce4a692d1c..09d5dde94a8 100644 --- a/src/system/settings.ts +++ b/src/system/settings.ts @@ -16,6 +16,7 @@ export enum Setting { Sprite_Set = "SPRITE_SET", Move_Animations = "MOVE_ANIMATIONS", Show_Stats_on_Level_Up = "SHOW_LEVEL_UP_STATS", + HP_Bar_Speed = "HP_BAR_SPEED", Fusion_Palette_Swaps = "FUSION_PALETTE_SWAPS", Player_Gender = "PLAYER_GENDER", Touch_Controls = "TOUCH_CONTROLS", @@ -43,6 +44,7 @@ export const settingOptions: SettingOptions = { [Setting.Sprite_Set]: [ 'Consistent', 'Prioritize Animation' ], [Setting.Move_Animations]: [ 'Off', 'On' ], [Setting.Show_Stats_on_Level_Up]: [ 'Off', 'On' ], + [Setting.HP_Bar_Speed]: [ 'Normal', 'Fast', 'Faster', 'Instant' ], [Setting.Fusion_Palette_Swaps]: [ 'Off', 'On' ], [Setting.Player_Gender]: [ 'Boy', 'Girl' ], [Setting.Touch_Controls]: [ 'Auto', 'Disabled' ], @@ -62,6 +64,7 @@ export const settingDefaults: SettingDefaults = { [Setting.Sprite_Set]: 0, [Setting.Move_Animations]: 1, [Setting.Show_Stats_on_Level_Up]: 1, + [Setting.HP_Bar_Speed]: 0, [Setting.Fusion_Palette_Swaps]: 1, [Setting.Player_Gender]: 0, [Setting.Touch_Controls]: 0, @@ -113,6 +116,9 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer) case Setting.Show_Stats_on_Level_Up: scene.showLevelUpStats = settingOptions[setting][value] === 'On'; break; + case Setting.HP_Bar_Speed: + scene.hpBarSpeed = value; + break; case Setting.Fusion_Palette_Swaps: scene.fusionPaletteSwaps = !!value; break; diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index c73ab8419c6..ce6c101f159 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -349,7 +349,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { }; const updatePokemonHp = () => { - const duration = !instant ? Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000) : 0; + let duration = !instant ? Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000) : 0; + const speed = (this.scene as BattleScene).hpBarSpeed; + if (speed) + duration = speed >= 3 ? 0 : duration / Math.pow(2, speed); this.scene.tweens.add({ targets: this.hpBar, ease: 'Sine.easeOut', From e672ead1847bc8fbe84a9446c11dc6ac26247c3e Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 16:58:56 -0400 Subject: [PATCH 18/19] Indicate starters that exceed cost on starter select and show values for locked starters --- src/data/ability.ts | 2 +- src/ui/starter-select-ui-handler.ts | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 7c722a183db..d09bb2ebab5 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2729,7 +2729,7 @@ export function initAbilities() { new Ability(Abilities.DAUNTLESS_SHIELD, "Dauntless Shield", "Boosts the Pokémon's Defense stat when the Pokémon enters a battle.", 8) .attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true), new Ability(Abilities.LIBERO, "Libero (N)", "Changes the Pokémon's type to the type of the move it's about to use.", 8), - new Ability(Abilities.BALL_FETCH, "Ball Fetch (N)", "If the Pokémon is not holding an item, it will fetch the Poké Ball from the first failed throw of the battle.", 8), + new Ability(Abilities.BALL_FETCH, "Ball Fetch (N)", "The Pokémon will fetch the Poké Ball from the first failed throw of the battle.", 8), new Ability(Abilities.COTTON_DOWN, "Cotton Down (N)", "When the Pokémon is hit by an attack, it scatters cotton fluff around and lowers the Speed stat of all Pokémon except itself.", 8), new Ability(Abilities.PROPELLER_TAIL, "Propeller Tail (N)", "Ignores the effects of opposing Pokémon's Abilities and moves that draw in moves.", 8), new Ability(Abilities.MIRROR_ARMOR, "Mirror Armor (N)", "Bounces back only the stat-lowering effects that the Pokémon receives.", 8) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 993a76b14ef..546c9ca5b29 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -889,7 +889,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const genLimit = this.genSpecies[genCursorWithScroll].length; for (let s = 0; s < 81; s++) { const speciesId = s < genLimit ? this.genSpecies[genCursorWithScroll][s].speciesId : 0 as Species; - const slotVisible = speciesId && !!(this.scene.gameData.dexData[speciesId].caughtAttr); + const slotVisible = !!speciesId; if (slotVisible) { const baseStarterValue = speciesStarters[speciesId]; const starterValue = slotVisible ? this.scene.gameData.getSpeciesStarterValue(speciesId) : 0; @@ -914,7 +914,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterValueLabels[s].setShadowColor(this.getTextColor(textStyle, true)); } this.starterValueLabels[s].setVisible(slotVisible); - this.shinyIcons[s].setVisible(slotVisible && !!(this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY)); + this.shinyIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY)); } } else { changed = super.setCursor(cursor); @@ -1244,17 +1244,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { tryUpdateValue(add?: integer): boolean { const value = this.starterGens.reduce((total: integer, gen: integer, i: integer) => total += this.scene.gameData.getSpeciesStarterValue(this.genSpecies[gen][this.starterCursors[i]].speciesId), 0); const newValue = value + (add || 0); - const overLimit = newValue > this.getValueLimit(); + const valueLimit = this.getValueLimit(); + const overLimit = newValue > valueLimit; let newValueStr = newValue.toString(); if (newValueStr.startsWith('0.')) newValueStr = newValueStr.slice(1); - this.valueLimitLabel.setText(`${newValueStr}/${this.getValueLimit()}`); + this.valueLimitLabel.setText(`${newValueStr}/${valueLimit}`); this.valueLimitLabel.setColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)); this.valueLimitLabel.setShadowColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true)); if (overLimit) { this.scene.time.delayedCall(Utils.fixedInt(500), () => this.tryUpdateValue()); return false; } + for (let g = 0; g < this.genSpecies.length; g++) { + for (let s = 0; s < this.genSpecies[g].length; s++) + (this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite).setAlpha((newValue + this.scene.gameData.getSpeciesStarterValue(this.genSpecies[g][s].speciesId)) > valueLimit ? 0.375 : 1); + } this.value = newValue; return true; } From 8ec7333b1eab481f2fa7fc4a2b4c35d25a0e4f80 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Apr 2024 17:22:38 -0400 Subject: [PATCH 19/19] Re-disable data imports --- src/ui/menu-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 6ef28d526ce..26103f51ed8 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -114,7 +114,7 @@ export default class MenuUiHandler extends MessageUiHandler { }); }; - if (/*Utils.isLocal*/true) { + if (Utils.isLocal) { manageDataOptions.push({ label: 'Import Session', handler: () => confirmSlot('Select a slot to import to.', () => true, slotId => this.scene.gameData.importData(GameDataType.SESSION, slotId)), @@ -140,7 +140,7 @@ export default class MenuUiHandler extends MessageUiHandler { }, keepOpen: true }); - if (/*Utils.isLocal*/true) { + if (Utils.isLocal) { manageDataOptions.push({ label: 'Import Data', handler: () => this.scene.gameData.importData(GameDataType.SYSTEM),