From 8a8c42fa6abfd6c519fb7ef20452994233a47271 Mon Sep 17 00:00:00 2001 From: "Andy Lu (Lu, Yu-An)" Date: Mon, 1 Jun 2026 20:19:32 +0800 Subject: [PATCH 01/13] feat: multiple skills --- Assets/SkillAnimation/fly_sword-1.png | Bin 0 -> 20130 bytes Assets/SkillAnimation/fly_sword-2.png | Bin 0 -> 23065 bytes Assets/SkillAnimation/fly_sword.png | Bin 0 -> 8748 bytes Scripts/Auth/AuthStorage.cs | 336 ++-- Scripts/Characters/Player.cs | 149 ++ .../PlayerSystems/PlayerCombatController.cs | 4 +- .../PlayerSystems/PlayerMovementController.cs | 104 +- Scripts/Core/Data/PlayerClass.cs | 121 +- .../Core/Data/Skills/GiantFireballSkill.cs | 42 + .../Core/Data/Skills/RicochetArrowSkill.cs | 38 + .../Data/Skills/SkillProjectileSpawner.cs | 212 +- Scripts/Core/Data/Skills/TripleArrowSkill.cs | 36 + .../Core/Data/Skills/TripleFireballSkill.cs | 43 + Scripts/Main.cs | 1716 ++++++++--------- Scripts/Prototype/LobbyManager.cs | 17 +- Scripts/UI/ClassSelectUI.cs | 332 +++- Scripts/UI/DifficultySelectionUI.cs | 332 ++-- Scripts/UI/PlayerHud.cs | 4 + 18 files changed, 2188 insertions(+), 1298 deletions(-) create mode 100644 Assets/SkillAnimation/fly_sword-1.png create mode 100644 Assets/SkillAnimation/fly_sword-2.png create mode 100644 Assets/SkillAnimation/fly_sword.png create mode 100644 Scripts/Core/Data/Skills/GiantFireballSkill.cs create mode 100644 Scripts/Core/Data/Skills/RicochetArrowSkill.cs create mode 100644 Scripts/Core/Data/Skills/TripleArrowSkill.cs create mode 100644 Scripts/Core/Data/Skills/TripleFireballSkill.cs diff --git a/Assets/SkillAnimation/fly_sword-1.png b/Assets/SkillAnimation/fly_sword-1.png new file mode 100644 index 0000000000000000000000000000000000000000..85a7de73189e9d7e69fa834698d2d4140eb99c35 GIT binary patch literal 20130 zcmd3ORZ|>H(>9APun-n^S==_bySsaU;O-8=U4y&31`iSl4vV`6cL@pZ1m62O`2NFJ zHB&QJ&%qo_byv&P6Qiagi-AUr1_uX+AulJT0S5>8Zwr6}BL27Be=+&T2ZxUHzX^cL$s_zvh~goyERAx8L;~Xe z$b~vV_1^_>@>1ejKEKX?ercuE4cLBK>oPv}qzHH^)@ffZ(&4Iif7Gc}EF#6=Qp zmS(djq668FAW*N#lL|F93$c>}$FA8BOq)sBR^^4f)Huj9kl+(hn-Kw^Qu1|M7DW>q z;b$+!vz4C#pO3Y*zg#?(dM#DgXdZ8^ZytMnZt(Q_DF5xR`}8->?++JO{{n)xDU_Bi zl>fgNOZt1)TTb<((m4YW#8SI6^X~-Zwb+C&Gbb~6<~=G+rz^DYpq{~Uk=TiU$Zp-d zeTMzQpI#eA1AD{|-W*<7Qa4LIKE-Z$W0ilguAc?GkeC8ST+t?idXham=08bl8UD7a zcV5>E{?m>Z%Omg5KSeUr&daYTcGO*;hLpO`MXNi2l$G2&vCWlFv_6&B;YzI05|d!s z92BeGr{gfiOpFlC?6M2#@`QM=E1i0~4Sus}voOyoZt0%;$5D>qTkij!;ShXDlOh+4e0ZP(#JUH*cAUeBxQvCX`0 z0A2(q=PGW=t#`>a+HeJHHsKRA^~<-h@&awI5iP#}&1W2UJV-UW6~Joq!%v^yPk8Oe zGl^C4hsuoM#3H{BS2%Cq3EayoT*!u*6-5J*ZZg^9uU{I3FkP}QR`A-}pUpoCUvhM& zrf)$z#cNtSbF&QyvfY`gZ?Fii__en;K}e${08L$Mgi+TE3ig4ASWn3HUAF`IGFVQ^ zYtAZMbs2Ak`z#$S+$*{wzW&+1?kP_88LuFKGo-9KxDr{ncaGkeOljcfuOgVth;|wT zUL9Bvt5&0L{h|&)uzmaNPM&p`Fn}=Ka}ig#I%bnpL^m@hYQft3oI>Jvh ze(Bt)WV_pkvCYIshbu8sa!GzFVTyVrX#xyMzxJ-BnJQ6qO+I;K3#vlAdz6qXqUY(r zcyvEVQ{}wOuv#4`314rg5*2V4z91Go^~keGoUyfT5)%)TJAqFn7l0&~ae2%f`W*s! z13AUP>iB<0(p!*piwLz?R&?;3<0`3~hvKrk8HVOF_XQVZbMgXg!zONK8Sy0^IoF^Q>IGjc(2J>?r}GF#nOQW&pfJlI#}1dN;KKKF5Kdq{8l)3uDBpcA z_NBy-;%3Exob3L>>B{<-mz8w*>4CEf6dihFHnfzXK5%_!9HZtE7hE({<|{`mDnt{+?6aOQ=H4e==2fo+ppaQ#`F9c+K_KEr1 z(XIksfJf5uPj51NA7z#Lt87cW>?FoU3>^7^VC!W}H1O$ryYb8Fr6lXKxHz8fh}MpM zY4h- zY3wgbTr2=x0UVu+(T6(i72xdD8|AE`=Nux%ESji(Kx7==Yg3Txy<^}*WOgZMZ)4_e zuR0>Re|em2+RfsflO*p?9wLY*D;6sCtHrS!d$OxdRl3;DpX^W;&f7>x;G(%C`5^M~ zjJwXYGpBvyiw23{^FVKCu z_Q|;ji##VZhK0atSPssTv?;D?)G}6-|LJhn|A5vzq-+8kJ^}>@-&OvR?fnty$HpV` zizwsA1+~m%Y4!nrCuRn|wWmVfiH;%C1Nu`e&WJdP7O4c}?L8`;$1mNQqn_A5Ih?(i z$pfB_wP@qRdRNvS7EV4GJ`N4?`49!yVGYSaKxBUp@Fbjm$v8s)a1!Vn{oI509l-w( zA@i%dhKKP>M~MWeGz~R#7m<_u%Bn@i)I8W}LmRhrHb5&XT53Ep>B(iDNYH6|T5v3( z<(w$&%?KkAnOuOGx?0&Nib$Mklc}dj@C_!)mVNAlEE%3yk{BmdVuL*=<`Qh=p(YhB zh91deU4qLQhvr60GVn9=nao2vJ=E|r+b}T@(yfiNzrRbFWMjuSL}*5Hm4C#p4sQJF zB^Ft;MaiCqlE8UQ)P*i5^e#Jv!^PemQh3P1eXmifN+1~=WrnIeIVco1(?Gf*s#;uT z(7g#deDte3s@1b$N)ZYveqXuwG@2%i*lW=5tDMG#U!hB2$3RS$#xkovTuT32?*QQ0 z=kTZw?#2ic6AvTu_w(uSVG!t$8uF0}uPd(Jb&V7Wc;!w7u$F|%aw)Z?nD_hwRF~%U zXgdzyR<7_faGl+k!&D9SKb~77J=VElireh&LE9a(x}5Qw2nl>GCJcl78b^GI4U4AG zjnnVV!%@VGq3jWn3u+8LLgSJ`BGK6DP%>Fn^$shWbdG0#3+B5n_ny5 zT5t9FQ?=bCgEvk2orrSoJ?EZUErez9y+PlTRQKfq7{zj@8up`r-lM){qQEf2XcS!`(T!Yi6pks)CjBa&DX zq%d~9l}2GHqoXMk(CcqL*#?4-lTNU}A${KV@>kovrs39Ei%J}j*2DHvB9V-1$7+^} zYugqit^bpond>8zS#bDS;cHSwyD-^?jMBK#7e5&-qGpKu_5We1-p;-_xBIN#^8s-KOXGwh+s8O5;NbgE6|82 z!~5I$@bQQ(5?wOOz;9|}JRYSO=r)`nW6_EzQ%oTVrJxl{Dp3$*La`%;r1uwgg+x3- zRJ-{VeTCd42E`Mp`kb`C{0iE$-VdOg52$_p0Mg3@>8I2av0sR@-?`yaH;*jh5E1!0 zfI@q!ur}VYx>A!O&ff!AEhg&~Ar){(#JI8B9HIl}AwMEk;+*QNqKk z%vmK^7MP~5Txv=V`RLuHh*$`cwk4c zmKJlEfiYRDZ-gg?4VY6v$$Mu~Th~yjTY1NkN+)VN;s(Y(U$j^-^g3?U{vJpXx17*R z{pv_2PoWBrJ`Bt|M-(I!LIhyBrA3o}>$?Be5}*uSnzWCLk3;74B4E4J|ABa-;MF5) zg;oem=(EnrM+72z+VK&Z{R*#}FODoWR-0LiZ|F7TRl`6gK!6c`wQaO5@^khuxf7$8 z6iqExVU9S0r#-Z7$z9Mj(KulSc(CQ?@_9cRs{C#1u9& z&b#|ZIbRBqM~YZ?_VIIRE}{afN@Jqc@@@#CwEC|{<}BLJ+%{K7jz7cg8u&ZRV%9kQ zep9*79L7~CiUB$ny4n$ps&7itkVC>^YQJZsfSAS|Y1Cb3+w?&u3~sNUA-JeHS&7-^ zKtp`no0g3UVs?>~Bx5uA$1j&294t;?UE&U0kjSLQ);Q{@J61ZkdjBI-}CZ9{xDV$=}il zou+Yw?JYafR`~b!HoWhD@`cF?_p&L_sV>eNLKkL zCa;Y;Z;`fKuXIr%_%LNfQx<-%&JyA;6j~ofyxS;*B@qg%>wFL~yBwOTRM%xBv_0An z-oEoA0ZZ2T4VJ6}mW;&GStOc@?J3KXGSoh=1#o(|Abdy+CMHgp!G&5sfvHjm6Rgs2 zc#MJXr_XK}1RqeosX|CR$FI*#xEp%ND9}}Z?;rUPXPj;bCq=`|aD@@Sdg@>kpv+*y zu$K@BJdY`fSl%7dx7u|&8%);OLdON&I@&5Y5wh-=fViUO%O^K{d%>R#1!6?)-v`WO!NBkRGucR-No5nwRi43^Om%svbkdA9Wcz}I8>Ml8_1 z&N6HE5kMd9L*iVbnn~Pp%T8LPVxer+M{$KRWH|HA)D0#n%KPbTl=+j<6H2q~x^+9p z)oIMPwwB-# z-%dTpy5%HDiSamn%KN>3lhSVMSNd-}V=UbGE|+XRRoE3&!A010h{g3J_zt*{?a9Ir&FRSKCVNC4x5mC?K9z|*_c@)ReT+R>^JmoMbxhxPa)BTm5nTvnaSHdZ153ixD49K<>9dtv_%IfkseAAdsUlbxqHicQC&Xq+wP(FwTP0@znv++Gj`Me76TCtuZ(4~-qTO4Y+8dtv? zoNqJF3#Pb@LEi-D_JelPp3r74VR`+#mWHyB9emD&sG-K#-DBX%rM$|#%$DEK7FNFJ zv6D7z)~c-+&VVrMW9CJ~l$69>~W6 z;X@3DUk=d_+B|9G;f6`$q$O&amVzw?quITr5*d*@NQeIpeS)$LH{_Obt-;`poDTDW zT=wCl2gHcnX3IVymOof732ycGKc9CyHC5p;LC;!0Z_#1#(`(Tt*M^Yq{@fGIZwN{t zhPqE;vBLnrSC3qy^-GmM*m5gihQ3|&%vf3M9Me8|HGtnx&ZVyF6YScb_ zPK(MCuRu=iy)=!#dg)ZKiWFij`{9I)wD7=S8Jx!Bmb10Xjvwnp3lFX^XQ|jw``o*V z$S)^2*iF%hR(g`)of7>rjPP?a(SWjY!~5vJoWBhRPe|Xddm9+1p22vy7|FvIF@@eS zdekH3%9FV4k)zke*h%#AkSWunD4?mkeEyK^4rxl1gxxwbkd$_tiKmqS;rx|s?*gHa z_dOE1R!BUTN3a7)S`NijHL*Bh#`890L2jY)?k@>>oy;gkyzmzlilD@DLFw8c*?q|_ zG+=0TT8sQ$xMXd1%J?{;fEbRr1ve7n5zmd@8;K3*s6a#*1g!+$o@D34FsJ<#Y;_dZl z;pt-nxnWu(jj`@|;kB4Zxy327&xt|*Ha=1MWIjf{ay7I~nnvXt4uYUmR5LfYq9uy? z(LBd%Qy?Qh{S*s@BoC1&9&<1F`AFZ`M-@x^XTQaacV)?_wm+DN^1(DTGP6z67N*}q zqa=Q+9Qg_{zyT!vK zJGPMV!C`Q+hy`ZSPA`}wFUa9?-U2(fV&w_D_zQT1L9xDw?6Q0;h6i4@m}JWf9o@p! z;EjPy{jxCve#z9|s~9?NUW~byR2`8&hhE(aX!kIUCv3`v*{1^v51%l>wLrh{wW0al z(<4m5!g=1Iw}LmlCINzdr_b3y)xOmCPu1vA|L*!?_>58xGXlOl# zc3w|H3ZS4deXk}7C7cjdDY-;O#0jB97yx91KdaP|=pJpj+iFNe==4Z9)25oGB!Xt! z;>W3Bs|1m3j?^$EQPMPJge}Xb7Dy)c$KyH@X=B1)xwO}wVdvjb8{ZL{*uN(AUm|af zbom-B^KwZ-ex5DRj##375Kjm=x5(iZxMgeAAOHSIdl<40(TI_4O%IeGF1t(i&s61S zzy%Q-YNX`RS<2qAGO)NL-9J>MjVsVR6O3Y1t{tgemeZ%&-q*5kSgYV%8aN#wRrr#L zunSx9$t8$j6J)l$29tUChD$>NCC@)ajx9&qiKR!Sr zWyhi&)U@O>@hbSoaPp21UlBzjMeHZdSNp|5p+*~FJEZT)Y`hg?T4#}o)-7oM_W>F~ z8tnGC#EA=1K;rJsSpt2hC%IpH3kgI3Dt7V!I~`_my=)@39@L2k8IG<|^T85sU3QGR zf|j41-tleZjDIHf|7=V;`VdxB@6THTP$+&TWlSngfZQ@bVbwG?saqlnb$ z|7=B|B70&@nJ~3)?hFpZr<4xZM2E!kcxdjb*^GH_Qu@IK4QI$5{&)3mVcy2RvU@JQ zkKK==L%And*Fv9wtH9ydVTGsR6+@AG?(a;;B&Sp$8nrQt@? z^hdH%bcbmdS&8l;SYx#|&8fQkrP%|LH`t$OPvEEkpZC;p8}@Z0M)%xW>M<{egO`W* zQpB4)tRK|-OY>+Ou@d7k`bXxZ~uR-fgi=hNp6oE79+Y-D$Lls@K|YDYg~B6Sw8&NCYnS zFRL&oyAI$lNw`03TK=8edXz3%U(OAh6cLHmmfHCPP5$|k$0+3oHzVzoEwN_v+G{{3Jfz~6X=g&gd8|DQ#TtD~$gRjX^3 z%GJD$ImJQv)B2TXFPXsC%SsYO_up}tUf=hj3!;kbru?s-lli|mLNt<5Qhnbo1bsTP zJrHjlIe*3t4YoXo?JJwMQ=$_(M3EDRIWOIO4=C3|3tEe4ykSqPe7+EBH!-vrXZ_Y(Z>eEua z;t{Tq@guHFy~cRCmzwY290NT+KI9!qc4V~#RsCIK#-;Rq>4 z53;n+N|$zI^JjGQF>xFB+uOS5Y!@jf2Hi!qcmI5>9t4>+F+Q{zKj#=%(#iZfWeCOG zR<3#Q{z+pW%c*Z4H{&}!cSx%Qh^6}os~mLa2~pM>9WrnYoNH@=8@{poI~&Yza`chF zzuN4V{M(nnKFpr!xJgqRSJscSBhbZOF#xUqep<6EteviVGc-+buY#G@ROqo#V?~zcKZ>Y52#*m5*u*y_VvS>|ODvBH+Dw67vIlDZ0I5X3} z+J2&@WKF4zIa#mzyl?OWCWfP>AIEh_)o27=$RwycIvQ9$yxNtoPMEbmOqvT>jIL-xY; zzwpA23Ua=!=2Rb|`u?4MELi%mMPo%Iyl&lr09Q0k?vIYj3~K36DxLLcUY@2Qc4hg; z+`wqoOfFlP@1q2sS9A#*9K6?wXD=g@1SNe)v6!xMTny748c{kzk7DoY#v>&BMR6>S zxWL6X$f$EdSzR2XZ~h_5X5Ko&c1w~h^W&v#Apz;mXY^i<@_D)G>p5B4kJqBPym1K* zVx2WRvt=PA=1(sz3|6+Tp_MJpbnXd-zeX^me`f+GQMjrXzLW0Gtu$e<^c@;XBv+;u zp0W}awC1*hkfWcX_UbSA>_2SY5e5z0PP+ydN=A#`bYJBp zT8)T;9hl}D)Xj~Nz{Pl9lgpGSGK2Xv5jglO!f1U!+Jvb*8r-X9UCOr2&pwj<>^zZ% zXKf5${Rr?r7~{foIBGu_8Q;l-aeM$b#t#(B=EDv&`3=Vt4@R6&JdBih1GL znsty9$`<(wlEQ8eblT0SoOF#8x(+Jj+-(=}c{6#G(JPo5RX1kgUBg z6<#X&BA4T*h8;v#LzP_*T^^lyCrtzDIN&RRIYWAjNoV*mj5>{dP_36&q@Fr?V;dxo)^`n+8rULRda|KI@4@J z!71m(nJRqC^RlL@K#_XO|J5Rr(*s=R8p6%x82I+^p~pHGUD}E3s>jDkNxI%KGIBU4 zcK7$NH_xLq;P@#;Uf?3dOEEDE8Iy{tg@-ooq|uB_%HpRh)8g5_rtG|BIzD;VYN7-M zk8G`5hW|aM%V$iXJT-ymjDv46=Y*vBKV_{g_g`-dyU9D->UMyIa5mW35NFO$8W^kd zr@MoP`MWHA79slTz~!{M2!C8U|Eq_IGE z{V5PzdlO*r2kDd0W^%KDG|7qg7<+PH)UbYpx-kj$l+HKk~g zB0UN!kxirxoZ`|uoO(4%9y%8Z`DPOtzG$;ogh|kX!(c~s+$6?PT3=Vl+sCpp2czDp z!wX6Vo@KYG`&nDGp>kpP8+ZUwPaJBDoBr^M5m{_96foc?4b38B(?$fLtj_e}zK{Bc zF{;2(EpUZIiyYhR-)Inr*EJV18omWzQ0nhdnp|GSoGw62c)OD8I8;9zKQc^M${2bI zY*X{EnCg(`460R5& z!n`=CiXqCfi5MZeyB9%ycqq~>N8X~D@|o{V`)50PV50>7n-t#RIDb7&F=|7j?`W|L)K&w1H9k^ zrkj-V?e&mex5=Cs2_(l%)Ptm~)Dq+RTjl~dgann1Q}=Cy?h;e$xL5 z$}o?6gT*3bfkTX&Onx+3vi&}KBXJ%!dPOOIYJC#+U*;P&o?bXM_@OknE0nVWiB{_l z-IkzyYJY`jZuqRIUL$km@G$359;o2ERI%!~x=eIPZ?Vv0H`;3aZj3Ba%ndV)qiNP! z8WND|25k#80)ElApD{ttu< z&)E)UDXlS|$B}gKc1y|8I6VLE9JG%-s=jB1iiI6b=F?9x-n_18IdL8|IqCbH&=H8m zP;pwzEN@AD4Tj2`f&QgEHb4IH7G-dub-60e`kT&io=>Sk9 z(xnJ=%?XVay3Kq2%POAJ4Q*!lPPsiNg`cJ%ND29a3@xx$R@eEY`PZ7Xk-3JM)k;t= z*kVQW>4cGH+UQ|xi%)>XM9nCGLgcO#g2DjwkyK2`hEI%wAhDrw9L?K33+nho z>Nb0ifj;Sc|BiH*$lnlAL@=vOF3@KE`;c0rf$%4nqJ4Q4iTN}%7_lvLfGdxd^JSp$ zqG|FnP|5PK-O(ku%!exJ(%5}bOXRF1KCkKk38dH=O$GG2#b>A}g`YwT%_64)E8g1R zU^n(5dEv~LsTLk*wNTry-|AU?)fb|foy@|}&K_qQWN_XnkMPf%Jf~+5NDLJVf?n=>6 z83uRcGIws3gB(iRM?18mUKt|Rh+Y`Y$F6?`UGYMtAd!NdXuk&Y zq(ShI9tmcWRiXO=6I1SZK8X8c3cx0>r;)m-*c*v1t|?$}y|bkKy<{kJz3+11Uig%E z)bMth`yfv`&7qvY51GCKah^BI1y2xz(GrPOo8WKxEK2C4MfUQLx}dRyM6K8Kw27Ti1j4_5Zi#pzDeNEXuZO_)MlWgI8@aPZ~Yk z`k^9gL(3D>Na151ApipvQ}~W(*XWWW*ZUiEMKR^7(khZq+MINY$`>)~oFqiQOw|NuwHbfPWB`|sJ)rtwKw>H) zvG-9t7%MXgIVwUzy#;RK(uIgU?dkJ#hLU5VqSE9-p&ZXXi?Y*!EoKw?AU66C-y;9S z%GD{Aeubom-efNJv(7M56%!7|3JS8MhbI3jk-u3SJk#%od{R*{4TrCIa(cBjVOf8g z02&6FP$aosl+3IW7-S))=r={=HqZ95tgF)IH( zcN{~-)9;qKzes22G!?dg2L5xpXD|@+cBOOb*rb*6iNRDisv{Se7d~qU3%}C}Yc<(Z znG>=#_-x$9iW?uy#caSto zJvO!Q^C7~+J5Ez}o#6YifF#@vhzf0zyx(CNSA(VlRDnq24HMs~P$~9g4_?JvheNnX zmm^ifvRkS&7XlTNeIrI-zityxPm+kw?=3&#z(Yb5F0jr{LXL$7fRxR=u;vbR3WkfP zG3{M6`}Dx`)>f|{Tv#V5r&HZr7kr8xeJ z4w-MXCJSfsKy_{*qYP7aF60sF-G%CA6Z!83T|Oa|YcWGR;8}6k$Y|QYI9f9&5x0Ztn#bPg4|&J9 z+=x#2LqrVha8l4EP9&6KH&}64)3@E?fXs~^eKGQO1?Ep9)2*&APu6yI#irvul@ zK;lAtOwEq&@XXm_7}75ms$`{wM)yFP9K4DrS+nHN+?s|nzB+nvXI!geAVKzUzAC}J z$_+F+6EMskyP048S~SrG@3`D0NWx|el&Tz+MeumgcBFFuna`*ei|g6&g|nx%tsl%Ufgt}pz< z`$94l+g5X!!p}het$~D%=h@orEfhP#``w)Yr>hpDdg*<(!IX68e9H{cwSOJ9HyT@1 zRk$HDf*gec7jVu&a%C+B^W1wrcNH&o(CUQ!Z0v z&rN%}$eDDLn#BlgD*qK0o?gMlSVDKZK`+Sy#F?wHTtot`Z0E4Bj??AF{72Ia)4z1Js?o6_J08k~sBDrk|&0(QZl|p%v zpVXwS_3G?3aZh*nWA}IQQFwZvjMTQ$4w*0kzyM|>cIRb%N8Sb*6$z1`975dBVCnjz zlF{lK{;md?QdE?%P zrG|8(1j+hE5?~YC6bAiS*In;ta~E?Z(i9Q@5eBk&uoL!ZpqmJSN5{=D>&QkF+sbG8 z7p&A@K?Miwz!z+qV8gPs3ugvMF1D|Kw{%g{k6;!up#rW?y?ydUQ-3IY|H&p;wq>RC zGhRPq5ELH9dQRp5Fx}KV`cw$N`E9fH9_>(H{QS)(x)*nU#6q<;X8L^lM2piru)Vty zQC;;}K&LHm`UnmaEh-qq;u*PSrFlTW0glb znp*^?a*tz1YEY*!bLEeH7R5AYj6BWa$U+jICod3@*Wjd#PYE-BThO8yfo#H{X?w;d z83@RLTmjFw=ib^w*<23Kfys){R0rBtANlJV5i*JA(P76Nqyz1q$(%`GHW*Fvwff%i z+lMDf)0xW{igrprb)WJ{DHeke4zfR^)^E8l!d6ej_N|>60j&w2^_~oAB%(OI2p@liH{-)%K>Qa$9%I znH~JvyJZ7Myg9Y$-eGA2#mcY{=Q;d|GYvcVPi}hx$Ez zxHHr~iuIedd;~1%2|P-iiY<#5^lk}|7=~7wk1S0}@v4PVu8(+1sM#cfol`Vsh?ZW7 zjR>=bf>eS(zT4M>2j5l<2WH2n9O2c8N@A7qa-?Kdm!-moZ2X2g>KY@>(#buAyqZ@A z#%vX;nlZ)P$hW0uC)G4k!=_NY1`edm#2SZ)@05&MXOuF8a{rvbUt<`?z@?7S?G_xm za*_Ql=drNzgq|?gqNm9UeKm(y*Wb4P$C@;R9(7`3(->VWGs*JN950c4n||lXTB`PG z;tnNY##E$SVa1uHgkE7Dvzo5jjPi}t8eumfJp(8Qn~lAQZNi&qn?x#WpFTV`CJ2yR ze9yVqr#gk_ra8JVGjHTWyi>=4$Jl~c^z&tY=Z(Ze=tRtIG8WX%e#lk1dhCcky`h*S zuyrGI=OZl|5rH;Fk@?@vGI|B|JUwyyEoP5t1uK6|JF+ke{blx!ip1hb>H4P@6k2)8 zCcQvjn5NSZAP0Xl1Zo+%cIEAI z9wt~S#IW0HIH(nMt(?bcwU#AJznp>&W zD3h60r;EA5=14A52bVGktjO1TYO*?Z$1+DtXMypNJVUfnnM>1j zT5yy5pq;*?jRUI3GvB8l2OT0b@59)C9Ad)a;$R$eoc4u(t%t#;5jhpv#rh`++!1uH zXt|aiTxwppPwGy?O-_d^4i&!|bMZCLi&QoX45Z0oVB(m&>)-I$EIX0q{TGU4f>U?D zVC#=dC`Hh6NDNN5J9&y66!h8LY*Rr zvyM^RVk;R-&i*w$b8~n*VA=Ou%SpVe+ATgn+>%Xl2W$V>%f}4!3(~EBQ6ei-n_5r5 zrtWB2{0Qb$#m3MuUuQHojeTo0Yp$v*W+Hiu+%sXVR0?jmW^UF!+_7f}X)QX$F*l2W ztDx+jy&0r1<~vDkN9D-T|#?HtP$cWd>q00 znj>hlT#a1!&Odhg>Ue{~m1XwPXnG&3$h9*=S53BYoyngGMCEB*fD=e;11baUSTNH} zU(c|LV9iUH>eH6NzHiWX=OL|@pzs+top8~%(mmK1%YTBb&0q?2v?mZpKpmd-mM7S0 z#VQS2tbI6KlH-Nzt~=il3*3Uc?3e@5#Y`wDhZb!tTAdt2TmTVNjVjA*yd9#ar5Gps zkP|A`QxgY@bfWAXCuRaRmOl&(OtwV!e|NZ!Pn%va5wWvGrJkpfW=Jz? zSva4Dk{)0Ewr?q-3*RK)8$0j70y>Esa2Qr{#JjXPLj>8OME7o7SODt#2n4&gl!ycEUax(R;c9D%`d}o<>d1*2hp#io!Z;oy37I1G8{CGFs_g~hflV%7W!UGnG1fHE%5zRtpcODgD<+Q$3y}CQ9e@ z_bzp1`1fAOZ=+*00vCq`OM_nb9X8d3lz<6HvMLH9A0h*((E4-AEzYnPWxlv&a`2>K zNz=jQ?Ms>XHB!MK4A$bL0WM)xVrknrN#sVZ`g;lP925A@c{vXwIp~Fw+j+m9W;JiG*_N=$ocL{w!@zB}0zs-X1Ph zAuGh^wp*-DU4Ej4l*Y!@30tsjY8_k`d1!V%^5MhdccyeU=k~S<2ECf)T@900M) znNgZO?B0>Te^4$&Ca_T(M6p}6#VT^Sa=_^}$z(;WRx)0;$PWBPL5U`onJ619hTS{@ zfr4|gR_Dd)rJi~3DI1xXMhh1Rqw0reu<<9+>kLZkPn&adt2B<4oz7H&srG3}w4TYk z+0qqU>0)lFvo^O;g)ee8ux3=DJo6GYw(+2fqg)0MfV+zdj~&2mA7%)m0(8~w$2x-4 za04j_1IIXKc4j9HER-q~Xijdd>Yx5?vEOO8r=T;gw($isHu;Ya z_E9$?&WB@^Hjfs^U*R#E4MJE4IajQ)*h%^d!rdOe=&aCCT&m|LBQ2 z2mA#;o~9i?+As2^m`qp7W5DRDdh#)IwEq6)DM}|Y$hLa}#@dPhY7R(UoTG02r%45N zr1`1D#iLC&eN!QQWH9oLKxD+OsA7g9SH#G8>YJGfkh@Z}Uc^RkH#c~~*y@kkFrtXD zX#)95W1$G30oOQ!uCj`hHFaRb%7P`S*LE!1fVyYJG5hBMW(q2RfuWM!o*vGA<*ei1DbEz9N^kNk{EHa?+HN}NfM zRjHc#>G-yUg+F*MUpmc37c{kp->FMn6ye)3?nMNepzw`_GrbxKHu(Boun(y<|Nc}@ zK6=$JFj*N*@k$!@HEbzQ+~6wfz`5%`-jC`e(@TdjAJJv50p?vuOPdo`OVp1w#C3=3Ip>Iu zc*uNJ8YyWh+-Mr5Vx@%OWzAyROoXs{V|J<5?yi-|@mc-)wX|&gdhoZBG+2@1>fBLf zYrB!KbhP~QfXbu%>Q6Acipr@V#v?M#g}?k4yhQx4NKNHT@?=Z=|5~Z?^7iE#+F@tl z3-d84aE!C;WcJT>Y}7j9R1KEVjF)Sg7at^dJ|Wqx82YYd#UEY;Uf3+(`3C1;D1^bO z2^n(alL=lwbg%l4Wj_vbs1ni3^2pD5C-hq;L}K7A6i*p1Z_&yRlNyIoHm`}#UDj0m z_g%sK|NaGFqj}A_hce_s6d=>srFzpeoH)#T{};^-GV&7BLokIxF>SZr@V0esb8cIu zmo(PeNrcHTo^2TfRtHXfB9eVa*oN(Vrs`u@J{0Uq)zGDGcB!xmj--0L^eI!D%;SB9dYdy zJDDR=yl7p9vXqacQ^H}DRp4i6yw!P37Dm(N8ByjoaVQ0wGMl$OHvmHe*2@T;DSWx~ z*7KPDmHsDU1S_~!UMYcsy}~qImwKTpmZw!o{47QoP38#pHmz=_uw~$Z*Ap-VTDQW^9JCN%>e*XG17H39-$95nIm zF)@+-6%rBVenrIhs@)y}2j7-polM3pUu=>#7BJR~55`~^Ydx^^mVwy&pxZA6mQ_Z7 z^9XE?C&Og3SDBvFE|CpUwPiTIHrg(#I|-hke}Xmj38a`h@+!~B1V_o;t+L! zubjK}>lm6$Ssy%QPb-;Ns*~l_ODyFkk| z&0!1?H_*scCPgOLAPb#JXM7qvha<{Pc4C79T6QxGOm2*1I-{28Y>J=EnmOWJN~>&Rr_6Hwywf3rVp@Sd4Liq&q%CGCKG(rT$)# zHI5scXTw8Yu30)S#3-{#dsrEI$DZ~SC6Kr|m0b#bMKS}MO?KjC=D$<#9oy(0`?=D# zv85(n4Pgp0+fIWjg(k51LyCwb>sQ{qkWnF%!lpP6kESuiopASI=&tPLoA< zx~pE*{W|A={^x&eV-xE$;{!BZL~22yH1Kt*xO@*o_U2!2|CSAMhKiK;*$5H6-v?X- z=f;6p)qyv@b5)92(M&9tqR!p^3KOo+ykv=3i9Y3A-X+uT|G+5hEa0$99!?77-bQP%BW*9sx0^#?W-c4R^6grNUZUiUr|9d@4wE#crY ze&6Pq>U&NZ@j4ex7Kue4{>Ee`{nhl8=Jay`htrZ|L5|K+wVEF3%Fh&9$@EN)Q$1PY z=llBm7>sq{pRdmyg~PxpT;or88-y9gtm*H&a0Hcg{8fFwNm5E>-@i1Q4R zBQA5TtQNjy6TYH3(wmirT!%D>?4J=Rc+qdv=kBa(=S9vNNAc#LZjS)VHaiIGWExy$ zT6z(K%Du2wrB;74i0bl7UQa>Jgbg+l(kYQIAW6t-0wm;feg}L=Pj@Cy_K4d=mRW!; zrg}saOnH&dulYjH->gbispe&Mqjg#3Hr*L+eGTL84;pe!5 zHm4Q^9F7ard*GOc>VaxwfAq%Qojk14kNALrRv4E$0a-MBn^6O58^S<`VUwzd$Al3d z<5D1o$Lrtm6gbBgyGc~yF}XsiADIea=fvfn0DEi!eRUmsyn-+7v_E$bhBt>T0X9wj zmZgPcPQL2-RL>Neg`1n@g}ZXMT9bwB2CnTs!X_8OBr7z;i^D|E8n~<}UJ2l>-{}2m zU1)A_n+cA`Jg;RUQ!cWJfF+kOfA@J7P))}R5B-icc!*{X0LYUoIqh#v9H;)otFu-(cfBxbKm~N9UFbvGQCqG z1btnFHWXi0cOL7ch%0T%T?5_J{kb}1%plOeD~P&cGMXepD0BK1hA;_L14cDJY@&kL z2FkKZnV1%R0BL1brlRgn!5NUgdwcrbpRq+hlwzG%jz0?6c+!bwU4PP7cPxc}2?A~< z^}1}*)(aqyix9gs;)e!*O?SMAf-0L-@DkL!T*U9IQdU*CxXS@v7x(~2KDIOckekl$lkWhov1L>{L1EtZ zSt8NnANON6KVFsJ@9}9Klk4lx88ITGk1){_KJLtE=+n~&bc*Z6TwW6?c|;0ks$w7k zf+Cs*4$BSo7Rm(BXV#iB{BcVxv-D1CA_WqXsOpUP0L|67z(UIA;%k})1VLh-;Op)u zzqmTG_$dW@U#Wzc}bd<4R zIeyw!791Z^(@HRB?FguXCyAuej^|P~hmKW8Zb6V=6t5g?jWrXWMS?8VB*>Dk1?W!U zqR`F{PZ3oCR2)Ew!ospBbjm*VwJaI-dR>nojBwYBS0`65e7_%&&&-K-!qqm}ZLNEF z`YJ5#H9AV+m5U36l+{LFuLpJ_x6D`fNYuaEXt-#@0We{ooiOAQR6o)G z9bg~UC2HceuQbr_wf+rPZQ|2 zq?-Pdf3c>?;w*r~E);dR=u`QvzapFz7{17w>UO4~Z3gr{eCe}x4o63r@^A4)EdxfX z8f5vD$xpB#7Bd3cVFkAC1h${Qat(qIny(sgh<{5K*uDVg`^R%DI2%)&>m?55cLRk6v$WHk39Xv zseE)6#qo>EXUq{9)@K$9mKA-#(x?8ZJj1ZYH}`vQ6~7t$ZZKzn1Yw6Urf+Vz8w?HZ zDwrLvnjMg#Tysk7S4Y=KU)Vk4nU@#4r9P6O5LGzkuiNdyfRqeRm+hQC{3!O)xKhmIYp=ZUPc(! z`8YzsCZ9A}EmT}CEj(|5ow^e!Ns05Swkglq%gL~p^Q7pszCL2Tf@ZwT%uQ39248zo zyUObCri?+meoyE(RP&s4nXI;JSS#)0Q+KWX;Wu1i4PldQGNwG2Yi1EHZe}18bHsHc zwRYG?4blwP*h9z|GGV~xS8a{jEekesnW<`;?{uD7A7GVnfjU{24z_-Y1vdGb$wE0- z^Gk|lq?&pZ$`PsAM{#x2=2nqTIMb*(qT;^JWz1%bu8f6BTThM(9|Q^RnKr zd{$&mPBf)W<0s6*S58I>6)m20=2RD&U4DJ89vAQ>p60Dx_BjZ(#PfQB&-Uh)Mz7+q z;V?3sPvf_2VQXk+b!OC*i_mIxoU%rIJaN(Xk(jBGd56FpK zutmdA-*uX=QCBmb?X%cfXPtG{S!bPf)>&trb=FyDopsh(XPtG{S!bPf)>&trb=FyD iopsh(XPtGnto;|ZMkyD}2hu_S0000L&qfb`oK>H7f=VE_U?_4pjz@S~@QQ>kQ^K<;t=g4hF98eH>mK*z8uPH1sM?p#U&I zQc_dt_`v_q&2oIxe*C{R$GWcR?v01rt`?cH^K;EFC-+?kIbBPJJ;M(V|NH|#eWfrP zUb^!9|Hs4xR{ZnN7TJlnFrpeffA~gm>A(M{;w>=7@X`bFh9B|84DFlC`nP8_djv>8 zN5qTZ-VluMHX$qfcyI;I?I1>EG?pHTk&-IcxfG4J1NTS#oEGw()R#6nge>v1W4e!#|7esz zG`;FL91PaIKpQ4JVnTx0M+=%;pT^?%dH8)^St1XjdGur8P1{@#2}Lg=mF)hkvp^59 zG3dC2?@P7FKx0wuRV0M#ZP^BHS9mbg8oJqw$D9^Iq9r6Mf2@im{1C$j0=U9)sie#kosK@HvtHYV?>&4hxF!jgN zb{Wl)nD5>}O-P)URfj^%o_JHAj~+RLZ`m(5kxZ!^5}xv>Io(*Yg#N>Kc8op5z%cY( zNV3-D-)iUxyA%GU!6H*+TRxx#*L-gmr6DCe2zY=b&B=s;L?SC{3jkq6_dGPGVlO2I zw+Azp-hbu1$u4P@Pkqt+6Dwcf04L%__4f4&r#_b5mq}rf+pxhq2H8e`$cf7wMJe7H zLja8LMN&ksHX|-hT}JhQRxk==9(YZ!qtYq>d>blIpO_Id`?}1V)3>7&R(tp-@I#YI zr6o?+mXJNxnbVqXnk(5%Wh&Bkz3;mjaj=i@EG0Z3KomV=>4rUtLl;0rVL(<}QL z4~k|ty$vH-Pnv|co9et)lS_3rtIj&>yj6y;qPvd6Rn1o%r|_fNdgqSyyTUf$v^g@j z)Hx9fxjAl7g$98L-nv%{%@qg}^rS$+*a#i1mVL{n-EJxS;n$Rz_ z&`))mBDzq0nmErPnaNiR!}9$786S%^Zrgr^28l9fzY35bNK#vleao?l9aJx%W0@ha zC92^EcwP4UPWn+VEis!dGeZbJb+re z7c%cDrtwd40f9vyno8e{ig<4#;g*QLYnOJ2U#LM~B@Px(pwim4qWr3(18gb?O@mVs zhx{=s7!im61uqj{h2gxd>VMm8Bvws!usF4`@%sCB&4p$h>q4ptg#kuEtJ}TO!}R0K zSd(V{NitVuBh*CXg5@5Y1iG>tQ=Ql_#texEM6W#sprwTR1P{E>Ba+K2mZF*e0gR+*cW7IMBY6EiWP?tQnhvV$NcxUslu^cg3Nd%nIGiC-rU!QG%Q?#}-Zx$Jq; zFC_VUVa<2%NRo0hvgb&o-#zd?MnWUI-fzH5f{%-rgn*Pe@XuSP>BB*ts{ekHxcI5` zU0$0Nf^KYJ8wuJ)ry&FvH!TMwulQr6Z*(kX>uPhfxi|kA$f76V91#~orO>r})U+9( z=ds|nHlk96y^@--EX&dQ9eDrpHmNqNDsWOmfRpgM*gPE*jpGTR_0e{5r_b|mGV{aH zzc0K5tRHKIe}Dk-2u}~Q28h=>D#}4+1#(w;Ik7o8IltTzKM2iAE9_f_+|M=g?fxTn z2b87Gd*=EIC$wN1uj;NY{RF&ten?|ftu;aG*6k#p|4vasp$i#*-#;}9r_|O02Wg2q zf4pH89*{fYvX0W@0`D<%qm9?trFjDjsoz%74YTvhzdsSCg%&zx&N9b>1TrdCd6|j3 zgbQocQUb%*{~AYt57rivzB23?NOB!KWM}{4SK>1>X?hV|LkSN#GX~9dso3rP^RlR( zhWe!cgNUGE0NSWs%bz%0{>CXbh4iWfjF|2ajDsL2bi%!nkzx$R)8kL7?(Q_UZwLnJ zC(dEKZ#KD4tWx4}d%CJ^hJ|j~<)6M7bwNi3+s9%_Duz|qJNI5Qg%CdaG<(EU3l{&Y z-K#=amWl(MuH!WmcibCST1NeAU2Lv|d$}@Btw7hOu~3wkM~lt)loZN?jb2AYZ9S43 zikKtimgd}?frAG}5?m52kETDk5=`*fj=xF&MLM6YJ9*WmNv%`Rd8|NUW+ zX8cyxC4|1NmYOL`=$vA2B_7H^UHZs4=Y1TO%YBL5S)k_0kK`Ey-2fQ(b{?FE2X^!) z|MSPVQH&A`KAk^C~u>j?IjgvS-TV%cief+TZVML_Sg+BL2t4mz@Uf4XQ10 zlS9CQ8t~*t<);g7s;!mpNr0y{vCn>OQJvnACgf z_<79$Wu-<@MdXSsyacT$GRt(|Pk6zNEfDqKaR%z(P)GCWzTc3Cd<>D1rIA`Ui3d;5 z3##3=$#1c|o`#x%(p=E9PnAgl;e3Jj?q9K+GRjZr;EsXN&NMIw$qA%>oXx*7TuCV^4E6E|m9@{F(#8SywFE;wwE|Tx3=-`0T8N&0 z>{tI93t`dZ);hNy1G*ew=sh8WWgT3YqvzJgu>=5W9F~fz`PQ89?gDd*EHDtt+lM6{ z{nk({>J7Lc;PG1HdBjeo^(~?@#9b$@w56Cs%Tlbu{l~!O zy*-_i$PHA|)*$rdaZ0A?-8EffhXeR-G5`zVQHu&wXpfouqos>2;UJzRCygY8HVt@$ zo6OaZ!@g58e%>PStDV=jwk(MZ;Pq|TyqY#+dGpJOAPWMwfie_$RAn~6C({!{ly5364 zKlGfE?gY^s__YPRVL`R~d0IRVWU}efUznDR3OqoRg58*#;Ry2>yUh?rO*ulbE0AS03XlxDn8pdIS z_=?oWh)y6@AnW1P6eIn`k`=m5!(i&;R zZ^rd9-SRNcla>VfYK$2Q%|m2w$Soz^yI&-3V0j4st$jn82t#lt>vP4YXRaQ=4@^fS zl-o_A6a1s0v0}8lXaJ;#3;4(Gd)uYR!Lhu`X_Rqs-AvK40Fp_&sW6xa7ypBGE$3rrjY^h<1QpY{Di zN?-L+3EQJ#MlhY8WAb8xP0ZLmOY5KS^MLZGlcU9Ul}qM}$lTSCr!?v&qziLa&5F!%dB+aGsBM=a0&M?v=;Q3B~itFnp{;<_%Vfjf#r?{!S8c#qW8|WrT0sg? zM>E{B-ZhBE1$X3CPC+*YL-1FRib7-berSV0fEV9LP(q%Q@;92D*e_XV3zc2}pccTR_9YG-woV zT8IipbPmPzt6WY>KFjn2Tuhlc#7!!k$jCy3Qvpb9Ps5$I7Q7balSNXPQX<)G-EWAc znL zn`D*66=;mf5d1obSvI2fExwAM2%a5D*(XWP$Iw`^Pdo3kxO6@MR|pn^P-6i{y@Zjg&~Zehsv<rjX{sz=K{+EsBH@V^E@AW4R94Jc}WfN=hEr+$al->AKFeY35 z6dMCe;+Po= zv*<_g{>Q-Ao$T=4&MZ$!&f124K}LQRdGTl(hF|6x>=u&Bu>dq08W+nUPG%AJx6)h- z`Nx+^F+EA=)%wk+3)*DmKhU-TQX*DgK!V#KQdxOxoRP-Ff6v86(-%K%XJ zap20(yQo(1mflTRB@#M(6$_6s4Rd0oTd#qSZ)mW)yPp~Fle2zg?J*aNpx+MMB3~o8 zT`^DgQy1B-==hHAEh!(4!K5YfH)k@v$M+97m zB?S=_vyj)(rFVvM<0pLCq=-Z^{r8vd09D89$T$1Uq65ahyk;IcYI|fGwB@if$uz|ru z{VB>HunFf{hltQnz${06k-Lp{A8-|=PJ_qC6toa;1x7P6;RZzNf@P>ikf}JSw%B>4 znr_DNIV@wWx%EJ>IEx{I{+j{g9RYZN=|`B-lnfjDe>^#2&K7godLPSjZv#38P$75B ztmB_yQ)H27lV=DGQFET>q(P?AVcBiT7i!BWj0{|b2Uj0Ok2-|5Q}&8dR6F$O>f z2$CKZ^~jwLd?bEFsQt7Q;o=t|d-LO;>tW+yY+kPjZZP8Kn>fhK#wv2wg~p%f_mV#? zqvd2SMXysVPJlEmX?@=uBBGtZ0h}b%7!8F0b{Q@yw`ee|PjHd2s%bf@(xht&A07=5 z>)?y}u_c~TmSR8K$y9v9`cu@+?aB_ylb4N?!pc68EK`|NB1~FVb;4s}d64t(ZZh_| zQTk{6GP+wBVl}KUHb(!5p;h;h`;Qk-!NWf!|Ee4VJ~lj1@@zjIz6Se$C=_1FiUv)? zBZTL~cp$+eE%*|_)nejCTUlmpOBZE_KoboQUNs@9-oy(WQ0G5yDn)xbGuPWyblZ=P zoejmN9V#htvQ${Hi8)xY`4yVOTKfsvs*Sx`C~TZfK*-4gwe&(fCd7^*kkp;yIME!1-8wr+G?Oj~ z$@5E6QI=*>Qc|?0!QoG(NujtUhFe@Yk6{l6m=Na9juEn>wC z$jd-RLp>-tr~>r|E)Up5!vREOHL$MIn-LYcm_qh}k+wg9y|+L=2~!JiE4&&Sx#C;e zJZP&M2wMW6RP}#ZmP~`)veP2REm2d@YiUt!i!j^U5mB=o*dQj7!e#)Jr4JhSX zhLJ>RVfis5ELp)%yJf0}YiZ}RTZj4m)@QJj%(IP)3~AW&OiyaVr;vmT8c7e008Zn>5Y`_8I)j;^ zQ`0Bc)d|IPujm`M`7$D<;QiZ|vln!<>_QpCq7R5+yG6zY8WZwJAFFvJIps{6;OS7X zG{^-s(#)$b(kt>n`psNn@h4jLOVTy*3HQ;1RH%Cs zd8uW8#rO2zU-!=q(R=Y*k+oULBo#~wjjK^*%t*~NiIqN!sQCXR>-9QZqu{>tJMO!S zcpgMT!_aCD0;exacx0KB#Tw8S&96M+mA8raoq#+(+Ggf2TL|>2SpZv=kq3TFU(o#g z;r~25`(e=5)CC=WF+-5UXFQZSjnZH3u0-@Vc>I=mWPO$h-iDHulj1c12`9DZ@yO>H#lUOd`e)QOtF5kIf~Rs z%DC}X(xr`R0!$H+F6qhFg%(H`;q$fegq3snk7rTQJi z_HRRUc@A7((|so|GFk|}hM1&dPUz#y%XvtMuUq>L+?Jk*3lJ2No2GN_nVQn*UXqs| zUGWUrv3*L!m^>Lo>y+HINT-AWLWRe7AJ92X|GA!jjd6**-=HIA$Npj5qthlbdEzE2 zr92|`mmmvh$&If8$hyP;OO*{^0GaiPq1t-!+i^>f4%xa?PF12w82vY$H-Ul&-IvAF z?yYgzi6;BlGK`AdQkMLHB%|dW0ee%qtxfq#fOQv5njTQt!qB*4q<{n_Ifk5;fXQaQ zvbP?e?-z3ybW03IKE#XZ>}G-C31Fj^w$c9mfRLt717=8jBG=;0_=KW$RbUx)6dxYF zcw-C1HndwSODC=pJLEje3nkRW#fEK;qv$ zNEiynZHt11Nr&#>NZMSV>!@jZc#WulsCtO|lKdS4MPI_rUP>4a{Ji-904Xn!ImxW$ zNNAnK%qctFKBAt_caol|s`-?VJ=)@e#fFc2?}Mz@O}S(nw`Ek50d>C*;B^1Dq$Z6zn=!RSG7Wugu#>R5V;kgP6QjN< zAo+P}#5a2KQaa_f+@&NaN7 zv!*3P$SCHJ0&d8}4?xek{Y*!`v!1&(ms9v(1=PDMIX0YlA`hvsO{EKSwjvoz96^=_ z)sB_38h(MjvkMEaqqP3vo`D)XeTmjqEG$hYtC!4Y^_nRf;M)CQW*)k4;Cnhl$sU-H z&~)+#^Rv24yDZnEs=AgJLfYx(2*o!zd6;r&f$6A@{coCB`ltmDPQub}@`Ff-c{{D{ zSc9#R)SS@&Hw$phZpAl&F32gX{*cg;BzZ+l1ZDWjB4XYv$k9P?8zry54=?l|?=<0j z`$Q@<@G6{^fHEIPC{o9xzCj%Q0WmwKBqAT#ZNO_e_i~FQmn0G@v4YA*e{-Y{IR7(`3dWd4UDul z5L#^+xlGS+fVWnn9D4Vz)9gbSs7FD!*|Vuedi2JjjQH8!@jOd6sFW0e9$xj*dCZ)W z8(U07|<|T?oM^qSUsuS9npkjLsr7#<237W@|0R464)o*9)Tn-4=W1zoMqWB_Q zHQb{&xX_N?&Of2Yr=9ormmz_kvdbMVD{n(y0qkK_w1^EeXZqjLehOpZkF3|%*Sbwi zxB12%HvYmo_;Z)yKTAragNcECb6XWI%Nv*7sNZcD7(W;5O#nyj-ozcE) z40gP|KePT#9j3iqcHg`iL>bL&c7U#rA*K>P`1#kbe!f!Yd^6Wr3R82k$!Rx~Pe?KY zDIARagIH-PCSF0#qG8+c;r}I34aGBmOhm~Gv!W4(mw|Ir+}}=y3sby|v7>Ngmo?j@ zdSX)#?;B5*lRL%1#Ln%T8n^*ba~*ieG=1%`ln4BeN$7{19b*eGcpT0P>gkw^8NlTv z931@mfe-$=D|pP|>!pS$j=c77Sxbvw?tWU&p^hr|gyXXbuicF zo~x+2X?*@wJ3?vE{|d0IrLiv`8wWD#%jL9PK_{%8ADwkp6Z}SJsy&c$uo}7m-)ga; zx@`=%Msn}OZNC_%@i}(rTHHhO#+zu7#i?n{2+}w#HH#Rfpuv(@HQmeq3Kferc<6)Ru@mAQLi{`>$#~AC( zWC#}`9<%Vt5I3#gjj^~9&E`(kS^Ca!bWSKRTrx}0*UIX2Cb_q67^EZ_uYz0>nlBuQ zp^{x(AjCq{3=Sx@VW?lb5pzBWH#d&=E<+^$ZcH*9EyYv?-(+-DJVNntrk&%Ko-L8j z1{}faS7qX^BDK27M!*??;s!UFP$xj${yL*K0{ly&1VPW_F#jKs$zZu3lpiaaZ;=~x z;6vM?ui9zprtRn|tvMMNmyo886#F{7&2uNwsnG%vmmfgLtUTcr)|RG#O39@ zmD)X0$@f`RAa|C5TZboM5y25cq}t#$H`eFn;$=7YE;UxS!U772#D-0#XgaW#PDh4< zxe7kgnh(7KrxUNvzKT;cujJ>OyBOm%#|W0U+%C?dc+$$Lo0_Q^6`P$!1^@WIE-7SI zl}q5ZJQs?|CKxTlT=*$O2Z|v@1EH;*&}qg>imaS!{o~p(vdQ-^cg1yLvzj8Q zoOD&>W^^~e5%aDUWF_m(K`396H~vw0>jmapnSV(-|b|MyAA;hFxN&FL2C4gKgrkyOEIdvxd_A?{<3o zEdHa<4NFY!3BniT3Zm@h*JD1@yWR9~tFIqvAyVA_n*R+KG)hS*iiglpgSS15cS>Ki zd_y6DbiukIZI51d*xENjo@4j|41xJWn=QAxdqXl88yufS7$k^=>P@-7K{4z&GksjT zs!iKeLwYeYihi4w7}K_Uo>w`EV;P7ip)$a;-9uf}1XzfMyueY>+rwRaipXCw9O9OwE?XQH3ekX#rvOMQCaxku zumN6>S^rtNl`J6K|@(b+Xhx2ff>i4LX&lsSkh)(tW+C%Mm_n|3= zBh2&gSd~J;jlX_;tWlQ4ia+`;;pEp-WQdxqo%2-iWG*47qp;l`?8YIjsH$4WVGEmm z1$GvGUd{a~G8{fLE2O=^661(tf(1l@#fcioh`6;VR{I8O_9sX4cqz!|oU6#k2Twc- z4hK$*Oq3_YH`OWgebGd{r#!?LqiswD}s&^n%#Mm`C zgjrp85+r|Dun%U&rsK^ca;qrd^!!$Bf$NzNW*KxY{-d-0U}wBB$kU}bg5Clj)FIa} zsuN!H(o62O&I!!G_W`k&p_B)YTf z6$8Ha`?oB}NW}HtzbK~+?+RPwNys9)7 zFIjm=Vk`6qyerv>?uA$`&g^FCMb~dQB<<58h5#!5$t#DMlH6-mQRco%ol6oDG zPc*(hS{@FGZ@~hiw>(?#&oNQ%pZ7J&Lri3Xtp4`iw9EP7#EcM>sJbZyn(>N)BB$aPMfOUVWbx*DBa z@H`H1oJ~^J7JxU}J7n;W{Kp5^+5~%k5qpJFa0@U4vYogR$XXRg*f?;dj=~LWm1Ws# zG@L*8HCL;6FlVV23G`QoD_;p$_;{%9+9Mo?7s=n`5;=eVgU(a^?sDEj`MHYhn`3Is z<-tux`>A#X>d_D!8H;LRtvXYAT7y2QwE+F{s^a=W?KOG$?Kj*Y#Vf094uT{`W>60x zdt%ulH6s@Lh6yP3<|pa9UYk`{LJDd}s#CgHg*kex>AN@ZRq?q;{ObPAP|uIR)w0~& z=uqGS7o$!w)xf(gVYyYCD&OnfZLEbpyddDe9m@Dq3S9Lp!L%mNr;j?O0uq9!miPQs zWA-Zd{yl;DV*e#GDG3hDavNzd$c|t$I~NefL!;^P_f{>uXThcOw&`(!=kmb^6W)w` z(0s*r_Zk5J$chc6R3vC?Ck#2u@eyl1kL-xp^OcvrdxEblQzxG)H_Gqx4bt9#;(H@7 zRIc~&OJ;a^jLiSm53=Fc>Z`1eXov{&Xt>oTSs8rWUsitO011` zb?CZ6PG`AX`(&k+Wbr{e zPbK^?izYD?Kz8f(dTN)l$+BvD!jq5TsRe;738V8+fjr(~FuUF8}Z zLv&f^%<;>%muFYApM$&RynrXw_`T@)-^o%^*HFA89hN&UbmJznTeWV)(;ZQWjgdIzMqh;G2~ZHbdcz=!uw?9^LzmjM`QV1FA* zZvpEF9=trp{lLFsGnOMlZ4{x%Srb5^=C&_O9tdN(k5%!)|HRc^9i9%KbKE7J!*a4x zzZ_#9xAAu!ZO(TG|LIzf?4h1-nsN(G`K9KSR-X}FwZeq|Nm z9P-3<;7Bc%{UjUoW5o}T5M-p8mzld@k4f2x2HKx{ZoK+=Utv=vL}gm za(_w;qB1RWkSv=!ycK;vpAWSXfhN8Ibl=p_`$+Mcc+wvGgVL5RSzP!>i0)44gw6{Q@PMe7ED%wpU`=_scIA z<6=dWcEmCsF1SnhNpqIsfRfV@5Rr_;t(>o#=7YrT{nh0_nJ%e5|1?7PaoyQ6G}^Zv z<`p|yKs%>Vka@fsX(Hg1%+|HZTTfPee4Co(uE#4|C) zXN3yMb(Zpx%XJ;w^0nr;mz%($ij=UlfCtcN^0U4cE%M;0<}cJ1uC7+m((Kh=dUA%x9lCX+ zE0B#$u{)yQ7af^0pmH!llH3U49L>f6S!8lBl$j?d0P$T3H04o?Zq3fu<`Lw;1&^F8 z4oXcC9l4ESdYy8>!v6N!HM|{WvPx&#XkNT3tN6iO@tO^UKVqFe>wE5dn(;ph3K-}= z*M*R6LblNuZ&!$a_F8yKjR#8g7b_uEsSlOQRgV{`W+o(Z*(96ECF5Pr4TP?%1eF~a z=8Q3Stlo7vW>#nnolY0?+H>4|sGrBJ$^+Ldf9Z0+=0oepV#XDiu_Z*HQf!|0{5g2a zgJe!*t<25auRF=#{5|bFy~nRjtY%BJ2NX}dMV$U!|3h7&bc{-blZ%OYyY2*C)a{mLaD?^;i>yVZqg8BGD^mS-b-y;LCB+PrR|C z+SVwpe6?JHm6WdA3WZ{-f0?@-KpucUx*f^jbd&W~R#wKIS(jYEPFGOCYU{n@Y6mAO)ex)4^Xr*R zQBHsynJ>rkcRhQo);fdWJ0f+;qhdCODx2iPZKI%Av1T&FoSlW+QGGToemvFs7yvTe zD@R}mG&_IWQyEAymQu|y*7X;jOo_TtBvpAtYT)Zl@$j z#MpYYukEG8MuLWLb#HAPzSl4T$@`+qsQHV!m8CO!N&V(kWm>%*VKqWeE%i@!GjT~D zk%54&?HRtH!ApZ?j+`ym2H9Ynp?M2Cd`YOg=@u^3tG+s+HHuQj6O-i(Q+}}H!liuY z0`xOd>XB+5MgON#h@udCBD0~jknE+&^Y&I20uh$T)q$<@Y;_wzxAwkLOlS=F%ht@O>rkXVobmG*rN5S5< z|Mg#0wf=Z-)m|T(1n;605+q)k4sw6?M1V)3(3@NmNQ-oMS_m$Fb}TMhs-(MBP!N_F zwn3V;#m*K;@|Qu;fZkQAvws@2Fh(k%;K)GYNhN~)r$&;`5T#$KlEbnJrDJlp!T3*t zKvIP_qGP#*@Ou6hWQa^yfY@A`_2>${l97@g`THtk@FZke^Npx&Sw!R}%v)OG4$J$NLXboq)#~ki- z%}&x%)H;IIA>3QX;S8!T+q4rlM9nY>#wWrr*(LXaS63Sn2PMU#$Rs_)grzB!ILw_A1OCp#&=%r$n5WIfkeh5w?P`t ztsP1b8mfHQIL<}j1REp8uWbM)H(*9ld))ZGG}n*U5TBha5?$(CdX&*r8`~i43IEo# zQ3*8d;j_!oUpVd)!RYT9>G^@2sib79nLB<^`_-t5h{=5?obWdrS>9!&4S>VkGvg+Lk)0#xuXcHskZ(z61LL^hUwewAS<#_9Eo7AFljMRJ3c&m;FLI<_P7z4FaUq*}+b;l=f>v~#wJ>SZaR)@=uCF)S2G zw~PT~4|I*uYC)sucHver19XsfrtN3))P*nCfGk?nI2m)vG6U0Bs?f{D@3QG zc=|>w&nx0uv-0_yT!yOB1G*teA-p-*>wu~GX5RqW|i-G#Xq;1c^GZ1 zt0D*hh?&qTlh=0M2w!S@h?O^)asqH{h&(5Ys8 zd&`|gXpBYIc4u_1`q;97vPC<1j2Ugt@aBK2L{7)ea9(H(fIJrb~V&t0U3?o1!Mmt0ZC^j4Chf(uzfp4_MQx{x{JXSgK=djuwY|A}=Y zI?XLC6w`a5j(}dP4yjP&xP+FkoMf%Ho6WO>A8lFJsmGNc-#DT^A^%(&hYAZ8|A8a& zR@uoSi7N1?N7i=_yz~2p)YLy814B|wUPl;K6VKATjFym*N@yQ~OI?z-=?tCuIU^yw zJ|7>#eUBfb1MgD6C4ZJ8wO}3ZR9+!CY_UsaX%A_#(UMjaA8R06GfYVG zwzcfpTP-#{wb`Roldm-$OQ0kj)a-Bk8@%edSU~3VAErc+*$?>Ds@ZxsGn-|qSwN{F zw?g(qeK~g)7VjS1B!win`z!K@l+~huT#@yC#0tqN%q}IGqDOR6 zxvP&XKSF$M(Y1cv((Xm6)+1i1i&j3s{2kwnFY^jt9ZhcQU2Ze)d_Vg?O1B&mgvVai z06Lj~o15n)E0fjx?F4uKJTd#d5$N2QOy~Aj!oxG%ant_{C`yUR_*@uu#Z>q#9VI%$ zE&RYp^9VTgKjsjl<~V%VzhItGCR^wIyN}F+PretNHOZCOl;S49UVgAeBtH4%x6f=I zDD;^c=Jjsy`x#Q4IWelEUB_v?L!NWBA2MHhZo~I!YgxMVJ`1l?H^&1yX&QijMDf++KA7todi|~g6SA)Yn*X$ z#(O398<0Oy52prB8@TpPgDG@J%sG!DF% z`U>)-XWLEVTM=+*$YOamzQAqq`3#x(B9`?ZySy?i_l`kjn~thtkMNv>!$Wtb`niu8 zUbT(wTo3ZVvDqf@A%FalKQ@W++!FVq>ryHdH_cAcVW?J-mQ-qem z?zY{R&{{o7C9WK|4H0fcQ$;j+Izqr2&i5Hj_Qf6UCOumAU*ErXO6n`_x5sNMK~EC+ zg1Xfc3CF$f>_y$PCOHCg)2q6OoO(Dq&)A>&W~=>gIf5=;@}Js$jv5euCR$!G^GUS6 zZsw$rkN^`JSm|>>GSYvFM?tTViazTK8+IUn#QsQ*=oF5J8_jF6m>x#sWn@SWawW0D zUeL~qsLbDxt^ociu$%oHu)EUYcMW6yN@rM z;bYA-LD?;YP7zcm%`V-gFnyLCEt>{s{u)shLnA2QW**A za-6&{ACHkg>$*;nvudHF%*Y?27Chk2e1OZ_aP5a@a(R2r1*%>MO& z@nY23lT-VjztN8jx!uf190kevI^x_Tnh`NTR&~70t3taH;M(70l^j`$J zf0Kuuz&~Q7v38%_p5-P#?x*_)B3PWNxBn8cR;pYOvP2hb^Uj*$`XVbZ1PElh0 zcn4Nr`)`bCtQ7EuGaB(4i9PNHvt~*7EiilR-xPR%&(gP!=62p*Z5e%=ugiukVs(7N zIXr0YEw2QB3M*lda>tNTn-cfjUy6b6k4WGC(q-5o*Yo}1gjIifH$^7E2o8=!;eY=E zM25i(y*+!-9+`(V2|&=4r5Y^<@|2zb3ql#a<{FtRl>0MEDs6CIOvCS}E~AQ4gFTnd zD24u|Ak|(dsTPa^4m3NsLZnS&P<-jBir*|G7BHTdQ`f8%sMf5E#lo5WX83!jsJ1n_ zMKy*{Sjo8aUyei}DMZPir9Uo7Y%`I?+!R+($T*F1RBXn~%h~G!kZHY_X$_F9pK!&r zFePi?chy|kY!Sua@NkSLPCXn#27I0MpS3?5au=^w%A1$fg;Lu+@`Izx0_+}|z^YMd zXskR~ZW^Di^Z1#%5hSaF8Fd<+{VOP0Z>AA(7*8;bDOx-xlG|#q1 z#Hz+X*!k2|HR^qjCSRmSk3e*ej2PyGo-AvMCE+wf6p9I+}lgFy{!kdF6LIRQF%;ezJ8l(<|L8;w?yx6f(i=6oRuNkhyTQiN~ zvs@7Vi{H>-Bz}#68Gn0ruBSV3wrgenhv^QQLz|f+oitrQ`Fp`v>}QD?vBuOjbOZ#f za*AD+iBV+qIEiHi#e|fnC2t=wVaDy;)|ly|oJNxJx+j!30YEvTc=`47JWWi<1_deb z*D$EJB_EDmJmD9z_Fq8_Z}dS{aOExODOHfYC;w#{+%)Z#j1_5#jwPn0grlxeC_0M3 zPwg9Z@J;_!&a=d2X?ibv@(VH8%Z#MIHw70HSTYKFqF^>7b@b4{GyGb_BC4T~Mr1Jp z$@|Nt4`eFJt~eV=NeGKD3>-wQJ@;i6GVA)rAE-aDOn<_9_3DUF>e?koCX&zxisjr* z2C$CXYFlOut|#t#V=zzK$g8G0y^yv|cR7Dw)k631j zf(wi(=(9wCW+pQZlqYOa^${9(zWsq#x-nYDS2_tioKXF)Zi!Gd%hgAe1=!B^ON)K9 zDojQMoREK;u;XB2NO+t}n^lb~=OnLC`iRec8%gvrecOq1mI8QxVpFkVnvkmuoLI9Z zAm&yXg&oRSRrKgfidMFGFOf1uaR!AI&R?zVQQ!;VDsO&h=@@Du=zA`IW0HK z|Dxu2g!Y*e2XT*jj&Le9t1k+wqSilP7M z(ABPEvWNId^RY_at=R~6(9_>e=v1rRQ%~V5XbzCGs9%oBP(tFURs3Qi5();?j7Uo+ zOyI=LDa*xvXcrFGgI=3KnsS>W@ESg~_gTuoGa+}Q;xn-Zb`^zj z4hwu@W401g@Gu1{^syB5r8cn31vl-so;DnER`jtfyQI8L4G)C?YCF?M+fnebjQL%g z(-RoC=H8tbIIA-6<@sHc@;B7U+NGB|oTJB$f6G9cmh==7uUXWA>0&tXc}PcYO9YayHlk zEVnVl5K50|Lp4B_xC;gg_#Z99T^P zasskrJI;*fUr+ye@7-HfEbh5gr|!GmGjFD+XC}N_+3xo1_uj2KbX(LrSiZ()71U<_#hz*_52cr2jJ{ zcCJeT@hGFWQeV(0$$X>w|M?=Q5+<=HT%!pS##c=b`t3()vl6^>+c|(4c=)lG7>b_X z>E`c#@LT`Em`%oVD?ULb5T;{?_eArrG*mMMJ1)}jSza=>2htooB344U%K{GVSNzVu z{LPD_l-^a$aa5^;*3COS%9BZ{H}Es|#DTDjYiC9IBhNIq<>Q>QJgr8(%bY(ugEp!8 zYb8ErAZVZKRE&9-Ib$lWahVzC_{|&DDW@c6Z&f;*qmBTf*DYHfm$1N;@m2rZTXBYE zhY1apj73E8@~BkB8xiXT8LWh z`>aIfDp%*($Ge;2uM*1PWeYon;b&Of6z!#~^dFS{WBUnz%DarIu!LmEGiQPOno}%< zejawGrSl4$Ks!jFDqXF*57JJ&w9X$L0isp=^CFShB~(^)b$u#+I%F*J1kDBaC*{|3 z5Sc69GA#`0W*sLCy;51YNr{`qGNvYClSG>?XM^Y;wG#Ow7O89JY0_npC7n7e2&;~g zk|#CUO{v2fc(GAeBENWERR3P z+}s%&8Xg5kyvG$X6l~QO+|n(!_$l?v{^gMn&bzxhBq9aMGzvwe>Q0qc*NYci?<$qN zC$9!MHRBH~JJPaoj2Sag1g_4^qEr4D@dTc^NW4xYYcXlCQ;&BVx!P>{>a!AfOsS=% zl5R@HL`p$(pq=$$N{L6>4vvSIFUDRwRi@^cf9G$%e3KDVwlEkrc|io94e%B}l4UzY`Mb--py%l<+a(%-Lg;no3Nh8yTPK*TdZ~#D*G`(m-+Pk{i_q4GN$R zN{W$`%Xh}IUTxZ(H(O=PY-JOS(+%!L3br$AXsKD<3AF`H4ta=1rN}Ntr6|(`IaW9t zE(_z>(a;dM&Yt{REJWlqTlsF+9rObFVaN>R1?`vZ7M1viw8BW0oPc&8pXTF?xF#iI zBh<344zANbp*-<)0%itenw)xX?bki(z1QqjYEuA?O1N#AxfqM>)8;pw9o~Y8;_LYY z6nWWZ-PZ8R+BV2$$~A?PkTY5|q3rUPyhXvUntIv=taZ@fN56J!)knaQ&sL z|75w&f8rQZ@jP49j5#HS(Sdikfu-S^fU92q&Yn~O_JB8R#C0Poo=-U?Ym3-miYdPw zPd3;TEWXq$>mopFOPhZ(=P}OFv7jSX+Q5FG6K9mqkxK^JT1c`z3|HA5Wj`da;1_ryy~bP& zXQ!fw*`4N}FjvJFg|41Sw|05`1Z78I3Jy>QlV&-q4vX95tg>@8Dbhq4^C%rpy!=G# z8U|JC89lt2W&DG4@Aoq8g{VM1S}u_z3O$-!~TYZH16pYU<>5B z&)kc>9()PF+VAbMU_#A^1r1vXvyL)R9A#Eke>j))bzBmP&$bIjsSRcsRi|!sn;xAu zQ;WsP%QJXo37fNkP(W2)y79Jf0PjQ4F?IKxXdRnE+CHX&FLw$jk`1-5G-n$lcG`1z z-4;|*iU?+oCkKeCU>kxS`gdoJ0yY6G?PHq|xXg!G8m7`@aagIQ%N&AKY6Yp$ebMG^ zk`_lPuRdC8miBW76y$3QyS11ycU`;%x#5FkG7$=?ONuCfpnXoDqMQVVM3gZi9oc@j zQ*jw>xS8CP+xT&UN)@5YA{KWW16F1Q4^8|H{a2kk>~lFrB5$$H29_z$$j7aCQd-6{ z{7AtfWo|-I&+Wp;@uxhf;E4*Jz;I`3a&MBTPv_E6v z=heEJ=>!<-7k+dRdTn~XR^C1Uf9Y=t0nk?~R@Wd%-(>ZT7pSTv>{ zLzi|{WYa~fPz~L}%3yF%gKnq^ouJhGqk_k~aj-^3fh-NToQaqsD`*(gU}*3x*d?&T zRGMWK8(*mqAfmQD&>@; zVuwA&sOi>*I!UoGmemH!qa{0rkcu&iS8&p#$}`Sw6xd?32erl|^`eW+_O2f(w_hZZ z#nj*ERKr}dc)SdZsF=xb1~u5Z$1n0UGYqGV9kj@}FA-pfb$2lJf&uX-gXOs@;t7B8 z?|;5SBYFO%B&zTQo>Fk|`|OG!N`8&N7F)f`s4q0975d^5VE|9AtYZ*l5^$DAGj#VoDlz9Q4B_P`uICIMdqXHT`2>y`F=j&qW(=Mk_F3Rr5U6o) zR!hPEUaggtLhlZA>;TpMq%39=!CG_hS{)6PM|j?DHnml{CTkQ=&5Y(}H!f{l*`E8k zx)wt5yG|0iSy9{p%C@-!zW&ElYo2ZVal8lH5Mm= zi$mt@K}IUek}Th5zW7;8WnNo$ZDN;L49i`0uR^d9V}|@nna^iagt9$1feb`N7JMj^ z{YJVVmYZC|OB4+3^EA(W)4t+Z)%WW@l!2??OR<+8T3{ie*2$FJNhyn34P7&MeS}2f zZsale;!E#S*ED6ijUkIvh8czB1?BLg^?5s4R+q-LvkYcTPTpmP9+oKEQ8a>D3fhDj z`%FNDBigic!2B&vCe|el- zz9S21__oR6X$+BbOWtV55d~I)f`^FKtH*$xQ-quto%jFvZ;!s8v^FNPG1`;3V2jVA z)kWjLyD*1B*yZ*Oa{jtUTqkQs6hk*C@Wm#YicVES5o5B{YvgVA6Ir|!k_k9=5PSMIUN#NEyQ)auvOV$Lo#6;t-vW{VSy*+|msQQfV!=t9NUJI5R*|!80T~6w zKhTp9RyIqN&Yxx^8y4)QG_rFKvcL^yLWrMZ`2_m{VZofIuuDX*J6rK#-2j@D`Mik) znm>5=+jFA8F%_G5JToq;4;JKPInMXSK0~4CU$&_`KB4dR2%Jh6yBeeG|9QE7Pg4N_N($vASGdet`mSGDw8ALEg^(P2qH^tvXOR42&Bk3rQD{yCeFMY;)cJqswd-H+ zzUC4C!$&yAT)|`5l*yZ}Bzr&26GauM^Q2HLs48tq_IyeSjYv zOSfemVumN(nAREs6m*2SX zV=-lEjTX)&xip_zxKXubBUzAv#2T`)MH&zKok)HJhG z_x*^9pNUGiNyd*2dz|N2zG+|4&R%iAi1KJ7fO*g(z+rTf)O`8Y?uC#v^{T|&iRmV< zprCF$Jd>r@>HgM2So}uucCxXBZX)G@(k#;)WmL@-;?0#rBd;WIJeE4C`UYxRl>ab4 zH2rU3snhXucm*7c4xku+l}h;tw$_*~DVE>s$7~+<4bUZMCh$?Y4NDaW8?>fR0ZP zkx{-JD9P6Tz`Ml>2<#bggAWo5$P`QoOU=jllBs$RyRTAwcQRN%H#xwqHk@|Q>%O#_ znUsoFS*K*zU6<7RtP1tHYRDX3oBoPXG_KtBHwD+YwR!IH{e@H!F--(^U%6)=S2T2o z=6KCggYC|czoXbb59kJ1X7scV%7fjP+T1A?zEdDg_Tr98n#rgZ zZ71Q_6@?uktR}Kxni|vHBkYK0o<|CF&)l*CGWYOwKcrW{@|g%dgQ_7Txq$!9>tDXi zRPpq5dsS-&l*DpWFE6H9g04$g($NAtoZ}_zADVxNJ1ojbV?{2`4t}1}m*D6yzk?p* zLwW@aZ8fVhdQGy{+CTxmQpav0ubaaQWL=%utH7f&vB|l)7Guz_Ze%bt;;D=+24Z4S zJofW@bB`nC19S!4J(_*+y*T74P~N|m1v^x!xfGS3Ur<_OUH`w-6^g>w$)n;n4TyIS z*%O$_M1$$!7Q-FA{+1htfbOQ7Hw+@(r(VF(qS=Q-qkS5P!SXq_lcs-e*ysvCR~1>x zvad4Mv3e?Xk;DY|oW}MP)AGCXs$(#e2}Ffc9OXGS17qqBU=9!&GG#w(?)COZpiA|A zjRLOnsp3F-*5^Z--c(cv3Y(&wT<%QvZ8Pt7&f->)*s@;hwO;GBUhB19>$P6%wO;GB yUhB19>$P6%wO;GBUhB19>$P6%wO;?9*Z%?P^-%V}!|-wd0000%4lit-7)TAiIBuefA#$d8wHC0sweq|2t@ayaMWfL2N%&O-1YjOj>*) zK~b^_-hT}MstU3OL5oL)>dEZ$!K<*{na!1Ml%S-%kA_m}yCxT0ds`6P0lUJ^jRYI5 znV4jVo3%Ji0ViEEa)Q<~nu$A@wZ78}2zp2D4qU*4L}E~5MLUx$rc?Tm>UxpWz8I!t z>d@PKy!xI9HEMTtW@8qS}bh2aic#uc)$nvDtn#O$BRn1vx!wHa?@odfl1_78IE1 zizJc)i~VLq_mt}IpKBy0nTdGxGqs<`J zRlE}7Js4;`g0Ck7F>4Q_B2Tj(L}{{8|Jr=Pib%&lplDuyK3r8$Ch%&ftpbKxuAcc5 z854vRy%0G*qSKL0`z`q-OqLRyOjH`W<9M^;7pG9q&oK#F-T=oJ2)h*UQ`}sA{n3Nn zE7ntLxH>CI_jPY}-t6c6pVch`n80=3Q`5DT1&}{uXIK5ysW6)a)4HBhhFEEG8hvUx z)C#AZOnz?-KD)+@L)mL91v5*LlI+p*N|Yyrh-A_F?5dN}ea3H3S?4AS#^=Xf;KDbE z(k_lsu9jF0c}J@wE2A`CNask0VS;wI{d}G2$-kZBbc2DnM!8zLWg4N+Ue#==c=O2s zAyuXIjygP2KeI<0UWNEZsm?~o9(RgkvX%T4#Zlh+z2<6Ocp2q zs5pKvc~w&;i*EV2mR2L5fFp;&4yIPoe< z4}GAg{Ar3tX``5Etut@$sJ$1PF~x6Cb1n5aWL-dQL%q;^g^J|*?~t_IZRSl%<5R@w z-*e8M{4}3byQ_)iUcT*~(`1G!|`>Sg4TM(<4?%_$o@S$A%8}JHKg??2Ka_SIQN{b z2*eV;-Blx_Og^A)m`cU!05l{+8Pi$hr(O&GvC)9N`LSxt$D1`c=S?s>NFHaCDEpB~ zqqScuvC>QkkJP8GgGcP0P{wtH{CPQT%=&Yp6rwFS>ZqWO*{--?+Ns|*N5C!>0?Cq$ z&0xO=s1;F&9`!WOeP*9ht2}{f-miY z@Kt`x+vODVk()r%te2IS@(A(cH3#Tx&Koc#x`;8?%v-Dq55A2k(~I5T*r)Z&L04R(4%)WZ&PW-%^2U z1Tg+IrD6(UVv<2ANX)2SY|3J z?g+2&-jyc<8sX9oR(IC$V!9 z;IOt&3yn`_S0|k!+;tXj!^SL2{Tn!eaT6SQl)8FNVZJ5(tw>9S4~HEOKll8eryX*s zrJ_RjsE_UEKqjZAuM2hio#+f?NWu~^v*^JGu zxf&0emrjziWqj5L$Iu}DWgs7~k3`JqBTR(27JiEl!amrI*Q)dw-x&CZ|@b&@j(VyG+*H{_~~FNa%2A^~#rmq`VZ6e0_sC`arv? zG!#@2u17ebp%O{{K~WUe!^2p860Dl!;REyMQV~w*$$%aiBPsfa3l5*N2>w`)L3Pyd%qlcH0Xw~_h= zgR5kc-s4PH2q?}4ut7zJZ}YZk{$OVOk*1qgBBGE}OcEQ*Wo5kdK!#5SWygz6hv2He z*t%QvOZ_5F!Gw#bvhGQ1Wzm{w@Zse=n~~50^ydrd?8i%H8GKpK%vC8U#z76s)XcNf zVXjFEV_eq%%t=oxgG90i>mROa;WUBOl71{2`^&sIB%EvK(+y@Ws$kD6!=he4+dRIO zq5;Y6uspixkC|3`9tps>QzkUvPjPExJ!r!oKaFLxQG0A1IEEEziq>J}YD%ajY zAaY0sxnuT>!zHsv9(MM!{$dD370jol;L0G=2DPQ9oGa31kQMf-d=<%k*KVPBA!<53 zTBb{$LIG#P!Bi(TMxQZyoTIav8PWP2o!blGC3y%}!Wt5%Dsot<{L zuSIPYN5-wqONG7LB#-I>{cFjrlZqiER05RLP`RHjW)sSHXe`nu>m z)Wj845#L}I#;@4qf}g?rSpj?UDDw6V>KG1oSv!%P95O8vc)5M=6e@TLjuk;PaV3~g zh82|EDh)rS-(jlPbLitvIF6+d%@Xz1+aceoi%iu`7k@9k-qU0|hhN^Xzp+R) z!Rme-VI>w7?Z7O}&gp=}&ebaggNF*(8!4`UD*R(LjX~H0!1oSgn{;WVFy%)Q;Z}}$ zj@4@Mn1@AxcY^1O7-CFoau&W_0w13WbN_3@R}o>eo3%R7$?})444M;6@M+ld(qk12 zA0>PW4>O5$*b_9#80L@$yQBABKsIe^qlOV)Pih%v|Bo_gY;|B2 ze&{ly(v6L+$gq*?3X21`TFKYI0xg2t8QuGx6e5%XbBJ@`OSt;m={3{#n8uk9IW<|i zk>%>k^ez2i;e^`zM??M!-vxI8Q)MzfQuEpw?~SR~6qEY92L}q;+s};?5=z6#k{804 z2q4%+C{idd_DA(w?l|^2^yDAZ5>7hhTU!L-+~rzv*>yVQ)GLm%y~(McieaX(7W!j0 z`t8*zrEpJ}_$tg;GRAK(rCaO|_abJ{Y_akSb{?6LQkVOxyslT(Q}isA;`@~iXjSS+ zP0yG6j@v!8@v^DU6JKukO3$+gg8yK08;uPv>}6jE2pB`gA5D>y7!qm3GYNKBpjkX;6(Rk**}=Y#XC1o~GjXMAhUVj<_DlOjwxQggsce^S7<) zKE&y%6R0B-pw7-9(1?KR^9?2hu$&2%M-?iFoLrn^=^1tk#O&QeW?0H*<`|35-Bo#COehDATJiCTabWNxA+92%K z2zP^44PZb?o=WQNni;kZUk=rW8I*W^eZzi{q#AkXOUybey{?DCw||aR^A1V_tdl*u zR|Dz$l5O&#w!f4%zr%Urqnrox1hPynXp674DXxh=;PkMDdg90>1m)#bYr07d{`EaLNx`==tEP3B_+| z{f#D^sb74vIuo;z@akh7dv&{edA`!fK%wle0Pu-;FB%h+6wT#O78O0Xj8(iD4l^sdJHk^E-gm1q8(!+2XtyDrU-DIKNz)*}O6JEENnp@fOYfl(toS8TIpy$7 zkaQ7P(`t1|Xm)+PF`-%iL&-H;9Y0&r6sd}45v>NSsS>yR3bIlDZOS(iM`F=ZN5AT9 zAz!Ieih7q#;Y)t^ei5&w|GwMZ^1UNRng>vPR&=DK>`TkWSAvJVTNb;5S7J!j5>#RD z)NNb^4DWIc^vtExvw-4meWD8b61kW80!nwGZDHG%>~uu*fqDz*Xn3vk*3K#}5KnH0|y6fcXx z5R_LXd5=>itag?rBf!wCN)@s^#{?UjsJN9`YWOb=3~;)}j1^Tb|0C@3=CICp$Ec^i zEM>-sP5&k&kIX~2-GzCCCl_qq=NzbJG6caF&c}}{(gkRBLEMQszQrc@UmkDVNRK9c z%{}ELs&YLHk=Oi@PxtARS^3_1my&B<-~~r!`(=dB!3kv_LJ%Zt2uv5cf5cE+$61Q0 z3EI4Vd0;f#6?Iv)Ukk0u8ctAtX_;i=FF=)#p)p`T@!Pq0k$3ma?2+IZX>)vX-*}BN z#hn~O-DOBjCK(*`<5i-nKEuKNc?s6uVe$GsLoR}+u*d7Qv6kF{NaS79p>ebD>@~|? z<=kka`LFPXc5xQ;K}hd9cca&@=UmqrieA=PK;h}WKkC15Jg*G_^dtF`Ec-$$B9ntc zbRj`Gx0K>-^cm~l^9_Wl)Ms}=*E)@+Y85FMuj@=c3LJXJQT2%!=qvg>C7G4eo#|dl zatK`P8fx1eu_zS~W>vfqc25$}cWU-awFpgH;{62}9^rC5wjLI#z-dKHqmQBvNf?^2 zyoCSwA1)xSTHlh9TGG|&KUOaZq^GBcSVSKtAqS7Qjta2$vUEqz{g<-b4=&Xk30sQ3 zz=(O6=steM4^nXPK@V6fPIy;*x%F?*^9Ug(!qxeHHh~+8KQ1R#n_=vj0DkegUNb{Ca14scnBqiW~*L_s&?L2zf`~=ms=0PAY1%Ma`Z8~ zfx@s)rjN#rc6^XPQi=c|d-U_efsHXS<4ceaM4($j^TK{%Kxc$ous>;BJcXD~nzEcJmm&U^c ztKn^Yn-@})fS#WtB5_c*s*`|1#WwhSjnn)6inNXudg~Y|`H+~cnZ-R8CA8gS%nack zd7B(B(DCWguuKNiX(WG?Yb^BbpQ;=c@rBEd?w@uYy*~fgl^@%`uEyMEWi=)m_o*)O zUMyjUPPDrm{imrcBTjwKuz z_(R^g1V!zkcZz?9b!qJ-hZvwYp--HxYj=F`H*0lY9uBc=4InodCA&$nSr7)hnSK~T zFQ9$&fzE~^4i!}E3GU-DG+vR#)NY+5edR}QH{~GXNWEj_e4Xe)9$D`W^Nket3h%9S zi$C?9(zsmEpjDkl-)jk9>G%0L9yLmIprtSqYIRY`N%W()NWl>royn1h;$p6 z4UaMazNNh#JEeF5dbWN(NQ4C?of7=SL6=RgO?e+^Z2G>9FkrEV9ot%#Ame59jD z-Xsh?x6sr0Ho$X*QBlY32uy*$a*LW+Dj-a8Re|s9K9XkGX@>l1~_>ga$k1;@==E&20 zg~OzXWFX7Z$o=RuN^3(E9+@yiJd|4rn_)B_hw4IWQRsAD{g1pn(sm7AoR4L-MYY1I zMx)N&p{gq!*jmf$eIFRdiXi-K8m(~-agJlL-sg`?@uOv@S1q?m=Uw~r+pB5b*|7db zeZJk)TQ?znD4qbmvVFlRZd zSJ!8&D-w9U7OQI7TdD|a_m4)>XVF;)NB4|^^q+FX`S@1-bHw&z z{mz{}p~%{OSSq{m!Y*qA8k>7-PcnA{j|8*ta-^c*t|;yxnZe9B{wU1xA1{OsZQaP5 z58$B}nyOiQ9m{Ri8IGxT;oY$3{v@VO?j2{P9266qUtV`ZQ9)-%%;BL_Rl1f2;wEfW zl9m0zkj2^{XcM&~;9rDb_xMYNp#Qw3ezU3UVA@}c_&Q1h-&cgu$Ze^jNpls z^Zo6PNsg=oRKzxIS0r zM#V{ZHGkG5aXq|?Bt360j;o$^#iN)BmKf*Y5gwikZA%fTgxS$faJKaQf$_J7*TR() zlr8aC_;4wMI&sjYgmZndndwdN*3XFrY-9NDuDl)xAP}0n zQ85$BRg3AxG2+XXK({-W@?^=YRt+UJr4**0x*1>r+?93ul(vEV&R+N9Gme&^f)GWD zU+|iO{D+*>*S^VpW-G7rt5yJiR4_f=S(lCv9{ z|N2s;QLjavhY?Oxbx45nL)OBTdwG1I>H-xWbQZ%&pcc`JwRah#RlLBVz)P${GBbbt?_fp|6TU+&2?|+ z=10Pbg1`%AR5&#Z1b%rw-J>nr7&nq00_%MbFYwl0;p6!{k%czq?lxFRE`V!nBquyX zEW~xlsEw9Yy$-*e2lu?^dtjI)scaCT`!Z2^@V;UOgrtGL5;UkGU)_wu{h^9g7C}eqWNIe3`Mo5==p*>=F9BJ@eDb z7##Kq(Dw;wKwMMZ+eei>rE4!C8*RHDkaWnM8h;?xnXCE$enti;4B zn)SOILvY~8gjgkb-P3o2a(2Y%ByYvWYK!miIv11{WjKM)Q0RB?bP8Vk)mVZBD!==_ z6i>qEr#>Z5RPLG9F0mz+C5Vfl6jlpX{rs}IEE*#XKV*68-y*JrZopeH+!ojRn#AP} z>}2_W3M5R%#D^}HI{QP zuqgTv-}0i4qpG!93SYqY`|QlW3@*6u(AR8CkfYv047-+ASKpS-%|M5Tt`m|2+)Su< z6Do>ND2CRABK=b~9M{#st^H_%S#*L46$%BPdEv*IcN?WjTtL=kY8Jmwl39GUyy#IS z_$%EuDK;vn2ZOqeRrmK{IZpWwB}2`r%T=Mg8e}=mj4L?A=~9yrxc{CMwSV-c+t3!sM@L zn>eU^K@+!bXe=*#MD5=T{v@0KJ?iar@VAIJi2aJee>`aGcv5JCl1^a1!rTQ=eO#Ej z@m%-~C;UWqNlSMqK+fB;t1Pl0`Z>)RO_zeji) zfE|O)(*r$7NsYr-(#hj2* zH&OA8pn4AnB?3gB-^0ocxm=LEEYMq$(UmZG_wZgLeDQYp zmz!@#a+)*0I}i=9nc+o~Zc^tiQ<7#vUgh*Akmx5|qHl0S^DHC9nsqZ1G*%~2j4cck zn_bVBSUp$IGct4$x~|efXp1hn<~84+eaL>bt!4)LBjUZ}*dzWEMKtS~>dnkU`Gacr>Ep{+CNw}?lGvlX9 z*GjCio9|i`wqmy#p^@QLSGjfK031LGHSx)AS?JSgg+!$?=&|VF#CK@4jRX7e73Id5 z@9i}vmIr*IQQir>xCktQQ~oCiJJOH_A)Dj#;k+jR$wz=9Hjz%Q714r~^ zO0PFnFq^YNZ-Sp>_O0n1w$K3X~$wU@JsJGv}n{xNLnj!d%Pw)f25cf}hl zjZ)Fr&)u)l4zV@4pEOpyYPX#!hoy%(4gWezoq_=<*qOTSQj<1S_W66Me?K@q{vfBN w63KT$QJ**yzIDtk_>>VqLxB~oOSg70k3t9uK)l5 literal 0 HcmV?d00001 diff --git a/Scripts/Auth/AuthStorage.cs b/Scripts/Auth/AuthStorage.cs index f828c31..32e95d7 100644 --- a/Scripts/Auth/AuthStorage.cs +++ b/Scripts/Auth/AuthStorage.cs @@ -22,171 +22,171 @@ /// public static class AuthStorage { - private const string AuthConfigPath = "user://auth.cfg"; - private const string AuthSessionSection = "auth_session"; - private const string TokenKey = "token"; - private const string UserIdKey = "user_id"; - private const string UsernameKey = "username"; - private const string IssuedAtKey = "issued_at"; - private const string ExpiresAtKey = "expires_at"; - - /// - /// Loads the stored authentication session. - /// - public static bool TryLoadSession(out AuthSession session) - { - session = new AuthSession(); - var config = new ConfigFile(); - Error loadError = config.Load(AuthConfigPath); - - if (loadError != Error.Ok) - { - return false; - } - - string token = config.GetValue(AuthSessionSection, TokenKey, string.Empty) as string ?? string.Empty; - if (string.IsNullOrWhiteSpace(token)) - { - return false; - } - - // Restore session data - session.Token = token; - - // Safely parse UserId - handle both int and long types - var userIdValue = config.GetValue(AuthSessionSection, UserIdKey, 0L); - if (userIdValue is long longUserId) - { - session.UserId = longUserId; - } - else if (userIdValue is int intUserId) - { - session.UserId = intUserId; - } - else if (long.TryParse(userIdValue?.ToString() ?? "0", out long parsedUserId)) - { - session.UserId = parsedUserId; - } - else - { - session.UserId = 0L; - } - - session.Username = config.GetValue(AuthSessionSection, UsernameKey, string.Empty) as string ?? string.Empty; - - // Restore issued and expiration times - if (long.TryParse(config.GetValue(AuthSessionSection, IssuedAtKey, string.Empty) as string ?? string.Empty, out long issuedTicks)) - { - session.IssuedAt = new System.DateTime(issuedTicks); - } - - if (long.TryParse(config.GetValue(AuthSessionSection, ExpiresAtKey, string.Empty) as string ?? string.Empty, out long expiresTicks)) - { - session.ExpiresAt = new System.DateTime(expiresTicks); - } - - GD.Print($"[AuthStorage] Session loaded: {session}"); - return true; - } - - /// - /// Legacy method for backward compatibility. - /// Prefer TryLoadSession() instead. - /// - public static bool TryLoadToken(out string token) - { - token = string.Empty; - if (TryLoadSession(out var session)) - { - token = session.Token; - return true; - } - return false; - } - - /// - /// Saves the authentication session persistently. - /// - public static void SaveSession(AuthSession session) - { - if (session == null) - { - ClearSession(); - return; - } - - var config = new ConfigFile(); - - // Load existing config to preserve other data - config.Load(AuthConfigPath); - - config.SetValue(AuthSessionSection, TokenKey, session.Token ?? string.Empty); - config.SetValue(AuthSessionSection, UserIdKey, session.UserId); - config.SetValue(AuthSessionSection, UsernameKey, session.Username ?? string.Empty); - config.SetValue(AuthSessionSection, IssuedAtKey, session.IssuedAt.Ticks.ToString()); - - if (session.ExpiresAt.HasValue) - { - config.SetValue(AuthSessionSection, ExpiresAtKey, session.ExpiresAt.Value.Ticks.ToString()); - } - - Error saveError = config.Save(AuthConfigPath); - if (saveError != Error.Ok) - { - GD.PrintErr($"[AuthStorage] Failed to save session: {saveError}"); - } - else - { - GD.Print($"[AuthStorage] Session saved: {session}"); - } - } - - /// - /// Legacy method for backward compatibility. - /// Prefer SaveSession() instead. - /// - public static void SaveToken(string token) - { - var session = new AuthSession { Token = token, IssuedAt = System.DateTime.UtcNow }; - SaveSession(session); - } - - /// - /// Clears the stored authentication session. - /// - public static void ClearSession() - { - var config = new ConfigFile(); - if (config.Load(AuthConfigPath) == Error.Ok) - { - // Remove all auth-related keys - foreach (var key in new[] { TokenKey, UserIdKey, UsernameKey, IssuedAtKey, ExpiresAtKey }) - { - if (config.HasSectionKey(AuthSessionSection, key)) - { - // Godot doesn't have a direct delete method, so we load and re-save without the keys - } - } - - // Create new config without auth data - var newConfig = new ConfigFile(); - Error saveError = newConfig.Save(AuthConfigPath); - if (saveError != Error.Ok) - { - GD.PrintErr($"[AuthStorage] Failed to clear session: {saveError}"); - } - else - { - GD.Print("[AuthStorage] Session cleared"); - } - } - } - - /// - /// Legacy method for backward compatibility. - /// - public static void ClearToken() - { - ClearSession(); - } -} \ No newline at end of file + private const string AuthConfigPath = "user://auth.cfg"; + private const string AuthSessionSection = "auth_session"; + private const string TokenKey = "token"; + private const string UserIdKey = "user_id"; + private const string UsernameKey = "username"; + private const string IssuedAtKey = "issued_at"; + private const string ExpiresAtKey = "expires_at"; + + /// + /// Loads the stored authentication session. + /// + public static bool TryLoadSession(out AuthSession session) + { + session = new AuthSession(); + var config = new ConfigFile(); + Error loadError = config.Load(AuthConfigPath); + + if (loadError != Error.Ok) + { + return false; + } + + string token = config.GetValue(AuthSessionSection, TokenKey, string.Empty) as string ?? string.Empty; + if (string.IsNullOrWhiteSpace(token)) + { + return false; + } + + // Restore session data + session.Token = token; + + // Safely parse UserId - handle both int and long types + var userIdValue = config.GetValue(AuthSessionSection, UserIdKey, 0L); + if (userIdValue is long longUserId) + { + session.UserId = longUserId; + } + else if (userIdValue is int intUserId) + { + session.UserId = intUserId; + } + else if (long.TryParse(userIdValue?.ToString() ?? "0", out long parsedUserId)) + { + session.UserId = parsedUserId; + } + else + { + session.UserId = 0L; + } + + session.Username = config.GetValue(AuthSessionSection, UsernameKey, string.Empty) as string ?? string.Empty; + + // Restore issued and expiration times + if (long.TryParse(config.GetValue(AuthSessionSection, IssuedAtKey, string.Empty) as string ?? string.Empty, out long issuedTicks)) + { + session.IssuedAt = new System.DateTime(issuedTicks); + } + + if (long.TryParse(config.GetValue(AuthSessionSection, ExpiresAtKey, string.Empty) as string ?? string.Empty, out long expiresTicks)) + { + session.ExpiresAt = new System.DateTime(expiresTicks); + } + + GD.Print($"[AuthStorage] Session loaded: {session}"); + return true; + } + + /// + /// Legacy method for backward compatibility. + /// Prefer TryLoadSession() instead. + /// + public static bool TryLoadToken(out string token) + { + token = string.Empty; + if (TryLoadSession(out var session)) + { + token = session.Token; + return true; + } + return false; + } + + /// + /// Saves the authentication session persistently. + /// + public static void SaveSession(AuthSession session) + { + if (session == null) + { + ClearSession(); + return; + } + + var config = new ConfigFile(); + + // Load existing config to preserve other data + config.Load(AuthConfigPath); + + config.SetValue(AuthSessionSection, TokenKey, session.Token ?? string.Empty); + config.SetValue(AuthSessionSection, UserIdKey, session.UserId); + config.SetValue(AuthSessionSection, UsernameKey, session.Username ?? string.Empty); + config.SetValue(AuthSessionSection, IssuedAtKey, session.IssuedAt.Ticks.ToString()); + + if (session.ExpiresAt.HasValue) + { + config.SetValue(AuthSessionSection, ExpiresAtKey, session.ExpiresAt.Value.Ticks.ToString()); + } + + Error saveError = config.Save(AuthConfigPath); + if (saveError != Error.Ok) + { + GD.PrintErr($"[AuthStorage] Failed to save session: {saveError}"); + } + else + { + GD.Print($"[AuthStorage] Session saved: {session}"); + } + } + + /// + /// Legacy method for backward compatibility. + /// Prefer SaveSession() instead. + /// + public static void SaveToken(string token) + { + var session = new AuthSession { Token = token, IssuedAt = System.DateTime.UtcNow }; + SaveSession(session); + } + + /// + /// Clears the stored authentication session. + /// + public static void ClearSession() + { + var config = new ConfigFile(); + if (config.Load(AuthConfigPath) == Error.Ok) + { + // Remove all auth-related keys + foreach (var key in new[] { TokenKey, UserIdKey, UsernameKey, IssuedAtKey, ExpiresAtKey }) + { + if (config.HasSectionKey(AuthSessionSection, key)) + { + // Godot doesn't have a direct delete method, so we load and re-save without the keys + } + } + + // Create new config without auth data + var newConfig = new ConfigFile(); + Error saveError = newConfig.Save(AuthConfigPath); + if (saveError != Error.Ok) + { + GD.PrintErr($"[AuthStorage] Failed to clear session: {saveError}"); + } + else + { + GD.Print("[AuthStorage] Session cleared"); + } + } + } + + /// + /// Legacy method for backward compatibility. + /// + public static void ClearToken() + { + ClearSession(); + } +} diff --git a/Scripts/Characters/Player.cs b/Scripts/Characters/Player.cs index 8bc5e6f..3a7c59c 100644 --- a/Scripts/Characters/Player.cs +++ b/Scripts/Characters/Player.cs @@ -582,6 +582,30 @@ private List BuildSkillsFromSnapshot(IReadOnlyList continue; } + if (string.Equals(snapshot.SkillId, "triple_fireball", StringComparison.OrdinalIgnoreCase)) + { + skills.Add(new TripleFireballSkill()); + continue; + } + + if (string.Equals(snapshot.SkillId, "giant_fireball", StringComparison.OrdinalIgnoreCase)) + { + skills.Add(new GiantFireballSkill()); + continue; + } + + if (string.Equals(snapshot.SkillId, "triple_arrow", StringComparison.OrdinalIgnoreCase)) + { + skills.Add(new TripleArrowSkill()); + continue; + } + + if (string.Equals(snapshot.SkillId, "ricochet_arrow", StringComparison.OrdinalIgnoreCase)) + { + skills.Add(new RicochetArrowSkill()); + continue; + } + var remoteSkill = new RemoteSkill( snapshot.SkillId, snapshot.Name, @@ -627,6 +651,26 @@ private static string ResolveSkillId(Skills skill) return "fireball"; } + if (skill is TripleFireballSkill) + { + return "triple_fireball"; + } + + if (skill is GiantFireballSkill) + { + return "giant_fireball"; + } + + if (skill is TripleArrowSkill) + { + return "triple_arrow"; + } + + if (skill is RicochetArrowSkill) + { + return "ricochet_arrow"; + } + if (skill is RemoteSkill remoteSkill) { return remoteSkill.SkillId; @@ -700,7 +744,11 @@ private static void EnsureClassCoreSkills(List skills, PlayerClass cls) // Ensure the class's primary skill exists bool hasSword = skills.Any(s => s is BasicAttackSkill); bool hasBow = skills.Any(s => s is BowAttackSkill); + bool hasTripleArrow = skills.Any(s => s is TripleArrowSkill); + bool hasRicochetArrow = skills.Any(s => s is RicochetArrowSkill); bool hasFireball = skills.Any(s => s is FireballSkill); + bool hasTripleFireball = skills.Any(s => s is TripleFireballSkill); + bool hasGiantFireball = skills.Any(s => s is GiantFireballSkill); if (allowed.Contains(PlayerClassData.SkillIdSword) && !hasSword) { @@ -716,10 +764,30 @@ private static void EnsureClassCoreSkills(List skills, PlayerClass cls) skills.Add(new BowAttackSkill()); } + if (allowed.Contains(PlayerClassData.SkillIdTripleArrow) && !hasTripleArrow) + { + skills.Add(new TripleArrowSkill()); + } + + if (allowed.Contains(PlayerClassData.SkillIdRicochetArrow) && !hasRicochetArrow) + { + skills.Add(new RicochetArrowSkill()); + } + if (allowed.Contains(PlayerClassData.SkillIdFireball) && !hasFireball) { skills.Add(new FireballSkill()); } + + if (allowed.Contains(PlayerClassData.SkillIdTripleFireball) && !hasTripleFireball) + { + skills.Add(new TripleFireballSkill()); + } + + if (allowed.Contains(PlayerClassData.SkillIdGiantFireball) && !hasGiantFireball) + { + skills.Add(new GiantFireballSkill()); + } } // ── Class system ────────────────────────────────────────────────── @@ -920,6 +988,87 @@ public void LearnSkill(Skills skill) _combatSystem?.LearnSkill(skill); } + /// + /// Replace the player's equipped skill list with the given ordered list of skill IDs, + /// enforcing class restrictions. Called from the skill-equip UI after the player + /// saves their loadout. Invalid / disallowed IDs are silently skipped. + /// + public void SetEquippedSkills(System.Collections.Generic.List orderedSkillIds) + { + if (_combatSystem == null) return; + + var builtSkills = BuildSkillsFromIds(orderedSkillIds, PlayerClass); + _combatSystem.SetSkills(builtSkills); + GD.Print($"[Player] Skill loadout updated: {string.Join(", ", orderedSkillIds)}"); + } + + /// + /// Returns the ordered list of skill IDs currently equipped by the player. + /// + public System.Collections.Generic.List GetEquippedSkillIds() + { + var ids = new System.Collections.Generic.List(); + var skills = _combatSystem?.CurrentSkills; + if (skills == null) return ids; + foreach (var s in skills) + { + if (s != null) ids.Add(ResolveSkillId(s)); + } + return ids; + } + + /// + /// Translates an ordered list of skill IDs into live skill instances, + /// filtering out any IDs not allowed for the given class. + /// + private static System.Collections.Generic.List BuildSkillsFromIds( + System.Collections.Generic.List orderedIds, + PlayerClass cls) + { + var allowed = PlayerClassData.GetAllowedSkillIds(cls); + var skills = new System.Collections.Generic.List(); + + if (orderedIds != null) + { + foreach (var id in orderedIds) + { + string key = (id ?? string.Empty).ToLowerInvariant(); + if (!allowed.Contains(key)) continue; + + if (key == "basic_attack") + { + skills.Add(new BasicAttackSkill { EffectRenderer = new BasicAttackEffectRenderer() }); + } + else if (key == "bow_attack") + { + skills.Add(new BowAttackSkill()); + } + else if (key == "triple_arrow") + { + skills.Add(new TripleArrowSkill()); + } + else if (key == "ricochet_arrow") + { + skills.Add(new RicochetArrowSkill()); + } + else if (key == "fireball") + { + skills.Add(new FireballSkill()); + } + else if (key == "triple_fireball") + { + skills.Add(new TripleFireballSkill()); + } + else if (key == "giant_fireball") + { + skills.Add(new GiantFireballSkill()); + } + } + } + + return skills; + } + // ==================== Inventory System ==================== /// /// Gain experience points diff --git a/Scripts/Characters/PlayerSystems/PlayerCombatController.cs b/Scripts/Characters/PlayerSystems/PlayerCombatController.cs index 6d6bca0..1343c16 100644 --- a/Scripts/Characters/PlayerSystems/PlayerCombatController.cs +++ b/Scripts/Characters/PlayerSystems/PlayerCombatController.cs @@ -125,12 +125,12 @@ private bool ExecuteSkill(Player player, Map map, int skillIndex) private static AttackAnimationStyle GetAttackAnimationStyle(Skills skill) { - if (skill is BowAttackSkill) + if (skill is BowAttackSkill || skill is TripleArrowSkill || skill is RicochetArrowSkill) { return AttackAnimationStyle.Bow; } - if (skill is FireballSkill) + if (skill is FireballSkill || skill is TripleFireballSkill || skill is GiantFireballSkill) { return AttackAnimationStyle.Fireball; } diff --git a/Scripts/Characters/PlayerSystems/PlayerMovementController.cs b/Scripts/Characters/PlayerSystems/PlayerMovementController.cs index 9ef73bb..b56096b 100644 --- a/Scripts/Characters/PlayerSystems/PlayerMovementController.cs +++ b/Scripts/Characters/PlayerSystems/PlayerMovementController.cs @@ -2,61 +2,61 @@ namespace QuestFantasy.Characters.PlayerSystems { - /// - /// Handles player character movement logic, including collision detection and axis-aligned movement. - /// - /// Design Notes: - /// - Uses axis-aligned movement: attempts X axis first, then Y axis - /// - Each axis calculates independently from the original position, preventing one axis from affecting the other - /// - If one axis is blocked, movement on the other axis can still proceed (sliding effect) - /// - Collision detection only checks the lower half of the character body, allowing head to pass through terrain - /// - public class PlayerMovementController - { - public void TryMove(Node2D actor, Map map, Vector2 deltaMove, Vector2 bodySize) - { - if (map == null) - { - GD.PrintErr("[Movement] Map is null!"); - return; - } + /// + /// Handles player character movement logic, including collision detection and axis-aligned movement. + /// + /// Design Notes: + /// - Uses axis-aligned movement: attempts X axis first, then Y axis + /// - Each axis calculates independently from the original position, preventing one axis from affecting the other + /// - If one axis is blocked, movement on the other axis can still proceed (sliding effect) + /// - Collision detection only checks the lower half of the character body, allowing head to pass through terrain + /// + public class PlayerMovementController + { + public void TryMove(Node2D actor, Map map, Vector2 deltaMove, Vector2 bodySize) + { + if (map == null) + { + GD.PrintErr("[Movement] Map is null!"); + return; + } - // Save original position to allow independent calculation for both axes - Vector2 originalPos = actor.Position; - Vector2 newPos = originalPos; + // Save original position to allow independent calculation for both axes + Vector2 originalPos = actor.Position; + Vector2 newPos = originalPos; - // Attempt movement along X axis - Vector2 nextX = new Vector2(originalPos.x + deltaMove.x, originalPos.y); - Rect2 xRect = GetBodyRect(nextX, bodySize); - if (map.CanMoveTo(xRect)) - { - newPos.x = nextX.x; - } + // Attempt movement along X axis + Vector2 nextX = new Vector2(originalPos.x + deltaMove.x, originalPos.y); + Rect2 xRect = GetBodyRect(nextX, bodySize); + if (map.CanMoveTo(xRect)) + { + newPos.x = nextX.x; + } - // Attempt movement along Y axis (based on original Y, unaffected by X axis) - Vector2 nextY = new Vector2(originalPos.x, originalPos.y + deltaMove.y); - Rect2 yRect = GetBodyRect(nextY, bodySize); - if (map.CanMoveTo(yRect)) - { - newPos.y = nextY.y; - } + // Attempt movement along Y axis (based on original Y, unaffected by X axis) + Vector2 nextY = new Vector2(originalPos.x, originalPos.y + deltaMove.y); + Rect2 yRect = GetBodyRect(nextY, bodySize); + if (map.CanMoveTo(yRect)) + { + newPos.y = nextY.y; + } - // Apply new position atomically - if (newPos != originalPos) - { - actor.Position = newPos; - } - } + // Apply new position atomically + if (newPos != originalPos) + { + actor.Position = newPos; + } + } - private Rect2 GetBodyRect(Vector2 centerPosition, Vector2 bodySize) - { - // Only check the lower half of the body for collision detection - // This allows the character's head to pass through terrain - float lowerBodyHeight = bodySize.y / 2f; - Vector2 lowerBodyStart = centerPosition - bodySize / 2f; - lowerBodyStart.y += bodySize.y / 2f; // Move to start of lower half + private Rect2 GetBodyRect(Vector2 centerPosition, Vector2 bodySize) + { + // Only check the lower half of the body for collision detection + // This allows the character's head to pass through terrain + float lowerBodyHeight = bodySize.y / 2f; + Vector2 lowerBodyStart = centerPosition - bodySize / 2f; + lowerBodyStart.y += bodySize.y / 2f; // Move to start of lower half - return new Rect2(lowerBodyStart, new Vector2(bodySize.x, lowerBodyHeight)); - } - } -} \ No newline at end of file + return new Rect2(lowerBodyStart, new Vector2(bodySize.x, lowerBodyHeight)); + } + } +} diff --git a/Scripts/Core/Data/PlayerClass.cs b/Scripts/Core/Data/PlayerClass.cs index e525491..d244996 100644 --- a/Scripts/Core/Data/PlayerClass.cs +++ b/Scripts/Core/Data/PlayerClass.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.ObjectModel; namespace QuestFantasy.Core.Data { @@ -54,6 +55,19 @@ public class ClassSpritePaths public float ScaleMultiplier { get; set; } = 1.0f; } + /// + /// Immutable descriptor for a single learnable skill. + /// Used by the skill-equip UI to build cards without coupling to concrete skill classes. + /// + public class SkillDefinition + { + public string Id { get; set; } + public string DisplayName { get; set; } + public string Description { get; set; } + public string Emoji { get; set; } + public float CooldownSec { get; set; } + } + /// /// Static registry of per-class data: /// - Which skill IDs are allowed @@ -86,6 +100,10 @@ public static class PlayerClassData public const string SkillIdSword = "basic_attack"; public const string SkillIdBow = "bow_attack"; public const string SkillIdFireball = "fireball"; + public const string SkillIdTripleFireball = "triple_fireball"; + public const string SkillIdGiantFireball = "giant_fireball"; + public const string SkillIdTripleArrow = "triple_arrow"; + public const string SkillIdRicochetArrow = "ricochet_arrow"; // ── Allowed skills per class ─────────────────────────────────────── @@ -96,12 +114,12 @@ public static class PlayerClassData private static readonly HashSet MageSkills = new HashSet { - SkillIdFireball + SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball }; private static readonly HashSet ArcherSkills = new HashSet { - SkillIdBow + SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow }; private static readonly HashSet WarriorSkills = new HashSet @@ -163,6 +181,105 @@ public static string GetSkillListText(PlayerClass cls) } } + // ── Skill definition catalogue ───────────────────────────────────── + + private static readonly SkillDefinition DefSword = new SkillDefinition + { + Id = SkillIdSword, + DisplayName = "Sword Slash", + Description = "A powerful melee strike that hits nearby enemies.", + Emoji = "⚔️", + CooldownSec = 0.3f, + }; + + private static readonly SkillDefinition DefBow = new SkillDefinition + { + Id = SkillIdBow, + DisplayName = "Arrow Shot", + Description = "Fire an arrow that pierces enemies at range.", + Emoji = "🏹", + CooldownSec = 0.8f, + }; + + private static readonly SkillDefinition DefTripleArrow = new SkillDefinition + { + Id = SkillIdTripleArrow, + DisplayName = "Triple Arrow", + Description = "Fire 3 parallel arrows at once that pierce enemies.", + Emoji = "🏹", + CooldownSec = 1.5f, + }; + + private static readonly SkillDefinition DefRicochetArrow = new SkillDefinition + { + Id = SkillIdRicochetArrow, + DisplayName = "Ricochet Arrow", + Description = "Fire an arrow that bounces between enemies and walls.", + Emoji = "↪️", + CooldownSec = 2.5f, + }; + + private static readonly SkillDefinition DefFireball = new SkillDefinition + { + Id = SkillIdFireball, + DisplayName = "Fireball", + Description = "Launch a fireball that explodes on impact and may Burn.", + Emoji = "🔥", + CooldownSec = 1.2f, + }; + + private static readonly SkillDefinition DefTripleFireball = new SkillDefinition + { + Id = SkillIdTripleFireball, + DisplayName = "Triple Fireball", + Description = "Launch 3 fireballs in a spread that explode on impact.", + Emoji = "☄️", + CooldownSec = 2.0f, + }; + + private static readonly SkillDefinition DefGiantFireball = new SkillDefinition + { + Id = SkillIdGiantFireball, + DisplayName = "Giant Fireball", + Description = "Launch a massive fireball that explodes on impact.", + Emoji = "🔥", + CooldownSec = 3.0f, + }; + + /// + /// Returns the ordered list of all s that + /// the given class is permitted to equip. Used to build the skill-equip UI. + /// + public static ReadOnlyCollection GetAllSkillDefinitions(PlayerClass cls) + { + switch (cls) + { + case PlayerClass.Mage: + return new ReadOnlyCollection(new[] { DefFireball, DefTripleFireball, DefGiantFireball }); + case PlayerClass.Archer: + return new ReadOnlyCollection(new[] { DefBow, DefTripleArrow, DefRicochetArrow }); + case PlayerClass.Warrior: + return new ReadOnlyCollection(new[] { DefSword }); + default: // Adventurer + return new ReadOnlyCollection(new[] { DefSword, DefBow, DefFireball }); + } + } + + /// + /// Returns the default ordered skill-ID loadout for . + /// Used to reset the loadout when the player changes class. + /// + public static ReadOnlyCollection GetDefaultSkillLoadout(PlayerClass cls) + { + switch (cls) + { + case PlayerClass.Mage: return new ReadOnlyCollection(new[] { SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball }); + case PlayerClass.Archer: return new ReadOnlyCollection(new[] { SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow }); + case PlayerClass.Warrior: return new ReadOnlyCollection(new[] { SkillIdSword }); + default: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdBow, SkillIdFireball }); + } + } + /// /// Returns the explicit sprite paths for each class. /// Paths that don't exist on disk are handled gracefully in diff --git a/Scripts/Core/Data/Skills/GiantFireballSkill.cs b/Scripts/Core/Data/Skills/GiantFireballSkill.cs new file mode 100644 index 0000000..cac33e6 --- /dev/null +++ b/Scripts/Core/Data/Skills/GiantFireballSkill.cs @@ -0,0 +1,42 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Systems.StatusEffects; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// A massive fireball projectile exclusive to the Mage. + /// Explodes on impact with a large AOE and high damage. + /// Has a higher chance to apply Burn on each enemy hit. + /// + public class GiantFireballSkill : Attributes.Skills + { + public GiantFireballSkill() + { + Name = "Giant Fireball"; + Description = "Launch a massive fireball that explodes on impact."; + } + + public override float MaxRange => 400f; + + public override float GetCooldownDuration() => 3.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + SkillProjectileSpawner.SpawnGiantFireball( + player, + target, + MaxRange, + onHitEffect: () => new BurnEffect( + GameConstants.FIREBALL_BURN_DURATION * 1.5f, + GameConstants.FIREBALL_BURN_DPS * 2), + onHitChance: GameConstants.FIREBALL_BURN_CHANCE * 1.5f); + } + } +} diff --git a/Scripts/Core/Data/Skills/RicochetArrowSkill.cs b/Scripts/Core/Data/Skills/RicochetArrowSkill.cs new file mode 100644 index 0000000..0dfd6f6 --- /dev/null +++ b/Scripts/Core/Data/Skills/RicochetArrowSkill.cs @@ -0,0 +1,38 @@ +using Godot; + +using QuestFantasy.Characters; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Advanced ricochet arrow projectile for the Archer. + /// Fires a single arrow that bounces between walls and enemies up to 4 times. + /// + public class RicochetArrowSkill : Attributes.Skills + { + public RicochetArrowSkill() + { + Name = "Ricochet Arrow"; + Description = "Fire an arrow that bounces between walls and enemies."; + } + + public override float MaxRange => 300f; + + public override float GetCooldownDuration() => 2.5f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + // Spawn an arrow with 4 bounces + SkillProjectileSpawner.SpawnRicochetArrow( + player, + target, + MaxRange, + bounces: 4); + } + } +} diff --git a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs index 311c33d..37d10ab 100644 --- a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs +++ b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs @@ -18,10 +18,35 @@ public static void SpawnArrow( float onHitChance = 0f) { Vector2 direction = ResolveDirection(player, target); - var node = SkillProjectileNode.CreateArrow(player, direction, maxRange, onHitEffect, onHitChance); + var node = SkillProjectileNode.CreateArrow(player, direction, maxRange, 0, onHitEffect, onHitChance); AttachToScene(player, node); } + public static void SpawnTripleArrow( + Player player, + Character target, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + + // Calculate a perpendicular offset vector (10 pixels wide) to separate the arrows + Vector2 perpOffset = new Vector2(-direction.y, direction.x) * 12f; + + var nodeCenter = SkillProjectileNode.CreateArrow(player, direction, maxRange, 0, onHitEffect, onHitChance); + var nodeLeft = SkillProjectileNode.CreateArrow(player, direction, maxRange, 0, onHitEffect, onHitChance); + var nodeRight = SkillProjectileNode.CreateArrow(player, direction, maxRange, 0, onHitEffect, onHitChance); + + AttachToScene(player, nodeCenter); + AttachToScene(player, nodeLeft); + AttachToScene(player, nodeRight); + + // Apply the visual offsets + nodeLeft.GlobalPosition += perpOffset; + nodeRight.GlobalPosition -= perpOffset; + } + public static void SpawnFireball( Player player, Character target, @@ -34,6 +59,54 @@ public static void SpawnFireball( AttachToScene(player, node); } + public static void SpawnTripleFireball( + Player player, + Character target, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + + // Calculate spread directions (±15 degrees = ±0.261799 radians) + float spreadAngle = 15f * Mathf.Pi / 180f; + Vector2 dirLeft = direction.Rotated(-spreadAngle); + Vector2 dirRight = direction.Rotated(spreadAngle); + + var nodeCenter = SkillProjectileNode.CreateFireball(player, direction, maxRange, onHitEffect, onHitChance); + var nodeLeft = SkillProjectileNode.CreateFireball(player, dirLeft, maxRange, onHitEffect, onHitChance); + var nodeRight = SkillProjectileNode.CreateFireball(player, dirRight, maxRange, onHitEffect, onHitChance); + + AttachToScene(player, nodeCenter); + AttachToScene(player, nodeLeft); + AttachToScene(player, nodeRight); + } + + public static void SpawnGiantFireball( + Player player, + Character target, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateGiantFireball(player, direction, maxRange, onHitEffect, onHitChance); + AttachToScene(player, node); + } + + public static void SpawnRicochetArrow( + Player player, + Character target, + float maxRange, + int bounces, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateArrow(player, direction, maxRange, bounces, onHitEffect, onHitChance); + AttachToScene(player, node); + } + private static Vector2 ResolveDirection(Player player, Character target) { if (target != null && Godot.Object.IsInstanceValid(target)) @@ -115,11 +188,14 @@ internal class SkillProjectileNode : Node2D private int _flightFrameIndex = -1; private float _flightFrameDuration = 0f; private float _impactFrameDuration = ArrowImpactFrameDuration; + private int _bouncesRemaining = 0; + private float _bounceRange = 150f; public static SkillProjectileNode CreateArrow( Player owner, Vector2 direction, float maxRange, + int bounces = 0, Func onHitEffect = null, float onHitChance = 0f) { @@ -135,6 +211,7 @@ public static SkillProjectileNode CreateArrow( _damageMax = 4, _isAoe = false, _aoeRadius = 0f, + _bouncesRemaining = bounces, _onHitEffect = onHitEffect, _onHitChance = onHitChance, _projectileTexture = GD.Load("res://Assets/SkillAnimation/arrow.png"), @@ -193,6 +270,48 @@ public static SkillProjectileNode CreateFireball( }; } + public static SkillProjectileNode CreateGiantFireball( + Player owner, + Vector2 direction, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + return new SkillProjectileNode + { + _owner = owner, + _map = FindMap(owner), + _direction = direction, + _speed = FireballSpeed * 0.8f, // Slightly slower because it's massive + _maxDistance = Mathf.Max(10f, maxRange), + _hitRadius = 24f, + _damageMin = 10, + _damageMax = 18, + _isAoe = true, + _aoeRadius = 80f, + _onHitEffect = onHitEffect, + _onHitChance = onHitChance, + _projectileTexture = GD.Load("res://Assets/SkillAnimation/fireball.png"), + _projectileScale = FireballProjectileScale * 2f, + _impactScale = FireballImpactScale * 2f, + _flightFrameDuration = FireballFlightFrameDuration, + _impactFrameDuration = FireballImpactFrameDuration, + _flightFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/fireball1.png"), + GD.Load("res://Assets/SkillAnimation/fireball2.png"), + GD.Load("res://Assets/SkillAnimation/fireball3.png"), + }, + _impactFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/fireball_hit.png"), + GD.Load("res://Assets/SkillAnimation/fireball_hit1.png"), + GD.Load("res://Assets/SkillAnimation/fireball_hit2.png"), + GD.Load("res://Assets/SkillAnimation/fireball_hit3.png"), + } + }; + } + public override void _Ready() { Texture firstFlightTexture = _projectileTexture; @@ -239,15 +358,59 @@ public override void _Process(float delta) if (IsBlockedByWall(nextPosition)) { - BeginImpact(nextPosition, null); - return; + if (_bouncesRemaining > 0) + { + _bouncesRemaining--; + + // Simple reflection based on axis + bool xBlocked = IsBlockedByWall(GlobalPosition + new Vector2(step.x, 0)); + bool yBlocked = IsBlockedByWall(GlobalPosition + new Vector2(0, step.y)); + + if (xBlocked) _direction.x *= -1; + if (yBlocked) _direction.y *= -1; + + // Corner case: if both or neither (diagonal corner), just flip both + if (!xBlocked && !yBlocked) { _direction = -_direction; } + + _direction = _direction.Normalized(); + Rotation = _direction.Angle(); + return; // continue next frame + } + else + { + BeginImpact(nextPosition, null); + return; + } } Character hitTarget = FindHitTarget(nextPosition); if (hitTarget != null) { - BeginImpact(hitTarget.GlobalPosition, hitTarget); - return; + if (_bouncesRemaining > 0) + { + ApplyDamage(hitTarget); + _bouncesRemaining--; + + // Find next target + Character nextTarget = FindNextBounceTarget(hitTarget.GlobalPosition); + if (nextTarget != null) + { + _direction = (nextTarget.GlobalPosition - GlobalPosition).Normalized(); + Rotation = _direction.Angle(); + return; // continue next frame + } + else + { + // No target to bounce to, just impact + BeginImpact(hitTarget.GlobalPosition, hitTarget); + return; + } + } + else + { + BeginImpact(hitTarget.GlobalPosition, hitTarget); + return; + } } GlobalPosition = nextPosition; @@ -283,6 +446,11 @@ private Character FindHitTarget(Vector2 position) continue; } + if (_damagedTargets.Contains(enemy)) + { + continue; + } + if (enemy.GlobalPosition.DistanceTo(position) <= _hitRadius) { return enemy; @@ -292,6 +460,40 @@ private Character FindHitTarget(Vector2 position) return null; } + private Character FindNextBounceTarget(Vector2 currentPosition) + { + if (!IsOwnerAlive()) + { + return null; + } + + Character bestTarget = null; + float closestDistSq = _bounceRange * _bounceRange; + + foreach (Character enemy in EnumerateEnemyCharacters()) + { + if (enemy?.Attributes?.HP == null || !enemy.Attributes.HP.IsAlive) + { + continue; + } + + // Do not bounce back to already hit targets + if (_damagedTargets.Contains(enemy)) + { + continue; + } + + float distSq = enemy.GlobalPosition.DistanceSquaredTo(currentPosition); + if (distSq <= closestDistSq) + { + closestDistSq = distSq; + bestTarget = enemy; + } + } + + return bestTarget; + } + private void BeginImpact(Vector2 impactPosition, Character directHitTarget) { GlobalPosition = impactPosition; diff --git a/Scripts/Core/Data/Skills/TripleArrowSkill.cs b/Scripts/Core/Data/Skills/TripleArrowSkill.cs new file mode 100644 index 0000000..4873c65 --- /dev/null +++ b/Scripts/Core/Data/Skills/TripleArrowSkill.cs @@ -0,0 +1,36 @@ +using Godot; + +using QuestFantasy.Characters; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Advanced triple arrow projectile for the Archer. + /// Fires 3 arrows simultaneously in the same direction, slightly offset side-by-side. + /// + public class TripleArrowSkill : Attributes.Skills + { + public TripleArrowSkill() + { + Name = "Triple Arrow"; + Description = "Fire 3 arrows at once that pierce enemies at range."; + } + + public override float MaxRange => 300f; + + public override float GetCooldownDuration() => 1.5f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + SkillProjectileSpawner.SpawnTripleArrow( + player, + target, + MaxRange); + } + } +} diff --git a/Scripts/Core/Data/Skills/TripleFireballSkill.cs b/Scripts/Core/Data/Skills/TripleFireballSkill.cs new file mode 100644 index 0000000..0fa340d --- /dev/null +++ b/Scripts/Core/Data/Skills/TripleFireballSkill.cs @@ -0,0 +1,43 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Systems.StatusEffects; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Advanced triple fireball projectile for the Mage. + /// Fires 3 fireballs simultaneously in a spread pattern. + /// Explodes on wall or monster hit and damages nearby enemies. + /// Has a 25% chance to apply Burn on each enemy hit (configurable via GameConstants). + /// + public class TripleFireballSkill : Attributes.Skills + { + public TripleFireballSkill() + { + Name = "Triple Fireball"; + Description = "Launch 3 fireballs in a spread that explode on impact."; + } + + public override float MaxRange => 300f; + + public override float GetCooldownDuration() => 2.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + SkillProjectileSpawner.SpawnTripleFireball( + player, + target, + MaxRange, + onHitEffect: () => new BurnEffect( + GameConstants.FIREBALL_BURN_DURATION, + GameConstants.FIREBALL_BURN_DPS), + onHitChance: GameConstants.FIREBALL_BURN_CHANCE); + } + } +} diff --git a/Scripts/Main.cs b/Scripts/Main.cs index ffa01d7..6fc8e6d 100644 --- a/Scripts/Main.cs +++ b/Scripts/Main.cs @@ -10,861 +10,861 @@ public class Main : Node2D { - [Export] public string BackendBaseUrl = "http://127.0.0.1:8000"; - [Export] public bool EnableMobileInputUI = true; // Force enable virtual D-pad for testing - - private AuthFlowController _authFlowController; - private AuthApiClient _playerDataApiClient; - private SidebarMenu _sidebarMenu; - private PlayerHud _playerHud; - private BackpackUI _backpackUi; - private DeathScreenUI _deathScreen; - private ProgressSyncIndicator _progressIndicator; - private Map _map; - private Player _player; - private MobileInputUI _mobileInputUI; - private MiniMapUI _miniMapUi; - private readonly EquipmentManager _equipManagerRef = new EquipmentManager(); - private readonly TreasureChest _chestRef = new TreasureChest(); - private readonly Godot.Collections.Array _spawnedMonsters = new Godot.Collections.Array(); - private readonly string _syncSessionId = Guid.NewGuid().ToString("N"); - private int _syncSequence = 0; - private int _localMutationVersion = 0; - private int _activeSyncMutationVersion = 0; - private float _checkpointElapsed = 0f; - private Timer _profileFetchTimeoutTimer; - private bool _isProfileFetchPending = false; - private int _activeProfileFetchId = 0; - private PlayerProfileSnapshot _pendingProfileSnapshot; - private LobbyManager _lobbyManager; - private bool _gameLoadedAlready = false; // Guard against loading twice - private const float ProfileFetchTimeoutSeconds = 12f; - - private int _currentMusicIndex = 0; - private readonly string[] _musicFiles = { - "res://Assets/Music/QuestFantasy_Oath2.mp3", - "res://Assets/Music/QuestFantasy_Oath3.mp3", - "res://Assets/Music/QuestFantasy_Oath1.mp3", - "res://Assets/Music/QuestFantasy_Oath4.mp3" - }; - private AudioStreamPlayer _musicPlayer; - - - public override void _Ready() - { - GD.Print("遊戲開始了,正在讀取登入畫面..."); - SetProcess(true); - GetTree().Connect("node_added", this, nameof(OnSceneNodeAdded)); - SetupMobileInputUI(); - SetupSidebarMenu(); - SetupMusic(); - SetupProgressIndicator(); - SetupPlayerDataClient(); - SetupAuthFlowController(); - SetupDeathScreen(); - GD.Print("登入成功..."); - } - - public override void _ExitTree() - { - if (GetTree() != null && GetTree().IsConnected("node_added", this, nameof(OnSceneNodeAdded))) - { - GetTree().Disconnect("node_added", this, nameof(OnSceneNodeAdded)); - } - } - - private void SetupProgressIndicator() - { - _progressIndicator = new ProgressSyncIndicator(); - AddChild(_progressIndicator); - _progressIndicator.SetState(ProgressSyncIndicator.SyncState.Hidden); - - if (_equipManagerRef.GetParent() == null) - { - AddChild(_equipManagerRef); - } - - if (_chestRef.GetParent() == null) - { - AddChild(_chestRef); - } - - // Ensure EquipmentPreview exists in the scene so pickups can call EquipmentPreview.Instance - if (EquipmentPreview.Instance == null) - { - var preview = new EquipmentPreview(); - AddChild(preview); - } - - // Ensure InteractionButtonUI exists in the scene - if (InteractionButtonUI.Instance == null) - { - var interactBtn = new InteractionButtonUI(); - AddChild(interactBtn); - } - } - - public override void _Process(float delta) - { - if (_player == null) - { - return; - } - - if (_authFlowController?.CurrentSession == null || !_authFlowController.CurrentSession.IsValid) - { - return; - } - - _checkpointElapsed += delta; - if (_checkpointElapsed >= 25f) - { - _checkpointElapsed = 0f; - TransmitPlayerProfile("checkpoint"); - } - } - - private void BuildPlayablePrototype(PlayerProfileSnapshot profileSnapshot) - { - GetTree().Paused = false; - DestroyPlayableWorld(); - _pendingProfileSnapshot = profileSnapshot; - EnsureLobbyBackpackContext(); - _sidebarMenu?.SetMenuVisible(true); - // Build lobby instead of directly loading a game map - BuildLobby(); - - if (_musicPlayer != null && !_musicPlayer.Playing) - { - PlayCurrentMusic(); - } - } - - - private void SetupAuthFlowController() - { - _authFlowController = new AuthFlowController - { - BackendBaseUrl = BackendBaseUrl, - PauseMode = PauseModeEnum.Process - }; - AddChild(_authFlowController); - _authFlowController.Authenticated += OnAuthenticated; - _authFlowController.LoggedOut += HandleLoggedOut; - _authFlowController.AuthViewShown += () => _mobileInputUI?.HideDPad(); - } - - private void SetupPlayerDataClient() - { - _playerDataApiClient = new AuthApiClient - { - BackendBaseUrl = BackendBaseUrl, - PauseMode = PauseModeEnum.Process, - }; - AddChild(_playerDataApiClient); - - _profileFetchTimeoutTimer = new Timer - { - OneShot = true, - WaitTime = ProfileFetchTimeoutSeconds, - PauseMode = PauseModeEnum.Process, - }; - AddChild(_profileFetchTimeoutTimer); - _profileFetchTimeoutTimer.Connect("timeout", this, nameof(OnProfileFetchTimeout)); - } - - private void OnAuthenticated() - { - // If logout paused the tree, profile HTTP callbacks can stall forever. - GetTree().Paused = false; - - string token = _authFlowController?.CurrentSession?.Token; - if (string.IsNullOrWhiteSpace(token) || _playerDataApiClient == null) - { - GD.Print("[ProgressSync] No token/client available. Building world with local defaults."); - BuildPlayablePrototype(null); - return; - } - - GD.Print("[ProgressSync] Fetching player profile before entering level..."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Loading); - _activeProfileFetchId += 1; - int requestId = _activeProfileFetchId; - _isProfileFetchPending = true; - _profileFetchTimeoutTimer?.Start(ProfileFetchTimeoutSeconds); - - if (!_playerDataApiClient.FetchPlayerProfile(token, result => OnPlayerProfileFetched(requestId, result))) - { - GD.PrintErr("[Main] Failed to fetch player profile. Starting with local defaults."); - GD.Print("[ProgressSync] Profile fetch request failed to send. Using local defaults."); - _isProfileFetchPending = false; - _profileFetchTimeoutTimer?.Stop(); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - BuildPlayablePrototype(null); - } - } - - private void OnPlayerProfileFetched(int requestId, AuthApiResult result) - { - if (!_isProfileFetchPending || requestId != _activeProfileFetchId) - { - GD.Print($"[ProgressSync] Ignored stale profile response. requestId={requestId}, active={_activeProfileFetchId}, pending={_isProfileFetchPending}."); - return; - } - - _isProfileFetchPending = false; - _profileFetchTimeoutTimer?.Stop(); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - if (!result.NetworkOk || !result.IsSuccessStatus(200)) - { - GD.PrintErr("[Main] Player profile fetch failed. Starting with local defaults."); - GD.Print($"[ProgressSync] Profile fetch failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}."); - BuildPlayablePrototype(null); - return; - } - - var snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); - GD.Print($"[ProgressSync] Profile loaded. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}, Skills={snapshot.Skills.Count}."); - BuildPlayablePrototype(snapshot); - } - - private void OnProfileFetchTimeout() - { - if (!_isProfileFetchPending) - { - return; - } - - _isProfileFetchPending = false; - GD.PrintErr($"[ProgressSync] Profile fetch timed out after {ProfileFetchTimeoutSeconds}s. Using local defaults."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - BuildPlayablePrototype(null); - } - - private void SetupSidebarMenu() - { - _sidebarMenu = new SidebarMenu(); - AddChild(_sidebarMenu); - _sidebarMenu.SetMenuVisible(false); - _sidebarMenu.AddMenuItem("change_music", "Change Music", OnChangeMusicPressed); - _sidebarMenu.AddMenuItem("logout", "Logout", OnLogoutPressed); - } - - private void SetupMusic() - { - _musicPlayer = new AudioStreamPlayer(); - _musicPlayer.PauseMode = PauseModeEnum.Process; // Keep playing even if game pauses - AddChild(_musicPlayer); - } - - private void PlayCurrentMusic() - { - if (_musicPlayer == null) return; - - var stream = GD.Load(_musicFiles[_currentMusicIndex]); - if (stream != null) - { - _musicPlayer.Stream = stream; - _musicPlayer.Play(); - } - else - { - GD.PrintErr($"[Main] Failed to load audio stream: {_musicFiles[_currentMusicIndex]}"); - } - } - - private void OnChangeMusicPressed() - { - _currentMusicIndex = (_currentMusicIndex + 1) % _musicFiles.Length; - PlayCurrentMusic(); - } - - private void SetupMobileInputUI() - { - // Create mobile input UI once for the entire game lifetime - bool shouldEnableMobileUI = EnableMobileInputUI || OS.HasTouchscreenUiHint(); - if (shouldEnableMobileUI) - { - _mobileInputUI = new MobileInputUI(); - AddChild(_mobileInputUI); - _mobileInputUI.HideDPad(); - GD.Print("[Main] Mobile input UI enabled globally for touch controls"); - } - } - - private void SetupDeathScreen() - { - _deathScreen = new DeathScreenUI(); - AddChild(_deathScreen); - _deathScreen.OnRespawnClicked += () => - { - _deathScreen.SetVisible(false); - if (_playerHud != null) _playerHud.SetVisible(true); - _player?.Respawn(); - }; - _deathScreen.OnExitClicked += () => - { - _deathScreen.SetVisible(false); - ReturnToLobby(); - }; - } - - private void OnLogoutPressed() - { - TransmitPlayerProfile("logout"); - _authFlowController?.RequestLogout(); - } - - private void OnPlayerDied() - { - TransmitPlayerProfile("die"); - if (_playerHud != null) _playerHud.SetVisible(false); - _deathScreen?.SetVisible(true); - } - - private void OnPlayerEnteredRoom(Vector2 roomIndex, string reason) - { - string syncReason = string.IsNullOrWhiteSpace(reason) ? "room_enter" : reason; - GD.Print($"[ProgressSync] Room entry autosave trigger at ({roomIndex.x}, {roomIndex.y}), reason={syncReason}."); - TransmitPlayerProfile(syncReason); - } - - private void HandleLoggedOut() - { - _isProfileFetchPending = false; - _profileFetchTimeoutTimer?.Stop(); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - _mobileInputUI?.HideDPad(); - DestroyPlayableWorld(); - _gameLoadedAlready = false; - _sidebarMenu?.SetMenuVisible(false); - GetTree().Paused = true; - _sidebarMenu?.SetMenuVisible(false); - _musicPlayer?.Stop(); - - // Clean up any active gameplay/lobby scenes - _lobbyManager?.QueueFree(); - _lobbyManager = null; - _map?.QueueFree(); - _map = null; - _player = null; - - GD.Print("[Main] Logged out - all game states cleaned"); - } - - private void TransmitPlayerProfile(string reason) - { - if (_player == null || _playerDataApiClient == null || _playerDataApiClient.IsBusy) - { - GD.Print($"[ProgressSync] Skipped send. reason={reason}, playerReady={_player != null}, clientReady={_playerDataApiClient != null}, clientBusy={_playerDataApiClient?.IsBusy}."); - return; - } - - string token = _authFlowController?.CurrentSession?.Token; - if (string.IsNullOrWhiteSpace(token)) - { - GD.Print($"[ProgressSync] Skipped send. reason={reason}, missing auth token."); - return; - } - - _syncSequence += 1; - PlayerProfileSnapshot snapshot = _player.BuildProfileSnapshot(); - _activeSyncMutationVersion = _localMutationVersion; - var payload = snapshot.ToUpdatePayload(_syncSessionId, _syncSequence); - payload["reason"] = reason; - GD.Print($"[ProgressSync] Sending profile. reason={reason}, seq={_syncSequence}, level={snapshot.Level}, hp={snapshot.HpCurrent}/{snapshot.HpMax}, exp={snapshot.Experience}, gold={snapshot.Gold}."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Saving); - - if (!_playerDataApiClient.UpdatePlayerProfile(token, payload, OnPlayerProfileSynced)) - { - GD.PrintErr($"[ProgressSync] Send failed to start. reason={reason}, seq={_syncSequence}."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - _syncSequence -= 1; - } - } - - private void OnPlayerProfileSynced(AuthApiResult result) - { - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - if (!result.NetworkOk || !result.IsSuccessStatus(200) || _player == null) - { - GD.PrintErr($"[ProgressSync] Sync failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}, playerReady={_player != null}."); - return; - } - - PlayerProfileSnapshot snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); - if (!snapshot.Ignored) - { - if (_activeSyncMutationVersion < _localMutationVersion) - { - GD.Print($"[ProgressSync] Ignored stale sync response. syncMutation={_activeSyncMutationVersion}, localMutation={_localMutationVersion}."); - TransmitPlayerProfile("resync_after_local_change"); - return; - } - - GD.Print($"[ProgressSync] Sync applied. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}."); - _player.ApplyProfile(snapshot); - return; - } - - GD.Print($"[ProgressSync] Sync ignored by server. reason={snapshot.IgnoreReason}."); - } - - private void DestroyPlayableWorld() - { - foreach (Node child in GetChildren()) - { - if (child is ExpPickup || child is QuestFantasy.Items.CoinDrop || child is EquipmentPickup) - { - child.QueueFree(); - } - } - - for (int i = 0; i < _spawnedMonsters.Count; i++) - { - if (Godot.Object.IsInstanceValid(_spawnedMonsters[i])) - { - _spawnedMonsters[i].QueueFree(); - } - } - _spawnedMonsters.Clear(); - - if (Godot.Object.IsInstanceValid(_miniMapUi)) - { - _miniMapUi.QueueFree(); - } - _miniMapUi = null; - - if (Godot.Object.IsInstanceValid(_player)) - { - _player.OnDied -= OnPlayerDied; - _player.OnRoomEntered -= OnPlayerEnteredRoom; - _player.QueueFree(); - } - _player = null; - - if (Godot.Object.IsInstanceValid(_playerHud)) - { - _playerHud.QueueFree(); - } - _playerHud = null; - - if (Godot.Object.IsInstanceValid(_backpackUi)) - { - _backpackUi.DropRequested -= OnBackpackDropRequested; - _backpackUi.UseRequested -= OnBackpackUseRequested; - _backpackUi.SyncRequested -= OnInventorySyncRequested; - _backpackUi.QueueFree(); - } - _backpackUi = null; - - // DO NOT destroy _mobileInputUI - it should persist throughout the game - // Hide it when leaving gameplay; it will be re-shown only when entering a game level - _mobileInputUI?.HideDPad(); - - if (Godot.Object.IsInstanceValid(_map)) - { - _map.QueueFree(); - } - _map = null; - _gameLoadedAlready = false; - - } - private void BuildLobby() - { - EnsureLobbyBackpackContext(); - - _lobbyManager = new LobbyManager(); - _lobbyManager.Initialize(_player, _playerDataApiClient, _authFlowController?.CurrentSession?.Token); - AddChild(_lobbyManager); - _lobbyManager.DifficultySelected += OnDifficultySelected; - - // Show D-pad in the lobby, but hide map button - _mobileInputUI?.ShowDPad(); - _mobileInputUI?.ShowMapButton(false); - _lobbyManager.SyncRequested += OnInventorySyncRequested; - _lobbyManager.ClassChangeRequested += OnClassChangeRequested; - } - - private void OnClassChangeRequested(QuestFantasy.Core.Data.PlayerClass newClass) - { - GD.Print($"[Main] Player changed class to {newClass}. Syncing profile to backend."); - TransmitPlayerProfile("class_change"); - } - - private void EnsureLobbyBackpackContext() - { - if (!Godot.Object.IsInstanceValid(_player)) - { - _player = new Player(); - AddChild(_player); - } - - _player.Visible = false; - - if (_pendingProfileSnapshot != null) - { - if (_pendingProfileSnapshot.HpCurrent <= 0) - { - _pendingProfileSnapshot.HpCurrent = _pendingProfileSnapshot.HpMax; - } - _player.ApplyProfile(_pendingProfileSnapshot); - } - - if (!Godot.Object.IsInstanceValid(_backpackUi)) - { - _backpackUi = new BackpackUI(); - AddChild(_backpackUi); - _backpackUi.DropRequested += OnBackpackDropRequested; - _backpackUi.UseRequested += OnBackpackUseRequested; - _backpackUi.SyncRequested += OnInventorySyncRequested; - } - - _backpackUi.Initialize(_player); - _backpackUi.SetGameplayVisible(true); - } - - private void OnDifficultySelected(DifficultyLevel difficulty) - { - if (_gameLoadedAlready) - return; - - if (!TryConsumeEntryTicket(difficulty)) - { - GD.Print($"[Main] Difficulty {difficulty} is locked. Missing entry ticket."); - return; - } - - _gameLoadedAlready = true; - - // Save current lobby player state before transitioning to game level - if (Godot.Object.IsInstanceValid(_player)) - { - _pendingProfileSnapshot = _player.BuildProfileSnapshot(); - GD.Print($"[Main] Saved lobby profile snapshot before entering game. Inventory: {_pendingProfileSnapshot.InventoryItems?.Count ?? 0}, HasEquip: {_pendingProfileSnapshot.HasEquippedItemsPayload}"); - - // Sync to backend - TransmitPlayerProfile("enter_dungeon"); - } - - _lobbyManager?.QueueFree(); - _lobbyManager = null; - LoadGameLevel(difficulty); - } - - private void LoadGameLevel(DifficultyLevel difficulty) - { - DestroyPlayableWorld(); - - _map = new Map(); - _map.TileSize = 24; - _map.RoomTileSize = 100; - _map.RoomsX = 2; - _map.RoomsY = 2; - _map.Difficulty = difficulty; - AddChild(_map); - _map.RegenerateWithRandomSeed(); - // Connect map's BoxOpened directly to TreasureChest so Main doesn't need to forward. - _map.Connect("BoxOpened", _chestRef, nameof(TreasureChest.HandleMapBoxOpened)); - - _player = new Player(); - AddChild(_player); - _player.Position = _map.GetSpawnWorldPosition(); - _player.SetMap(_map); - _player.OnDied += OnPlayerDied; - _player.OnRoomEntered += OnPlayerEnteredRoom; - - if (_pendingProfileSnapshot != null) - { - _player.ApplyProfile(_pendingProfileSnapshot); - _pendingProfileSnapshot = null; - } - - _playerHud = new PlayerHud(); - AddChild(_playerHud); - _playerHud.Initialize(_player, _map); - _playerHud.OnSkillSlotPressed += (skillIndex) => - { - _player?.InputHandler?.RequestSkillActivation(skillIndex); - }; - - _miniMapUi = new MiniMapUI(); - AddChild(_miniMapUi); - _miniMapUi.Initialize(_map, _player); - - _backpackUi = new BackpackUI(); - AddChild(_backpackUi); - _backpackUi.Initialize(_player); - _backpackUi.SetGameplayVisible(true); - _backpackUi.DropRequested += OnBackpackDropRequested; - _backpackUi.UseRequested += OnBackpackUseRequested; - - // Show D-pad only during actual gameplay - _mobileInputUI?.ShowDPad(); - _mobileInputUI?.ShowMapButton(true); - _backpackUi.SyncRequested += OnInventorySyncRequested; - - // Spawn monsters based on difficulty - int numMonstersToSpawn = ((int)difficulty + 1) * 100; - var monsterScene = (PackedScene)GD.Load("res://Scenes/Entities/monster.tscn"); - var speedMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/speed_monster.tscn"); - var fireMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/fire_monster.tscn"); - var monsterSpawnRandom = new RandomNumberGenerator(); - monsterSpawnRandom.Randomize(); - for (int i = 0; i < numMonstersToSpawn; i++) - { - int monsterRoll = monsterSpawnRandom.RandiRange(1, 10); - var selectedMonsterScene = monsterScene; - if (monsterRoll == 1 && speedMonsterScene != null) - { - selectedMonsterScene = speedMonsterScene; - } - else if ((monsterRoll == 2 || monsterRoll == 3) && fireMonsterScene != null) - { - selectedMonsterScene = fireMonsterScene; - } - - var monster = (Monster)selectedMonsterScene.Instance(); - monster.SetEnvironment(_map, _player); - AddChild(monster); - _spawnedMonsters.Add(monster); - } - - // Listen for when player reaches the exit to return to lobby - _player.GetCharacterController().ExitReached += ReturnToLobby; - } - - private void ReturnToLobby() - { - GD.Print("[Main] Player reached exit - returning to lobby"); - - // Save map difficulty before destroying it - DifficultyLevel lastMapDiff = _map != null ? _map.Difficulty : DifficultyLevel.Normal; - - bool wasDead = _player == null || _player.Attributes?.HP == null || !_player.Attributes.HP.IsAlive; - - // Restore HP to max before snapshotting so a dead player never carries - // 0 HP into the lobby or the next dungeon run. - if (_player != null) - { - int maxHp = _player.Attributes?.HP?.MaxHP ?? 100; - _player.Attributes?.HP?.SetMaxHPAndCurrentHP(maxHp, maxHp); - } - - // Save the current player state BEFORE destroying the world - _pendingProfileSnapshot = _player?.BuildProfileSnapshot(); - - // Sync to backend so the server has the latest state - TransmitPlayerProfile("return_to_lobby"); - - DestroyPlayableWorld(); - - // Rebuild the lobby for another session - BuildLobby(); - - if (!wasDead && _player != null && Godot.Object.IsInstanceValid(_player)) - { - var coinDrop = new QuestFantasy.Items.CoinDrop(); - coinDrop.Initialize((int)_player.Level, lastMapDiff, 5.0f, _player, 0.5f); - var spawnPos = _lobbyManager != null ? _lobbyManager.GetLobbyMap().GetSpawnWorldPosition() : _player.Position; - coinDrop.Position = spawnPos; - - if (_lobbyManager != null) - { - _lobbyManager.AddChild(coinDrop); - } - else - { - AddChild(coinDrop); - } - GD.PrintS($"[Main] Spawned Return-to-Lobby Coin drop at {coinDrop.Position}"); - } - } - - // Note: Map.BoxOpened is handled directly by TreasureChest.HandleMapBoxOpened now. - - private void OnSceneNodeAdded(Node node) - { - if (node is EquipmentPickup pickup) - { - AttachPickupSignal(pickup); - } - } - - private void AttachPickupSignal(EquipmentPickup pickup) - { - if (pickup == null) - { - return; - } - - if (!pickup.IsConnected(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested))) - { - pickup.Connect(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested)); - } - } - - private void OnPickupRequested(EquipmentPickup pickup) - { - if (_player == null || pickup == null || !Godot.Object.IsInstanceValid(pickup)) - { - return; - } - - EquipmentPickup targetPickup = ResolvePickupTarget(pickup); - if (targetPickup == null || !Godot.Object.IsInstanceValid(targetPickup)) - { - return; - } - - float distance = _player.GlobalPosition.DistanceTo(targetPickup.GlobalPosition); - if (distance > 80f) - { - GD.Print($"[Backpack] Pickup too far (distance: {distance:F1}). Move closer to pick it up."); - return; - } - - if (!(targetPickup.ItemData is Item item)) - { - GD.Print("[Backpack] Pickup ignored: item data missing or invalid."); - return; - } - - if (!_player.AddItem(item)) - { - GD.Print("[Backpack] Pickup failed: inventory add rejected."); - return; - } - - MarkLocalMutation(); - EquipmentPreview.Instance?.HidePreview(); - targetPickup.QueueFree(); - TransmitPlayerProfile("pickup_item"); - } - - private EquipmentPickup ResolvePickupTarget(EquipmentPickup requested) - { - if (requested == null || !Godot.Object.IsInstanceValid(requested)) - { - return null; - } - - EquipmentPickup best = requested; - int bestPriority = GetPickupPriority(requested); - float bestDistance = 0f; - - foreach (Node node in GetTree().GetNodesInGroup("pickup_items")) - { - if (!(node is EquipmentPickup candidate) || !Godot.Object.IsInstanceValid(candidate)) - { - continue; - } - - float distance = requested.GlobalPosition.DistanceTo(candidate.GlobalPosition); - if (distance > 36f) - { - continue; - } - - int priority = GetPickupPriority(candidate); - if (priority > bestPriority || (priority == bestPriority && distance < bestDistance)) - { - best = candidate; - bestPriority = priority; - bestDistance = distance; - } - } - - return best; - } - - private int GetPickupPriority(EquipmentPickup pickup) - { - if (pickup?.ItemData is ConsumableItem consumable) - { - if (consumable.HealAmount > 0) - { - return 30; - } - - return 25; - } - - if (pickup?.ItemData is TicketItem) - { - return 20; - } - - return 10; - } - - private void OnBackpackDropRequested(Item item) - { - if (_player == null || item == null) - { - return; - } - - if (!_player.DiscardItem(item)) - { - GD.Print("[Backpack] Drop failed: item not in inventory."); - return; - } - - MarkLocalMutation(); - var rng = new RandomNumberGenerator(); - rng.Randomize(); - Vector2 dropPosition = _player.Position + new Vector2(rng.RandfRange(-36f, 36f), rng.RandfRange(-24f, 24f)); - LootItemFactory.SpawnPickup(this, item, dropPosition, _equipManagerRef?.PickupSpriteScale ?? 0.5f, "backpack_drop"); - - TransmitPlayerProfile("discard_item"); - } - - private void OnBackpackUseRequested(Item item) - { - MarkLocalMutation(); - TransmitPlayerProfile("use_item"); - } - - private void MarkLocalMutation() - { - _localMutationVersion += 1; - } - - private bool TryConsumeEntryTicket(DifficultyLevel difficulty) - { - if (difficulty == DifficultyLevel.Easy) - { - return true; - } - - if (_player == null) - { - return false; - } - - foreach (Item item in _player.InventoryItems) - { - if (!ItemCatalog.IsTicketForDifficulty(item, difficulty)) - { - continue; - } - - bool removed = _player.RemoveItem(item); - if (removed) - { - MarkLocalMutation(); - GD.Print($"[Main] Consumed {item.Name} to enter {difficulty}."); - TransmitPlayerProfile($"consume_{ItemCatalog.GetTicketItemId(difficulty)}"); - } - return removed; - } - - return false; - } - - private void OnInventorySyncRequested() - { - TransmitPlayerProfile("inventory_sync"); - } -} \ No newline at end of file + [Export] public string BackendBaseUrl = "http://127.0.0.1:8000"; + [Export] public bool EnableMobileInputUI = true; // Force enable virtual D-pad for testing + + private AuthFlowController _authFlowController; + private AuthApiClient _playerDataApiClient; + private SidebarMenu _sidebarMenu; + private PlayerHud _playerHud; + private BackpackUI _backpackUi; + private DeathScreenUI _deathScreen; + private ProgressSyncIndicator _progressIndicator; + private Map _map; + private Player _player; + private MobileInputUI _mobileInputUI; + private MiniMapUI _miniMapUi; + private readonly EquipmentManager _equipManagerRef = new EquipmentManager(); + private readonly TreasureChest _chestRef = new TreasureChest(); + private readonly Godot.Collections.Array _spawnedMonsters = new Godot.Collections.Array(); + private readonly string _syncSessionId = Guid.NewGuid().ToString("N"); + private int _syncSequence = 0; + private int _localMutationVersion = 0; + private int _activeSyncMutationVersion = 0; + private float _checkpointElapsed = 0f; + private Timer _profileFetchTimeoutTimer; + private bool _isProfileFetchPending = false; + private int _activeProfileFetchId = 0; + private PlayerProfileSnapshot _pendingProfileSnapshot; + private LobbyManager _lobbyManager; + private bool _gameLoadedAlready = false; // Guard against loading twice + private const float ProfileFetchTimeoutSeconds = 12f; + + private int _currentMusicIndex = 0; + private readonly string[] _musicFiles = { + "res://Assets/Music/QuestFantasy_Oath2.mp3", + "res://Assets/Music/QuestFantasy_Oath3.mp3", + "res://Assets/Music/QuestFantasy_Oath1.mp3", + "res://Assets/Music/QuestFantasy_Oath4.mp3" + }; + private AudioStreamPlayer _musicPlayer; + + + public override void _Ready() + { + GD.Print("遊戲開始了,正在讀取登入畫面..."); + SetProcess(true); + GetTree().Connect("node_added", this, nameof(OnSceneNodeAdded)); + SetupMobileInputUI(); + SetupSidebarMenu(); + SetupMusic(); + SetupProgressIndicator(); + SetupPlayerDataClient(); + SetupAuthFlowController(); + SetupDeathScreen(); + GD.Print("登入成功..."); + } + + public override void _ExitTree() + { + if (GetTree() != null && GetTree().IsConnected("node_added", this, nameof(OnSceneNodeAdded))) + { + GetTree().Disconnect("node_added", this, nameof(OnSceneNodeAdded)); + } + } + + private void SetupProgressIndicator() + { + _progressIndicator = new ProgressSyncIndicator(); + AddChild(_progressIndicator); + _progressIndicator.SetState(ProgressSyncIndicator.SyncState.Hidden); + + if (_equipManagerRef.GetParent() == null) + { + AddChild(_equipManagerRef); + } + + if (_chestRef.GetParent() == null) + { + AddChild(_chestRef); + } + + // Ensure EquipmentPreview exists in the scene so pickups can call EquipmentPreview.Instance + if (EquipmentPreview.Instance == null) + { + var preview = new EquipmentPreview(); + AddChild(preview); + } + + // Ensure InteractionButtonUI exists in the scene + if (InteractionButtonUI.Instance == null) + { + var interactBtn = new InteractionButtonUI(); + AddChild(interactBtn); + } + } + + public override void _Process(float delta) + { + if (_player == null) + { + return; + } + + if (_authFlowController?.CurrentSession == null || !_authFlowController.CurrentSession.IsValid) + { + return; + } + + _checkpointElapsed += delta; + if (_checkpointElapsed >= 25f) + { + _checkpointElapsed = 0f; + TransmitPlayerProfile("checkpoint"); + } + } + + private void BuildPlayablePrototype(PlayerProfileSnapshot profileSnapshot) + { + GetTree().Paused = false; + DestroyPlayableWorld(); + _pendingProfileSnapshot = profileSnapshot; + EnsureLobbyBackpackContext(); + _sidebarMenu?.SetMenuVisible(true); + // Build lobby instead of directly loading a game map + BuildLobby(); + + if (_musicPlayer != null && !_musicPlayer.Playing) + { + PlayCurrentMusic(); + } + } + + + private void SetupAuthFlowController() + { + _authFlowController = new AuthFlowController + { + BackendBaseUrl = BackendBaseUrl, + PauseMode = PauseModeEnum.Process + }; + AddChild(_authFlowController); + _authFlowController.Authenticated += OnAuthenticated; + _authFlowController.LoggedOut += HandleLoggedOut; + _authFlowController.AuthViewShown += () => _mobileInputUI?.HideDPad(); + } + + private void SetupPlayerDataClient() + { + _playerDataApiClient = new AuthApiClient + { + BackendBaseUrl = BackendBaseUrl, + PauseMode = PauseModeEnum.Process, + }; + AddChild(_playerDataApiClient); + + _profileFetchTimeoutTimer = new Timer + { + OneShot = true, + WaitTime = ProfileFetchTimeoutSeconds, + PauseMode = PauseModeEnum.Process, + }; + AddChild(_profileFetchTimeoutTimer); + _profileFetchTimeoutTimer.Connect("timeout", this, nameof(OnProfileFetchTimeout)); + } + + private void OnAuthenticated() + { + // If logout paused the tree, profile HTTP callbacks can stall forever. + GetTree().Paused = false; + + string token = _authFlowController?.CurrentSession?.Token; + if (string.IsNullOrWhiteSpace(token) || _playerDataApiClient == null) + { + GD.Print("[ProgressSync] No token/client available. Building world with local defaults."); + BuildPlayablePrototype(null); + return; + } + + GD.Print("[ProgressSync] Fetching player profile before entering level..."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Loading); + _activeProfileFetchId += 1; + int requestId = _activeProfileFetchId; + _isProfileFetchPending = true; + _profileFetchTimeoutTimer?.Start(ProfileFetchTimeoutSeconds); + + if (!_playerDataApiClient.FetchPlayerProfile(token, result => OnPlayerProfileFetched(requestId, result))) + { + GD.PrintErr("[Main] Failed to fetch player profile. Starting with local defaults."); + GD.Print("[ProgressSync] Profile fetch request failed to send. Using local defaults."); + _isProfileFetchPending = false; + _profileFetchTimeoutTimer?.Stop(); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + BuildPlayablePrototype(null); + } + } + + private void OnPlayerProfileFetched(int requestId, AuthApiResult result) + { + if (!_isProfileFetchPending || requestId != _activeProfileFetchId) + { + GD.Print($"[ProgressSync] Ignored stale profile response. requestId={requestId}, active={_activeProfileFetchId}, pending={_isProfileFetchPending}."); + return; + } + + _isProfileFetchPending = false; + _profileFetchTimeoutTimer?.Stop(); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + if (!result.NetworkOk || !result.IsSuccessStatus(200)) + { + GD.PrintErr("[Main] Player profile fetch failed. Starting with local defaults."); + GD.Print($"[ProgressSync] Profile fetch failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}."); + BuildPlayablePrototype(null); + return; + } + + var snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); + GD.Print($"[ProgressSync] Profile loaded. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}, Skills={snapshot.Skills.Count}."); + BuildPlayablePrototype(snapshot); + } + + private void OnProfileFetchTimeout() + { + if (!_isProfileFetchPending) + { + return; + } + + _isProfileFetchPending = false; + GD.PrintErr($"[ProgressSync] Profile fetch timed out after {ProfileFetchTimeoutSeconds}s. Using local defaults."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + BuildPlayablePrototype(null); + } + + private void SetupSidebarMenu() + { + _sidebarMenu = new SidebarMenu(); + AddChild(_sidebarMenu); + _sidebarMenu.SetMenuVisible(false); + _sidebarMenu.AddMenuItem("change_music", "Change Music", OnChangeMusicPressed); + _sidebarMenu.AddMenuItem("logout", "Logout", OnLogoutPressed); + } + + private void SetupMusic() + { + _musicPlayer = new AudioStreamPlayer(); + _musicPlayer.PauseMode = PauseModeEnum.Process; // Keep playing even if game pauses + AddChild(_musicPlayer); + } + + private void PlayCurrentMusic() + { + if (_musicPlayer == null) return; + + var stream = GD.Load(_musicFiles[_currentMusicIndex]); + if (stream != null) + { + _musicPlayer.Stream = stream; + _musicPlayer.Play(); + } + else + { + GD.PrintErr($"[Main] Failed to load audio stream: {_musicFiles[_currentMusicIndex]}"); + } + } + + private void OnChangeMusicPressed() + { + _currentMusicIndex = (_currentMusicIndex + 1) % _musicFiles.Length; + PlayCurrentMusic(); + } + + private void SetupMobileInputUI() + { + // Create mobile input UI once for the entire game lifetime + bool shouldEnableMobileUI = EnableMobileInputUI || OS.HasTouchscreenUiHint(); + if (shouldEnableMobileUI) + { + _mobileInputUI = new MobileInputUI(); + AddChild(_mobileInputUI); + _mobileInputUI.HideDPad(); + GD.Print("[Main] Mobile input UI enabled globally for touch controls"); + } + } + + private void SetupDeathScreen() + { + _deathScreen = new DeathScreenUI(); + AddChild(_deathScreen); + _deathScreen.OnRespawnClicked += () => + { + _deathScreen.SetVisible(false); + if (_playerHud != null) _playerHud.SetVisible(true); + _player?.Respawn(); + }; + _deathScreen.OnExitClicked += () => + { + _deathScreen.SetVisible(false); + ReturnToLobby(); + }; + } + + private void OnLogoutPressed() + { + TransmitPlayerProfile("logout"); + _authFlowController?.RequestLogout(); + } + + private void OnPlayerDied() + { + TransmitPlayerProfile("die"); + if (_playerHud != null) _playerHud.SetVisible(false); + _deathScreen?.SetVisible(true); + } + + private void OnPlayerEnteredRoom(Vector2 roomIndex, string reason) + { + string syncReason = string.IsNullOrWhiteSpace(reason) ? "room_enter" : reason; + GD.Print($"[ProgressSync] Room entry autosave trigger at ({roomIndex.x}, {roomIndex.y}), reason={syncReason}."); + TransmitPlayerProfile(syncReason); + } + + private void HandleLoggedOut() + { + _isProfileFetchPending = false; + _profileFetchTimeoutTimer?.Stop(); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + _mobileInputUI?.HideDPad(); + DestroyPlayableWorld(); + _gameLoadedAlready = false; + _sidebarMenu?.SetMenuVisible(false); + GetTree().Paused = true; + _sidebarMenu?.SetMenuVisible(false); + _musicPlayer?.Stop(); + + // Clean up any active gameplay/lobby scenes + _lobbyManager?.QueueFree(); + _lobbyManager = null; + _map?.QueueFree(); + _map = null; + _player = null; + + GD.Print("[Main] Logged out - all game states cleaned"); + } + + private void TransmitPlayerProfile(string reason) + { + if (_player == null || _playerDataApiClient == null || _playerDataApiClient.IsBusy) + { + GD.Print($"[ProgressSync] Skipped send. reason={reason}, playerReady={_player != null}, clientReady={_playerDataApiClient != null}, clientBusy={_playerDataApiClient?.IsBusy}."); + return; + } + + string token = _authFlowController?.CurrentSession?.Token; + if (string.IsNullOrWhiteSpace(token)) + { + GD.Print($"[ProgressSync] Skipped send. reason={reason}, missing auth token."); + return; + } + + _syncSequence += 1; + PlayerProfileSnapshot snapshot = _player.BuildProfileSnapshot(); + _activeSyncMutationVersion = _localMutationVersion; + var payload = snapshot.ToUpdatePayload(_syncSessionId, _syncSequence); + payload["reason"] = reason; + GD.Print($"[ProgressSync] Sending profile. reason={reason}, seq={_syncSequence}, level={snapshot.Level}, hp={snapshot.HpCurrent}/{snapshot.HpMax}, exp={snapshot.Experience}, gold={snapshot.Gold}."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Saving); + + if (!_playerDataApiClient.UpdatePlayerProfile(token, payload, OnPlayerProfileSynced)) + { + GD.PrintErr($"[ProgressSync] Send failed to start. reason={reason}, seq={_syncSequence}."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + _syncSequence -= 1; + } + } + + private void OnPlayerProfileSynced(AuthApiResult result) + { + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + if (!result.NetworkOk || !result.IsSuccessStatus(200) || _player == null) + { + GD.PrintErr($"[ProgressSync] Sync failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}, playerReady={_player != null}."); + return; + } + + PlayerProfileSnapshot snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); + if (!snapshot.Ignored) + { + if (_activeSyncMutationVersion < _localMutationVersion) + { + GD.Print($"[ProgressSync] Ignored stale sync response. syncMutation={_activeSyncMutationVersion}, localMutation={_localMutationVersion}."); + TransmitPlayerProfile("resync_after_local_change"); + return; + } + + GD.Print($"[ProgressSync] Sync applied. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}."); + _player.ApplyProfile(snapshot); + return; + } + + GD.Print($"[ProgressSync] Sync ignored by server. reason={snapshot.IgnoreReason}."); + } + + private void DestroyPlayableWorld() + { + foreach (Node child in GetChildren()) + { + if (child is ExpPickup || child is QuestFantasy.Items.CoinDrop || child is EquipmentPickup) + { + child.QueueFree(); + } + } + + for (int i = 0; i < _spawnedMonsters.Count; i++) + { + if (Godot.Object.IsInstanceValid(_spawnedMonsters[i])) + { + _spawnedMonsters[i].QueueFree(); + } + } + _spawnedMonsters.Clear(); + + if (Godot.Object.IsInstanceValid(_miniMapUi)) + { + _miniMapUi.QueueFree(); + } + _miniMapUi = null; + + if (Godot.Object.IsInstanceValid(_player)) + { + _player.OnDied -= OnPlayerDied; + _player.OnRoomEntered -= OnPlayerEnteredRoom; + _player.QueueFree(); + } + _player = null; + + if (Godot.Object.IsInstanceValid(_playerHud)) + { + _playerHud.QueueFree(); + } + _playerHud = null; + + if (Godot.Object.IsInstanceValid(_backpackUi)) + { + _backpackUi.DropRequested -= OnBackpackDropRequested; + _backpackUi.UseRequested -= OnBackpackUseRequested; + _backpackUi.SyncRequested -= OnInventorySyncRequested; + _backpackUi.QueueFree(); + } + _backpackUi = null; + + // DO NOT destroy _mobileInputUI - it should persist throughout the game + // Hide it when leaving gameplay; it will be re-shown only when entering a game level + _mobileInputUI?.HideDPad(); + + if (Godot.Object.IsInstanceValid(_map)) + { + _map.QueueFree(); + } + _map = null; + _gameLoadedAlready = false; + + } + private void BuildLobby() + { + EnsureLobbyBackpackContext(); + + _lobbyManager = new LobbyManager(); + _lobbyManager.Initialize(_player, _playerDataApiClient, _authFlowController?.CurrentSession?.Token); + AddChild(_lobbyManager); + _lobbyManager.DifficultySelected += OnDifficultySelected; + + // Show D-pad in the lobby, but hide map button + _mobileInputUI?.ShowDPad(); + _mobileInputUI?.ShowMapButton(false); + _lobbyManager.SyncRequested += OnInventorySyncRequested; + _lobbyManager.ClassChangeRequested += OnClassChangeRequested; + } + + private void OnClassChangeRequested(QuestFantasy.Core.Data.PlayerClass newClass) + { + GD.Print($"[Main] Player changed class to {newClass}. Syncing profile to backend."); + TransmitPlayerProfile("class_change"); + } + + private void EnsureLobbyBackpackContext() + { + if (!Godot.Object.IsInstanceValid(_player)) + { + _player = new Player(); + AddChild(_player); + } + + _player.Visible = false; + + if (_pendingProfileSnapshot != null) + { + if (_pendingProfileSnapshot.HpCurrent <= 0) + { + _pendingProfileSnapshot.HpCurrent = _pendingProfileSnapshot.HpMax; + } + _player.ApplyProfile(_pendingProfileSnapshot); + } + + if (!Godot.Object.IsInstanceValid(_backpackUi)) + { + _backpackUi = new BackpackUI(); + AddChild(_backpackUi); + _backpackUi.DropRequested += OnBackpackDropRequested; + _backpackUi.UseRequested += OnBackpackUseRequested; + _backpackUi.SyncRequested += OnInventorySyncRequested; + } + + _backpackUi.Initialize(_player); + _backpackUi.SetGameplayVisible(true); + } + + private void OnDifficultySelected(DifficultyLevel difficulty) + { + if (_gameLoadedAlready) + return; + + if (!TryConsumeEntryTicket(difficulty)) + { + GD.Print($"[Main] Difficulty {difficulty} is locked. Missing entry ticket."); + return; + } + + _gameLoadedAlready = true; + + // Save current lobby player state before transitioning to game level + if (Godot.Object.IsInstanceValid(_player)) + { + _pendingProfileSnapshot = _player.BuildProfileSnapshot(); + GD.Print($"[Main] Saved lobby profile snapshot before entering game. Inventory: {_pendingProfileSnapshot.InventoryItems?.Count ?? 0}, HasEquip: {_pendingProfileSnapshot.HasEquippedItemsPayload}"); + + // Sync to backend + TransmitPlayerProfile("enter_dungeon"); + } + + _lobbyManager?.QueueFree(); + _lobbyManager = null; + LoadGameLevel(difficulty); + } + + private void LoadGameLevel(DifficultyLevel difficulty) + { + DestroyPlayableWorld(); + + _map = new Map(); + _map.TileSize = 24; + _map.RoomTileSize = 100; + _map.RoomsX = 2; + _map.RoomsY = 2; + _map.Difficulty = difficulty; + AddChild(_map); + _map.RegenerateWithRandomSeed(); + // Connect map's BoxOpened directly to TreasureChest so Main doesn't need to forward. + _map.Connect("BoxOpened", _chestRef, nameof(TreasureChest.HandleMapBoxOpened)); + + _player = new Player(); + AddChild(_player); + _player.Position = _map.GetSpawnWorldPosition(); + _player.SetMap(_map); + _player.OnDied += OnPlayerDied; + _player.OnRoomEntered += OnPlayerEnteredRoom; + + if (_pendingProfileSnapshot != null) + { + _player.ApplyProfile(_pendingProfileSnapshot); + _pendingProfileSnapshot = null; + } + + _playerHud = new PlayerHud(); + AddChild(_playerHud); + _playerHud.Initialize(_player, _map); + _playerHud.OnSkillSlotPressed += (skillIndex) => + { + _player?.InputHandler?.RequestSkillActivation(skillIndex); + }; + + _miniMapUi = new MiniMapUI(); + AddChild(_miniMapUi); + _miniMapUi.Initialize(_map, _player); + + _backpackUi = new BackpackUI(); + AddChild(_backpackUi); + _backpackUi.Initialize(_player); + _backpackUi.SetGameplayVisible(true); + _backpackUi.DropRequested += OnBackpackDropRequested; + _backpackUi.UseRequested += OnBackpackUseRequested; + + // Show D-pad only during actual gameplay + _mobileInputUI?.ShowDPad(); + _mobileInputUI?.ShowMapButton(true); + _backpackUi.SyncRequested += OnInventorySyncRequested; + + // Spawn monsters based on difficulty + int numMonstersToSpawn = ((int)difficulty + 1) * 100; + var monsterScene = (PackedScene)GD.Load("res://Scenes/Entities/monster.tscn"); + var speedMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/speed_monster.tscn"); + var fireMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/fire_monster.tscn"); + var monsterSpawnRandom = new RandomNumberGenerator(); + monsterSpawnRandom.Randomize(); + for (int i = 0; i < numMonstersToSpawn; i++) + { + int monsterRoll = monsterSpawnRandom.RandiRange(1, 10); + var selectedMonsterScene = monsterScene; + if (monsterRoll == 1 && speedMonsterScene != null) + { + selectedMonsterScene = speedMonsterScene; + } + else if ((monsterRoll == 2 || monsterRoll == 3) && fireMonsterScene != null) + { + selectedMonsterScene = fireMonsterScene; + } + + var monster = (Monster)selectedMonsterScene.Instance(); + monster.SetEnvironment(_map, _player); + AddChild(monster); + _spawnedMonsters.Add(monster); + } + + // Listen for when player reaches the exit to return to lobby + _player.GetCharacterController().ExitReached += ReturnToLobby; + } + + private void ReturnToLobby() + { + GD.Print("[Main] Player reached exit - returning to lobby"); + + // Save map difficulty before destroying it + DifficultyLevel lastMapDiff = _map != null ? _map.Difficulty : DifficultyLevel.Normal; + + bool wasDead = _player == null || _player.Attributes?.HP == null || !_player.Attributes.HP.IsAlive; + + // Restore HP to max before snapshotting so a dead player never carries + // 0 HP into the lobby or the next dungeon run. + if (_player != null) + { + int maxHp = _player.Attributes?.HP?.MaxHP ?? 100; + _player.Attributes?.HP?.SetMaxHPAndCurrentHP(maxHp, maxHp); + } + + // Save the current player state BEFORE destroying the world + _pendingProfileSnapshot = _player?.BuildProfileSnapshot(); + + // Sync to backend so the server has the latest state + TransmitPlayerProfile("return_to_lobby"); + + DestroyPlayableWorld(); + + // Rebuild the lobby for another session + BuildLobby(); + + if (!wasDead && _player != null && Godot.Object.IsInstanceValid(_player)) + { + var coinDrop = new QuestFantasy.Items.CoinDrop(); + coinDrop.Initialize((int)_player.Level, lastMapDiff, 5.0f, _player, 0.5f); + var spawnPos = _lobbyManager != null ? _lobbyManager.GetLobbyMap().GetSpawnWorldPosition() : _player.Position; + coinDrop.Position = spawnPos; + + if (_lobbyManager != null) + { + _lobbyManager.AddChild(coinDrop); + } + else + { + AddChild(coinDrop); + } + GD.PrintS($"[Main] Spawned Return-to-Lobby Coin drop at {coinDrop.Position}"); + } + } + + // Note: Map.BoxOpened is handled directly by TreasureChest.HandleMapBoxOpened now. + + private void OnSceneNodeAdded(Node node) + { + if (node is EquipmentPickup pickup) + { + AttachPickupSignal(pickup); + } + } + + private void AttachPickupSignal(EquipmentPickup pickup) + { + if (pickup == null) + { + return; + } + + if (!pickup.IsConnected(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested))) + { + pickup.Connect(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested)); + } + } + + private void OnPickupRequested(EquipmentPickup pickup) + { + if (_player == null || pickup == null || !Godot.Object.IsInstanceValid(pickup)) + { + return; + } + + EquipmentPickup targetPickup = ResolvePickupTarget(pickup); + if (targetPickup == null || !Godot.Object.IsInstanceValid(targetPickup)) + { + return; + } + + float distance = _player.GlobalPosition.DistanceTo(targetPickup.GlobalPosition); + if (distance > 80f) + { + GD.Print($"[Backpack] Pickup too far (distance: {distance:F1}). Move closer to pick it up."); + return; + } + + if (!(targetPickup.ItemData is Item item)) + { + GD.Print("[Backpack] Pickup ignored: item data missing or invalid."); + return; + } + + if (!_player.AddItem(item)) + { + GD.Print("[Backpack] Pickup failed: inventory add rejected."); + return; + } + + MarkLocalMutation(); + EquipmentPreview.Instance?.HidePreview(); + targetPickup.QueueFree(); + TransmitPlayerProfile("pickup_item"); + } + + private EquipmentPickup ResolvePickupTarget(EquipmentPickup requested) + { + if (requested == null || !Godot.Object.IsInstanceValid(requested)) + { + return null; + } + + EquipmentPickup best = requested; + int bestPriority = GetPickupPriority(requested); + float bestDistance = 0f; + + foreach (Node node in GetTree().GetNodesInGroup("pickup_items")) + { + if (!(node is EquipmentPickup candidate) || !Godot.Object.IsInstanceValid(candidate)) + { + continue; + } + + float distance = requested.GlobalPosition.DistanceTo(candidate.GlobalPosition); + if (distance > 36f) + { + continue; + } + + int priority = GetPickupPriority(candidate); + if (priority > bestPriority || (priority == bestPriority && distance < bestDistance)) + { + best = candidate; + bestPriority = priority; + bestDistance = distance; + } + } + + return best; + } + + private int GetPickupPriority(EquipmentPickup pickup) + { + if (pickup?.ItemData is ConsumableItem consumable) + { + if (consumable.HealAmount > 0) + { + return 30; + } + + return 25; + } + + if (pickup?.ItemData is TicketItem) + { + return 20; + } + + return 10; + } + + private void OnBackpackDropRequested(Item item) + { + if (_player == null || item == null) + { + return; + } + + if (!_player.DiscardItem(item)) + { + GD.Print("[Backpack] Drop failed: item not in inventory."); + return; + } + + MarkLocalMutation(); + var rng = new RandomNumberGenerator(); + rng.Randomize(); + Vector2 dropPosition = _player.Position + new Vector2(rng.RandfRange(-36f, 36f), rng.RandfRange(-24f, 24f)); + LootItemFactory.SpawnPickup(this, item, dropPosition, _equipManagerRef?.PickupSpriteScale ?? 0.5f, "backpack_drop"); + + TransmitPlayerProfile("discard_item"); + } + + private void OnBackpackUseRequested(Item item) + { + MarkLocalMutation(); + TransmitPlayerProfile("use_item"); + } + + private void MarkLocalMutation() + { + _localMutationVersion += 1; + } + + private bool TryConsumeEntryTicket(DifficultyLevel difficulty) + { + if (difficulty == DifficultyLevel.Easy) + { + return true; + } + + if (_player == null) + { + return false; + } + + foreach (Item item in _player.InventoryItems) + { + if (!ItemCatalog.IsTicketForDifficulty(item, difficulty)) + { + continue; + } + + bool removed = _player.RemoveItem(item); + if (removed) + { + MarkLocalMutation(); + GD.Print($"[Main] Consumed {item.Name} to enter {difficulty}."); + TransmitPlayerProfile($"consume_{ItemCatalog.GetTicketItemId(difficulty)}"); + } + return removed; + } + + return false; + } + + private void OnInventorySyncRequested() + { + TransmitPlayerProfile("inventory_sync"); + } +} diff --git a/Scripts/Prototype/LobbyManager.cs b/Scripts/Prototype/LobbyManager.cs index 97aebfd..e85d180 100644 --- a/Scripts/Prototype/LobbyManager.cs +++ b/Scripts/Prototype/LobbyManager.cs @@ -313,6 +313,20 @@ private void SetupClassSelectUI() _classSelectUI = new ClassSelectUI(); AddChild(_classSelectUI); _classSelectUI.ClassSelected += OnClassSelected; + _classSelectUI.SkillLoadoutChanged += OnSkillLoadoutChanged; + } + + private void OnSkillLoadoutChanged(List orderedSkillIds) + { + Player target = _player; + if (target == null) + { + return; + } + + target.SetEquippedSkills(orderedSkillIds); + GD.Print($"[Lobby] Applied skill loadout to {target.Name}"); + SyncRequested?.Invoke(); } private void OnNpcClassChangeRequested(NPC npc, Player player) @@ -325,8 +339,9 @@ private void OnNpcClassChangeRequested(NPC npc, Player player) Player target = player ?? _player; PlayerClass current = target?.PlayerClass ?? PlayerClass.Adventurer; int level = (int)(target?.Level ?? 1); + var equippedSkills = target?.GetEquippedSkillIds(); - _classSelectUI.Show(current, level); + _classSelectUI.Show(current, level, equippedSkills); GD.Print($"[Lobby] Class selector opened by {npc.EntityName}. Current class: {current}, Player Level: {level}"); } diff --git a/Scripts/UI/ClassSelectUI.cs b/Scripts/UI/ClassSelectUI.cs index a4a0dea..a49926c 100644 --- a/Scripts/UI/ClassSelectUI.cs +++ b/Scripts/UI/ClassSelectUI.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; using Godot; @@ -6,12 +8,6 @@ namespace QuestFantasy.UI { - /// - /// Fullscreen overlay panel presented when the player interacts with the "Previous Hero" NPC. - /// Extends CanvasLayer (same as DifficultySelectionUI) so it is always fixed to screen-space, - /// independent of the game camera position. - /// Fires when the player confirms a choice. - /// public class ClassSelectUI : CanvasLayer { // ── Layout constants ────────────────────────────────────────────── @@ -40,20 +36,35 @@ public class ClassSelectUI : CanvasLayer private static readonly Color BtnConfirmHover = new Color(0.30f, 0.65f, 1.00f, 1f); private static readonly Color BtnCloseBg = new Color(0.20f, 0.22f, 0.28f, 1f); private static readonly Color BtnCloseHover = new Color(0.30f, 0.33f, 0.42f, 1f); + + // Tab colors + private static readonly Color TabNormal = new Color(0.15f, 0.18f, 0.25f, 1f); + private static readonly Color TabSelected = new Color(0.25f, 0.45f, 0.85f, 1f); // ── State ───────────────────────────────────────────────────────── private PlayerClass _currentClass = PlayerClass.Adventurer; private PlayerClass _selectedClass = PlayerClass.Adventurer; private int _playerLevel = 1; + + // Skill state + private List _equippedSkillIds = new List(); + private ReadOnlyCollection _availableSkills; - // Per-card panel references kept for highlight refresh (no node-path lookup needed) - private Panel[] _cardPanels; - - // Root container — shown/hidden as a whole + // UI References private Control _root; private Label _subtitleLabel; + private Control _classTabContent; + private Control _skillTabContent; + private Button _tabClassBtn; + private Button _tabSkillsBtn; + private Panel[] _cardPanels; + + // Skill UI References + private Label[] _skillSlotLabels; + private Panel[] _skillCardPanels; public event Action ClassSelected; + public event Action> SkillLoadoutChanged; private static readonly PlayerClass[] AllClasses = { @@ -90,23 +101,35 @@ private static string GetClassEmoji(PlayerClass cls) public override void _Ready() { - // Keep receiving input even when game tree is paused PauseMode = PauseModeEnum.Process; BuildLayout(); _root.Visible = false; } - /// Opens the panel, pre-selecting the player's current class. - public void Show(PlayerClass currentClass, int playerLevel) + public void Show(PlayerClass currentClass, int playerLevel, IReadOnlyList currentEquippedSkills = null) { _currentClass = currentClass; _selectedClass = currentClass; _playerLevel = playerLevel; + + _equippedSkillIds.Clear(); + if (currentEquippedSkills != null) + { + _equippedSkillIds.AddRange(currentEquippedSkills); + } + else + { + _equippedSkillIds.AddRange(PlayerClassData.GetDefaultSkillLoadout(_currentClass)); + } + + _availableSkills = PlayerClassData.GetAllSkillDefinitions(_currentClass); + if (_subtitleLabel != null) { _subtitleLabel.Text = $"Different classes unlock different skills. You can change class again any time. (Level Requirement: Lv.{playerLevel}/{GameConstants.CLASS_CHANGE_MIN_LEVEL})"; } RefreshCardHighlights(); + SwitchTab(0); _root.Visible = true; } @@ -122,13 +145,11 @@ public void Show(PlayerClass currentClass, int playerLevel) private void BuildLayout() { - // Full-screen Control root — anchored to entire viewport via preset _root = new Control(); _root.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); _root.MouseFilter = Control.MouseFilterEnum.Stop; AddChild(_root); - // Dim overlay var overlay = new ColorRect { Color = BgOverlay, @@ -137,10 +158,8 @@ private void BuildLayout() overlay.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); _root.AddChild(overlay); - // Centred panel container var panel = new Panel(); panel.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Center); - // Offset by half the panel size so it is perfectly centred panel.MarginLeft = -PanelWidth / 2f; panel.MarginTop = -PanelHeight / 2f; panel.MarginRight = PanelWidth / 2f; @@ -148,24 +167,49 @@ private void BuildLayout() panel.AddStyleboxOverride("panel", MakePanelStyle()); _root.AddChild(panel); - // ── Header ────────────────────────────────────────────────── + // Tabs + var tabsBox = new HBoxContainer(); + tabsBox.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); + tabsBox.MarginLeft = 24f; + tabsBox.MarginRight = -24f; + tabsBox.MarginTop = 16f; + tabsBox.MarginBottom = 50f; + panel.AddChild(tabsBox); + + _tabClassBtn = CreateStyledButton("⚡ Change Class", TabSelected, TabSelected); + _tabClassBtn.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + _tabClassBtn.Connect("pressed", this, nameof(OnTabPressed), new Godot.Collections.Array { 0 }); + tabsBox.AddChild(_tabClassBtn); + + _tabSkillsBtn = CreateStyledButton("🗡 Skills", TabNormal, TabSelected); + _tabSkillsBtn.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + _tabSkillsBtn.Connect("pressed", this, nameof(OnTabPressed), new Godot.Collections.Array { 1 }); + tabsBox.AddChild(_tabSkillsBtn); + + _classTabContent = new Control(); + _classTabContent.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); + _classTabContent.MarginTop = 50f; + panel.AddChild(_classTabContent); + + _skillTabContent = new Control(); + _skillTabContent.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); + _skillTabContent.MarginTop = 50f; + _skillTabContent.Visible = false; + panel.AddChild(_skillTabContent); + + BuildClassTabContent(); + BuildSkillTabContent(); + } + + private void BuildClassTabContent() + { var header = new VBoxContainer(); header.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); header.MarginLeft = 24f; header.MarginRight = -24f; header.MarginTop = 16f; header.MarginBottom = HeaderHeight; - panel.AddChild(header); - - var title = new Label - { - Text = "⚡ Choose Your Class", - Align = Label.AlignEnum.Center, - RectMinSize = new Vector2(0f, 34f), - MouseFilter = Control.MouseFilterEnum.Ignore, - }; - title.AddColorOverride("font_color", HeaderColor); - header.AddChild(title); + _classTabContent.AddChild(header); _subtitleLabel = new Label { @@ -178,7 +222,6 @@ private void BuildLayout() _subtitleLabel.AddColorOverride("font_color", SubHeaderColor); header.AddChild(_subtitleLabel); - // ── Cards row ─────────────────────────────────────────────── float totalCardsW = AllClasses.Length * CardWidth + (AllClasses.Length - 1) * CardSpacing; float cardsLeft = (PanelWidth - totalCardsW) / 2f; float cardsTop = HeaderHeight + 8f; @@ -190,23 +233,74 @@ private void BuildLayout() PlayerClass cls = AllClasses[i]; float cardX = cardsLeft + i * (CardWidth + CardSpacing); var card = BuildClassCard(cls, cardX, cardsTop, i); - panel.AddChild(card); + _classTabContent.AddChild(card); } - // ── Footer buttons ─────────────────────────────────────────── - float footerY = PanelHeight - FooterHeight + 4f; + float footerY = PanelHeight - FooterHeight - 50f; - var confirmBtn = CreateStyledButton("✔ Confirm Class", BtnConfirmBg, BtnConfirmHover); + var confirmBtn = CreateStyledButton("✔ Confirm Class", BtnConfirmBg, BtnConfirmHover); confirmBtn.RectPosition = new Vector2(PanelWidth / 2f - 152f, footerY); confirmBtn.RectMinSize = new Vector2(142f, 42f); confirmBtn.Connect("pressed", this, nameof(OnConfirmPressed)); - panel.AddChild(confirmBtn); + _classTabContent.AddChild(confirmBtn); - var closeBtn = CreateStyledButton("✖ Cancel", BtnCloseBg, BtnCloseHover); + var closeBtn = CreateStyledButton("✖ Cancel", BtnCloseBg, BtnCloseHover); closeBtn.RectPosition = new Vector2(PanelWidth / 2f + 14f, footerY); closeBtn.RectMinSize = new Vector2(112f, 42f); closeBtn.Connect("pressed", this, nameof(OnClosePressed)); - panel.AddChild(closeBtn); + _classTabContent.AddChild(closeBtn); + } + + private void BuildSkillTabContent() + { + // Skill slots (Top) + var slotsBox = new HBoxContainer(); + slotsBox.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); + slotsBox.MarginLeft = 50f; + slotsBox.MarginRight = -50f; + slotsBox.MarginTop = 16f; + slotsBox.MarginBottom = 76f; + slotsBox.Alignment = BoxContainer.AlignMode.Center; + slotsBox.AddConstantOverride("separation", 20); + _skillTabContent.AddChild(slotsBox); + + _skillSlotLabels = new Label[3]; + for (int i = 0; i < 3; i++) + { + var slotPanel = new Panel(); + slotPanel.RectMinSize = new Vector2(200f, 60f); + slotPanel.AddStyleboxOverride("panel", MakeCardStyle(new Color(0.12f, 0.15f, 0.22f, 1f), new Color(0.3f, 0.4f, 0.6f, 1f), 2)); + + var lbl = new Label + { + Text = $"Slot {i + 1}: Empty", + Align = Label.AlignEnum.Center, + Valign = Label.VAlign.Center, + RectMinSize = new Vector2(200f, 60f) + }; + slotPanel.AddChild(lbl); + _skillSlotLabels[i] = lbl; + slotsBox.AddChild(slotPanel); + } + + // Skill grid (Middle) + // We use a container that will hold the skill cards based on current class + var gridBox = new HBoxContainer(); + gridBox.Name = "SkillGrid"; + gridBox.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); + gridBox.MarginTop = 100f; + gridBox.MarginBottom = 340f; + gridBox.Alignment = BoxContainer.AlignMode.Center; + gridBox.AddConstantOverride("separation", (int)CardSpacing); + _skillTabContent.AddChild(gridBox); + + // Footer (Bottom) + float footerY = PanelHeight - FooterHeight - 50f; + var saveBtn = CreateStyledButton("✔ Save Loadout", BtnConfirmBg, BtnConfirmHover); + saveBtn.RectPosition = new Vector2(PanelWidth / 2f - 71f, footerY); + saveBtn.RectMinSize = new Vector2(142f, 42f); + saveBtn.Connect("pressed", this, nameof(OnSaveLoadoutPressed)); + _skillTabContent.AddChild(saveBtn); } // ── Card builder ────────────────────────────────────────────────── @@ -220,13 +314,11 @@ private Panel BuildClassCard(PlayerClass cls, float x, float y, int index) card.RectMinSize = new Vector2(CardWidth, CardHeight); card.AddStyleboxOverride("panel", MakeCardStyle(CardBgNormal, CardBorderNormal)); - // Accent stripe at the very top var stripe = new ColorRect { Color = accent, MouseFilter = Control.MouseFilterEnum.Ignore }; stripe.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); stripe.MarginBottom = -(CardHeight - 6f); card.AddChild(stripe); - // Content VBox var vbox = new VBoxContainer(); vbox.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); vbox.MarginLeft = 8f; @@ -242,7 +334,6 @@ private Panel BuildClassCard(PlayerClass cls, float x, float y, int index) vbox.AddChild(MakeLabel("Skills:", 16f, SubHeaderColor, center: true)); vbox.AddChild(MakeLabel(PlayerClassData.GetSkillListText(cls), 30f, SkillLabelColor, center: true, wrap: true)); - // Transparent click-receiver over the whole card var btn = new Button { Text = string.Empty, Flat = true }; btn.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); foreach (var s in new[] { "normal", "hover", "pressed", "focus" }) @@ -256,6 +347,37 @@ private Panel BuildClassCard(PlayerClass cls, float x, float y, int index) return card; } + private Panel BuildSkillCard(SkillDefinition def) + { + var card = new Panel(); + card.RectMinSize = new Vector2(CardWidth, CardHeight); + + var vbox = new VBoxContainer(); + vbox.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); + vbox.MarginLeft = 8f; + vbox.MarginRight = -8f; + vbox.MarginTop = 14f; + vbox.MarginBottom = -8f; + card.AddChild(vbox); + + vbox.AddChild(MakeLabel(def.Emoji, 32f, CardTitleColor, center: true)); + vbox.AddChild(MakeLabel(def.DisplayName, 22f, CardTitleColor, center: true)); + vbox.AddChild(new HSeparator { RectMinSize = new Vector2(0f, 4f) }); + vbox.AddChild(MakeLabel(def.Description, 72f, CardDescColor, center: true, wrap: true)); + vbox.AddChild(MakeLabel($"CD: {def.CooldownSec}s", 16f, SubHeaderColor, center: true)); + + var btn = new Button { Text = string.Empty, Flat = true }; + btn.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); + foreach (var s in new[] { "normal", "hover", "pressed", "focus" }) + { + btn.AddStyleboxOverride(s, new StyleBoxEmpty()); + } + btn.Connect("pressed", this, nameof(OnSkillCardPressed), new Godot.Collections.Array { def.Id }); + card.AddChild(btn); + + return card; + } + // ── Style / Label helpers ───────────────────────────────────────── private static StyleBoxFlat MakePanelStyle() @@ -335,6 +457,25 @@ private static StyleBoxFlat MakeButtonStyle(Color bg) // ── Signal handlers ─────────────────────────────────────────────── + private void SwitchTab(int tabIndex) + { + _classTabContent.Visible = (tabIndex == 0); + _skillTabContent.Visible = (tabIndex == 1); + + _tabClassBtn.AddStyleboxOverride("normal", MakeButtonStyle(tabIndex == 0 ? TabSelected : TabNormal)); + _tabSkillsBtn.AddStyleboxOverride("normal", MakeButtonStyle(tabIndex == 1 ? TabSelected : TabNormal)); + + if (tabIndex == 1) + { + RefreshSkillTab(); + } + } + + private void OnTabPressed(int tabIndex) + { + SwitchTab(tabIndex); + } + private void OnCardPressed(int index) { if (index >= 0 && index < AllClasses.Length) @@ -342,7 +483,6 @@ private void OnCardPressed(int index) PlayerClass targetClass = AllClasses[index]; if (targetClass != PlayerClass.Adventurer && _playerLevel < GameConstants.CLASS_CHANGE_MIN_LEVEL) { - // Block selection of locked advanced classes (only Adventurer is selectable) return; } @@ -352,9 +492,27 @@ private void OnCardPressed(int index) } private void OnConfirmPressed() + { + if (_selectedClass != _currentClass) + { + // Class changed -> Reset skills to new class defaults + _currentClass = _selectedClass; + _availableSkills = PlayerClassData.GetAllSkillDefinitions(_currentClass); + _equippedSkillIds.Clear(); + _equippedSkillIds.AddRange(PlayerClassData.GetDefaultSkillLoadout(_currentClass)); + ClassSelected?.Invoke(_selectedClass); + SwitchTab(1); // Auto jump to skills tab + } + else + { + Hide(); + } + } + + private void OnSaveLoadoutPressed() { Hide(); - ClassSelected?.Invoke(_selectedClass); + SkillLoadoutChanged?.Invoke(_equippedSkillIds); } private void OnClosePressed() @@ -362,6 +520,30 @@ private void OnClosePressed() Hide(); } + private void OnSkillCardPressed(string skillId) + { + // If class only has 1 skill, it's always equipped + if (_availableSkills.Count <= 1) return; + + if (_equippedSkillIds.Contains(skillId)) + { + _equippedSkillIds.Remove(skillId); + } + else + { + if (_equippedSkillIds.Count >= 3) + { + // Replace the last slot if full + _equippedSkillIds[2] = skillId; + } + else + { + _equippedSkillIds.Add(skillId); + } + } + RefreshSkillTab(); + } + // ── Highlight refresh ───────────────────────────────────────────── private void RefreshCardHighlights() @@ -378,12 +560,10 @@ private void RefreshCardHighlights() bool isSelected = cls == _selectedClass; bool isCurrent = cls == _currentClass; - // Adventurer is always unlocked. Advanced classes are locked if level requirement is not met. bool isLocked = levelLocked && cls != PlayerClass.Adventurer; if (isLocked) { - // Gray out and make semi-transparent _cardPanels[i].Modulate = new Color(0.4f, 0.4f, 0.4f, 0.7f); _cardPanels[i].AddStyleboxOverride("panel", MakeCardStyle(CardBgNormal, CardBorderNormal)); } @@ -404,5 +584,69 @@ private void RefreshCardHighlights() } } } + + private void RefreshSkillTab() + { + // Update slots + for (int i = 0; i < 3; i++) + { + if (i < _equippedSkillIds.Count) + { + string skillId = _equippedSkillIds[i]; + var def = GetSkillDef(skillId); + if (def != null) + { + _skillSlotLabels[i].Text = $"Slot {i + 1}: {def.Emoji} {def.DisplayName}"; + } + else + { + _skillSlotLabels[i].Text = $"Slot {i + 1}: Empty"; + } + } + else + { + _skillSlotLabels[i].Text = $"Slot {i + 1}: Empty"; + } + } + + // Rebuild grid + var gridBox = _skillTabContent.GetNodeOrNull("SkillGrid"); + if (gridBox != null) + { + foreach (Node child in gridBox.GetChildren()) + { + child.QueueFree(); + } + + _skillCardPanels = new Panel[_availableSkills.Count]; + + for (int i = 0; i < _availableSkills.Count; i++) + { + var def = _availableSkills[i]; + var card = BuildSkillCard(def); + + bool isEquipped = _equippedSkillIds.Contains(def.Id); + + card.AddStyleboxOverride("panel", MakeCardStyle( + isEquipped ? CardBgSelected : CardBgNormal, + isEquipped ? SkillLabelColor : CardBorderNormal, + isEquipped ? 3 : 2 + )); + + gridBox.AddChild(card); + _skillCardPanels[i] = card; + } + } + } + + private SkillDefinition GetSkillDef(string id) + { + if (_availableSkills == null) return null; + foreach (var def in _availableSkills) + { + if (def.Id == id) return def; + } + return null; + } } } \ No newline at end of file diff --git a/Scripts/UI/DifficultySelectionUI.cs b/Scripts/UI/DifficultySelectionUI.cs index 5fc39df..b7d1cca 100644 --- a/Scripts/UI/DifficultySelectionUI.cs +++ b/Scripts/UI/DifficultySelectionUI.cs @@ -12,169 +12,169 @@ /// public class DifficultySelectionUI : CanvasLayer { - public event Action DifficultySelected; - - private Control _uiContainer; - private VBoxContainer _buttonContainer; - private bool _isVisible; - private Player _player; - private readonly Dictionary _difficultyButtons = new Dictionary(); - - public override void _Ready() - { - // Ensure this UI processes even when the game is paused (Godot 3.6) - PauseMode = PauseModeEnum.Process; - - BuildUI(); - HideDifficultyMenu(); - } - - private void BuildUI() - { - // Wrap everything in a MarginContainer anchored to the screen - var screenMargin = new MarginContainer(); - screenMargin.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); - screenMargin.AddConstantOverride("margin_right", 20); - screenMargin.AddConstantOverride("margin_top", 20); - screenMargin.AddConstantOverride("margin_left", 20); - screenMargin.AddConstantOverride("margin_bottom", 20); - AddChild(screenMargin); - - // Main container - var panelContainer = new PanelContainer(); - panelContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ShrinkCenter; - panelContainer.SizeFlagsVertical = (int)Control.SizeFlags.ShrinkCenter; - screenMargin.AddChild(panelContainer); - - // Create a VBox for the entire panel content - var mainVBox = new VBoxContainer(); - panelContainer.AddChild(mainVBox); - - // Title - var titleLabel = new Label(); - titleLabel.Text = "Select Difficulty"; - titleLabel.Align = Label.AlignEnum.Center; - mainVBox.AddChild(titleLabel); - - // Spacer - var spacer = new Control(); - spacer.RectMinSize = new Vector2(0, 10); - mainVBox.AddChild(spacer); - - // Scroll container for buttons in case height is constrained - var scrollContainer = new ScrollContainer(); - scrollContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; - scrollContainer.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; - scrollContainer.RectMinSize = new Vector2(240, 200); // Minimum view area - mainVBox.AddChild(scrollContainer); - - // Button container - _buttonContainer = new VBoxContainer(); - _buttonContainer.AddConstantOverride("separation", 10); - _buttonContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; - scrollContainer.AddChild(_buttonContainer); - - // Easy button - AddDifficultyButton("Easy", DifficultyLevel.Easy); - - // Normal button - AddDifficultyButton("Normal", DifficultyLevel.Normal); - - // Hard button - AddDifficultyButton("Hard", DifficultyLevel.Hard); - - // Nightmare button - AddDifficultyButton("Nightmare", DifficultyLevel.Nightmare); - - // Spacer - var spacer2 = new Control(); - spacer2.RectMinSize = new Vector2(0, 10); - mainVBox.AddChild(spacer2); - - // Close button - var closeButton = new Button(); - closeButton.Text = "Close"; - closeButton.RectMinSize = new Vector2(200, 52); - closeButton.Connect("pressed", this, nameof(OnClosePressed)); - mainVBox.AddChild(closeButton); - - _uiContainer = screenMargin; - } - - public void Initialize(Player player) - { - _player = player; - RefreshLocks(); - } - - private void AddDifficultyButton(string label, DifficultyLevel difficulty) - { - var button = new Button(); - button.Text = label; - button.RectMinSize = new Vector2(200, 52); - var binds = new Godot.Collections.Array(); - binds.Add(difficulty); - button.Connect("pressed", this, nameof(OnDifficultyButtonPressed), binds); - _buttonContainer.AddChild(button); - _difficultyButtons[difficulty] = button; - } - - private void OnDifficultyButtonPressed(DifficultyLevel difficulty) - { - DifficultySelected?.Invoke(difficulty); - HideDifficultyMenu(); // Close menu after selection - } - - private void OnClosePressed() - { - HideDifficultyMenu(); - } - - public void ShowDifficultyMenu() - { - RefreshLocks(); - _uiContainer.Visible = true; - _isVisible = true; - GetTree().Paused = true; - } - - public void HideDifficultyMenu() - { - _uiContainer.Visible = false; - _isVisible = false; - GetTree().Paused = false; - } - - public bool IsMenuVisible => _isVisible; - - private void RefreshLocks() - { - foreach (var entry in _difficultyButtons) - { - DifficultyLevel difficulty = entry.Key; - Button button = entry.Value; - bool unlocked = difficulty == DifficultyLevel.Easy || HasTicket(difficulty); - button.Disabled = !unlocked; - string label = difficulty.ToString(); - button.Text = unlocked ? label : $"{label} Locked"; - } - } - - private bool HasTicket(DifficultyLevel difficulty) - { - if (_player == null) - { - return false; - } - - foreach (Item item in _player.InventoryItems) - { - if (ItemCatalog.IsTicketForDifficulty(item, difficulty)) - { - return true; - } - } - - return false; - } -} \ No newline at end of file + public event Action DifficultySelected; + + private Control _uiContainer; + private VBoxContainer _buttonContainer; + private bool _isVisible; + private Player _player; + private readonly Dictionary _difficultyButtons = new Dictionary(); + + public override void _Ready() + { + // Ensure this UI processes even when the game is paused (Godot 3.6) + PauseMode = PauseModeEnum.Process; + + BuildUI(); + HideDifficultyMenu(); + } + + private void BuildUI() + { + // Wrap everything in a MarginContainer anchored to the screen + var screenMargin = new MarginContainer(); + screenMargin.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); + screenMargin.AddConstantOverride("margin_right", 20); + screenMargin.AddConstantOverride("margin_top", 20); + screenMargin.AddConstantOverride("margin_left", 20); + screenMargin.AddConstantOverride("margin_bottom", 20); + AddChild(screenMargin); + + // Main container + var panelContainer = new PanelContainer(); + panelContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ShrinkCenter; + panelContainer.SizeFlagsVertical = (int)Control.SizeFlags.ShrinkCenter; + screenMargin.AddChild(panelContainer); + + // Create a VBox for the entire panel content + var mainVBox = new VBoxContainer(); + panelContainer.AddChild(mainVBox); + + // Title + var titleLabel = new Label(); + titleLabel.Text = "Select Difficulty"; + titleLabel.Align = Label.AlignEnum.Center; + mainVBox.AddChild(titleLabel); + + // Spacer + var spacer = new Control(); + spacer.RectMinSize = new Vector2(0, 10); + mainVBox.AddChild(spacer); + + // Scroll container for buttons in case height is constrained + var scrollContainer = new ScrollContainer(); + scrollContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + scrollContainer.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; + scrollContainer.RectMinSize = new Vector2(240, 200); // Minimum view area + mainVBox.AddChild(scrollContainer); + + // Button container + _buttonContainer = new VBoxContainer(); + _buttonContainer.AddConstantOverride("separation", 10); + _buttonContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + scrollContainer.AddChild(_buttonContainer); + + // Easy button + AddDifficultyButton("Easy", DifficultyLevel.Easy); + + // Normal button + AddDifficultyButton("Normal", DifficultyLevel.Normal); + + // Hard button + AddDifficultyButton("Hard", DifficultyLevel.Hard); + + // Nightmare button + AddDifficultyButton("Nightmare", DifficultyLevel.Nightmare); + + // Spacer + var spacer2 = new Control(); + spacer2.RectMinSize = new Vector2(0, 10); + mainVBox.AddChild(spacer2); + + // Close button + var closeButton = new Button(); + closeButton.Text = "Close"; + closeButton.RectMinSize = new Vector2(200, 52); + closeButton.Connect("pressed", this, nameof(OnClosePressed)); + mainVBox.AddChild(closeButton); + + _uiContainer = screenMargin; + } + + public void Initialize(Player player) + { + _player = player; + RefreshLocks(); + } + + private void AddDifficultyButton(string label, DifficultyLevel difficulty) + { + var button = new Button(); + button.Text = label; + button.RectMinSize = new Vector2(200, 52); + var binds = new Godot.Collections.Array(); + binds.Add(difficulty); + button.Connect("pressed", this, nameof(OnDifficultyButtonPressed), binds); + _buttonContainer.AddChild(button); + _difficultyButtons[difficulty] = button; + } + + private void OnDifficultyButtonPressed(DifficultyLevel difficulty) + { + DifficultySelected?.Invoke(difficulty); + HideDifficultyMenu(); // Close menu after selection + } + + private void OnClosePressed() + { + HideDifficultyMenu(); + } + + public void ShowDifficultyMenu() + { + RefreshLocks(); + _uiContainer.Visible = true; + _isVisible = true; + GetTree().Paused = true; + } + + public void HideDifficultyMenu() + { + _uiContainer.Visible = false; + _isVisible = false; + GetTree().Paused = false; + } + + public bool IsMenuVisible => _isVisible; + + private void RefreshLocks() + { + foreach (var entry in _difficultyButtons) + { + DifficultyLevel difficulty = entry.Key; + Button button = entry.Value; + bool unlocked = difficulty == DifficultyLevel.Easy || HasTicket(difficulty); + button.Disabled = !unlocked; + string label = difficulty.ToString(); + button.Text = unlocked ? label : $"{label} Locked"; + } + } + + private bool HasTicket(DifficultyLevel difficulty) + { + if (_player == null) + { + return false; + } + + foreach (Item item in _player.InventoryItems) + { + if (ItemCatalog.IsTicketForDifficulty(item, difficulty)) + { + return true; + } + } + + return false; + } +} diff --git a/Scripts/UI/PlayerHud.cs b/Scripts/UI/PlayerHud.cs index a6da0d5..ab3d445 100644 --- a/Scripts/UI/PlayerHud.cs +++ b/Scripts/UI/PlayerHud.cs @@ -17,7 +17,11 @@ public class PlayerHud : CanvasLayer { ["basic_attack"] = "res://Assets/SkillAnimation/slash-icon.png", ["bow_attack"] = "res://Assets/SkillAnimation/arrow.png", + ["triple_arrow"] = "res://Assets/SkillAnimation/arrow.png", + ["ricochet_arrow"] = "res://Assets/SkillAnimation/arrow.png", ["fireball"] = "res://Assets/SkillAnimation/fireball.png", + ["triple_fireball"] = "res://Assets/SkillAnimation/fireball.png", + ["giant_fireball"] = "res://Assets/SkillAnimation/fireball.png", }; private readonly List _skillSlots = new List(); From 01190bf7367dd7d824c11b8b205267cb68dc1973 Mon Sep 17 00:00:00 2001 From: "Andy Lu (Lu, Yu-An)" Date: Mon, 1 Jun 2026 21:06:09 +0800 Subject: [PATCH 02/13] feat: warrior skills --- Assets/SkillAnimation/fly_sword-1.png.import | 35 + Assets/SkillAnimation/fly_sword-2.png.import | 35 + Assets/SkillAnimation/fly_sword.png.import | 35 + Scripts/Auth/AuthStorage.cs | 336 ++-- Scripts/Characters/Character.cs | 2 +- Scripts/Characters/Monster.cs | 6 +- Scripts/Characters/Player.cs | 81 +- .../PlayerAnimationController.cs | 26 + .../PlayerSystems/PlayerAnimationSystem.cs | 56 +- .../PlayerSystems/PlayerMovementController.cs | 104 +- Scripts/Core/Data/PlayerClass.cs | 43 +- .../Core/Data/Skills/DefenseStanceSkill.cs | 27 + Scripts/Core/Data/Skills/FlyingSwordSkill.cs | 38 + .../Core/Data/Skills/GiantFireballSkill.cs | 2 +- .../Core/Data/Skills/RicochetArrowSkill.cs | 2 +- .../Data/Skills/SkillProjectileSpawner.cs | 125 +- Scripts/Core/Data/Skills/TripleArrowSkill.cs | 2 +- .../Core/Data/Skills/TripleFireballSkill.cs | 2 +- Scripts/Main.cs | 1716 ++++++++--------- Scripts/UI/ClassSelectUI.cs | 46 +- Scripts/UI/DifficultySelectionUI.cs | 332 ++-- Scripts/UI/PlayerHud.cs | 2 + 22 files changed, 1749 insertions(+), 1304 deletions(-) create mode 100644 Assets/SkillAnimation/fly_sword-1.png.import create mode 100644 Assets/SkillAnimation/fly_sword-2.png.import create mode 100644 Assets/SkillAnimation/fly_sword.png.import create mode 100644 Scripts/Core/Data/Skills/DefenseStanceSkill.cs create mode 100644 Scripts/Core/Data/Skills/FlyingSwordSkill.cs diff --git a/Assets/SkillAnimation/fly_sword-1.png.import b/Assets/SkillAnimation/fly_sword-1.png.import new file mode 100644 index 0000000..99086ee --- /dev/null +++ b/Assets/SkillAnimation/fly_sword-1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fly_sword-1.png-a7442a514264b0f0f1d43aaaa6e12a4c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/fly_sword-1.png" +dest_files=[ "res://.import/fly_sword-1.png-a7442a514264b0f0f1d43aaaa6e12a4c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/fly_sword-2.png.import b/Assets/SkillAnimation/fly_sword-2.png.import new file mode 100644 index 0000000..8fa6a80 --- /dev/null +++ b/Assets/SkillAnimation/fly_sword-2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fly_sword-2.png-ba5560b5f2b4f5ceab352d4b9dd136b5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/fly_sword-2.png" +dest_files=[ "res://.import/fly_sword-2.png-ba5560b5f2b4f5ceab352d4b9dd136b5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/fly_sword.png.import b/Assets/SkillAnimation/fly_sword.png.import new file mode 100644 index 0000000..b0a8ec9 --- /dev/null +++ b/Assets/SkillAnimation/fly_sword.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fly_sword.png-1f0c4760f72d2f7f95268d8f3775b3da.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/fly_sword.png" +dest_files=[ "res://.import/fly_sword.png-1f0c4760f72d2f7f95268d8f3775b3da.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Scripts/Auth/AuthStorage.cs b/Scripts/Auth/AuthStorage.cs index 32e95d7..f828c31 100644 --- a/Scripts/Auth/AuthStorage.cs +++ b/Scripts/Auth/AuthStorage.cs @@ -22,171 +22,171 @@ /// public static class AuthStorage { - private const string AuthConfigPath = "user://auth.cfg"; - private const string AuthSessionSection = "auth_session"; - private const string TokenKey = "token"; - private const string UserIdKey = "user_id"; - private const string UsernameKey = "username"; - private const string IssuedAtKey = "issued_at"; - private const string ExpiresAtKey = "expires_at"; - - /// - /// Loads the stored authentication session. - /// - public static bool TryLoadSession(out AuthSession session) - { - session = new AuthSession(); - var config = new ConfigFile(); - Error loadError = config.Load(AuthConfigPath); - - if (loadError != Error.Ok) - { - return false; - } - - string token = config.GetValue(AuthSessionSection, TokenKey, string.Empty) as string ?? string.Empty; - if (string.IsNullOrWhiteSpace(token)) - { - return false; - } - - // Restore session data - session.Token = token; - - // Safely parse UserId - handle both int and long types - var userIdValue = config.GetValue(AuthSessionSection, UserIdKey, 0L); - if (userIdValue is long longUserId) - { - session.UserId = longUserId; - } - else if (userIdValue is int intUserId) - { - session.UserId = intUserId; - } - else if (long.TryParse(userIdValue?.ToString() ?? "0", out long parsedUserId)) - { - session.UserId = parsedUserId; - } - else - { - session.UserId = 0L; - } - - session.Username = config.GetValue(AuthSessionSection, UsernameKey, string.Empty) as string ?? string.Empty; - - // Restore issued and expiration times - if (long.TryParse(config.GetValue(AuthSessionSection, IssuedAtKey, string.Empty) as string ?? string.Empty, out long issuedTicks)) - { - session.IssuedAt = new System.DateTime(issuedTicks); - } - - if (long.TryParse(config.GetValue(AuthSessionSection, ExpiresAtKey, string.Empty) as string ?? string.Empty, out long expiresTicks)) - { - session.ExpiresAt = new System.DateTime(expiresTicks); - } - - GD.Print($"[AuthStorage] Session loaded: {session}"); - return true; - } - - /// - /// Legacy method for backward compatibility. - /// Prefer TryLoadSession() instead. - /// - public static bool TryLoadToken(out string token) - { - token = string.Empty; - if (TryLoadSession(out var session)) - { - token = session.Token; - return true; - } - return false; - } - - /// - /// Saves the authentication session persistently. - /// - public static void SaveSession(AuthSession session) - { - if (session == null) - { - ClearSession(); - return; - } - - var config = new ConfigFile(); - - // Load existing config to preserve other data - config.Load(AuthConfigPath); - - config.SetValue(AuthSessionSection, TokenKey, session.Token ?? string.Empty); - config.SetValue(AuthSessionSection, UserIdKey, session.UserId); - config.SetValue(AuthSessionSection, UsernameKey, session.Username ?? string.Empty); - config.SetValue(AuthSessionSection, IssuedAtKey, session.IssuedAt.Ticks.ToString()); - - if (session.ExpiresAt.HasValue) - { - config.SetValue(AuthSessionSection, ExpiresAtKey, session.ExpiresAt.Value.Ticks.ToString()); - } - - Error saveError = config.Save(AuthConfigPath); - if (saveError != Error.Ok) - { - GD.PrintErr($"[AuthStorage] Failed to save session: {saveError}"); - } - else - { - GD.Print($"[AuthStorage] Session saved: {session}"); - } - } - - /// - /// Legacy method for backward compatibility. - /// Prefer SaveSession() instead. - /// - public static void SaveToken(string token) - { - var session = new AuthSession { Token = token, IssuedAt = System.DateTime.UtcNow }; - SaveSession(session); - } - - /// - /// Clears the stored authentication session. - /// - public static void ClearSession() - { - var config = new ConfigFile(); - if (config.Load(AuthConfigPath) == Error.Ok) - { - // Remove all auth-related keys - foreach (var key in new[] { TokenKey, UserIdKey, UsernameKey, IssuedAtKey, ExpiresAtKey }) - { - if (config.HasSectionKey(AuthSessionSection, key)) - { - // Godot doesn't have a direct delete method, so we load and re-save without the keys - } - } - - // Create new config without auth data - var newConfig = new ConfigFile(); - Error saveError = newConfig.Save(AuthConfigPath); - if (saveError != Error.Ok) - { - GD.PrintErr($"[AuthStorage] Failed to clear session: {saveError}"); - } - else - { - GD.Print("[AuthStorage] Session cleared"); - } - } - } - - /// - /// Legacy method for backward compatibility. - /// - public static void ClearToken() - { - ClearSession(); - } -} + private const string AuthConfigPath = "user://auth.cfg"; + private const string AuthSessionSection = "auth_session"; + private const string TokenKey = "token"; + private const string UserIdKey = "user_id"; + private const string UsernameKey = "username"; + private const string IssuedAtKey = "issued_at"; + private const string ExpiresAtKey = "expires_at"; + + /// + /// Loads the stored authentication session. + /// + public static bool TryLoadSession(out AuthSession session) + { + session = new AuthSession(); + var config = new ConfigFile(); + Error loadError = config.Load(AuthConfigPath); + + if (loadError != Error.Ok) + { + return false; + } + + string token = config.GetValue(AuthSessionSection, TokenKey, string.Empty) as string ?? string.Empty; + if (string.IsNullOrWhiteSpace(token)) + { + return false; + } + + // Restore session data + session.Token = token; + + // Safely parse UserId - handle both int and long types + var userIdValue = config.GetValue(AuthSessionSection, UserIdKey, 0L); + if (userIdValue is long longUserId) + { + session.UserId = longUserId; + } + else if (userIdValue is int intUserId) + { + session.UserId = intUserId; + } + else if (long.TryParse(userIdValue?.ToString() ?? "0", out long parsedUserId)) + { + session.UserId = parsedUserId; + } + else + { + session.UserId = 0L; + } + + session.Username = config.GetValue(AuthSessionSection, UsernameKey, string.Empty) as string ?? string.Empty; + + // Restore issued and expiration times + if (long.TryParse(config.GetValue(AuthSessionSection, IssuedAtKey, string.Empty) as string ?? string.Empty, out long issuedTicks)) + { + session.IssuedAt = new System.DateTime(issuedTicks); + } + + if (long.TryParse(config.GetValue(AuthSessionSection, ExpiresAtKey, string.Empty) as string ?? string.Empty, out long expiresTicks)) + { + session.ExpiresAt = new System.DateTime(expiresTicks); + } + + GD.Print($"[AuthStorage] Session loaded: {session}"); + return true; + } + + /// + /// Legacy method for backward compatibility. + /// Prefer TryLoadSession() instead. + /// + public static bool TryLoadToken(out string token) + { + token = string.Empty; + if (TryLoadSession(out var session)) + { + token = session.Token; + return true; + } + return false; + } + + /// + /// Saves the authentication session persistently. + /// + public static void SaveSession(AuthSession session) + { + if (session == null) + { + ClearSession(); + return; + } + + var config = new ConfigFile(); + + // Load existing config to preserve other data + config.Load(AuthConfigPath); + + config.SetValue(AuthSessionSection, TokenKey, session.Token ?? string.Empty); + config.SetValue(AuthSessionSection, UserIdKey, session.UserId); + config.SetValue(AuthSessionSection, UsernameKey, session.Username ?? string.Empty); + config.SetValue(AuthSessionSection, IssuedAtKey, session.IssuedAt.Ticks.ToString()); + + if (session.ExpiresAt.HasValue) + { + config.SetValue(AuthSessionSection, ExpiresAtKey, session.ExpiresAt.Value.Ticks.ToString()); + } + + Error saveError = config.Save(AuthConfigPath); + if (saveError != Error.Ok) + { + GD.PrintErr($"[AuthStorage] Failed to save session: {saveError}"); + } + else + { + GD.Print($"[AuthStorage] Session saved: {session}"); + } + } + + /// + /// Legacy method for backward compatibility. + /// Prefer SaveSession() instead. + /// + public static void SaveToken(string token) + { + var session = new AuthSession { Token = token, IssuedAt = System.DateTime.UtcNow }; + SaveSession(session); + } + + /// + /// Clears the stored authentication session. + /// + public static void ClearSession() + { + var config = new ConfigFile(); + if (config.Load(AuthConfigPath) == Error.Ok) + { + // Remove all auth-related keys + foreach (var key in new[] { TokenKey, UserIdKey, UsernameKey, IssuedAtKey, ExpiresAtKey }) + { + if (config.HasSectionKey(AuthSessionSection, key)) + { + // Godot doesn't have a direct delete method, so we load and re-save without the keys + } + } + + // Create new config without auth data + var newConfig = new ConfigFile(); + Error saveError = newConfig.Save(AuthConfigPath); + if (saveError != Error.Ok) + { + GD.PrintErr($"[AuthStorage] Failed to clear session: {saveError}"); + } + else + { + GD.Print("[AuthStorage] Session cleared"); + } + } + } + + /// + /// Legacy method for backward compatibility. + /// + public static void ClearToken() + { + ClearSession(); + } +} \ No newline at end of file diff --git a/Scripts/Characters/Character.cs b/Scripts/Characters/Character.cs index 7178603..902c48e 100644 --- a/Scripts/Characters/Character.cs +++ b/Scripts/Characters/Character.cs @@ -93,7 +93,7 @@ public virtual void UpdateAttributes() /// Apply damage to this character. /// Blocked entirely when is true. /// - public virtual void TakeDamage(int damage) + public virtual void TakeDamage(int damage, Character source = null) { // Invincibility guard — effect-based immunity if (IsInvincible) return; diff --git a/Scripts/Characters/Monster.cs b/Scripts/Characters/Monster.cs index 1a0cbd8..49e14a1 100644 --- a/Scripts/Characters/Monster.cs +++ b/Scripts/Characters/Monster.cs @@ -211,9 +211,9 @@ public override void UpdateAttributes() Attributes.TotalDef = 0; } - public override void TakeDamage(int damage) + public override void TakeDamage(int damage, Character source = null) { - base.TakeDamage(damage); + base.TakeDamage(damage, source); if (!_isDead && Attributes?.HP != null && Attributes.HP.IsAlive) { _isHit = true; @@ -815,7 +815,7 @@ public override void Attack() { // EffectiveAtk respects Burn debuff (ATK reduction while burning) int damage = Attributes?.EffectiveAtk ?? 1; - _player.TakeDamage(damage); + _player.TakeDamage(damage, this); GD.Print($"[COMBAT] {EntityName} attacks Player for {damage} damage! Player HP: {_player.Attributes.HP.CurrentHP}/{_player.Attributes.HP.MaxHP}"); } } diff --git a/Scripts/Characters/Player.cs b/Scripts/Characters/Player.cs index 3a7c59c..23bb1a6 100644 --- a/Scripts/Characters/Player.cs +++ b/Scripts/Characters/Player.cs @@ -66,6 +66,7 @@ public class Player : Character // Invincibility state private int _damageCooldownFrames = 0; private float _respawnInvincibilityTimer = 0f; + private float _defenseStanceTimer = 0f; // Previously exposed properties now delegated to subsystems public int Experience => _inventorySystem?.Experience ?? 0; @@ -244,6 +245,13 @@ public int GetSelectedSkillIndex() public System.Collections.Generic.IReadOnlyList DiscardedItems => _inventorySystem?.Discarded?.Items.AsReadOnly() ?? new System.Collections.Generic.List().AsReadOnly(); + public void ActivateDefenseStance(float duration) + { + _defenseStanceTimer = duration; + _animationController?.PlayDefenseAnimation(); + GD.Print($"[Player] Defense Stance activated for {duration} seconds."); + } + /// /// Set the map reference and initialize room tracking /// @@ -289,14 +297,24 @@ public override void UpdateAttributes() Attributes.TotalVit = jobBonuses.Vit + equipmentBonuses.Vit; } - public override void TakeDamage(int damage) + public override void TakeDamage(int damage, Character source = null) { + if (_defenseStanceTimer > 0f) + { + if (source != null && source.Attributes?.HP?.IsAlive == true) + { + source.TakeDamage(Attributes.EffectiveAtk); + _animationController?.PlayDefenseCounterAnimation(0.2f); + } + return; + } + if (_respawnInvincibilityTimer > 0f) return; if (_damageCooldownFrames > 0) return; _damageCooldownFrames = 6; // 0.1 seconds at 60 FPS processing - base.TakeDamage(damage); + base.TakeDamage(damage, source); if (!_isDead && Attributes?.HP != null && Attributes.HP.IsAlive) { _animationController?.PlayHitAnimation(_hitTexture, 0.2f); @@ -352,8 +370,17 @@ public override void _PhysicsProcess(float delta) if (_map == null) return; + if (_defenseStanceTimer > 0f) + { + _defenseStanceTimer -= delta; + if (_defenseStanceTimer <= 0f) + { + _animationController?.StopDefenseAnimation(); + } + } + // Get current movement input - Vector2 movementInput = _inputHandler.GetMovementInput(); + Vector2 movementInput = _defenseStanceTimer > 0f ? Vector2.Zero : _inputHandler.GetMovementInput(); // 1. Handle physics and movement _physicsController.Update( @@ -606,6 +633,18 @@ private List BuildSkillsFromSnapshot(IReadOnlyList continue; } + if (string.Equals(snapshot.SkillId, "flying_sword", StringComparison.OrdinalIgnoreCase)) + { + skills.Add(new FlyingSwordSkill()); + continue; + } + + if (string.Equals(snapshot.SkillId, "defense_stance", StringComparison.OrdinalIgnoreCase)) + { + skills.Add(new DefenseStanceSkill()); + continue; + } + var remoteSkill = new RemoteSkill( snapshot.SkillId, snapshot.Name, @@ -671,6 +710,16 @@ private static string ResolveSkillId(Skills skill) return "ricochet_arrow"; } + if (skill is FlyingSwordSkill) + { + return "flying_sword"; + } + + if (skill is DefenseStanceSkill) + { + return "defense_stance"; + } + if (skill is RemoteSkill remoteSkill) { return remoteSkill.SkillId; @@ -749,6 +798,8 @@ private static void EnsureClassCoreSkills(List skills, PlayerClass cls) bool hasFireball = skills.Any(s => s is FireballSkill); bool hasTripleFireball = skills.Any(s => s is TripleFireballSkill); bool hasGiantFireball = skills.Any(s => s is GiantFireballSkill); + bool hasFlyingSword = skills.Any(s => s is FlyingSwordSkill); + bool hasDefenseStance = skills.Any(s => s is DefenseStanceSkill); if (allowed.Contains(PlayerClassData.SkillIdSword) && !hasSword) { @@ -788,6 +839,16 @@ private static void EnsureClassCoreSkills(List skills, PlayerClass cls) { skills.Add(new GiantFireballSkill()); } + + if (allowed.Contains(PlayerClassData.SkillIdFlyingSword) && !hasFlyingSword) + { + skills.Add(new FlyingSwordSkill()); + } + + if (allowed.Contains(PlayerClassData.SkillIdDefenseStance) && !hasDefenseStance) + { + skills.Add(new DefenseStanceSkill()); + } } // ── Class system ────────────────────────────────────────────────── @@ -879,10 +940,14 @@ string Resolve(string primary, string fb) => // Reload class-specific hit / dead textures (with shared fallback). string hitPath = Resolve(paths.HitFrame, fallback.HitFrame); string deadPath = Resolve(paths.DeadFrame, fallback.DeadFrame); + string defPath = Resolve(paths.DefenseFrame, fallback.DefenseFrame); + string atkPath = Resolve(paths.SkillAttackFrame, fallback.SkillAttackFrame); _hitTexture = GD.Load(hitPath); _deadTexture = GD.Load(deadPath); + _animationController?.LoadDefenseTextures(defPath, atkPath); + string bowFrame = paths.BowAttackPaths != null ? paths.BowAttackPaths[0] : "default"; GD.Print($"[Player] Sprites updated for class {cls}. Stand={stand1}, Attack={attack1}, Bow={bowFrame}, Hit={hitPath}, Dead={deadPath}"); } @@ -1026,7 +1091,7 @@ private static System.Collections.Generic.List BuildSkillsFromIds( PlayerClass cls) { var allowed = PlayerClassData.GetAllowedSkillIds(cls); - var skills = new System.Collections.Generic.List(); + var skills = new System.Collections.Generic.List(); if (orderedIds != null) { @@ -1063,6 +1128,14 @@ private static System.Collections.Generic.List BuildSkillsFromIds( { skills.Add(new GiantFireballSkill()); } + else if (key == "flying_sword") + { + skills.Add(new FlyingSwordSkill()); + } + else if (key == "defense_stance") + { + skills.Add(new DefenseStanceSkill()); + } } } diff --git a/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs b/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs index bc8fa1d..fd8aae2 100644 --- a/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs +++ b/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs @@ -28,6 +28,9 @@ public class PlayerAnimationController private Texture[] _bowAttackFrames; private Texture[] _fireballAttackFrames; + private Texture _defenseTexture; + private Texture _counterTexture; + // Default (Adventurer) frame paths for each skill style. private static readonly string[] DefaultSwordPaths = new[] { @@ -172,6 +175,29 @@ public void UpdateClassFrames(string[] swordPaths, string[] bowPaths, string[] f GD.Print("[PlayerAnimationController] Attack frames updated for class."); } + public void LoadDefenseTextures(string defensePath, string counterPath) + { + _defenseTexture = !string.IsNullOrEmpty(defensePath) ? GD.Load(defensePath) : null; + _counterTexture = !string.IsNullOrEmpty(counterPath) ? GD.Load(counterPath) : null; + } + + public void PlayDefenseAnimation() + { + if (_defenseTexture != null) + _animationSystem.PlayDefenseAnimation(_defenseTexture); + } + + public void PlayDefenseCounterAnimation(float duration = 0.2f) + { + if (_counterTexture != null) + _animationSystem.PlayDefenseCounterAnimation(_counterTexture, duration); + } + + public void StopDefenseAnimation() + { + _animationSystem.StopDefenseAnimation(); + } + /// /// Trigger dead animation playback /// diff --git a/Scripts/Characters/PlayerSystems/PlayerAnimationSystem.cs b/Scripts/Characters/PlayerSystems/PlayerAnimationSystem.cs index 40697e5..e2ddd22 100644 --- a/Scripts/Characters/PlayerSystems/PlayerAnimationSystem.cs +++ b/Scripts/Characters/PlayerSystems/PlayerAnimationSystem.cs @@ -11,7 +11,8 @@ public enum AnimationState Walking, // Moving around Attacking, // Performing basic attack Dead, // Character is dead - Hit // Character took damage + Hit, // Character took damage + Defending // Character is in defense stance } public class PlayerAnimationSystem @@ -37,6 +38,11 @@ public class PlayerAnimationSystem private Texture _hitTexture; private float _hitTimer = 0f; + // Defense animation + private Texture _defenseTexture; + private Texture _counterTexture; + private float _counterTimer = 0f; + private AnimationState _currentState = AnimationState.Idle; private int _frameIndex = 0; private float _animationTimer = 0f; @@ -190,6 +196,16 @@ public void UpdateAnimation(bool isMoving, float delta, float walkAnimationFps, } } + if (_currentState == AnimationState.Defending) + { + if (_counterTimer > 0f) + { + _counterTimer -= delta; + } + ApplyCurrentFrame(facingX); + return; + } + // Determine target state AnimationState targetState = isMoving ? AnimationState.Walking : AnimationState.Idle; @@ -311,6 +327,34 @@ public void Revive() } } + public void PlayDefenseAnimation(Texture defenseTexture) + { + if (_currentState == AnimationState.Dead) return; + + _currentState = AnimationState.Defending; + _defenseTexture = defenseTexture; + _counterTimer = 0f; + ApplyCurrentFrame(1f); + } + + public void PlayDefenseCounterAnimation(Texture counterTexture, float duration) + { + if (_currentState != AnimationState.Defending) return; + + _counterTexture = counterTexture; + _counterTimer = duration; + ApplyCurrentFrame(1f); + } + + public void StopDefenseAnimation() + { + if (_currentState == AnimationState.Defending) + { + _currentState = AnimationState.Idle; + ApplyCurrentFrame(1f); + } + } + /// /// Update attack animation and return true when finished /// @@ -380,6 +424,16 @@ private void ApplyCurrentFrame(float facingX) frameToUse = _hitTexture; } break; + case AnimationState.Defending: + if (_counterTimer > 0f && _counterTexture != null) + { + frameToUse = _counterTexture; + } + else if (_defenseTexture != null) + { + frameToUse = _defenseTexture; + } + break; } if (frameToUse != null) diff --git a/Scripts/Characters/PlayerSystems/PlayerMovementController.cs b/Scripts/Characters/PlayerSystems/PlayerMovementController.cs index b56096b..9ef73bb 100644 --- a/Scripts/Characters/PlayerSystems/PlayerMovementController.cs +++ b/Scripts/Characters/PlayerSystems/PlayerMovementController.cs @@ -2,61 +2,61 @@ namespace QuestFantasy.Characters.PlayerSystems { - /// - /// Handles player character movement logic, including collision detection and axis-aligned movement. - /// - /// Design Notes: - /// - Uses axis-aligned movement: attempts X axis first, then Y axis - /// - Each axis calculates independently from the original position, preventing one axis from affecting the other - /// - If one axis is blocked, movement on the other axis can still proceed (sliding effect) - /// - Collision detection only checks the lower half of the character body, allowing head to pass through terrain - /// - public class PlayerMovementController - { - public void TryMove(Node2D actor, Map map, Vector2 deltaMove, Vector2 bodySize) - { - if (map == null) - { - GD.PrintErr("[Movement] Map is null!"); - return; - } + /// + /// Handles player character movement logic, including collision detection and axis-aligned movement. + /// + /// Design Notes: + /// - Uses axis-aligned movement: attempts X axis first, then Y axis + /// - Each axis calculates independently from the original position, preventing one axis from affecting the other + /// - If one axis is blocked, movement on the other axis can still proceed (sliding effect) + /// - Collision detection only checks the lower half of the character body, allowing head to pass through terrain + /// + public class PlayerMovementController + { + public void TryMove(Node2D actor, Map map, Vector2 deltaMove, Vector2 bodySize) + { + if (map == null) + { + GD.PrintErr("[Movement] Map is null!"); + return; + } - // Save original position to allow independent calculation for both axes - Vector2 originalPos = actor.Position; - Vector2 newPos = originalPos; + // Save original position to allow independent calculation for both axes + Vector2 originalPos = actor.Position; + Vector2 newPos = originalPos; - // Attempt movement along X axis - Vector2 nextX = new Vector2(originalPos.x + deltaMove.x, originalPos.y); - Rect2 xRect = GetBodyRect(nextX, bodySize); - if (map.CanMoveTo(xRect)) - { - newPos.x = nextX.x; - } + // Attempt movement along X axis + Vector2 nextX = new Vector2(originalPos.x + deltaMove.x, originalPos.y); + Rect2 xRect = GetBodyRect(nextX, bodySize); + if (map.CanMoveTo(xRect)) + { + newPos.x = nextX.x; + } - // Attempt movement along Y axis (based on original Y, unaffected by X axis) - Vector2 nextY = new Vector2(originalPos.x, originalPos.y + deltaMove.y); - Rect2 yRect = GetBodyRect(nextY, bodySize); - if (map.CanMoveTo(yRect)) - { - newPos.y = nextY.y; - } + // Attempt movement along Y axis (based on original Y, unaffected by X axis) + Vector2 nextY = new Vector2(originalPos.x, originalPos.y + deltaMove.y); + Rect2 yRect = GetBodyRect(nextY, bodySize); + if (map.CanMoveTo(yRect)) + { + newPos.y = nextY.y; + } - // Apply new position atomically - if (newPos != originalPos) - { - actor.Position = newPos; - } - } + // Apply new position atomically + if (newPos != originalPos) + { + actor.Position = newPos; + } + } - private Rect2 GetBodyRect(Vector2 centerPosition, Vector2 bodySize) - { - // Only check the lower half of the body for collision detection - // This allows the character's head to pass through terrain - float lowerBodyHeight = bodySize.y / 2f; - Vector2 lowerBodyStart = centerPosition - bodySize / 2f; - lowerBodyStart.y += bodySize.y / 2f; // Move to start of lower half + private Rect2 GetBodyRect(Vector2 centerPosition, Vector2 bodySize) + { + // Only check the lower half of the body for collision detection + // This allows the character's head to pass through terrain + float lowerBodyHeight = bodySize.y / 2f; + Vector2 lowerBodyStart = centerPosition - bodySize / 2f; + lowerBodyStart.y += bodySize.y / 2f; // Move to start of lower half - return new Rect2(lowerBodyStart, new Vector2(bodySize.x, lowerBodyHeight)); - } - } -} + return new Rect2(lowerBodyStart, new Vector2(bodySize.x, lowerBodyHeight)); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/PlayerClass.cs b/Scripts/Core/Data/PlayerClass.cs index d244996..20fec76 100644 --- a/Scripts/Core/Data/PlayerClass.cs +++ b/Scripts/Core/Data/PlayerClass.cs @@ -47,6 +47,9 @@ public class ClassSpritePaths // Death / knocked-down frame (optional) public string DeadFrame { get; set; } + public string DefenseFrame { get; set; } + public string SkillAttackFrame { get; set; } + /// /// Uniform visual scale multiplier applied on top of the body-size calculation. /// 1.0 = normal size, 0.8 = 20 % smaller, etc. @@ -61,11 +64,11 @@ public class ClassSpritePaths /// public class SkillDefinition { - public string Id { get; set; } + public string Id { get; set; } public string DisplayName { get; set; } public string Description { get; set; } - public string Emoji { get; set; } - public float CooldownSec { get; set; } + public string Emoji { get; set; } + public float CooldownSec { get; set; } } /// @@ -104,6 +107,8 @@ public static class PlayerClassData public const string SkillIdGiantFireball = "giant_fireball"; public const string SkillIdTripleArrow = "triple_arrow"; public const string SkillIdRicochetArrow = "ricochet_arrow"; + public const string SkillIdFlyingSword = "flying_sword"; + public const string SkillIdDefenseStance = "defense_stance"; // ── Allowed skills per class ─────────────────────────────────────── @@ -124,7 +129,7 @@ public static class PlayerClassData private static readonly HashSet WarriorSkills = new HashSet { - SkillIdSword + SkillIdSword, SkillIdFlyingSword, SkillIdDefenseStance }; /// @@ -246,6 +251,24 @@ public static string GetSkillListText(PlayerClass cls) CooldownSec = 3.0f, }; + private static readonly SkillDefinition DefFlyingSword = new SkillDefinition + { + Id = SkillIdFlyingSword, + DisplayName = "Flying Sword", + Description = "Throw a sword that pierces enemies and returns to you.", + Emoji = "🗡️", + CooldownSec = 1.5f, + }; + + private static readonly SkillDefinition DefDefenseStance = new SkillDefinition + { + Id = SkillIdDefenseStance, + DisplayName = "Defense Stance", + Description = "Block all damage and counter-attack enemies when hit.", + Emoji = "🛡️", + CooldownSec = 8.0f, + }; + /// /// Returns the ordered list of all s that /// the given class is permitted to equip. Used to build the skill-equip UI. @@ -259,7 +282,7 @@ public static ReadOnlyCollection GetAllSkillDefinitions(PlayerC case PlayerClass.Archer: return new ReadOnlyCollection(new[] { DefBow, DefTripleArrow, DefRicochetArrow }); case PlayerClass.Warrior: - return new ReadOnlyCollection(new[] { DefSword }); + return new ReadOnlyCollection(new[] { DefSword, DefFlyingSword, DefDefenseStance }); default: // Adventurer return new ReadOnlyCollection(new[] { DefSword, DefBow, DefFireball }); } @@ -273,10 +296,10 @@ public static ReadOnlyCollection GetDefaultSkillLoadout(PlayerClass cls) { switch (cls) { - case PlayerClass.Mage: return new ReadOnlyCollection(new[] { SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball }); - case PlayerClass.Archer: return new ReadOnlyCollection(new[] { SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow }); - case PlayerClass.Warrior: return new ReadOnlyCollection(new[] { SkillIdSword }); - default: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdBow, SkillIdFireball }); + case PlayerClass.Mage: return new ReadOnlyCollection(new[] { SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball }); + case PlayerClass.Archer: return new ReadOnlyCollection(new[] { SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow }); + case PlayerClass.Warrior: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdFlyingSword, SkillIdDefenseStance }); + default: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdBow, SkillIdFireball }); } } @@ -350,6 +373,8 @@ public static ClassSpritePaths GetSpritePaths(PlayerClass cls) FireballAttackPaths = null, HitFrame = W + "hit.png", DeadFrame = W + "skill_down.png", // knocked-down sprite + DefenseFrame = W + "defense.png", + SkillAttackFrame = W + "skill_attack.png", }; } diff --git a/Scripts/Core/Data/Skills/DefenseStanceSkill.cs b/Scripts/Core/Data/Skills/DefenseStanceSkill.cs new file mode 100644 index 0000000..0c3a497 --- /dev/null +++ b/Scripts/Core/Data/Skills/DefenseStanceSkill.cs @@ -0,0 +1,27 @@ +using Godot; + +using QuestFantasy.Characters; + +namespace QuestFantasy.Core.Data.Skills +{ + public class DefenseStanceSkill : Attributes.Skills + { + public DefenseStanceSkill() + { + Name = "Defense Stance"; + Description = "Become invulnerable for 3 seconds. Any attack received triggers a counter-attack."; + } + + public override float MaxRange => 0f; + + public override float GetCooldownDuration() => 8.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) return; + + // Activate defense stance for 3 seconds + player.ActivateDefenseStance(3.0f); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/FlyingSwordSkill.cs b/Scripts/Core/Data/Skills/FlyingSwordSkill.cs new file mode 100644 index 0000000..2a52dd8 --- /dev/null +++ b/Scripts/Core/Data/Skills/FlyingSwordSkill.cs @@ -0,0 +1,38 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Systems.StatusEffects; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// A returning projectile skill for the Warrior. + /// Throws a sword that pierces through enemies, reaches max range, + /// and then flies back to the player, damaging enemies again. + /// + public class FlyingSwordSkill : Attributes.Skills + { + public FlyingSwordSkill() + { + Name = "Flying Sword"; + Description = "Throw a sword that pierces enemies and returns to you."; + } + + public override float MaxRange => 250f; + + public override float GetCooldownDuration() => 1.5f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + SkillProjectileSpawner.SpawnFlyingSword( + player, + target, + MaxRange); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/GiantFireballSkill.cs b/Scripts/Core/Data/Skills/GiantFireballSkill.cs index cac33e6..0199ac0 100644 --- a/Scripts/Core/Data/Skills/GiantFireballSkill.cs +++ b/Scripts/Core/Data/Skills/GiantFireballSkill.cs @@ -39,4 +39,4 @@ public override void Effect(Player player, Character target) onHitChance: GameConstants.FIREBALL_BURN_CHANCE * 1.5f); } } -} +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/RicochetArrowSkill.cs b/Scripts/Core/Data/Skills/RicochetArrowSkill.cs index 0dfd6f6..e7a16e8 100644 --- a/Scripts/Core/Data/Skills/RicochetArrowSkill.cs +++ b/Scripts/Core/Data/Skills/RicochetArrowSkill.cs @@ -35,4 +35,4 @@ public override void Effect(Player player, Character target) bounces: 4); } } -} +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs index 37d10ab..5efdcd6 100644 --- a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs +++ b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs @@ -30,7 +30,7 @@ public static void SpawnTripleArrow( float onHitChance = 0f) { Vector2 direction = ResolveDirection(player, target); - + // Calculate a perpendicular offset vector (10 pixels wide) to separate the arrows Vector2 perpOffset = new Vector2(-direction.y, direction.x) * 12f; @@ -41,7 +41,7 @@ public static void SpawnTripleArrow( AttachToScene(player, nodeCenter); AttachToScene(player, nodeLeft); AttachToScene(player, nodeRight); - + // Apply the visual offsets nodeLeft.GlobalPosition += perpOffset; nodeRight.GlobalPosition -= perpOffset; @@ -67,7 +67,7 @@ public static void SpawnTripleFireball( float onHitChance = 0f) { Vector2 direction = ResolveDirection(player, target); - + // Calculate spread directions (±15 degrees = ±0.261799 radians) float spreadAngle = 15f * Mathf.Pi / 180f; Vector2 dirLeft = direction.Rotated(-spreadAngle); @@ -94,6 +94,18 @@ public static void SpawnGiantFireball( AttachToScene(player, node); } + public static void SpawnFlyingSword( + Player player, + Character target, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateFlyingSword(player, direction, maxRange, onHitEffect, onHitChance); + AttachToScene(player, node); + } + public static void SpawnRicochetArrow( Player player, Character target, @@ -189,7 +201,10 @@ internal class SkillProjectileNode : Node2D private float _flightFrameDuration = 0f; private float _impactFrameDuration = ArrowImpactFrameDuration; private int _bouncesRemaining = 0; - private float _bounceRange = 150f; + private readonly float _bounceRange = 150f; + private bool _isPiercing = false; + private bool _isReturning = false; + private bool _returningPhase = false; public static SkillProjectileNode CreateArrow( Player owner, @@ -312,6 +327,47 @@ public static SkillProjectileNode CreateGiantFireball( }; } + public static SkillProjectileNode CreateFlyingSword( + Player owner, + Vector2 direction, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + return new SkillProjectileNode + { + _owner = owner, + _map = FindMap(owner), + _direction = direction, + _speed = ArrowSpeed * 0.9f, + _maxDistance = Mathf.Max(10f, maxRange), + _hitRadius = 16f, + _damageMin = 6, + _damageMax = 12, + _isAoe = false, + _aoeRadius = 0f, + _isPiercing = true, + _isReturning = true, + _onHitEffect = onHitEffect, + _onHitChance = onHitChance, + _projectileTexture = GD.Load("res://Assets/SkillAnimation/fly_sword.png"), + _projectileScale = 0.3f, + _impactScale = 0.3f, + _flightFrameDuration = 0.08f, + _impactFrameDuration = ArrowImpactFrameDuration, + _flightFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/fly_sword.png"), + GD.Load("res://Assets/SkillAnimation/fly_sword-1.png"), + GD.Load("res://Assets/SkillAnimation/fly_sword-2.png"), + }, + _impactFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/fly_sword.png"), + } + }; + } + public override void _Ready() { Texture firstFlightTexture = _projectileTexture; @@ -353,31 +409,48 @@ public override void _Process(float delta) UpdateFlightAnimation(delta); + if (_returningPhase) + { + Vector2 toOwner = _owner.GlobalPosition - GlobalPosition; + if (toOwner.LengthSquared() < 400f) // approx 20 units + { + QueueFree(); + return; + } + _direction = toOwner.Normalized(); + Rotation = _direction.Angle(); + } + Vector2 step = _direction * _speed * delta; Vector2 nextPosition = GlobalPosition + step; - if (IsBlockedByWall(nextPosition)) + if (IsBlockedByWall(nextPosition) && !_returningPhase) { if (_bouncesRemaining > 0) { _bouncesRemaining--; - + // Simple reflection based on axis bool xBlocked = IsBlockedByWall(GlobalPosition + new Vector2(step.x, 0)); bool yBlocked = IsBlockedByWall(GlobalPosition + new Vector2(0, step.y)); - + if (xBlocked) _direction.x *= -1; if (yBlocked) _direction.y *= -1; - + // Corner case: if both or neither (diagonal corner), just flip both if (!xBlocked && !yBlocked) { _direction = -_direction; } - + _direction = _direction.Normalized(); Rotation = _direction.Angle(); return; // continue next frame } else { + if (_isReturning) + { + StartReturningPhase(); + return; + } BeginImpact(nextPosition, null); return; } @@ -390,7 +463,7 @@ public override void _Process(float delta) { ApplyDamage(hitTarget); _bouncesRemaining--; - + // Find next target Character nextTarget = FindNextBounceTarget(hitTarget.GlobalPosition); if (nextTarget != null) @@ -399,13 +472,17 @@ public override void _Process(float delta) Rotation = _direction.Angle(); return; // continue next frame } - else + else { // No target to bounce to, just impact BeginImpact(hitTarget.GlobalPosition, hitTarget); return; } } + else if (_isPiercing) + { + ApplyDamage(hitTarget); + } else { BeginImpact(hitTarget.GlobalPosition, hitTarget); @@ -414,13 +491,31 @@ public override void _Process(float delta) } GlobalPosition = nextPosition; - _traveled += step.Length(); - if (_traveled >= _maxDistance) + + if (!_returningPhase) { - QueueFree(); + _traveled += step.Length(); + if (_traveled >= _maxDistance) + { + if (_isReturning) + { + StartReturningPhase(); + } + else + { + QueueFree(); + } + } } } + private void StartReturningPhase() + { + _returningPhase = true; + _damagedTargets.Clear(); + _isPiercing = true; + } + private bool IsBlockedByWall(Vector2 position) { if (_map == null || !Godot.Object.IsInstanceValid(_map)) @@ -476,7 +571,7 @@ private Character FindNextBounceTarget(Vector2 currentPosition) { continue; } - + // Do not bounce back to already hit targets if (_damagedTargets.Contains(enemy)) { diff --git a/Scripts/Core/Data/Skills/TripleArrowSkill.cs b/Scripts/Core/Data/Skills/TripleArrowSkill.cs index 4873c65..29e267e 100644 --- a/Scripts/Core/Data/Skills/TripleArrowSkill.cs +++ b/Scripts/Core/Data/Skills/TripleArrowSkill.cs @@ -33,4 +33,4 @@ public override void Effect(Player player, Character target) MaxRange); } } -} +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/TripleFireballSkill.cs b/Scripts/Core/Data/Skills/TripleFireballSkill.cs index 0fa340d..6b7a346 100644 --- a/Scripts/Core/Data/Skills/TripleFireballSkill.cs +++ b/Scripts/Core/Data/Skills/TripleFireballSkill.cs @@ -40,4 +40,4 @@ public override void Effect(Player player, Character target) onHitChance: GameConstants.FIREBALL_BURN_CHANCE); } } -} +} \ No newline at end of file diff --git a/Scripts/Main.cs b/Scripts/Main.cs index 6fc8e6d..ffa01d7 100644 --- a/Scripts/Main.cs +++ b/Scripts/Main.cs @@ -10,861 +10,861 @@ public class Main : Node2D { - [Export] public string BackendBaseUrl = "http://127.0.0.1:8000"; - [Export] public bool EnableMobileInputUI = true; // Force enable virtual D-pad for testing - - private AuthFlowController _authFlowController; - private AuthApiClient _playerDataApiClient; - private SidebarMenu _sidebarMenu; - private PlayerHud _playerHud; - private BackpackUI _backpackUi; - private DeathScreenUI _deathScreen; - private ProgressSyncIndicator _progressIndicator; - private Map _map; - private Player _player; - private MobileInputUI _mobileInputUI; - private MiniMapUI _miniMapUi; - private readonly EquipmentManager _equipManagerRef = new EquipmentManager(); - private readonly TreasureChest _chestRef = new TreasureChest(); - private readonly Godot.Collections.Array _spawnedMonsters = new Godot.Collections.Array(); - private readonly string _syncSessionId = Guid.NewGuid().ToString("N"); - private int _syncSequence = 0; - private int _localMutationVersion = 0; - private int _activeSyncMutationVersion = 0; - private float _checkpointElapsed = 0f; - private Timer _profileFetchTimeoutTimer; - private bool _isProfileFetchPending = false; - private int _activeProfileFetchId = 0; - private PlayerProfileSnapshot _pendingProfileSnapshot; - private LobbyManager _lobbyManager; - private bool _gameLoadedAlready = false; // Guard against loading twice - private const float ProfileFetchTimeoutSeconds = 12f; - - private int _currentMusicIndex = 0; - private readonly string[] _musicFiles = { - "res://Assets/Music/QuestFantasy_Oath2.mp3", - "res://Assets/Music/QuestFantasy_Oath3.mp3", - "res://Assets/Music/QuestFantasy_Oath1.mp3", - "res://Assets/Music/QuestFantasy_Oath4.mp3" - }; - private AudioStreamPlayer _musicPlayer; - - - public override void _Ready() - { - GD.Print("遊戲開始了,正在讀取登入畫面..."); - SetProcess(true); - GetTree().Connect("node_added", this, nameof(OnSceneNodeAdded)); - SetupMobileInputUI(); - SetupSidebarMenu(); - SetupMusic(); - SetupProgressIndicator(); - SetupPlayerDataClient(); - SetupAuthFlowController(); - SetupDeathScreen(); - GD.Print("登入成功..."); - } - - public override void _ExitTree() - { - if (GetTree() != null && GetTree().IsConnected("node_added", this, nameof(OnSceneNodeAdded))) - { - GetTree().Disconnect("node_added", this, nameof(OnSceneNodeAdded)); - } - } - - private void SetupProgressIndicator() - { - _progressIndicator = new ProgressSyncIndicator(); - AddChild(_progressIndicator); - _progressIndicator.SetState(ProgressSyncIndicator.SyncState.Hidden); - - if (_equipManagerRef.GetParent() == null) - { - AddChild(_equipManagerRef); - } - - if (_chestRef.GetParent() == null) - { - AddChild(_chestRef); - } - - // Ensure EquipmentPreview exists in the scene so pickups can call EquipmentPreview.Instance - if (EquipmentPreview.Instance == null) - { - var preview = new EquipmentPreview(); - AddChild(preview); - } - - // Ensure InteractionButtonUI exists in the scene - if (InteractionButtonUI.Instance == null) - { - var interactBtn = new InteractionButtonUI(); - AddChild(interactBtn); - } - } - - public override void _Process(float delta) - { - if (_player == null) - { - return; - } - - if (_authFlowController?.CurrentSession == null || !_authFlowController.CurrentSession.IsValid) - { - return; - } - - _checkpointElapsed += delta; - if (_checkpointElapsed >= 25f) - { - _checkpointElapsed = 0f; - TransmitPlayerProfile("checkpoint"); - } - } - - private void BuildPlayablePrototype(PlayerProfileSnapshot profileSnapshot) - { - GetTree().Paused = false; - DestroyPlayableWorld(); - _pendingProfileSnapshot = profileSnapshot; - EnsureLobbyBackpackContext(); - _sidebarMenu?.SetMenuVisible(true); - // Build lobby instead of directly loading a game map - BuildLobby(); - - if (_musicPlayer != null && !_musicPlayer.Playing) - { - PlayCurrentMusic(); - } - } - - - private void SetupAuthFlowController() - { - _authFlowController = new AuthFlowController - { - BackendBaseUrl = BackendBaseUrl, - PauseMode = PauseModeEnum.Process - }; - AddChild(_authFlowController); - _authFlowController.Authenticated += OnAuthenticated; - _authFlowController.LoggedOut += HandleLoggedOut; - _authFlowController.AuthViewShown += () => _mobileInputUI?.HideDPad(); - } - - private void SetupPlayerDataClient() - { - _playerDataApiClient = new AuthApiClient - { - BackendBaseUrl = BackendBaseUrl, - PauseMode = PauseModeEnum.Process, - }; - AddChild(_playerDataApiClient); - - _profileFetchTimeoutTimer = new Timer - { - OneShot = true, - WaitTime = ProfileFetchTimeoutSeconds, - PauseMode = PauseModeEnum.Process, - }; - AddChild(_profileFetchTimeoutTimer); - _profileFetchTimeoutTimer.Connect("timeout", this, nameof(OnProfileFetchTimeout)); - } - - private void OnAuthenticated() - { - // If logout paused the tree, profile HTTP callbacks can stall forever. - GetTree().Paused = false; - - string token = _authFlowController?.CurrentSession?.Token; - if (string.IsNullOrWhiteSpace(token) || _playerDataApiClient == null) - { - GD.Print("[ProgressSync] No token/client available. Building world with local defaults."); - BuildPlayablePrototype(null); - return; - } - - GD.Print("[ProgressSync] Fetching player profile before entering level..."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Loading); - _activeProfileFetchId += 1; - int requestId = _activeProfileFetchId; - _isProfileFetchPending = true; - _profileFetchTimeoutTimer?.Start(ProfileFetchTimeoutSeconds); - - if (!_playerDataApiClient.FetchPlayerProfile(token, result => OnPlayerProfileFetched(requestId, result))) - { - GD.PrintErr("[Main] Failed to fetch player profile. Starting with local defaults."); - GD.Print("[ProgressSync] Profile fetch request failed to send. Using local defaults."); - _isProfileFetchPending = false; - _profileFetchTimeoutTimer?.Stop(); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - BuildPlayablePrototype(null); - } - } - - private void OnPlayerProfileFetched(int requestId, AuthApiResult result) - { - if (!_isProfileFetchPending || requestId != _activeProfileFetchId) - { - GD.Print($"[ProgressSync] Ignored stale profile response. requestId={requestId}, active={_activeProfileFetchId}, pending={_isProfileFetchPending}."); - return; - } - - _isProfileFetchPending = false; - _profileFetchTimeoutTimer?.Stop(); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - if (!result.NetworkOk || !result.IsSuccessStatus(200)) - { - GD.PrintErr("[Main] Player profile fetch failed. Starting with local defaults."); - GD.Print($"[ProgressSync] Profile fetch failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}."); - BuildPlayablePrototype(null); - return; - } - - var snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); - GD.Print($"[ProgressSync] Profile loaded. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}, Skills={snapshot.Skills.Count}."); - BuildPlayablePrototype(snapshot); - } - - private void OnProfileFetchTimeout() - { - if (!_isProfileFetchPending) - { - return; - } - - _isProfileFetchPending = false; - GD.PrintErr($"[ProgressSync] Profile fetch timed out after {ProfileFetchTimeoutSeconds}s. Using local defaults."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - BuildPlayablePrototype(null); - } - - private void SetupSidebarMenu() - { - _sidebarMenu = new SidebarMenu(); - AddChild(_sidebarMenu); - _sidebarMenu.SetMenuVisible(false); - _sidebarMenu.AddMenuItem("change_music", "Change Music", OnChangeMusicPressed); - _sidebarMenu.AddMenuItem("logout", "Logout", OnLogoutPressed); - } - - private void SetupMusic() - { - _musicPlayer = new AudioStreamPlayer(); - _musicPlayer.PauseMode = PauseModeEnum.Process; // Keep playing even if game pauses - AddChild(_musicPlayer); - } - - private void PlayCurrentMusic() - { - if (_musicPlayer == null) return; - - var stream = GD.Load(_musicFiles[_currentMusicIndex]); - if (stream != null) - { - _musicPlayer.Stream = stream; - _musicPlayer.Play(); - } - else - { - GD.PrintErr($"[Main] Failed to load audio stream: {_musicFiles[_currentMusicIndex]}"); - } - } - - private void OnChangeMusicPressed() - { - _currentMusicIndex = (_currentMusicIndex + 1) % _musicFiles.Length; - PlayCurrentMusic(); - } - - private void SetupMobileInputUI() - { - // Create mobile input UI once for the entire game lifetime - bool shouldEnableMobileUI = EnableMobileInputUI || OS.HasTouchscreenUiHint(); - if (shouldEnableMobileUI) - { - _mobileInputUI = new MobileInputUI(); - AddChild(_mobileInputUI); - _mobileInputUI.HideDPad(); - GD.Print("[Main] Mobile input UI enabled globally for touch controls"); - } - } - - private void SetupDeathScreen() - { - _deathScreen = new DeathScreenUI(); - AddChild(_deathScreen); - _deathScreen.OnRespawnClicked += () => - { - _deathScreen.SetVisible(false); - if (_playerHud != null) _playerHud.SetVisible(true); - _player?.Respawn(); - }; - _deathScreen.OnExitClicked += () => - { - _deathScreen.SetVisible(false); - ReturnToLobby(); - }; - } - - private void OnLogoutPressed() - { - TransmitPlayerProfile("logout"); - _authFlowController?.RequestLogout(); - } - - private void OnPlayerDied() - { - TransmitPlayerProfile("die"); - if (_playerHud != null) _playerHud.SetVisible(false); - _deathScreen?.SetVisible(true); - } - - private void OnPlayerEnteredRoom(Vector2 roomIndex, string reason) - { - string syncReason = string.IsNullOrWhiteSpace(reason) ? "room_enter" : reason; - GD.Print($"[ProgressSync] Room entry autosave trigger at ({roomIndex.x}, {roomIndex.y}), reason={syncReason}."); - TransmitPlayerProfile(syncReason); - } - - private void HandleLoggedOut() - { - _isProfileFetchPending = false; - _profileFetchTimeoutTimer?.Stop(); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - _mobileInputUI?.HideDPad(); - DestroyPlayableWorld(); - _gameLoadedAlready = false; - _sidebarMenu?.SetMenuVisible(false); - GetTree().Paused = true; - _sidebarMenu?.SetMenuVisible(false); - _musicPlayer?.Stop(); - - // Clean up any active gameplay/lobby scenes - _lobbyManager?.QueueFree(); - _lobbyManager = null; - _map?.QueueFree(); - _map = null; - _player = null; - - GD.Print("[Main] Logged out - all game states cleaned"); - } - - private void TransmitPlayerProfile(string reason) - { - if (_player == null || _playerDataApiClient == null || _playerDataApiClient.IsBusy) - { - GD.Print($"[ProgressSync] Skipped send. reason={reason}, playerReady={_player != null}, clientReady={_playerDataApiClient != null}, clientBusy={_playerDataApiClient?.IsBusy}."); - return; - } - - string token = _authFlowController?.CurrentSession?.Token; - if (string.IsNullOrWhiteSpace(token)) - { - GD.Print($"[ProgressSync] Skipped send. reason={reason}, missing auth token."); - return; - } - - _syncSequence += 1; - PlayerProfileSnapshot snapshot = _player.BuildProfileSnapshot(); - _activeSyncMutationVersion = _localMutationVersion; - var payload = snapshot.ToUpdatePayload(_syncSessionId, _syncSequence); - payload["reason"] = reason; - GD.Print($"[ProgressSync] Sending profile. reason={reason}, seq={_syncSequence}, level={snapshot.Level}, hp={snapshot.HpCurrent}/{snapshot.HpMax}, exp={snapshot.Experience}, gold={snapshot.Gold}."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Saving); - - if (!_playerDataApiClient.UpdatePlayerProfile(token, payload, OnPlayerProfileSynced)) - { - GD.PrintErr($"[ProgressSync] Send failed to start. reason={reason}, seq={_syncSequence}."); - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - _syncSequence -= 1; - } - } - - private void OnPlayerProfileSynced(AuthApiResult result) - { - _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); - if (!result.NetworkOk || !result.IsSuccessStatus(200) || _player == null) - { - GD.PrintErr($"[ProgressSync] Sync failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}, playerReady={_player != null}."); - return; - } - - PlayerProfileSnapshot snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); - if (!snapshot.Ignored) - { - if (_activeSyncMutationVersion < _localMutationVersion) - { - GD.Print($"[ProgressSync] Ignored stale sync response. syncMutation={_activeSyncMutationVersion}, localMutation={_localMutationVersion}."); - TransmitPlayerProfile("resync_after_local_change"); - return; - } - - GD.Print($"[ProgressSync] Sync applied. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}."); - _player.ApplyProfile(snapshot); - return; - } - - GD.Print($"[ProgressSync] Sync ignored by server. reason={snapshot.IgnoreReason}."); - } - - private void DestroyPlayableWorld() - { - foreach (Node child in GetChildren()) - { - if (child is ExpPickup || child is QuestFantasy.Items.CoinDrop || child is EquipmentPickup) - { - child.QueueFree(); - } - } - - for (int i = 0; i < _spawnedMonsters.Count; i++) - { - if (Godot.Object.IsInstanceValid(_spawnedMonsters[i])) - { - _spawnedMonsters[i].QueueFree(); - } - } - _spawnedMonsters.Clear(); - - if (Godot.Object.IsInstanceValid(_miniMapUi)) - { - _miniMapUi.QueueFree(); - } - _miniMapUi = null; - - if (Godot.Object.IsInstanceValid(_player)) - { - _player.OnDied -= OnPlayerDied; - _player.OnRoomEntered -= OnPlayerEnteredRoom; - _player.QueueFree(); - } - _player = null; - - if (Godot.Object.IsInstanceValid(_playerHud)) - { - _playerHud.QueueFree(); - } - _playerHud = null; - - if (Godot.Object.IsInstanceValid(_backpackUi)) - { - _backpackUi.DropRequested -= OnBackpackDropRequested; - _backpackUi.UseRequested -= OnBackpackUseRequested; - _backpackUi.SyncRequested -= OnInventorySyncRequested; - _backpackUi.QueueFree(); - } - _backpackUi = null; - - // DO NOT destroy _mobileInputUI - it should persist throughout the game - // Hide it when leaving gameplay; it will be re-shown only when entering a game level - _mobileInputUI?.HideDPad(); - - if (Godot.Object.IsInstanceValid(_map)) - { - _map.QueueFree(); - } - _map = null; - _gameLoadedAlready = false; - - } - private void BuildLobby() - { - EnsureLobbyBackpackContext(); - - _lobbyManager = new LobbyManager(); - _lobbyManager.Initialize(_player, _playerDataApiClient, _authFlowController?.CurrentSession?.Token); - AddChild(_lobbyManager); - _lobbyManager.DifficultySelected += OnDifficultySelected; - - // Show D-pad in the lobby, but hide map button - _mobileInputUI?.ShowDPad(); - _mobileInputUI?.ShowMapButton(false); - _lobbyManager.SyncRequested += OnInventorySyncRequested; - _lobbyManager.ClassChangeRequested += OnClassChangeRequested; - } - - private void OnClassChangeRequested(QuestFantasy.Core.Data.PlayerClass newClass) - { - GD.Print($"[Main] Player changed class to {newClass}. Syncing profile to backend."); - TransmitPlayerProfile("class_change"); - } - - private void EnsureLobbyBackpackContext() - { - if (!Godot.Object.IsInstanceValid(_player)) - { - _player = new Player(); - AddChild(_player); - } - - _player.Visible = false; - - if (_pendingProfileSnapshot != null) - { - if (_pendingProfileSnapshot.HpCurrent <= 0) - { - _pendingProfileSnapshot.HpCurrent = _pendingProfileSnapshot.HpMax; - } - _player.ApplyProfile(_pendingProfileSnapshot); - } - - if (!Godot.Object.IsInstanceValid(_backpackUi)) - { - _backpackUi = new BackpackUI(); - AddChild(_backpackUi); - _backpackUi.DropRequested += OnBackpackDropRequested; - _backpackUi.UseRequested += OnBackpackUseRequested; - _backpackUi.SyncRequested += OnInventorySyncRequested; - } - - _backpackUi.Initialize(_player); - _backpackUi.SetGameplayVisible(true); - } - - private void OnDifficultySelected(DifficultyLevel difficulty) - { - if (_gameLoadedAlready) - return; - - if (!TryConsumeEntryTicket(difficulty)) - { - GD.Print($"[Main] Difficulty {difficulty} is locked. Missing entry ticket."); - return; - } - - _gameLoadedAlready = true; - - // Save current lobby player state before transitioning to game level - if (Godot.Object.IsInstanceValid(_player)) - { - _pendingProfileSnapshot = _player.BuildProfileSnapshot(); - GD.Print($"[Main] Saved lobby profile snapshot before entering game. Inventory: {_pendingProfileSnapshot.InventoryItems?.Count ?? 0}, HasEquip: {_pendingProfileSnapshot.HasEquippedItemsPayload}"); - - // Sync to backend - TransmitPlayerProfile("enter_dungeon"); - } - - _lobbyManager?.QueueFree(); - _lobbyManager = null; - LoadGameLevel(difficulty); - } - - private void LoadGameLevel(DifficultyLevel difficulty) - { - DestroyPlayableWorld(); - - _map = new Map(); - _map.TileSize = 24; - _map.RoomTileSize = 100; - _map.RoomsX = 2; - _map.RoomsY = 2; - _map.Difficulty = difficulty; - AddChild(_map); - _map.RegenerateWithRandomSeed(); - // Connect map's BoxOpened directly to TreasureChest so Main doesn't need to forward. - _map.Connect("BoxOpened", _chestRef, nameof(TreasureChest.HandleMapBoxOpened)); - - _player = new Player(); - AddChild(_player); - _player.Position = _map.GetSpawnWorldPosition(); - _player.SetMap(_map); - _player.OnDied += OnPlayerDied; - _player.OnRoomEntered += OnPlayerEnteredRoom; - - if (_pendingProfileSnapshot != null) - { - _player.ApplyProfile(_pendingProfileSnapshot); - _pendingProfileSnapshot = null; - } - - _playerHud = new PlayerHud(); - AddChild(_playerHud); - _playerHud.Initialize(_player, _map); - _playerHud.OnSkillSlotPressed += (skillIndex) => - { - _player?.InputHandler?.RequestSkillActivation(skillIndex); - }; - - _miniMapUi = new MiniMapUI(); - AddChild(_miniMapUi); - _miniMapUi.Initialize(_map, _player); - - _backpackUi = new BackpackUI(); - AddChild(_backpackUi); - _backpackUi.Initialize(_player); - _backpackUi.SetGameplayVisible(true); - _backpackUi.DropRequested += OnBackpackDropRequested; - _backpackUi.UseRequested += OnBackpackUseRequested; - - // Show D-pad only during actual gameplay - _mobileInputUI?.ShowDPad(); - _mobileInputUI?.ShowMapButton(true); - _backpackUi.SyncRequested += OnInventorySyncRequested; - - // Spawn monsters based on difficulty - int numMonstersToSpawn = ((int)difficulty + 1) * 100; - var monsterScene = (PackedScene)GD.Load("res://Scenes/Entities/monster.tscn"); - var speedMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/speed_monster.tscn"); - var fireMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/fire_monster.tscn"); - var monsterSpawnRandom = new RandomNumberGenerator(); - monsterSpawnRandom.Randomize(); - for (int i = 0; i < numMonstersToSpawn; i++) - { - int monsterRoll = monsterSpawnRandom.RandiRange(1, 10); - var selectedMonsterScene = monsterScene; - if (monsterRoll == 1 && speedMonsterScene != null) - { - selectedMonsterScene = speedMonsterScene; - } - else if ((monsterRoll == 2 || monsterRoll == 3) && fireMonsterScene != null) - { - selectedMonsterScene = fireMonsterScene; - } - - var monster = (Monster)selectedMonsterScene.Instance(); - monster.SetEnvironment(_map, _player); - AddChild(monster); - _spawnedMonsters.Add(monster); - } - - // Listen for when player reaches the exit to return to lobby - _player.GetCharacterController().ExitReached += ReturnToLobby; - } - - private void ReturnToLobby() - { - GD.Print("[Main] Player reached exit - returning to lobby"); - - // Save map difficulty before destroying it - DifficultyLevel lastMapDiff = _map != null ? _map.Difficulty : DifficultyLevel.Normal; - - bool wasDead = _player == null || _player.Attributes?.HP == null || !_player.Attributes.HP.IsAlive; - - // Restore HP to max before snapshotting so a dead player never carries - // 0 HP into the lobby or the next dungeon run. - if (_player != null) - { - int maxHp = _player.Attributes?.HP?.MaxHP ?? 100; - _player.Attributes?.HP?.SetMaxHPAndCurrentHP(maxHp, maxHp); - } - - // Save the current player state BEFORE destroying the world - _pendingProfileSnapshot = _player?.BuildProfileSnapshot(); - - // Sync to backend so the server has the latest state - TransmitPlayerProfile("return_to_lobby"); - - DestroyPlayableWorld(); - - // Rebuild the lobby for another session - BuildLobby(); - - if (!wasDead && _player != null && Godot.Object.IsInstanceValid(_player)) - { - var coinDrop = new QuestFantasy.Items.CoinDrop(); - coinDrop.Initialize((int)_player.Level, lastMapDiff, 5.0f, _player, 0.5f); - var spawnPos = _lobbyManager != null ? _lobbyManager.GetLobbyMap().GetSpawnWorldPosition() : _player.Position; - coinDrop.Position = spawnPos; - - if (_lobbyManager != null) - { - _lobbyManager.AddChild(coinDrop); - } - else - { - AddChild(coinDrop); - } - GD.PrintS($"[Main] Spawned Return-to-Lobby Coin drop at {coinDrop.Position}"); - } - } - - // Note: Map.BoxOpened is handled directly by TreasureChest.HandleMapBoxOpened now. - - private void OnSceneNodeAdded(Node node) - { - if (node is EquipmentPickup pickup) - { - AttachPickupSignal(pickup); - } - } - - private void AttachPickupSignal(EquipmentPickup pickup) - { - if (pickup == null) - { - return; - } - - if (!pickup.IsConnected(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested))) - { - pickup.Connect(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested)); - } - } - - private void OnPickupRequested(EquipmentPickup pickup) - { - if (_player == null || pickup == null || !Godot.Object.IsInstanceValid(pickup)) - { - return; - } - - EquipmentPickup targetPickup = ResolvePickupTarget(pickup); - if (targetPickup == null || !Godot.Object.IsInstanceValid(targetPickup)) - { - return; - } - - float distance = _player.GlobalPosition.DistanceTo(targetPickup.GlobalPosition); - if (distance > 80f) - { - GD.Print($"[Backpack] Pickup too far (distance: {distance:F1}). Move closer to pick it up."); - return; - } - - if (!(targetPickup.ItemData is Item item)) - { - GD.Print("[Backpack] Pickup ignored: item data missing or invalid."); - return; - } - - if (!_player.AddItem(item)) - { - GD.Print("[Backpack] Pickup failed: inventory add rejected."); - return; - } - - MarkLocalMutation(); - EquipmentPreview.Instance?.HidePreview(); - targetPickup.QueueFree(); - TransmitPlayerProfile("pickup_item"); - } - - private EquipmentPickup ResolvePickupTarget(EquipmentPickup requested) - { - if (requested == null || !Godot.Object.IsInstanceValid(requested)) - { - return null; - } - - EquipmentPickup best = requested; - int bestPriority = GetPickupPriority(requested); - float bestDistance = 0f; - - foreach (Node node in GetTree().GetNodesInGroup("pickup_items")) - { - if (!(node is EquipmentPickup candidate) || !Godot.Object.IsInstanceValid(candidate)) - { - continue; - } - - float distance = requested.GlobalPosition.DistanceTo(candidate.GlobalPosition); - if (distance > 36f) - { - continue; - } - - int priority = GetPickupPriority(candidate); - if (priority > bestPriority || (priority == bestPriority && distance < bestDistance)) - { - best = candidate; - bestPriority = priority; - bestDistance = distance; - } - } - - return best; - } - - private int GetPickupPriority(EquipmentPickup pickup) - { - if (pickup?.ItemData is ConsumableItem consumable) - { - if (consumable.HealAmount > 0) - { - return 30; - } - - return 25; - } - - if (pickup?.ItemData is TicketItem) - { - return 20; - } - - return 10; - } - - private void OnBackpackDropRequested(Item item) - { - if (_player == null || item == null) - { - return; - } - - if (!_player.DiscardItem(item)) - { - GD.Print("[Backpack] Drop failed: item not in inventory."); - return; - } - - MarkLocalMutation(); - var rng = new RandomNumberGenerator(); - rng.Randomize(); - Vector2 dropPosition = _player.Position + new Vector2(rng.RandfRange(-36f, 36f), rng.RandfRange(-24f, 24f)); - LootItemFactory.SpawnPickup(this, item, dropPosition, _equipManagerRef?.PickupSpriteScale ?? 0.5f, "backpack_drop"); - - TransmitPlayerProfile("discard_item"); - } - - private void OnBackpackUseRequested(Item item) - { - MarkLocalMutation(); - TransmitPlayerProfile("use_item"); - } - - private void MarkLocalMutation() - { - _localMutationVersion += 1; - } - - private bool TryConsumeEntryTicket(DifficultyLevel difficulty) - { - if (difficulty == DifficultyLevel.Easy) - { - return true; - } - - if (_player == null) - { - return false; - } - - foreach (Item item in _player.InventoryItems) - { - if (!ItemCatalog.IsTicketForDifficulty(item, difficulty)) - { - continue; - } - - bool removed = _player.RemoveItem(item); - if (removed) - { - MarkLocalMutation(); - GD.Print($"[Main] Consumed {item.Name} to enter {difficulty}."); - TransmitPlayerProfile($"consume_{ItemCatalog.GetTicketItemId(difficulty)}"); - } - return removed; - } - - return false; - } - - private void OnInventorySyncRequested() - { - TransmitPlayerProfile("inventory_sync"); - } -} + [Export] public string BackendBaseUrl = "http://127.0.0.1:8000"; + [Export] public bool EnableMobileInputUI = true; // Force enable virtual D-pad for testing + + private AuthFlowController _authFlowController; + private AuthApiClient _playerDataApiClient; + private SidebarMenu _sidebarMenu; + private PlayerHud _playerHud; + private BackpackUI _backpackUi; + private DeathScreenUI _deathScreen; + private ProgressSyncIndicator _progressIndicator; + private Map _map; + private Player _player; + private MobileInputUI _mobileInputUI; + private MiniMapUI _miniMapUi; + private readonly EquipmentManager _equipManagerRef = new EquipmentManager(); + private readonly TreasureChest _chestRef = new TreasureChest(); + private readonly Godot.Collections.Array _spawnedMonsters = new Godot.Collections.Array(); + private readonly string _syncSessionId = Guid.NewGuid().ToString("N"); + private int _syncSequence = 0; + private int _localMutationVersion = 0; + private int _activeSyncMutationVersion = 0; + private float _checkpointElapsed = 0f; + private Timer _profileFetchTimeoutTimer; + private bool _isProfileFetchPending = false; + private int _activeProfileFetchId = 0; + private PlayerProfileSnapshot _pendingProfileSnapshot; + private LobbyManager _lobbyManager; + private bool _gameLoadedAlready = false; // Guard against loading twice + private const float ProfileFetchTimeoutSeconds = 12f; + + private int _currentMusicIndex = 0; + private readonly string[] _musicFiles = { + "res://Assets/Music/QuestFantasy_Oath2.mp3", + "res://Assets/Music/QuestFantasy_Oath3.mp3", + "res://Assets/Music/QuestFantasy_Oath1.mp3", + "res://Assets/Music/QuestFantasy_Oath4.mp3" + }; + private AudioStreamPlayer _musicPlayer; + + + public override void _Ready() + { + GD.Print("遊戲開始了,正在讀取登入畫面..."); + SetProcess(true); + GetTree().Connect("node_added", this, nameof(OnSceneNodeAdded)); + SetupMobileInputUI(); + SetupSidebarMenu(); + SetupMusic(); + SetupProgressIndicator(); + SetupPlayerDataClient(); + SetupAuthFlowController(); + SetupDeathScreen(); + GD.Print("登入成功..."); + } + + public override void _ExitTree() + { + if (GetTree() != null && GetTree().IsConnected("node_added", this, nameof(OnSceneNodeAdded))) + { + GetTree().Disconnect("node_added", this, nameof(OnSceneNodeAdded)); + } + } + + private void SetupProgressIndicator() + { + _progressIndicator = new ProgressSyncIndicator(); + AddChild(_progressIndicator); + _progressIndicator.SetState(ProgressSyncIndicator.SyncState.Hidden); + + if (_equipManagerRef.GetParent() == null) + { + AddChild(_equipManagerRef); + } + + if (_chestRef.GetParent() == null) + { + AddChild(_chestRef); + } + + // Ensure EquipmentPreview exists in the scene so pickups can call EquipmentPreview.Instance + if (EquipmentPreview.Instance == null) + { + var preview = new EquipmentPreview(); + AddChild(preview); + } + + // Ensure InteractionButtonUI exists in the scene + if (InteractionButtonUI.Instance == null) + { + var interactBtn = new InteractionButtonUI(); + AddChild(interactBtn); + } + } + + public override void _Process(float delta) + { + if (_player == null) + { + return; + } + + if (_authFlowController?.CurrentSession == null || !_authFlowController.CurrentSession.IsValid) + { + return; + } + + _checkpointElapsed += delta; + if (_checkpointElapsed >= 25f) + { + _checkpointElapsed = 0f; + TransmitPlayerProfile("checkpoint"); + } + } + + private void BuildPlayablePrototype(PlayerProfileSnapshot profileSnapshot) + { + GetTree().Paused = false; + DestroyPlayableWorld(); + _pendingProfileSnapshot = profileSnapshot; + EnsureLobbyBackpackContext(); + _sidebarMenu?.SetMenuVisible(true); + // Build lobby instead of directly loading a game map + BuildLobby(); + + if (_musicPlayer != null && !_musicPlayer.Playing) + { + PlayCurrentMusic(); + } + } + + + private void SetupAuthFlowController() + { + _authFlowController = new AuthFlowController + { + BackendBaseUrl = BackendBaseUrl, + PauseMode = PauseModeEnum.Process + }; + AddChild(_authFlowController); + _authFlowController.Authenticated += OnAuthenticated; + _authFlowController.LoggedOut += HandleLoggedOut; + _authFlowController.AuthViewShown += () => _mobileInputUI?.HideDPad(); + } + + private void SetupPlayerDataClient() + { + _playerDataApiClient = new AuthApiClient + { + BackendBaseUrl = BackendBaseUrl, + PauseMode = PauseModeEnum.Process, + }; + AddChild(_playerDataApiClient); + + _profileFetchTimeoutTimer = new Timer + { + OneShot = true, + WaitTime = ProfileFetchTimeoutSeconds, + PauseMode = PauseModeEnum.Process, + }; + AddChild(_profileFetchTimeoutTimer); + _profileFetchTimeoutTimer.Connect("timeout", this, nameof(OnProfileFetchTimeout)); + } + + private void OnAuthenticated() + { + // If logout paused the tree, profile HTTP callbacks can stall forever. + GetTree().Paused = false; + + string token = _authFlowController?.CurrentSession?.Token; + if (string.IsNullOrWhiteSpace(token) || _playerDataApiClient == null) + { + GD.Print("[ProgressSync] No token/client available. Building world with local defaults."); + BuildPlayablePrototype(null); + return; + } + + GD.Print("[ProgressSync] Fetching player profile before entering level..."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Loading); + _activeProfileFetchId += 1; + int requestId = _activeProfileFetchId; + _isProfileFetchPending = true; + _profileFetchTimeoutTimer?.Start(ProfileFetchTimeoutSeconds); + + if (!_playerDataApiClient.FetchPlayerProfile(token, result => OnPlayerProfileFetched(requestId, result))) + { + GD.PrintErr("[Main] Failed to fetch player profile. Starting with local defaults."); + GD.Print("[ProgressSync] Profile fetch request failed to send. Using local defaults."); + _isProfileFetchPending = false; + _profileFetchTimeoutTimer?.Stop(); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + BuildPlayablePrototype(null); + } + } + + private void OnPlayerProfileFetched(int requestId, AuthApiResult result) + { + if (!_isProfileFetchPending || requestId != _activeProfileFetchId) + { + GD.Print($"[ProgressSync] Ignored stale profile response. requestId={requestId}, active={_activeProfileFetchId}, pending={_isProfileFetchPending}."); + return; + } + + _isProfileFetchPending = false; + _profileFetchTimeoutTimer?.Stop(); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + if (!result.NetworkOk || !result.IsSuccessStatus(200)) + { + GD.PrintErr("[Main] Player profile fetch failed. Starting with local defaults."); + GD.Print($"[ProgressSync] Profile fetch failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}."); + BuildPlayablePrototype(null); + return; + } + + var snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); + GD.Print($"[ProgressSync] Profile loaded. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}, Skills={snapshot.Skills.Count}."); + BuildPlayablePrototype(snapshot); + } + + private void OnProfileFetchTimeout() + { + if (!_isProfileFetchPending) + { + return; + } + + _isProfileFetchPending = false; + GD.PrintErr($"[ProgressSync] Profile fetch timed out after {ProfileFetchTimeoutSeconds}s. Using local defaults."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + BuildPlayablePrototype(null); + } + + private void SetupSidebarMenu() + { + _sidebarMenu = new SidebarMenu(); + AddChild(_sidebarMenu); + _sidebarMenu.SetMenuVisible(false); + _sidebarMenu.AddMenuItem("change_music", "Change Music", OnChangeMusicPressed); + _sidebarMenu.AddMenuItem("logout", "Logout", OnLogoutPressed); + } + + private void SetupMusic() + { + _musicPlayer = new AudioStreamPlayer(); + _musicPlayer.PauseMode = PauseModeEnum.Process; // Keep playing even if game pauses + AddChild(_musicPlayer); + } + + private void PlayCurrentMusic() + { + if (_musicPlayer == null) return; + + var stream = GD.Load(_musicFiles[_currentMusicIndex]); + if (stream != null) + { + _musicPlayer.Stream = stream; + _musicPlayer.Play(); + } + else + { + GD.PrintErr($"[Main] Failed to load audio stream: {_musicFiles[_currentMusicIndex]}"); + } + } + + private void OnChangeMusicPressed() + { + _currentMusicIndex = (_currentMusicIndex + 1) % _musicFiles.Length; + PlayCurrentMusic(); + } + + private void SetupMobileInputUI() + { + // Create mobile input UI once for the entire game lifetime + bool shouldEnableMobileUI = EnableMobileInputUI || OS.HasTouchscreenUiHint(); + if (shouldEnableMobileUI) + { + _mobileInputUI = new MobileInputUI(); + AddChild(_mobileInputUI); + _mobileInputUI.HideDPad(); + GD.Print("[Main] Mobile input UI enabled globally for touch controls"); + } + } + + private void SetupDeathScreen() + { + _deathScreen = new DeathScreenUI(); + AddChild(_deathScreen); + _deathScreen.OnRespawnClicked += () => + { + _deathScreen.SetVisible(false); + if (_playerHud != null) _playerHud.SetVisible(true); + _player?.Respawn(); + }; + _deathScreen.OnExitClicked += () => + { + _deathScreen.SetVisible(false); + ReturnToLobby(); + }; + } + + private void OnLogoutPressed() + { + TransmitPlayerProfile("logout"); + _authFlowController?.RequestLogout(); + } + + private void OnPlayerDied() + { + TransmitPlayerProfile("die"); + if (_playerHud != null) _playerHud.SetVisible(false); + _deathScreen?.SetVisible(true); + } + + private void OnPlayerEnteredRoom(Vector2 roomIndex, string reason) + { + string syncReason = string.IsNullOrWhiteSpace(reason) ? "room_enter" : reason; + GD.Print($"[ProgressSync] Room entry autosave trigger at ({roomIndex.x}, {roomIndex.y}), reason={syncReason}."); + TransmitPlayerProfile(syncReason); + } + + private void HandleLoggedOut() + { + _isProfileFetchPending = false; + _profileFetchTimeoutTimer?.Stop(); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + _mobileInputUI?.HideDPad(); + DestroyPlayableWorld(); + _gameLoadedAlready = false; + _sidebarMenu?.SetMenuVisible(false); + GetTree().Paused = true; + _sidebarMenu?.SetMenuVisible(false); + _musicPlayer?.Stop(); + + // Clean up any active gameplay/lobby scenes + _lobbyManager?.QueueFree(); + _lobbyManager = null; + _map?.QueueFree(); + _map = null; + _player = null; + + GD.Print("[Main] Logged out - all game states cleaned"); + } + + private void TransmitPlayerProfile(string reason) + { + if (_player == null || _playerDataApiClient == null || _playerDataApiClient.IsBusy) + { + GD.Print($"[ProgressSync] Skipped send. reason={reason}, playerReady={_player != null}, clientReady={_playerDataApiClient != null}, clientBusy={_playerDataApiClient?.IsBusy}."); + return; + } + + string token = _authFlowController?.CurrentSession?.Token; + if (string.IsNullOrWhiteSpace(token)) + { + GD.Print($"[ProgressSync] Skipped send. reason={reason}, missing auth token."); + return; + } + + _syncSequence += 1; + PlayerProfileSnapshot snapshot = _player.BuildProfileSnapshot(); + _activeSyncMutationVersion = _localMutationVersion; + var payload = snapshot.ToUpdatePayload(_syncSessionId, _syncSequence); + payload["reason"] = reason; + GD.Print($"[ProgressSync] Sending profile. reason={reason}, seq={_syncSequence}, level={snapshot.Level}, hp={snapshot.HpCurrent}/{snapshot.HpMax}, exp={snapshot.Experience}, gold={snapshot.Gold}."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Saving); + + if (!_playerDataApiClient.UpdatePlayerProfile(token, payload, OnPlayerProfileSynced)) + { + GD.PrintErr($"[ProgressSync] Send failed to start. reason={reason}, seq={_syncSequence}."); + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + _syncSequence -= 1; + } + } + + private void OnPlayerProfileSynced(AuthApiResult result) + { + _progressIndicator?.SetState(ProgressSyncIndicator.SyncState.Hidden); + if (!result.NetworkOk || !result.IsSuccessStatus(200) || _player == null) + { + GD.PrintErr($"[ProgressSync] Sync failed. NetworkOk={result.NetworkOk}, Code={result.ResponseCode}, playerReady={_player != null}."); + return; + } + + PlayerProfileSnapshot snapshot = PlayerProfileSnapshot.FromDictionary(result.Data); + if (!snapshot.Ignored) + { + if (_activeSyncMutationVersion < _localMutationVersion) + { + GD.Print($"[ProgressSync] Ignored stale sync response. syncMutation={_activeSyncMutationVersion}, localMutation={_localMutationVersion}."); + TransmitPlayerProfile("resync_after_local_change"); + return; + } + + GD.Print($"[ProgressSync] Sync applied. Level={snapshot.Level}, HP={snapshot.HpCurrent}/{snapshot.HpMax}, EXP={snapshot.Experience}, Gold={snapshot.Gold}."); + _player.ApplyProfile(snapshot); + return; + } + + GD.Print($"[ProgressSync] Sync ignored by server. reason={snapshot.IgnoreReason}."); + } + + private void DestroyPlayableWorld() + { + foreach (Node child in GetChildren()) + { + if (child is ExpPickup || child is QuestFantasy.Items.CoinDrop || child is EquipmentPickup) + { + child.QueueFree(); + } + } + + for (int i = 0; i < _spawnedMonsters.Count; i++) + { + if (Godot.Object.IsInstanceValid(_spawnedMonsters[i])) + { + _spawnedMonsters[i].QueueFree(); + } + } + _spawnedMonsters.Clear(); + + if (Godot.Object.IsInstanceValid(_miniMapUi)) + { + _miniMapUi.QueueFree(); + } + _miniMapUi = null; + + if (Godot.Object.IsInstanceValid(_player)) + { + _player.OnDied -= OnPlayerDied; + _player.OnRoomEntered -= OnPlayerEnteredRoom; + _player.QueueFree(); + } + _player = null; + + if (Godot.Object.IsInstanceValid(_playerHud)) + { + _playerHud.QueueFree(); + } + _playerHud = null; + + if (Godot.Object.IsInstanceValid(_backpackUi)) + { + _backpackUi.DropRequested -= OnBackpackDropRequested; + _backpackUi.UseRequested -= OnBackpackUseRequested; + _backpackUi.SyncRequested -= OnInventorySyncRequested; + _backpackUi.QueueFree(); + } + _backpackUi = null; + + // DO NOT destroy _mobileInputUI - it should persist throughout the game + // Hide it when leaving gameplay; it will be re-shown only when entering a game level + _mobileInputUI?.HideDPad(); + + if (Godot.Object.IsInstanceValid(_map)) + { + _map.QueueFree(); + } + _map = null; + _gameLoadedAlready = false; + + } + private void BuildLobby() + { + EnsureLobbyBackpackContext(); + + _lobbyManager = new LobbyManager(); + _lobbyManager.Initialize(_player, _playerDataApiClient, _authFlowController?.CurrentSession?.Token); + AddChild(_lobbyManager); + _lobbyManager.DifficultySelected += OnDifficultySelected; + + // Show D-pad in the lobby, but hide map button + _mobileInputUI?.ShowDPad(); + _mobileInputUI?.ShowMapButton(false); + _lobbyManager.SyncRequested += OnInventorySyncRequested; + _lobbyManager.ClassChangeRequested += OnClassChangeRequested; + } + + private void OnClassChangeRequested(QuestFantasy.Core.Data.PlayerClass newClass) + { + GD.Print($"[Main] Player changed class to {newClass}. Syncing profile to backend."); + TransmitPlayerProfile("class_change"); + } + + private void EnsureLobbyBackpackContext() + { + if (!Godot.Object.IsInstanceValid(_player)) + { + _player = new Player(); + AddChild(_player); + } + + _player.Visible = false; + + if (_pendingProfileSnapshot != null) + { + if (_pendingProfileSnapshot.HpCurrent <= 0) + { + _pendingProfileSnapshot.HpCurrent = _pendingProfileSnapshot.HpMax; + } + _player.ApplyProfile(_pendingProfileSnapshot); + } + + if (!Godot.Object.IsInstanceValid(_backpackUi)) + { + _backpackUi = new BackpackUI(); + AddChild(_backpackUi); + _backpackUi.DropRequested += OnBackpackDropRequested; + _backpackUi.UseRequested += OnBackpackUseRequested; + _backpackUi.SyncRequested += OnInventorySyncRequested; + } + + _backpackUi.Initialize(_player); + _backpackUi.SetGameplayVisible(true); + } + + private void OnDifficultySelected(DifficultyLevel difficulty) + { + if (_gameLoadedAlready) + return; + + if (!TryConsumeEntryTicket(difficulty)) + { + GD.Print($"[Main] Difficulty {difficulty} is locked. Missing entry ticket."); + return; + } + + _gameLoadedAlready = true; + + // Save current lobby player state before transitioning to game level + if (Godot.Object.IsInstanceValid(_player)) + { + _pendingProfileSnapshot = _player.BuildProfileSnapshot(); + GD.Print($"[Main] Saved lobby profile snapshot before entering game. Inventory: {_pendingProfileSnapshot.InventoryItems?.Count ?? 0}, HasEquip: {_pendingProfileSnapshot.HasEquippedItemsPayload}"); + + // Sync to backend + TransmitPlayerProfile("enter_dungeon"); + } + + _lobbyManager?.QueueFree(); + _lobbyManager = null; + LoadGameLevel(difficulty); + } + + private void LoadGameLevel(DifficultyLevel difficulty) + { + DestroyPlayableWorld(); + + _map = new Map(); + _map.TileSize = 24; + _map.RoomTileSize = 100; + _map.RoomsX = 2; + _map.RoomsY = 2; + _map.Difficulty = difficulty; + AddChild(_map); + _map.RegenerateWithRandomSeed(); + // Connect map's BoxOpened directly to TreasureChest so Main doesn't need to forward. + _map.Connect("BoxOpened", _chestRef, nameof(TreasureChest.HandleMapBoxOpened)); + + _player = new Player(); + AddChild(_player); + _player.Position = _map.GetSpawnWorldPosition(); + _player.SetMap(_map); + _player.OnDied += OnPlayerDied; + _player.OnRoomEntered += OnPlayerEnteredRoom; + + if (_pendingProfileSnapshot != null) + { + _player.ApplyProfile(_pendingProfileSnapshot); + _pendingProfileSnapshot = null; + } + + _playerHud = new PlayerHud(); + AddChild(_playerHud); + _playerHud.Initialize(_player, _map); + _playerHud.OnSkillSlotPressed += (skillIndex) => + { + _player?.InputHandler?.RequestSkillActivation(skillIndex); + }; + + _miniMapUi = new MiniMapUI(); + AddChild(_miniMapUi); + _miniMapUi.Initialize(_map, _player); + + _backpackUi = new BackpackUI(); + AddChild(_backpackUi); + _backpackUi.Initialize(_player); + _backpackUi.SetGameplayVisible(true); + _backpackUi.DropRequested += OnBackpackDropRequested; + _backpackUi.UseRequested += OnBackpackUseRequested; + + // Show D-pad only during actual gameplay + _mobileInputUI?.ShowDPad(); + _mobileInputUI?.ShowMapButton(true); + _backpackUi.SyncRequested += OnInventorySyncRequested; + + // Spawn monsters based on difficulty + int numMonstersToSpawn = ((int)difficulty + 1) * 100; + var monsterScene = (PackedScene)GD.Load("res://Scenes/Entities/monster.tscn"); + var speedMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/speed_monster.tscn"); + var fireMonsterScene = (PackedScene)GD.Load("res://Scenes/Entities/fire_monster.tscn"); + var monsterSpawnRandom = new RandomNumberGenerator(); + monsterSpawnRandom.Randomize(); + for (int i = 0; i < numMonstersToSpawn; i++) + { + int monsterRoll = monsterSpawnRandom.RandiRange(1, 10); + var selectedMonsterScene = monsterScene; + if (monsterRoll == 1 && speedMonsterScene != null) + { + selectedMonsterScene = speedMonsterScene; + } + else if ((monsterRoll == 2 || monsterRoll == 3) && fireMonsterScene != null) + { + selectedMonsterScene = fireMonsterScene; + } + + var monster = (Monster)selectedMonsterScene.Instance(); + monster.SetEnvironment(_map, _player); + AddChild(monster); + _spawnedMonsters.Add(monster); + } + + // Listen for when player reaches the exit to return to lobby + _player.GetCharacterController().ExitReached += ReturnToLobby; + } + + private void ReturnToLobby() + { + GD.Print("[Main] Player reached exit - returning to lobby"); + + // Save map difficulty before destroying it + DifficultyLevel lastMapDiff = _map != null ? _map.Difficulty : DifficultyLevel.Normal; + + bool wasDead = _player == null || _player.Attributes?.HP == null || !_player.Attributes.HP.IsAlive; + + // Restore HP to max before snapshotting so a dead player never carries + // 0 HP into the lobby or the next dungeon run. + if (_player != null) + { + int maxHp = _player.Attributes?.HP?.MaxHP ?? 100; + _player.Attributes?.HP?.SetMaxHPAndCurrentHP(maxHp, maxHp); + } + + // Save the current player state BEFORE destroying the world + _pendingProfileSnapshot = _player?.BuildProfileSnapshot(); + + // Sync to backend so the server has the latest state + TransmitPlayerProfile("return_to_lobby"); + + DestroyPlayableWorld(); + + // Rebuild the lobby for another session + BuildLobby(); + + if (!wasDead && _player != null && Godot.Object.IsInstanceValid(_player)) + { + var coinDrop = new QuestFantasy.Items.CoinDrop(); + coinDrop.Initialize((int)_player.Level, lastMapDiff, 5.0f, _player, 0.5f); + var spawnPos = _lobbyManager != null ? _lobbyManager.GetLobbyMap().GetSpawnWorldPosition() : _player.Position; + coinDrop.Position = spawnPos; + + if (_lobbyManager != null) + { + _lobbyManager.AddChild(coinDrop); + } + else + { + AddChild(coinDrop); + } + GD.PrintS($"[Main] Spawned Return-to-Lobby Coin drop at {coinDrop.Position}"); + } + } + + // Note: Map.BoxOpened is handled directly by TreasureChest.HandleMapBoxOpened now. + + private void OnSceneNodeAdded(Node node) + { + if (node is EquipmentPickup pickup) + { + AttachPickupSignal(pickup); + } + } + + private void AttachPickupSignal(EquipmentPickup pickup) + { + if (pickup == null) + { + return; + } + + if (!pickup.IsConnected(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested))) + { + pickup.Connect(nameof(EquipmentPickup.PickupRequested), this, nameof(OnPickupRequested)); + } + } + + private void OnPickupRequested(EquipmentPickup pickup) + { + if (_player == null || pickup == null || !Godot.Object.IsInstanceValid(pickup)) + { + return; + } + + EquipmentPickup targetPickup = ResolvePickupTarget(pickup); + if (targetPickup == null || !Godot.Object.IsInstanceValid(targetPickup)) + { + return; + } + + float distance = _player.GlobalPosition.DistanceTo(targetPickup.GlobalPosition); + if (distance > 80f) + { + GD.Print($"[Backpack] Pickup too far (distance: {distance:F1}). Move closer to pick it up."); + return; + } + + if (!(targetPickup.ItemData is Item item)) + { + GD.Print("[Backpack] Pickup ignored: item data missing or invalid."); + return; + } + + if (!_player.AddItem(item)) + { + GD.Print("[Backpack] Pickup failed: inventory add rejected."); + return; + } + + MarkLocalMutation(); + EquipmentPreview.Instance?.HidePreview(); + targetPickup.QueueFree(); + TransmitPlayerProfile("pickup_item"); + } + + private EquipmentPickup ResolvePickupTarget(EquipmentPickup requested) + { + if (requested == null || !Godot.Object.IsInstanceValid(requested)) + { + return null; + } + + EquipmentPickup best = requested; + int bestPriority = GetPickupPriority(requested); + float bestDistance = 0f; + + foreach (Node node in GetTree().GetNodesInGroup("pickup_items")) + { + if (!(node is EquipmentPickup candidate) || !Godot.Object.IsInstanceValid(candidate)) + { + continue; + } + + float distance = requested.GlobalPosition.DistanceTo(candidate.GlobalPosition); + if (distance > 36f) + { + continue; + } + + int priority = GetPickupPriority(candidate); + if (priority > bestPriority || (priority == bestPriority && distance < bestDistance)) + { + best = candidate; + bestPriority = priority; + bestDistance = distance; + } + } + + return best; + } + + private int GetPickupPriority(EquipmentPickup pickup) + { + if (pickup?.ItemData is ConsumableItem consumable) + { + if (consumable.HealAmount > 0) + { + return 30; + } + + return 25; + } + + if (pickup?.ItemData is TicketItem) + { + return 20; + } + + return 10; + } + + private void OnBackpackDropRequested(Item item) + { + if (_player == null || item == null) + { + return; + } + + if (!_player.DiscardItem(item)) + { + GD.Print("[Backpack] Drop failed: item not in inventory."); + return; + } + + MarkLocalMutation(); + var rng = new RandomNumberGenerator(); + rng.Randomize(); + Vector2 dropPosition = _player.Position + new Vector2(rng.RandfRange(-36f, 36f), rng.RandfRange(-24f, 24f)); + LootItemFactory.SpawnPickup(this, item, dropPosition, _equipManagerRef?.PickupSpriteScale ?? 0.5f, "backpack_drop"); + + TransmitPlayerProfile("discard_item"); + } + + private void OnBackpackUseRequested(Item item) + { + MarkLocalMutation(); + TransmitPlayerProfile("use_item"); + } + + private void MarkLocalMutation() + { + _localMutationVersion += 1; + } + + private bool TryConsumeEntryTicket(DifficultyLevel difficulty) + { + if (difficulty == DifficultyLevel.Easy) + { + return true; + } + + if (_player == null) + { + return false; + } + + foreach (Item item in _player.InventoryItems) + { + if (!ItemCatalog.IsTicketForDifficulty(item, difficulty)) + { + continue; + } + + bool removed = _player.RemoveItem(item); + if (removed) + { + MarkLocalMutation(); + GD.Print($"[Main] Consumed {item.Name} to enter {difficulty}."); + TransmitPlayerProfile($"consume_{ItemCatalog.GetTicketItemId(difficulty)}"); + } + return removed; + } + + return false; + } + + private void OnInventorySyncRequested() + { + TransmitPlayerProfile("inventory_sync"); + } +} \ No newline at end of file diff --git a/Scripts/UI/ClassSelectUI.cs b/Scripts/UI/ClassSelectUI.cs index a49926c..22aa2bb 100644 --- a/Scripts/UI/ClassSelectUI.cs +++ b/Scripts/UI/ClassSelectUI.cs @@ -36,7 +36,7 @@ public class ClassSelectUI : CanvasLayer private static readonly Color BtnConfirmHover = new Color(0.30f, 0.65f, 1.00f, 1f); private static readonly Color BtnCloseBg = new Color(0.20f, 0.22f, 0.28f, 1f); private static readonly Color BtnCloseHover = new Color(0.30f, 0.33f, 0.42f, 1f); - + // Tab colors private static readonly Color TabNormal = new Color(0.15f, 0.18f, 0.25f, 1f); private static readonly Color TabSelected = new Color(0.25f, 0.45f, 0.85f, 1f); @@ -45,9 +45,9 @@ public class ClassSelectUI : CanvasLayer private PlayerClass _currentClass = PlayerClass.Adventurer; private PlayerClass _selectedClass = PlayerClass.Adventurer; private int _playerLevel = 1; - + // Skill state - private List _equippedSkillIds = new List(); + private readonly List _equippedSkillIds = new List(); private ReadOnlyCollection _availableSkills; // UI References @@ -58,7 +58,7 @@ public class ClassSelectUI : CanvasLayer private Button _tabClassBtn; private Button _tabSkillsBtn; private Panel[] _cardPanels; - + // Skill UI References private Label[] _skillSlotLabels; private Panel[] _skillCardPanels; @@ -111,7 +111,7 @@ public void Show(PlayerClass currentClass, int playerLevel, IReadOnlyList("SkillGrid"); if (gridBox != null) @@ -617,28 +617,28 @@ private void RefreshSkillTab() { child.QueueFree(); } - + _skillCardPanels = new Panel[_availableSkills.Count]; - + for (int i = 0; i < _availableSkills.Count; i++) { var def = _availableSkills[i]; var card = BuildSkillCard(def); - + bool isEquipped = _equippedSkillIds.Contains(def.Id); - + card.AddStyleboxOverride("panel", MakeCardStyle( isEquipped ? CardBgSelected : CardBgNormal, isEquipped ? SkillLabelColor : CardBorderNormal, isEquipped ? 3 : 2 )); - + gridBox.AddChild(card); _skillCardPanels[i] = card; } } } - + private SkillDefinition GetSkillDef(string id) { if (_availableSkills == null) return null; diff --git a/Scripts/UI/DifficultySelectionUI.cs b/Scripts/UI/DifficultySelectionUI.cs index b7d1cca..5fc39df 100644 --- a/Scripts/UI/DifficultySelectionUI.cs +++ b/Scripts/UI/DifficultySelectionUI.cs @@ -12,169 +12,169 @@ /// public class DifficultySelectionUI : CanvasLayer { - public event Action DifficultySelected; - - private Control _uiContainer; - private VBoxContainer _buttonContainer; - private bool _isVisible; - private Player _player; - private readonly Dictionary _difficultyButtons = new Dictionary(); - - public override void _Ready() - { - // Ensure this UI processes even when the game is paused (Godot 3.6) - PauseMode = PauseModeEnum.Process; - - BuildUI(); - HideDifficultyMenu(); - } - - private void BuildUI() - { - // Wrap everything in a MarginContainer anchored to the screen - var screenMargin = new MarginContainer(); - screenMargin.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); - screenMargin.AddConstantOverride("margin_right", 20); - screenMargin.AddConstantOverride("margin_top", 20); - screenMargin.AddConstantOverride("margin_left", 20); - screenMargin.AddConstantOverride("margin_bottom", 20); - AddChild(screenMargin); - - // Main container - var panelContainer = new PanelContainer(); - panelContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ShrinkCenter; - panelContainer.SizeFlagsVertical = (int)Control.SizeFlags.ShrinkCenter; - screenMargin.AddChild(panelContainer); - - // Create a VBox for the entire panel content - var mainVBox = new VBoxContainer(); - panelContainer.AddChild(mainVBox); - - // Title - var titleLabel = new Label(); - titleLabel.Text = "Select Difficulty"; - titleLabel.Align = Label.AlignEnum.Center; - mainVBox.AddChild(titleLabel); - - // Spacer - var spacer = new Control(); - spacer.RectMinSize = new Vector2(0, 10); - mainVBox.AddChild(spacer); - - // Scroll container for buttons in case height is constrained - var scrollContainer = new ScrollContainer(); - scrollContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; - scrollContainer.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; - scrollContainer.RectMinSize = new Vector2(240, 200); // Minimum view area - mainVBox.AddChild(scrollContainer); - - // Button container - _buttonContainer = new VBoxContainer(); - _buttonContainer.AddConstantOverride("separation", 10); - _buttonContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; - scrollContainer.AddChild(_buttonContainer); - - // Easy button - AddDifficultyButton("Easy", DifficultyLevel.Easy); - - // Normal button - AddDifficultyButton("Normal", DifficultyLevel.Normal); - - // Hard button - AddDifficultyButton("Hard", DifficultyLevel.Hard); - - // Nightmare button - AddDifficultyButton("Nightmare", DifficultyLevel.Nightmare); - - // Spacer - var spacer2 = new Control(); - spacer2.RectMinSize = new Vector2(0, 10); - mainVBox.AddChild(spacer2); - - // Close button - var closeButton = new Button(); - closeButton.Text = "Close"; - closeButton.RectMinSize = new Vector2(200, 52); - closeButton.Connect("pressed", this, nameof(OnClosePressed)); - mainVBox.AddChild(closeButton); - - _uiContainer = screenMargin; - } - - public void Initialize(Player player) - { - _player = player; - RefreshLocks(); - } - - private void AddDifficultyButton(string label, DifficultyLevel difficulty) - { - var button = new Button(); - button.Text = label; - button.RectMinSize = new Vector2(200, 52); - var binds = new Godot.Collections.Array(); - binds.Add(difficulty); - button.Connect("pressed", this, nameof(OnDifficultyButtonPressed), binds); - _buttonContainer.AddChild(button); - _difficultyButtons[difficulty] = button; - } - - private void OnDifficultyButtonPressed(DifficultyLevel difficulty) - { - DifficultySelected?.Invoke(difficulty); - HideDifficultyMenu(); // Close menu after selection - } - - private void OnClosePressed() - { - HideDifficultyMenu(); - } - - public void ShowDifficultyMenu() - { - RefreshLocks(); - _uiContainer.Visible = true; - _isVisible = true; - GetTree().Paused = true; - } - - public void HideDifficultyMenu() - { - _uiContainer.Visible = false; - _isVisible = false; - GetTree().Paused = false; - } - - public bool IsMenuVisible => _isVisible; - - private void RefreshLocks() - { - foreach (var entry in _difficultyButtons) - { - DifficultyLevel difficulty = entry.Key; - Button button = entry.Value; - bool unlocked = difficulty == DifficultyLevel.Easy || HasTicket(difficulty); - button.Disabled = !unlocked; - string label = difficulty.ToString(); - button.Text = unlocked ? label : $"{label} Locked"; - } - } - - private bool HasTicket(DifficultyLevel difficulty) - { - if (_player == null) - { - return false; - } - - foreach (Item item in _player.InventoryItems) - { - if (ItemCatalog.IsTicketForDifficulty(item, difficulty)) - { - return true; - } - } - - return false; - } -} + public event Action DifficultySelected; + + private Control _uiContainer; + private VBoxContainer _buttonContainer; + private bool _isVisible; + private Player _player; + private readonly Dictionary _difficultyButtons = new Dictionary(); + + public override void _Ready() + { + // Ensure this UI processes even when the game is paused (Godot 3.6) + PauseMode = PauseModeEnum.Process; + + BuildUI(); + HideDifficultyMenu(); + } + + private void BuildUI() + { + // Wrap everything in a MarginContainer anchored to the screen + var screenMargin = new MarginContainer(); + screenMargin.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); + screenMargin.AddConstantOverride("margin_right", 20); + screenMargin.AddConstantOverride("margin_top", 20); + screenMargin.AddConstantOverride("margin_left", 20); + screenMargin.AddConstantOverride("margin_bottom", 20); + AddChild(screenMargin); + + // Main container + var panelContainer = new PanelContainer(); + panelContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ShrinkCenter; + panelContainer.SizeFlagsVertical = (int)Control.SizeFlags.ShrinkCenter; + screenMargin.AddChild(panelContainer); + + // Create a VBox for the entire panel content + var mainVBox = new VBoxContainer(); + panelContainer.AddChild(mainVBox); + + // Title + var titleLabel = new Label(); + titleLabel.Text = "Select Difficulty"; + titleLabel.Align = Label.AlignEnum.Center; + mainVBox.AddChild(titleLabel); + + // Spacer + var spacer = new Control(); + spacer.RectMinSize = new Vector2(0, 10); + mainVBox.AddChild(spacer); + + // Scroll container for buttons in case height is constrained + var scrollContainer = new ScrollContainer(); + scrollContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + scrollContainer.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; + scrollContainer.RectMinSize = new Vector2(240, 200); // Minimum view area + mainVBox.AddChild(scrollContainer); + + // Button container + _buttonContainer = new VBoxContainer(); + _buttonContainer.AddConstantOverride("separation", 10); + _buttonContainer.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + scrollContainer.AddChild(_buttonContainer); + + // Easy button + AddDifficultyButton("Easy", DifficultyLevel.Easy); + + // Normal button + AddDifficultyButton("Normal", DifficultyLevel.Normal); + + // Hard button + AddDifficultyButton("Hard", DifficultyLevel.Hard); + + // Nightmare button + AddDifficultyButton("Nightmare", DifficultyLevel.Nightmare); + + // Spacer + var spacer2 = new Control(); + spacer2.RectMinSize = new Vector2(0, 10); + mainVBox.AddChild(spacer2); + + // Close button + var closeButton = new Button(); + closeButton.Text = "Close"; + closeButton.RectMinSize = new Vector2(200, 52); + closeButton.Connect("pressed", this, nameof(OnClosePressed)); + mainVBox.AddChild(closeButton); + + _uiContainer = screenMargin; + } + + public void Initialize(Player player) + { + _player = player; + RefreshLocks(); + } + + private void AddDifficultyButton(string label, DifficultyLevel difficulty) + { + var button = new Button(); + button.Text = label; + button.RectMinSize = new Vector2(200, 52); + var binds = new Godot.Collections.Array(); + binds.Add(difficulty); + button.Connect("pressed", this, nameof(OnDifficultyButtonPressed), binds); + _buttonContainer.AddChild(button); + _difficultyButtons[difficulty] = button; + } + + private void OnDifficultyButtonPressed(DifficultyLevel difficulty) + { + DifficultySelected?.Invoke(difficulty); + HideDifficultyMenu(); // Close menu after selection + } + + private void OnClosePressed() + { + HideDifficultyMenu(); + } + + public void ShowDifficultyMenu() + { + RefreshLocks(); + _uiContainer.Visible = true; + _isVisible = true; + GetTree().Paused = true; + } + + public void HideDifficultyMenu() + { + _uiContainer.Visible = false; + _isVisible = false; + GetTree().Paused = false; + } + + public bool IsMenuVisible => _isVisible; + + private void RefreshLocks() + { + foreach (var entry in _difficultyButtons) + { + DifficultyLevel difficulty = entry.Key; + Button button = entry.Value; + bool unlocked = difficulty == DifficultyLevel.Easy || HasTicket(difficulty); + button.Disabled = !unlocked; + string label = difficulty.ToString(); + button.Text = unlocked ? label : $"{label} Locked"; + } + } + + private bool HasTicket(DifficultyLevel difficulty) + { + if (_player == null) + { + return false; + } + + foreach (Item item in _player.InventoryItems) + { + if (ItemCatalog.IsTicketForDifficulty(item, difficulty)) + { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/Scripts/UI/PlayerHud.cs b/Scripts/UI/PlayerHud.cs index ab3d445..4bca2f6 100644 --- a/Scripts/UI/PlayerHud.cs +++ b/Scripts/UI/PlayerHud.cs @@ -22,6 +22,8 @@ public class PlayerHud : CanvasLayer ["fireball"] = "res://Assets/SkillAnimation/fireball.png", ["triple_fireball"] = "res://Assets/SkillAnimation/fireball.png", ["giant_fireball"] = "res://Assets/SkillAnimation/fireball.png", + ["flying_sword"] = "res://Assets/SkillAnimation/fly_sword.png", + ["defense_stance"] = "res://Assets/Characters/warrior/defense.png", }; private readonly List _skillSlots = new List(); From cbec27f199ef032cc77cc842dc150f66bb479c1c Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Mon, 1 Jun 2026 21:32:18 +0800 Subject: [PATCH 03/13] feat: add new skill animations for arrows and fireballs --- Assets/SkillAnimation/arrow_multi.png | Bin 0 -> 3515 bytes Assets/SkillAnimation/arrow_multi.png.import | 35 ++++++++++++++++++ Assets/SkillAnimation/arrow_ricochet.png | Bin 0 -> 9220 bytes .../SkillAnimation/arrow_ricochet.png.import | 35 ++++++++++++++++++ Assets/SkillAnimation/fireball_multi.png | Bin 0 -> 31815 bytes .../SkillAnimation/fireball_multi.png.import | 35 ++++++++++++++++++ .../Data/Skills/SkillProjectileSpawner.cs | 10 +++-- Scripts/UI/PlayerHud.cs | 8 ++-- 8 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 Assets/SkillAnimation/arrow_multi.png create mode 100644 Assets/SkillAnimation/arrow_multi.png.import create mode 100644 Assets/SkillAnimation/arrow_ricochet.png create mode 100644 Assets/SkillAnimation/arrow_ricochet.png.import create mode 100644 Assets/SkillAnimation/fireball_multi.png create mode 100644 Assets/SkillAnimation/fireball_multi.png.import diff --git a/Assets/SkillAnimation/arrow_multi.png b/Assets/SkillAnimation/arrow_multi.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d4d8088c4dd6677dba5aa3d0899d616c934f3d GIT binary patch literal 3515 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 literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/arrow_multi.png.import b/Assets/SkillAnimation/arrow_multi.png.import new file mode 100644 index 0000000..6c78789 --- /dev/null +++ b/Assets/SkillAnimation/arrow_multi.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow_multi.png-e566f9557bb7c8a12ed527f7bd9cf3b9.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/arrow_multi.png" +dest_files=[ "res://.import/arrow_multi.png-e566f9557bb7c8a12ed527f7bd9cf3b9.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/arrow_ricochet.png b/Assets/SkillAnimation/arrow_ricochet.png new file mode 100644 index 0000000000000000000000000000000000000000..651237f1555446c663a5c14e0884187796513862 GIT binary patch literal 9220 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 D`4)LI literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/arrow_ricochet.png.import b/Assets/SkillAnimation/arrow_ricochet.png.import new file mode 100644 index 0000000..a22058a --- /dev/null +++ b/Assets/SkillAnimation/arrow_ricochet.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow_ricochet.png-3ddf9c10400670aafbba52b76ec07756.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/arrow_ricochet.png" +dest_files=[ "res://.import/arrow_ricochet.png-3ddf9c10400670aafbba52b76ec07756.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/fireball_multi.png b/Assets/SkillAnimation/fireball_multi.png new file mode 100644 index 0000000000000000000000000000000000000000..d88ea498e903fcd73aa5bb007c8dce859e170cc2 GIT binary patch literal 31815 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 Ls>;+$nTGuzQ|t$X literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/fireball_multi.png.import b/Assets/SkillAnimation/fireball_multi.png.import new file mode 100644 index 0000000..b8fdfad --- /dev/null +++ b/Assets/SkillAnimation/fireball_multi.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fireball_multi.png-e38cb0ce02f3fbe5dea14a9f58cb6f01.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/fireball_multi.png" +dest_files=[ "res://.import/fireball_multi.png-e38cb0ce02f3fbe5dea14a9f58cb6f01.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs index 5efdcd6..d6eea8d 100644 --- a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs +++ b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs @@ -214,6 +214,10 @@ public static SkillProjectileNode CreateArrow( Func onHitEffect = null, float onHitChance = 0f) { + string arrowTexturePath = bounces > 0 + ? "res://Assets/SkillAnimation/arrow_ricochet.png" + : "res://Assets/SkillAnimation/arrow.png"; + return new SkillProjectileNode { _owner = owner, @@ -229,16 +233,16 @@ public static SkillProjectileNode CreateArrow( _bouncesRemaining = bounces, _onHitEffect = onHitEffect, _onHitChance = onHitChance, - _projectileTexture = GD.Load("res://Assets/SkillAnimation/arrow.png"), + _projectileTexture = GD.Load(arrowTexturePath), _projectileScale = ArrowProjectileScale, _impactScale = ArrowImpactScale, _flightFrames = new[] { - GD.Load("res://Assets/SkillAnimation/arrow.png"), + GD.Load(arrowTexturePath), }, _impactFrames = new[] { - GD.Load("res://Assets/SkillAnimation/arrow.png"), + GD.Load(arrowTexturePath), } }; } diff --git a/Scripts/UI/PlayerHud.cs b/Scripts/UI/PlayerHud.cs index 4bca2f6..0ceb01f 100644 --- a/Scripts/UI/PlayerHud.cs +++ b/Scripts/UI/PlayerHud.cs @@ -17,11 +17,11 @@ public class PlayerHud : CanvasLayer { ["basic_attack"] = "res://Assets/SkillAnimation/slash-icon.png", ["bow_attack"] = "res://Assets/SkillAnimation/arrow.png", - ["triple_arrow"] = "res://Assets/SkillAnimation/arrow.png", - ["ricochet_arrow"] = "res://Assets/SkillAnimation/arrow.png", + ["triple_arrow"] = "res://Assets/SkillAnimation/arrow_multi.png", + ["ricochet_arrow"] = "res://Assets/SkillAnimation/arrow_ricochet.png", ["fireball"] = "res://Assets/SkillAnimation/fireball.png", - ["triple_fireball"] = "res://Assets/SkillAnimation/fireball.png", - ["giant_fireball"] = "res://Assets/SkillAnimation/fireball.png", + ["triple_fireball"] = "res://Assets/SkillAnimation/fireball_multi.png", + ["giant_fireball"] = "res://Assets/SkillAnimation/fireball3.png", ["flying_sword"] = "res://Assets/SkillAnimation/fly_sword.png", ["defense_stance"] = "res://Assets/Characters/warrior/defense.png", }; From 6a372b3824f58f96cbc573c0606bb414050d70fc Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Mon, 1 Jun 2026 22:33:13 +0800 Subject: [PATCH 04/13] feat: update skill animation assets for sword attacks --- Assets/SkillAnimation/fly_sword-1.png | Bin 20130 -> 32083 bytes Assets/SkillAnimation/fly_sword-2.png | Bin 23065 -> 46325 bytes Assets/SkillAnimation/fly_sword.png | Bin 8748 -> 12262 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Assets/SkillAnimation/fly_sword-1.png b/Assets/SkillAnimation/fly_sword-1.png index 85a7de73189e9d7e69fa834698d2d4140eb99c35..bdd193fb6cd06ea66de24b1023457d1854cb8b4c 100644 GIT binary patch literal 32083 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 literal 20130 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�~gjpK%*& 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 D7ls26 literal 23065 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 NWd(IejoiD?{|7EHfBOIc literal 8748 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 From 2b27eb897c63c0ef46029d47f33818577081c25f Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Mon, 1 Jun 2026 22:44:05 +0800 Subject: [PATCH 05/13] feat: enhance class selection UI to display available skills --- Scripts/UI/ClassSelectUI.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Scripts/UI/ClassSelectUI.cs b/Scripts/UI/ClassSelectUI.cs index 22aa2bb..8a54151 100644 --- a/Scripts/UI/ClassSelectUI.cs +++ b/Scripts/UI/ClassSelectUI.cs @@ -313,6 +313,7 @@ private Panel BuildClassCard(PlayerClass cls, float x, float y, int index) card.RectPosition = new Vector2(x, y); card.RectMinSize = new Vector2(CardWidth, CardHeight); card.AddStyleboxOverride("panel", MakeCardStyle(CardBgNormal, CardBorderNormal)); + card.MouseFilter = Control.MouseFilterEnum.Stop; var stripe = new ColorRect { Color = accent, MouseFilter = Control.MouseFilterEnum.Ignore }; stripe.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); @@ -325,14 +326,24 @@ private Panel BuildClassCard(PlayerClass cls, float x, float y, int index) vbox.MarginRight = -8f; vbox.MarginTop = 14f; vbox.MarginBottom = -8f; + vbox.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + vbox.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; card.AddChild(vbox); vbox.AddChild(MakeLabel(GetClassEmoji(cls), 32f, CardTitleColor, center: true)); vbox.AddChild(MakeLabel(PlayerClassData.GetDisplayName(cls), 22f, CardTitleColor, center: true)); vbox.AddChild(new HSeparator { RectMinSize = new Vector2(0f, 4f) }); vbox.AddChild(MakeLabel(PlayerClassData.GetDescription(cls), 72f, CardDescColor, center: true, wrap: true)); - vbox.AddChild(MakeLabel("Skills:", 16f, SubHeaderColor, center: true)); - vbox.AddChild(MakeLabel(PlayerClassData.GetSkillListText(cls), 30f, SkillLabelColor, center: true, wrap: true)); + + // Display all available skills for this class + vbox.AddChild(MakeLabel("Available Skills:", 16f, SubHeaderColor, center: true)); + + var skillDefs = PlayerClassData.GetAllSkillDefinitions(cls); + foreach (var skillDef in skillDefs) + { + var skillLbl = MakeLabel($"{skillDef.Emoji} {skillDef.DisplayName}", 12f, SkillLabelColor, center: false, wrap: true); + vbox.AddChild(skillLbl); + } var btn = new Button { Text = string.Empty, Flat = true }; btn.SetAnchorsAndMarginsPreset(Control.LayoutPreset.Wide); @@ -649,4 +660,6 @@ private SkillDefinition GetSkillDef(string id) return null; } } + + } \ No newline at end of file From c32f8d3260adac6857c19e233f52dc342e224f46 Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Mon, 1 Jun 2026 22:54:16 +0800 Subject: [PATCH 06/13] style: clean up whitespace in ClassSelectUI.cs --- Scripts/UI/ClassSelectUI.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/UI/ClassSelectUI.cs b/Scripts/UI/ClassSelectUI.cs index 8a54151..3e09c5d 100644 --- a/Scripts/UI/ClassSelectUI.cs +++ b/Scripts/UI/ClassSelectUI.cs @@ -334,10 +334,10 @@ private Panel BuildClassCard(PlayerClass cls, float x, float y, int index) vbox.AddChild(MakeLabel(PlayerClassData.GetDisplayName(cls), 22f, CardTitleColor, center: true)); vbox.AddChild(new HSeparator { RectMinSize = new Vector2(0f, 4f) }); vbox.AddChild(MakeLabel(PlayerClassData.GetDescription(cls), 72f, CardDescColor, center: true, wrap: true)); - + // Display all available skills for this class vbox.AddChild(MakeLabel("Available Skills:", 16f, SubHeaderColor, center: true)); - + var skillDefs = PlayerClassData.GetAllSkillDefinitions(cls); foreach (var skillDef in skillDefs) { From 5b60c6494a19deac167050033cd048d8a8e51814 Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Mon, 1 Jun 2026 23:47:13 +0800 Subject: [PATCH 07/13] feat: implement new player skills and add corresponding animation assets --- Assets/Characters/warrior/super_attack.png | Bin 0 -> 92341 bytes .../warrior/super_attack.png.import | 35 ++ Assets/SkillAnimation/digit_arrow.png | Bin 0 -> 26249 bytes Assets/SkillAnimation/digit_arrow.png.import | 35 ++ Assets/SkillAnimation/ice_spear-1.png | Bin 0 -> 31906 bytes Assets/SkillAnimation/ice_spear-1.png.import | 35 ++ Assets/SkillAnimation/ice_spear-2.png | Bin 0 -> 23118 bytes Assets/SkillAnimation/ice_spear-2.png.import | 35 ++ Assets/SkillAnimation/ice_spear-3.png | Bin 0 -> 20287 bytes Assets/SkillAnimation/ice_spear-3.png.import | 35 ++ Assets/SkillAnimation/ice_spear-4.png | Bin 0 -> 30492 bytes Assets/SkillAnimation/ice_spear-4.png.import | 35 ++ Assets/SkillAnimation/ice_spear-hit.png | Bin 0 -> 46900 bytes .../SkillAnimation/ice_spear-hit.png.import | 35 ++ Assets/SkillAnimation/knight_explose.png | Bin 0 -> 78940 bytes .../SkillAnimation/knight_explose.png.import | 35 ++ Assets/SkillAnimation/magic_slash-2.png | Bin 0 -> 42236 bytes .../SkillAnimation/magic_slash-2.png.import | 35 ++ Assets/SkillAnimation/roundhouse-slash.png | Bin 0 -> 52374 bytes .../roundhouse-slash.png.import | 35 ++ Assets/SkillAnimation/super_arrow.png | Bin 0 -> 38687 bytes Assets/SkillAnimation/super_arrow.png.import | 35 ++ Scripts/Auth/PlayerProfileSnapshot.cs | 29 ++ Scripts/Characters/Player.cs | 316 ++++++------- .../PlayerAnimationController.cs | 22 + .../PlayerSystems/PlayerCombatController.cs | 12 +- Scripts/Core/Data/PlayerClass.cs | 78 +++- Scripts/Core/Data/Skills/DigitArrowSkill.cs | 35 ++ Scripts/Core/Data/Skills/IceSpearSkill.cs | 40 ++ .../Core/Data/Skills/KnightExploseSkill.cs | 35 ++ Scripts/Core/Data/Skills/MagicSlashSkill.cs | 83 ++++ .../Core/Data/Skills/RoundhouseSlashSkill.cs | 92 ++++ .../Data/Skills/SkillProjectileSpawner.cs | 429 +++++++++++++++++- Scripts/Core/Data/Skills/SuperArrowSkill.cs | 41 ++ Scripts/UI/ClassSelectUI.cs | 25 +- Scripts/UI/PlayerHud.cs | 6 + 36 files changed, 1455 insertions(+), 173 deletions(-) create mode 100644 Assets/Characters/warrior/super_attack.png create mode 100644 Assets/Characters/warrior/super_attack.png.import create mode 100644 Assets/SkillAnimation/digit_arrow.png create mode 100644 Assets/SkillAnimation/digit_arrow.png.import create mode 100644 Assets/SkillAnimation/ice_spear-1.png create mode 100644 Assets/SkillAnimation/ice_spear-1.png.import create mode 100644 Assets/SkillAnimation/ice_spear-2.png create mode 100644 Assets/SkillAnimation/ice_spear-2.png.import create mode 100644 Assets/SkillAnimation/ice_spear-3.png create mode 100644 Assets/SkillAnimation/ice_spear-3.png.import create mode 100644 Assets/SkillAnimation/ice_spear-4.png create mode 100644 Assets/SkillAnimation/ice_spear-4.png.import create mode 100644 Assets/SkillAnimation/ice_spear-hit.png create mode 100644 Assets/SkillAnimation/ice_spear-hit.png.import create mode 100644 Assets/SkillAnimation/knight_explose.png create mode 100644 Assets/SkillAnimation/knight_explose.png.import create mode 100644 Assets/SkillAnimation/magic_slash-2.png create mode 100644 Assets/SkillAnimation/magic_slash-2.png.import create mode 100644 Assets/SkillAnimation/roundhouse-slash.png create mode 100644 Assets/SkillAnimation/roundhouse-slash.png.import create mode 100644 Assets/SkillAnimation/super_arrow.png create mode 100644 Assets/SkillAnimation/super_arrow.png.import create mode 100644 Scripts/Core/Data/Skills/DigitArrowSkill.cs create mode 100644 Scripts/Core/Data/Skills/IceSpearSkill.cs create mode 100644 Scripts/Core/Data/Skills/KnightExploseSkill.cs create mode 100644 Scripts/Core/Data/Skills/MagicSlashSkill.cs create mode 100644 Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs create mode 100644 Scripts/Core/Data/Skills/SuperArrowSkill.cs diff --git a/Assets/Characters/warrior/super_attack.png b/Assets/Characters/warrior/super_attack.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7b85177bfd27b55452010afab341417ccd05c0 GIT binary patch literal 92341 zcmV)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;z&~696gnL&gUH000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHeG4GSF>&?8^~03ZNKL_t(|+U&h~wB}b?=lgl~-oN1;&sfu`sthEdAV9c6 zm^#=OyxayZ%Gd!^1`R3(q_O*A6dT1Wh~Q!=ZQqt|1yl&#KyCmLWe}Mp5l9#^kyMgO z4XN?e8Q<|Y?BV{g->TpWMue(V0q0q(R-IL+-uKz;L#w}0Z` zaEbLwFkaD?jV-kSSR3{OWka1lqiA-K+06hHN*Il6hNjVZpx0Rm3ogiffGj8}0SM-B z71V-Nis0N?_pGkjob!z-3YI|3s@}+fBp@24PQ4Fs;soIw!HYdjgWA|Hf+N-Y{SFaupcGs zNPW%DR`S~J)~QK|C>$SWOi6k8UkV9B2+^zZz6&5)^@9fxM9!{+_8;DS?9g9*^(K01 z3awJK)`*;X4=YhMN=777;k3etUDyDu4f~O^Yj3@4VbA{khXAg6*3(YePJ8i=`Ro4l zw!7XbjaD@Qol?y{qJPB&JKp?&p%0;>6aHta#O_wQeNcF-oHDtXC6wp??j#qMkP0wQ`DK&xaQO5;5!fA-|C-nB2h?S=zA3frKn6sZK1 z7?e7-TS~gmUpjjG8&RQ2NHn!g31SZYsP3H&zQ3)ZOdM|KXHL%K}REH|0)HFYL zHm>b)@8%~B220m_JHmRy_Vb=`%GdQ-16Y6Ym;dv%Wm#TQjLOUEx<0R}>l0;dBq$J1 z0KE4o5uB^Zn|c3r|MzRV-_8549=K-LU|2kE=fhum^_hIm&}gEPCLt(_uuf&NGd32l z^UlCWHu~S)aOb<9^84?9_s>23iNE@DkGbH#oRPVSIjl5>g1!UbTu3cKK;ilB*8d&L zYkyMfgszfz0H=J@WZN!ac-xRsp|Q@OfM6Y>0$QK?vnTI9bW>`IO97Nm_O>@auYWcI zR-X0Ww{&D5Avla_|L}TPzxnz%hM#}=70AS$7SRNW1x)Y#$wa0Igb>go7^A4FqVv|b z{b2z3jbHyy|LjUxx#!x2dUX5^*pLBd6tI+c7y>F-@E&igGd310Nj9kCv{ik}fF@)t`Ln6-ualKtkY}LAC4hcDnn4-ls@2N}ZCLQ(FZ8t-rZGRNb9? z{%gA#hbBR_NJL|8MP?L6Y2-B2-M5|p{3YO%XKU0@jlTK(MD?z9#Ue&V=(K?kihA^| zG-+O3{m=o{@x@j0tVyfWMQcq_)r^byoMI9J3h;PWqa~ma@-#tf%|}1-aR6TPnqLcp zexI@&lNgPy22l5zYL?t_+dbu$P3i8@xV+>{KWhhvp`wj2l8S~MpRuuMli^hgKO2uS5NNGJ(-V+2WV|D=#2v{Qzr36xcYQwWKo95;{ z$5}2~c$Fh0Cz18i zd3lxK;Oh6ik0eP5<#UH8N(mZI2#Fnt|4M?@)L$4LS(Jevf{?&#m9O1Awo8^Jc88 z&r2OazSRL*jL$fvIR27i8c zan;XXnE%0pep09DE^iFV=)QW=)ggo zX=5ZKh#|Ndg~x~`H(=#Q3$jA}rDJP{Z)Sb<08`WR491>rvOuf-*th;rg@jd6V^l(7 zG@VY1-+tp8$eKBO_U&bTT=LYPd@cZ+&N-LbT70l*=g5s_^XxQV`urDo^{ZY(8A&?S z1W+0u0yqa~65T`^DgWi2AEqqVfxvm&=ECfzNMkvCbcx43{)znc$3OBTDF@=5>)1(F zyLM2j22(TJSXbE8^&5VI2w{ik2C}01G z0M$+Zrybqhdz>u@QLB%xssD z9RaZ1U&VSyF&dH(NEJ9cX6!4T_u?0F?z!j1P^;NOYmE}9stU1zBZm(2fvc}(JnrL- zAtMi@rozZCY)YtvmujW7Oi%uz3I`6Z% z$rV0nalBaPOE>S^^@q3g4xQJmAN~9b=9W(97#5wp;ZWu1+me~CKnQrDbD}i|z`EQ^2!n0!W*rT6bI&?GMu8^dP>6tAwr?)}6?N>xS=D+>W z0hae3oF~g0j0OWny>%Y;@C$Lla%?!F-H5rB`PmM=;gEi>pp~a|n+<|^E_mogoO97G zbQ(|E%p`c{sKy0(p0jm+3xDkW^(DI=zKz)~436H(+n==Uw9VCD?m2Sh-+k_Lm%rr`p9#PD%%`3Cbs3J(ZH%Z& zOWK%by;qV=H!!CWtj=smSQR)|Qxrm?g?;zzXEf~7ANH8ru?^c_17K;tqc`ZIf~Vb_ zN81vDCs;>iEuB0rTpujnJAw*~t1-Lx-Az8zZCsi`T90)j()3?tJd;okiR z_|g}?NC<&M8$t-A%@*%{-}~9QE+;5R9q^~5*L!^%cWw4^?RUW0fxT&erKGxlbjuGZJ zF|(;lpuz@Efb;~LTO^Ln2SMqC%6lp?9P54OVuckJoEV%J{P)=^`d{mwx^m z`=C9Gm4qM$=PiQAV=)bAG$Ew+w9Zq}>|ELxgG(A`7N>^qfA+z>-~6lfBe$YML0Q%$ zt?eYu8G>q`b{^ju1FT0r>Jcn2tuX43=&kkn)TjR*TbDGO4KDlfCvyDg@d!lXvA(9! z$eEj+rqO6%y-?VIH5qxM74sIpMkz(@99tH)bN)jg%0nM{F%P@se*+*%5^PnH2uycl zII(T>CjR!XKh9r$;%^AnK?sBp2+k6$BR8=MbmZt#E2r+J{4!f4<1cuyqWV zjjcj!!}r?T|Hn5TxB=kfU%B(rHR-U}2g&C^G=hK#9!C&M2o|kC$>|dp{G&UL+_U%S z>iNB4O;BfM%P#HtgV1eRs+F5a?IBzth;GoCUZA<@A+(b1pA`N0SNzZd*7aZh2LX7? zo8BIN=eK@`Jn0fJfMC$%6IOFsjlouETT!}-q4N|rPzPb9KRPKn(&@G)IjWLS4%xAN zE2S1((3m8pH>jzrlGJF1MXVOC_EzbaV_y1-pXZ!&&S83bn#3sPr)KE3+q~oLf5;a< z_jwR#w%P<|Nz;_Nu6fg&-+BYUlb`%F8qJJWt3@M=X|G13L95lG*>2J4w0YDc9+f}m zx&PN`_r$Jz<*UN>ZCiNXd)~vUt!XMn?Hy&W$M(%T!muoP*^7UcKX}()y!)zO_&LcE zb+cA-8Gwt-5tJAZO(hvi|+O2s=W)c0wXFe#o z?=$TU_)rt58H@)cTGMJp;Ay7u1XZrade2<5gV73yL)R5+>wS`OiB94poYR~q$rI{k zLL1NE(0-Qg1*a0SR*U{{Kv2S_O`F(!;f3+DZD8j^&f}toUrcFhTCE1b)o2gREN9z! z+X<;gbV6kW>jSInYxt^SbvT?nfQ!|r39&Ke=ix;-MOIu@y+@pXQQ-nO(Nv@y?ZvtN)D3$uRn3mA+ZY}_n&q?8q@A4?iyz%&G^)3KrS~W)1IA?JIMwO?sDMyZv+1_nEXf0i59I)Q-+pm|8 zT>G(w=e^+Bhu`p@ek;7^&)&r?x7|*s8HZMnM;N8pvT5$*Ddt?jxvOF( zqj4Wwjp-F5Ru+%3J|1Hc(q@y&)?}?F$EIg+!^lY#le2m2R-CQK62sd13OI}Mp7j8a zeZr+Y?HNx;RLW>vV6DZNlyY3~p$~o#fPehrmoQ4ulj}Oe82NJ9*-{*zzAHlbAjAf7;2JchG;`GOR1crEJ}_Z zUt9o4Q`v1MT%|fD;bT`pPy|Wv5*Wo!8FbR+`r8lP^xnhuE54ha!!(P$>@TXyvO z1?_UoxbBfBmihBG^JmN99h*{q{ka`^Ko9q$>mln0E(iG9{y6S3B$Q4FB81>U3u&h4 zPE8@9Vl*z1B%n07Q`|%Nnos>>`208bv46SG(c>$;a&z*al6ez<^xc$)2q9MMwJ8bC zqjic48O`O1QkZOtY2JFgdla(Y0gN7~1U?jdla;9bO4pDwttR=vO{r zoFq8WX2|EvRIg^`66rgjzYgndOcpUVHnf_uAKgqlXrS z_nzQlF4B8X5TWvpzq|D~A&vcS{SXt|I`2ZAqLjjlr}ksAETuKqK`V{)GCVad1oSCv z1A5Pa;T!(^)Biv>%rYoEi9C2Zo8#pVT$by#U#|N1JiF5e(!;4<>!fT%O?|zaz&&l(6g5GuKogBF507<*c!KF3sIe08CH0$ur z(U{O0{_T?<&#s4FKv4{+sw(yz8o?`t$CIZiPGER+k@e#%F_G9GV}oK`TNX2EjteiM)#*@JPh~yhYRFGK{5Xka2N+)#MQ@rLsygg)T%K7J?`>?vM&;RM4`S<^--m$f{ zH8g@IkVqiYibgZXs)RKQ#-!veO;S`m?2J~;NClJ^j80BA9EYSs zm238_S`ICZJ2~rr;%$ut2Vv6pDWLM4u;e&CuBlCD5^d&q60j=zOnAHmBuPk8jje}> zuOsoY8k2=&U+V2;F^8p>^LjwD7DBN?UQeMtC>4t>!5EzO7&JJK!lIPHsEqyl*Ewb! zp)LuwMo$ik5W-2~XHbID8WBw$#uLvf9+rhSc;dW>sqt=16$;9bpuHz=8cdduBnF+G znkM#Zj@G+Adi_mr8iXdzkfN)arhjnyO~=Ro^2()qzxpSwbcA7@gaSPg()U5*NlBX9 zv3`zPwqhP+usZ7i3*c`){qcV?2|siBPlvC6^Co)ZA^3pS8fzVDvPn`M7s^d{+{0~m z?xie7Xf4c4b$R@yKgQJ5EE*W}2aKzVK{2MZ(S09`3tWhy&}emy)Cktsm@KD1E->9L zVKl@I2OL>lWmMH5iqh6JCQNG;cMr;FtdF6@Xk5@64j3!Xi+=v+sEPt_YkXDWtVOwi zw~lY!d<&z|kWo?cyKjCgwyF@3J0w7sOjFerc_X73$Bp!&7hMj(2R`_|`z;h-N2*33 z5^Wwb(YXbIG|JPE>Ha+ZfR z%WFNf^W;jQ@HpoX(KzP-PtYY^6u~4|9g7emIubc0^1VO^+T&b+pilv9F=9?TT7E=U z$zqqte%Gto z?U%pvOyR>>uZMN+L(b=67hjAqkt1cTCHT0|aL`*@k8XTfBf*m;87Qc|=C<8?xO2}Q zl1XkR%W}LxrxQ>9nNAny99fnkcoHROEodclvJ9&eZvX0+x#7!SVOZC!4~GOD-|Ny# zF9l%d6E34OJ;kW1F_Tlao(_yg1(c$^bF0s!Fbq5LL^EyI~|OP-sbAs;GdnR#l^_pPZPl;iVz$^Aj@0i4M@@)ZxXCm z{NW$}zx?8RJ`(oqxr;^?H`>UJF-oIwI49se#-!Af+>9tgz))+25eSnF8uTQ0lMp?e zMBxdMo*?N26!e5*5OYBxKtNHI9_xFE8xUHK?c2Nj<|BVmZd|$g@+PrS-D}l<*&|-@ zTfnQ{xAgUw3`fQL_E<+SGjSuSJklKmbWkx5=L4xSARcs7`v~4fYRaS)Dd0{5Jb>mt z?JYm~SJ7aV$7GOqC00_kLJMdV{q>SVYXjW!I-O$pJ+JW(>^^cCz{hX+)|dYJ3pZo) zDdy)AT4BWN&P%(ebAR1?%kPE$@tbkgag^)P(lvw%P3$h1@QP`57C5r5*>T>P11s3L zgkr-sY{Pzl?5y{&e*bN6dB8Y%rn@NsWGaoM(h0@j$ZC%x%d0qFf%ACh5D|i%t=}odaL{GKKdn_lNii z6(ebOSs4uIPEYf=$32ePYwB{0NWfJUwyYW9c=d0*j&{3?chN(-<))jsYxkXu`#tLM z2t68t)^wWDBfRb_H$*QgpAXGE$J**-nEa_veVW81TpI zdS#udR+})@A)kq%)y;PuBux!*QorRO^_-6BVev zM@>Sk6GaHEgb+ZXaNdKcSRS_?hoh-M>XMeyHv@E)l4(U zrr7MnjqpWX6EFy|P!OpaaSXvr43U)(ypEJqIpJZ+$$aCn6i$NJE2LY8t(8FpQs$?ku3?#Og51K6`TVw9F79SfBs$myf*g~7Yt z1~5E!JJsMYM#d;##KMbr1T=vRoy0IlligO?OFaS2~JddrN2Ayt;xmFVgjK$-9O?ze&T7=&86kFT^CdokmJ1*D2udpyd4qf=RznB1!k7#f z0?uoaB*P?A*y<6)9_i(o2BL5Q6Tg2LH=5_K}+E+VLtKZB@% z3n5Y$08ISbVW~qw1=vs_;&9HP<4qaZTJSDqb+v{RKKZ44@A&o4-i=>5#I7wffA9-G ze#x(YSAdnaE(2(8K8MQYH1ZbX(EuZ-C)vKX@2z3!z}I4^X9lRSLM9%i1400$@LupF z495}8Q`fvMnSbHU8-VqF+8_VdcU%L|Zni%6(wD#FJI2>rw{Hn+s{?eJQB@^hnE-&2 zfO9p@TM}(hKF~}u&OK*=iyw9&IzXOgh!5CNi718Af-5Rih&hmkbL5Sj=5&|&Nv60f z70w3gV~4rr^Pl0^N)In^;f3duY+sVxBHZ&~A*90M5sah2Uz7FKgVmU?y)eF30@cpT7%l5>zvu zpx#H2U(*=}Khup_ow;p1>IFX?pL5d=bkZd_ha*D=jSn%Q?m}dHdnUAq5a;&Wue=H& zATd)E3j#qQDj*8dM4^KNTVn7XEvny0?k@wJnvhCamiU@L1T5=4At(sZBRb(fDLhJP zocAbEAQC+z6+O@pT=b;`yz>O(kyuBeI~{2a))-P3XwRmI_9zYb=(&j`grE_h5xinp z1a8|qq!9|*L6f%CRlvUpSns}b`Awg=;nrsZjDn$dmSVU@Jy;=Yo!b6HyL!zoaYwE$ z*7sn`Nb2=&jA4ut74t(r5_C}sjto>xp{=cl>}=TYKk$Hc<(04e7v(mzR;;YAz@(aV z!UPW@gkW(ZB&76fOO0VrdTdz`*46<}Rh1|oXf;#PM5ELR*=C{DN$Hvd29c1uI_NVh zOG*pN>wOL!T?A#g{mV_}x6HF?+X7jq!_EsI%9goV^7a%yz~b>^jE5t7)rgt7S?1y~Ee~*pu)6F(}cHhY@-?#}o9P{-rf0bf&ksaH%vM`m9X-$@Dybq`(!5BlH zB?Md1);V*HjI3Ovu7)&{c#7xEHj683IF*nvVBidO+2evd0`v6dHv5hqW4JaV@64km z;7~Y~AS%HHha+m5N1hp+klz#)@IGLaLPG2h)k;t*kR_Uwn#31maI+3}dm{QfO4^9E z3pk6?6Sa>C5L)lhL1Hg~t8li!S&LQ%m2`=IgWN}qy|19)8YtX8bhM)hZu7m7dk&&3Cx+5Dn>Jh{dW@0zn*V(!=Qx&>4lz2&T*C9T&d` zK;~ZgiVeVeknHxmza<~~z_pjz+MQoj)vnQK^i+VVC@vkBWtM2o$3FHkZupc!0JV;?{wrtR@R+dcQ9tuPM4J)i$X44=R78J5O++dYD(_=8GJ1xd5Cl;g=f-pzmUFkw(lmzke#yRj`vlbi1%m#z`vD|+krMN0 zE;#%|E%bz^6{I9jYJ`GNk4aTZPzE0~nn_5h4OI;$D7@Eb(<1Gp&^Fw#&wlpRpFBuA z(->EC?s+@j3D6r3UP7AS^1QQmd7b9wIRM)27HY7@Q+}-T!k09=r>q61UVZ@xDNPd8+V`nv}c8J zIbsZ~kJm6tW1XMe*P_TwieNal(q~ZAoVXmt+lr;t0i9M(voZ0SmEfFXFe>Qxhg9Q| zb~-~NfDFbA`y&QrY#VZ-ur5$kC3ba{O`A3`Z-go3DT^`X+A_{h+Gi$S#gVe&-o1CT z=gz%snwr6g!YE<1wn8=9OqSFHoq%X8kyKh1W2RaSQa8p_nog@pyQNNgDn5*8whe=- zq-FaI3yUfS-2Auy-^AN!0SV{~nVZ3^+>0(1Q=4`$!cqnyc!g+UfkSB$eIl1#qqK=3 zn~I^E5)ewnjY*R+=g+4!{mN3Ns$E9z4_Nmue>A&$y+3cQU5KKx?&Ms@Akg7M$@Emp z6CU5DY2fZXId|T3lr(PJ@gw^dr5xoya=xT{}TB1UQayfmM zBRZLYp2E9;3K9vXI)@ObDLK}wS-j~0;tO2|uH+X4~G&eIfd-096 z+V+x-D&bjb&wkENU3cL{7hIO6Dbv%_L=tx;)$4`AyWkw8}oo3_l-nQkL) z%nhITI71gG1M~-R1D&YKHJeR(gE1X4a_?A}n?cqWdB~0~bJK0aj!>d#bY}^*CeL${ z(U@)X(>(H_=TQxo3DqcSh}lWdU9Bo5vNG0{_Ir*g5yy@{9YfF7Xx#=DuoQR47FdL^(uNxB#_QpR93PCit8W?8jB-ZdzWkh@v=t#9MM4M> z(3Hv%4FxrK9$KFiiY%l#t#p)uS9^GbRA~I+xih`ho zx#?-rM3ZU7Y^y~oAl|dObez$6j75=7+K^7L%QFc~37~}=ulo|m4&2LB-r)S5JLtA^ zs!?Fi-hJG8-8U(m#s|lTdIH8m=E=b0=_7cLrOGsVQkli_$x4AGPLBcqx%8VPc4_ zz=hc2g$;BH6V^U^k=Gd`g2c=J`#x;#b zi{Ldl2(G4`XmZm&xf$TT4WgB&2!W-wWtQ$e!1~HE)_BVC7Hny-K5%?(z~QA4PGHNX zO+4SPDLJ=Yl%?Ck(;QWcuP~jX%5D<%&l19t( z<3Ik082UL_>lf@lI;7tlQcM&_sw(65J*ynscjSi4|MU}F^GnbCS2q`r7XRY4jQ75F zu05u|dVoX&)}5HUR7UwEy}ifAoNh z=YxO#mhk_)@wWjubkN2VJwQ=Ht6{J>Y;6#olBp?{dOZgB?8DU+#bC%xx4}ct-_F9; zd5l1}+agU<(#)VI%xil>c+*?@%WF(`H?wo=R*oJx$jnrSRwKhXhcX#SqfO0mPzIAI zieiK!f`!L{w{gRL+f&8|QsM|IVp41stzp{Q5{5D9oZN(+@Qa5ySgVmugW;Z%i5 zYp7$6DGVcUb=(>YO-F9m5i><3qw<<j@lRwtQd5# z7^QH*PBM!yt_>k+F|4{IZu+{;SqxSifOU%OA3yh}f6`ys%kRJG3IO))J;2h+Ds|y7 zNrNh(3#?~-(8IfbN+7JQ zMJG9}Ml-VVgC`Lv%YtDLbfbYoPxQazU5!;$l1jk2c*-K+gCk6CM;3{&7=j}NK^ukl z7MWDzf~^_!)~L!cO>OXa>eWS#9XkLf1+BpQxPf&FX$#VLLCEo9#E)HiX>8j`aw-)y z(Ot0Aw!|BY_jVyn)E~Z+32x31J+JAGAz7KQz?COZ;k7|$LQsO0C}ik`I4&)K!)s5o zn^IFF-jjAUD))%3(3CWYsu-KnC|Y-3LumVTQkOEWbBa0wp~v8ZnviWdsc#k{lQteN z5`)hWDiFuG7;xfiObnD2I9o+x@}$97qY&i@=@jFT^2)zk3=dnF+B@ae-*d$!o8SCE zKou9p;SWtUEw&h95`}X)jYdw|Y7xpIWp5ErjY>0Ih+97-Ep&5%ytzO~x4m>DhxH?1 zPkQPvz3SMV|Ly#CW9tGyRh)Z?_YR{ow9ZgTlcF~0Y?k-E|6|;}=XPc{=S*$d%+bZ1 zL;H_1!g1%3BiwcGA(VIQJ$#H-mat>{7N)xG38pAr80cI4$hKD#dIU1In}|s zftC-+kbG>D~J#;5!1=@}YOVZSS4e zT?H`H4Fo&D`I_9c5D{uoq^6B1P3W)2#!00p>gZwV#%8)(9)7iSe)*+82zzY&^xvVW1@+N7U$asfd*Pf3&~H3?a&n4M}eH{GTxhiEN`O7N(719Ax1;7{s6 zc^6PxP5S8c$^NxQrG zW~CPhOhHH{8etHEn%q{MASRMrO|#9+<~iPTD7@i{?eb4Rt13P`KR9;VRe3U+fVvQr z!l^cm_EtzU#_MbNqM{zHBc3S5<29v=VW=-#boG{3ZBz-*pcTv4F647BIQ(FKrb^n^ z_1CJ)02-!7>yl>fX|-C2j;DFEV|e1@&f(I>J&HLLWwbgwH9w{>bk~xj|8ErDr)CQ z!sL!W?;)H}RhVqD6D)60u`!tYDqsNPvSwtVC@Q@7XliohN!^&-)Fg?Jrb6jFqDm4J z7jByc;P&gk!RYWYc*w($XFUxq8P0i>1hQ1oYNiDG9TlR$UkLw9-&%0(0f`|tR_^Lwr3eA|NT_qpK1E*0kEFKOjM6e2>0$(s39Ho^8x~=n>nu2aiv!|@u; zJi$mBo3GeJQ)RWHH{>ZI^=ZyOMf31<% zobX3$Yf1AKnK==Xrx@Kw`KZV4f?$#sq8lV8hU=AVJ1ouT^)~?P4A{PJ{$4P$M(^onRk6qRRvX?0QpiYIAPEOz-Q!?K{Z zV;Z@l8jSHa!Fd-Gz7p>v^a3VLNYj*1MKw_69qPp9IN4jL5txjr`3_T!oOKCQ!QrhVD2FDHnq;rC z@vbq){dHB8QhlW+*M2EWGHESws>Gyz;M_j8?A#I(O+L8PX$a)VGYX6GBy9uYXHprl`s53 z+T%YofK@GBvup9-jij=Qp(0f&;vHIs&j5Bm7-PuhUV1e^SpSQ;UVrHwl^qa586`}d zBh4D5NlNW{Y@HKEO)T_vg3JxVFLXZjLIYbt?Oe$=M zIk_p*EXO2M=z+zUid2M|={d42N2v;xBnSbm1Er0Z(Vp0M%`9asf%T(DaHDlhrbxu0 ztR=W1WHk!kiC`xv(aZOnTpzFRFf}*C8Xo_)#F|8QUD$mqhlQe6` z3s_wd8?Q}NRK?a%4akx;b}b}q?!+?Q+=Mcr#WIvOWj;fdw#FYRR;yREBLvve$RKPGSQZ!%n9YP8vVj4QW$?f_CcvH<0fA%>tC2zw zV4W4UmMEZmHG#R^44&R^^`Gdbf9(Ki-=q$q2I;2}w~WqN1Xf%)H>vx82I>+7Y}otgWoj(H0tq)(R^WQYz}&U|O%lxpC}_Cx~*&N-sr3F*FSbb-0Qb zCW45t3@Zd!kg>d~Rqh;AjX|miki=<3-s=-*5!I~0H9_ax3qj*0m4)#rR4U{B18lCK zoKqhhfRkBvrLQhly817aijE5`RpmY}@1I@!(g(Pl4dx6D$+Cu|p z5yGKFP2?x&dJ|EcLDN)dbNWO%x9? z7If!^w_ShJ7gkmE#hI{VdbhO^Mx=NlKxnLw@FIHpZ{vDSf60#vv;U?au=VBF)$_{; zKgSqDQ&$KgvTmO|%IM||Rb665jjcCHMU5&-L?ICR2%XL`o_%W&*?agy9|vH+D4Fc< z(P?eTq<09V+MTc;#(Sl^})SZS_>|iHsB?u zUA*3(%o&#jH4!q>I4Rkk6bKx}xL|F0k;c{tC2n{`9fj6AiNkwhgkmldE=?OoDx!)LgpR4| z2I*}`RKkaWg|-}DTR}R>GtMldT*3Yxcn$a5^C*@j;;3~Ia)<4=Xj|@9Fwh3DUJxE~ z+KourCa#{Q=guuYM^tsNaEH58L$u6WJVNuOE*g6MhjH04x3Zf{cs3e_a zfum<`eu?OO%X`0&&-oWk!qSWXaB}YcpPJMn>S+IZnNTR5LDV6#4OpmcO+DG7sdrdt;2FIkM{c}@N1xi^eZTiU0DkvvLB!y; zqbIpx{RsW0i*yzx1Qv}G3Wp>~dl;v%NSs&5C}&zn%r?gqR$)y|uai?%1x?kip_rOM zCu5juR)+m{DOfWp!@rNF6{FIk(hfykAymQ#@A(7^{hTa{7#oeVhA4`d7bP;S**+)^ zClVx5!epP#dp?5eWSqNnj_Sk`)Y}|+&as!sPW~QKN?a0c$j|VQ5kl0FRJ+={-XKzM z9810pAg=sT=`4xVP!}8@_E=q9U{cjw+8<#>gu}I7hz5&ksTvloJb5fx%`=v|B~dZ` zv}vr3I;gaVX>u$vp4*Luy*Ne?csW;l zEGwyMk1>j-5p?4S=_}HuggTOB(Fl{*{K`k(1;FP09|2(c&_g`)#B~gMIZ+fb9_?ej zV{bBJYdk~ed(3JNDj|+ioQT<a0Ym*4#Rbv1jL%D>?=ikV9xsz`vcc2{}36K-ICG!m_% zscAU9v_Lc+y&aHIVLr7mZoUKv5!c2B(%ryL$FG=)7n;{HB?>=(pLyO zC3Tzl(S!8*4cFy25HA))8(SQV&?_Let-;OJ;T-$teMjgQ8bFYx5C2e zozD~bKfe2mqA=lFeAdH9i}#VKJFMFaD{o~*F&_uAql@Sc)&WB?-Nsg9vc%(O1zKkm z7k4q+q2S04@#pE3+30}Xx+D=2p<|LPXKQ1hC$H>bnBi24M}dy8Li7Bu{JXs1h0mv` z=4h=@TCjd(?doBXINovBU3}nu?_q6u0b5jb@*bwWMW(f*u`sWu{NNA0nt%I${#ya? zs#m_szwPaJk+p3}6eW1+kV@fNoXIvdy*MFmCb(*fbdq6r!0!GY!+w_|*%IIV+L!xx z|G~Z7cH8xzQCh`&9|vDUyDWvTly|#85GHgMM}xvbH7AL3lmpu|m`LLUSZ{+SmXtUf z5<~23mQqhwl-SuAT1jGS+LllnY)iDYEw(3RP*63tCe{kuc=9wNANDwYVujModGd;2 zE){!qaMLaw(5?*eDKo&(3IUYE<7L};Y5m}XA5y9%8?t}Mv9OTi}I zm!y$FM4)7`k6=R*CDQdhg zSwD7?n{K^>ozX7K%ZpTXL9aUqh7~|Hnv1aTA-D}}X&$t1|en0ms>@Ce`WO<%|K;4&vqtdXPq3xk0}^H!xIoU>SGQL;h!Rw~Dgkj)nTe8h=f!`D3bChW#8E6EI; zU}3OC+F!vN9gHxV0?dT62rLj&?BP2ZMJ=gKj2_&0_k)+OC9E&1c;x)%8y?)A67?4t zJ-ze(pS<_!>R*4!sq}C9=Nw)5&e#9xQ$PE%M()0BQBJAs9M!f27=z4)K#s2sw%Ns) zl5%eYWmDpo%KX?v!CFiz@UmuOXNO5yv$KByI%0P`!$kpWiQ*(UT@gr=MP0FbaKQ5F zk)X7IV1F_tPump@74cOs|A&0l-?#kCYk!Kef!YVRtZ>MJs%M&Y`Nd!URlf2o{+{GT-x0{t??39w2gax}B8O_@(TQOWuChJJ|EE zzS`%Z2cP0izw{b^`ugK{1N@zr2IWhoMD4v@axTzRybruA2r@F(ffNGK?mpJWf(%kS zP6>>22y4S+&{gzR$-0;m?LEO@n9D@hW_@|@dm2~s0J^aEcTKD78cegK3(d%yd4KFEhYbU)*&U^cJtDopf* zNWwy}P&B5&$*_$3fj|8a8#`Mpt*zokIDBPU5=G(V=2?f^ZoL(Sf;dNKXhK2M001BW zNklEjdOIW&&;G}^&|8EzzvT^|uIui6?40WfCF;Q8 zZ!0Vp#OS05t~gqUte|x(rl-If-x6Xy($_?GLZ{i|8Al`TJh{%Y-=srBRkyO&?vwgs z4u4gX%zF#MkVGEcOGvC?xtnw69Vb{{f$hDLOWOrg=P^R#t)XH*w?h0GvF!#L)%G^#jF?3nxhGEmTo5>>WY)6l8)kAVmXi!q(Q)#A1$WrKgR^ z@W~PC^cas_nD8eL?LXJ&gST#O&iJ_xK6cluzwD;3|7@M3kIl@#@KW`pW8+yJ@vGMo z)@LbxDvKVo4q=hxoyR-Sp=b9md^@8bKu|6d^@gNh@D!v(Tom;P|T)0Zw#I@7w_ zc=q@ATRu=2S{@usneI=JQgi0aO+5P0gP0b8u8g6v2Im}c+C{}3W@SOz?V+QL-e7^z zY>sn|(cT`HclSdn2#6?SZWV9(wcq4LUveFHazPp^@`c0WRxwBgC;BOU+hhEA(BV4MnX=+HSZv00o0x?> zrcpzL>>y<)yq^kOHAea|S<=u{4N3=o*UV;YjWaGaeV%TX*pv;5b)pqP6))WW**Zh- zojCt1@BRSOM$t^h{Q86Ef8`(FdQx0VSf9oC7pHn(^QzzYu;1M)xo3MD6(?jmrtAOb z?7}b4#d47yBknFRZ+3~B3Cp5GGfXMxPe57XiYaNT>2~ulI*+=+tfSB`Vjjq5Be=0O@5A51b7EUq5m%U=G!{JGb6Y;_fYOIuq! z_^}7s+S%j8`Z3DMn5MB;TdbliaUux$+33)iR1oJqZhYn~Tz|uj?2ZoD-rixfzegO$ z^jle+ayI5*^8)7{-Q>Ziwm5s~fTgrxW#tH24AR#menwZ-bTsT<-sF3~>!1H9!2Z19 zPu~BgR~=dZ&ev~j{?Z4MIDhXySb4?HFI@VQs~?PT9^Y12*4kiCXl-kl>f7m(M|(?T zW*o@{$7IZEGNatz#P&eMJ}ABdZH}h4V4MsVWOcGSZm32B}y*zKr&YScW89j7OB?EtK{g?^pD%4?pjYBha@A_4XWJlyn9sh`K{$ zIv{W|8n6Xbu}d-AKnhEZX5It_eU)6thacMGzO5bh)eY3y3boI{6g;&#J^k4@H}`t~ zipNL5!WyIP8I_q)9IhH&OIV-XIG&gw{Fe2Y)ZkP~XWoG4cqU8zB+;CkuTuMP4;gw{zGorIR__XU^wBHWy|aAD^-J7xdXc&qGal`;HdK7yKmA(%@B^RV;qzfp_{6bg z-tv||c-_zc;;Ua5CCe-GviPzVxoWXB1=b;3-FvNdV7s|MNsvMxZ;jZW73@rBl*S+$ zi#t5C!k{BdswLXCOVw(R6H5&@c18@RPtl)W0HD+Fv6w}ul~wwkMU2%rkt1yc!r;uD z+4vkv6(Aa{OsG_csS5A+NZi1t?Q^k6sInDmwTLGMDTo)2{EeQK`@O%dgzw$)eE(d* zCmuhGb1_j_T(yq7masm{@&Ek&7YTshG(NfiscHGXyC330U9!8o{akyn^`4*k*wat_ z;ImI%{}+9q|MK94mw({Fr|)X|M|kwo2&?-vA_6Vh7|pnRevGLVCsoAty&fv6u~m)T z-y+d7oJ$!l9BH>U8eG|0)lY-K+`JfJtz|ynrYI~~23uQ~`Ot?S=iPt&AOcC8q^umj zj_c3dKy3}3|Lz)h_C|l^x(5qG5}h#UbUFLb19)rkt=@RmH00eLr_S8K!s;?AjyQhZ zNg87~n2Zrh5(`DHVw`g{&M~h;qHXYGy&=Q(Q|xS<<$dq{J@R_OiSPJo;?96!FJ?5_ z=b1P4SvqkiAHMeyrlat+E;9VwFT91?JEBguz4pu-ehc_5+UvSH&2ufDWlUIl@fP7~ z1Tl%QSX+|1F`Z_QWVTP5?9-voLU%xH6ND>36zyZ7m4&u~#)FrE5Nln7aDWrc<};2C z)-gbwXEbQ6tdTKTA;AlrYmmYREBN|=xCwlzX#O-SQO#|O39AFe{9(j0Q|QLqvcne80`FcUw^4g?s{S*s0%|C_c0>H zc_>Rq?O>^YhN7c6J1SW{dW>@8{u@5h2aUB(zqs4}XsHBP20+YU0cg z=^<-%m%Bgq0NdNU2pu7$Chv9W^m|N-84G`j*S)&Bid+&X>)FVXVA{}*2|bpqlTw(H z$0X zSCkyd4U5cJYj)_E5vo?mYy~AH&V!esA~b|)VdFybkxCPh;8lziF|uh$l*S3imHj!R z(S!y?BP56jfy6pTq$EljlE%<=Gmhrrb!EQbDBJYLj>XKfv=ns1mWRtoIw;ix(E}p9 z5C~ZVjxOsN;B^fE@~G){yHROg)AoU*fhIT`xF z|J2#I*ywlMcWLkFs1Dj_-psh=^g93Sl`keU&~ff)et`h^=?iZA zJs*B#xiW$e-hb}fe)yi9Z+mVq;P(m7zHNwuY zeu}W3-~O%N;a~lmU!k!HDp{r|N=D-;{q+U#W>q8L_4Ib(6UC=yR51MZtjQgyVi;5Pd%%;W~dXC zUT!C~tDySe6ClPJkE1~g$K+rOXZAs9<~Cs}7kKx_w%L|zOye6v>z(u{$ zhQH-la@9|iTUTCJCj+h+%h_a)EYides!srv;{${cSTFdRUk|cd_db1q(F+(f#>IFS zw2eF(132d?ea_6S@ZqyFx>d}HQ>WOEHp!bBF+0FpgQ>RZbdMtQBWGA=4ng=Qq$>n zSz216uFJqx65;jvncvP}amZ{k zW-^%s>#PC}6}b$O(-#IZ&+HQqGHBtlq& z7M93Wbi|yF-KSR;taVHBXpYbgDGrGU0(xHITas+us;?RpwFR#vwy81AoJd88s-$Qt zs`(LW>yau(Nm|Qyhx3+1d4w$)h&h?ur#m{!APSw>k*pv#2e`uGRZgeHmzpLaQeB*r z;3YB&5`L&40y&+IAySl4pLq2SE>1te#X6&C%|04Az={rz2!U$3V}U>C+C9+AqcOkx zC-=VibsxL@2*CgP?Dd=f`}^Q6k6wP!M;^cYeiQeZHLYWl)Kt!M|5Lj}X~OBnh@+ht zG2Z5ee#CR-XFpk8OIUx2=*$j&|9Dq0Q6T&4OlybNhfbYfJw!>0HG<3Y!_E7swVTp7 zFT#`w8T8X7IC2mYmt<^JyL1;jZ21B6on3l`<3w5`+>BIt@|>WlLa>1f*&_wvFs`O7 z8H0iRmyh_(;vaIu0e!Wo?p?vFJ(;8O^NH9~8SUv~p5y*~Ef0^@TZ#gHImii%2vPEb1H&@!=Z90!wv z$|%O8nvcBqqkQDP2UtCQkLlbw|n&fQP z2@G$g+*_npi|vpg!T2b+`3Mo%|LvpBdBDZgWHi2mSXldW$KMZ)>i6HhF`-dG+bmR_ z(A0BQdI?9mnpeE^c8(^z|Ape_ulQV^$7>1eFNklvW&KfFvEU#7_{6{KqxUmy9J&P- zpZ%<7aOzBtk3U#(|HBs#VPIVQMM6kCpB%5_b-SXGP#Z9=%hTH)`OuhUB2IUgSY2Ge zWHrW>)Xg4I3jzz#wst}Rhc{+|j&iCx_~gZL!p`14QD?yUr_WKovxL^=xGCn8Wr>uM zPQQl`is!%hg`f6%?|9xF0S|fXv0z!{KPi85=(^**AWajHK~6bXb9torpdq zWG<=(Yc0k*d~HZNJ?hvOJ@-AvYVRfzndHf%cwQWeAmn4Z2j$ z3(O&_y{)vY1EDnDdlU{=%~@YwWF-@%M;3YT>^Y2SZOyzxNRP6HSk^?%2w7~97dxz^ ziX|~+p;hYW$qv1x6{2LBx>k6Xw>V)G+EL*^G`MEM=-?@|s%U&kB@=vpj3=I+bKmAR zJLNjH9AH|~zmpNdOQaMb!(63(2oMr4G>#ONE%NZ?<_>_Lyx_}nK1(`Tx}g%aBU2_1 zJvFB8t_JneHhY_DNel=oO9^rs^v`*XQxt^7FO07T4knCazUje}!0;vp3$d zntu0z70lbE;W%>W7_weMBif0YcX;oR(j(iJ%1eRp66Zajg2@93hAySo92i4QiK+#s zwWg!TWW^>-N0@0?B3@n$63JOdAfp~}9FwLg-bLiy1v!j;_-vkER;*<(^VN@{wk!k|C|(A^3}-XEf4 z$o^0ddJci#)Zelh3top(^Bpm11IqR>cNk@zV+9LM{Xl{hDzNfxq{rM!n& z?O|=!9)VyU>)WMg*IH~_1dR=n+sZazpgPzk9v&wWfn|@@0k^XTX&YQMp_>?1(-{le zvrtSprWA|0z>bP``k3O93{;OOjiIfOq!2h~kkW>sikLB*?%=h<#2I_8OO~BRu4>Lb zzQa`XanayV?moyayF(KT(OS6)4*jaV7dRDx=y1=Y=K%QV!{ekkh>4Qu=x8!I>b1l= zg-RBP;~3ovILfl%%-WEbed!Hf{>?-2f&X$XVSWC`Kf817duWve-n8d`0N`EsKK8oD zF6=OMQLum~Ec-g^u->+s=-~zuhs(KA;GM$D)+I&?E{(>B8q!niJTxlMS%(E#Q&s!) zRcjfn#%(gmz#FUquTr$`u(iEUF>mlq!Ks^WQq2h$f+AwKKGM3k`=j54N8SQM4_Lj)|iy>(Njd57S)f+YG zFVW0ryzT#cTljZh@_ql;PjK5;zKE(Sh$Sc*Vp$QJF@00B@(2p;k;>uC1mUN6F(>J!%$%U=uJgdz89O_B zY*lMa)haXBrSZ|#V;tJ(L$_Ubb?xfv_g4}xJe3zX9q`TCftN9nk`%E=Nzbr1KzPmQ z%4Kdo8Sabcz3@3t*{w^<-#io_xK?3(0me|;UjW!Tf9`c--6uP8l;^zQnc>iHScOIn_#@nF7E)xV9QD+&`>2t;Hk&MQ~dxp~;&8a-xgrg!5NUN$M ziTX%6z!R*u>PBFl#2JS%hOCp5Dv45p)zwvcy$;u1cbd^?#Bey|=9_Qf=*d&u{jqxh zxaaN%c+PWg|Bjd0r-0csL>XX-T^D}S7)-#^IbT%ZH zxy(~DJHY>d5b}+0p28d z9|c8-miHA44`#yN{&|eqC(bp6knEFkc@p#J*sv!OMkZzA6<%dnqYl?9KRr1K5$-kb zgU_S~ZZs#krb8BB1x})C~}k#(RS$I7By5 zkIlMbGM|vny38s^7Pr&3IF#r0Y@1yTrmQQRl!*3lW@(3yeDD)=Iz1XMsLKYWB5khea_9>ocEVh~>TtbYY=O-+Q2_2^N zkm#nwRt7o|rUacFs*hH|T}il4d7UjE%eVfH#xmU>vAEvHNN7}`I&|_FV+%4-lDGo~ zcAI4W1cQ;G7Z)sdA`0&@rNg-tYr+kpM1n`R;#!vIP=i!fpl4WnKvnKxq8_toz%*WE z-yLI`SDf3{B>g@%@p$to>q&q&pW;Fto{UH#u+{`KSz$4vp*9V@I8<2ul>xP_F&0EQ zqaQnNSyPi2uH5oQJv+JaT_=05y@p|Z5yd}U*Z=0=d<>`$AREkP+c1I(A<2UZY%Yb3TTG2EO)6p2A75#png{5U~f7Y|P{r0fL zKORl_=tn!%5*xWX&Ul8r)eznq993H z-k6ZYaf;TSx@?$_$Hcu3{Zx}ip8f4jOlhf$F}wR?Mg^EwCdO4GY(0QHytfKZSvO1$ zLbd7bj6Z(oyZGvV^mX)x8Hub(ungr4kvGK6oS{m{RD#z%I{6Ss3QmC+=qSRu>XTDk zxT-Q?y+C@&u)jdJ)8Sw;xk1p1I|lzEz9g zzXrO0k;Z&nVJnT(p%Th-$&n=(_Mt8k@DY*DnM@ty(G>3$Ql){L1vp>Rm@=4AwEKHP z=BRXq1Lj<5>KCXEU0n39S^+nEEPT zt14=gQuOi;TI;LW7eFEfM^+ZOT#k9-{<}H2@+3=n%}ZYPET((s>30&29zVw3q~gkc zI8aY)%$Sd_;0FV0BZ;(RHlE;3i|f@53t7(5!2liC*x433_2hPkG$}CkoD4}44T%oPaS16bf|mB*w`F1 zt5XV{qq{?-h_KRAn~Fqegx6OGBi_4D!Ld9-ScJ5AQL?xgv36pe%i}%L7Q37lhRMhx ztw37n$1$I;$?96d`WuK}y5N8Aqfd@Vvn6T~TA3ysr0xOfRjkQN zkCYyv444_?gCO8%&4}J&2ifg0sS~b@1?P~|ony>Z2NUNQBWS9U+7zvNwa2xes}~j} zRIs}j24gFnuV{)XPF5_hEOX--ShtHj{&e_k#=9e~T;65a86XNt8udS~&)crxSX;9%V7Yv^Vmn z#_cyglaGD$<4lVgCl?oa;*o~|*xNl|X=#aBnp2k*-a4Fji1w64QZU}yV7kAF5Q1X= z3UM4$SH;z&CX}R;_bAJfE1MgXMVM-8Q8O9s;!RB_izp{Gx7;-3OK*>P){Q;tgGZ>1 zLR9-0QYt&9n1*D#zF@e}fulo-ktOxPF6DGe+)@x4=eYRzSzh(>ujAy2jNf_t>q&Ki zbO&@&PtnA<8fJx~pT^)7La3JH8Z_R81S!HqFcc<-I`#^s6mhHpN1jWTbB|&|Jlkej zJ66+ulGzR`kt4MprE^wSPvcj52-ydfV~xB@>p1K^ zdW@|=Xq=}t8CQ&4(t_84-F<29(Z=!U`Q7l;77^A9M$-ug^EsV<2h%j4@!Icy{9#li zIey|Ok=ERM_n`xn;$UZ+bB{lcHx>On!Bq3B$tYD4Gv8-6A0dQi@AAW>QH*sBSrRiI zkFg%IP7g$kX-bwB0v6Qo2v#D?px@#8(`P8>BW}Iv7~l0RUyG_Y5zQ{DF=#iVnjD~& zV=-R>;D^8e+iBwC{Q7TykpKKEzsvPEJsU*CpxaUeGL4Wmv+WJ`&L2?iZy-A!ZD*9l z6e%JG3u{!i+xi0Pu!7@VyZ+*^wxnq)Tw4*kPf;@!)-gKRWwR-%r+f4nacVh6?2j4N zdmM>MvcwX3hp!ctQCQnSB}+J?kv;(r&W6MoaJLdDsEcicnBqj(l5vq{-zIGNK3igm zqPxg=)}a(RR>m0TvCdL8H8S!H7jv{#Ob-IK>0OPn4lM-J=?<%DpPSAcN6F)4Jve*b z@vcAoI8yf*Pg?Iq*+;q<=@q7q*xoJJ-n+s}?tI3}fS;9`suY*lk6(_I7!x88PwJcsGrGwgRLO^J|}vYH3YrEmukM1I3= zTZKaSsKqG4WamoJpbN`GPi%ot!xObt+l-=!B#o$>KmRpEX~auj`eL4V_$;Ogpn4j` z>~HO`w|#{?Rt$O>uNL3RF2a!NaMJz1dhpJ(HIb-qII$Jxp zuyJvl!gTrY#~z?R3_ACihBS}p#W9OLPd`>9zC9(m{-r?0<`v;#VlG_|IjIAR@Izq(Rrq48EARZ8PM zorR-p%>B>(j}q1&Tkn!F>7^{yhsr;K_RcQ z!lhRrG!}*TlEwaUl4w9xK%IfDEm;;LBWUI&LV6lw5K11BmcUzt4|Ip71#3mCi`5v* z-gr!HVrZGpiH=Dk6{Kwb0*P871WrJbrW`wd^y=T6vSfFo1Oesf09)+Q$wO5)JJ{jN zzvB74`k#LGa%_T{IkC!0L^@Okck z{0c-JMtgfKbtNx;{wa>HM0i_~M4F|unko)!Mh6CE_z2kR6>cb8ALUW ztyxx@<3n)D(6hVbW<=^6FqW#;bg~4ZMIx2sY=n?OwDIt>3>sO1o+4yHtZI_jAd{4) z_4KaNRYo>v(-|hFhj(3!O7Wz4FM<(<6byzP2K_Fv(nJ=b;{hrd#xb|tus|;bQwOI0 zeGhGN@BNPvXG7+-Ldijp$l>t)_24v(b4a1F#7rB_d+vFJAAh*jldj5m6I@&(6}3Bqf}PDNmo8l*$sB9z3!J=uEf^KJ zB*^g2XJ{>`OhY6Ebr}v&mc+PL2qbUyrMfXhG^{Kf1t-BPj4_xxES1bhlmFo-+Z*(G z_pg-bxT8kynR6Pi3)Ipf*1cvg57M0U?iI@M z9$3S;9MMlDy+n|vg7e0&Jgmjmoq~1X$~)aJ)pm!f@$8m{QnXY}gPBHLX1lrf|G4U_ zwkosHXoUAZYTR0ETO*p1#~(O-_NNcY3xCm{{fi%d%K!Ese3446Lb8k%S(FzCVJ}V~ z<9IxPpB|-UupAK@gv2xr&J`>!EwZw_K#@ajpvZH4Q`0Fjl0?z4jt;R|2F8AHFy`f~vmxw!+RS9$TmMV@&4Vczqe z@1|}OKK$Vz+OC=ul_WvfizY3WS?J|-J2G@OJ_D5#bdkYkCD0dKELawNjqo+84I96R zxZa9aENh37js-hn!FYPQ!X==b#@UpjdxT0c1ZP^BXr(!ea~g7kt!X*!AK$h{}Sx@!!hs-dhU z+gp1qA6}s)r|2F<$R5V(z~OR&ebv=WHboR(YoNo8&63-@SLR-9r|vsRBP7NSG0h%j zU6M+}j;|5+vC*9l>kU`o+RsmKUT2!^adUGInJ?m!J|cz@Ov+uJet9!fN?~kp4e)Y^ z5FT$T7P}esqJ8OCUiHYhFuk{ECDDSBsrLGrnO^=UkKOwqHuBeP>uzZY8f0ftD5Sp>D zcmyvC(tH5PfV6jnqsLD&SwDwL`*>MlZLm_VYtN`Q$UN8vA3AoJ*KY0c>g6d9-a97O zFc}X?B0?_XL{BFLN#4WJL#j^nlrnLNtN35^^a@54;cFD&TM}nUbogFJ($IeNmB#6o zL`f1eLA5Q?s&L$M8J0fQFQDj0FRKLaTy!4wAS?ol6g4nG>d;|LM!U!&qe%x0%>uWg zGsUJ~VJruf6f`2kNfq>$5`?oPN};SJ6(Cwm;tid&$Dzegea4f7%U9MIPFsX1sCQsA z)zl`eF}%XLa2lSk-`H^qvF|F2(0E@^R}Cu4%`RQIg|}1QeBUbf-@VAArv?;F!;&zs zz9|#Uor3j->n9&PwK+R0|MOQzAFFlm(HC#*9lvlju!McOfKY_!bK!4A{H#AMQF8^>*vDp;K{@HeqiMPeqZxJZ%Avyqa(vlf8;Y)Xte{fP$0dU z3uO-qglE5YacbxAD5>zyqou|o81B~WjfXULh*b^u-G7Ru#V$%nd|e}jBQY&b1$*Dx=fPIKHgB!ycf8h z#ajP0#cI}JRZWZ57G%M+Rebh~PXVyDzC+t8R##Ve?2*SPr#s|{d>u$Xsw@M!w?PWM@T ztH}QOU&r45s`KAv1@~LS141&!L8ADybliMIi!0yuw1$6ty8j-4|M3gA{a0>=_oJ3h zQBq)}z{e++aRM(CQYa(~hy)x4(y$qfw}>=i3<}QOuDI}_7e0_G_W@xI#tJM6jp$-U zj*8z`2#=nvr9hQN9M}v(2KPxHz0sX>C?W7((l#DRN^4SdlAu*Vk|=B~P~KB`%Sw`P z>i97}{E1Jp_SrwCAN09X)WY3MXHoM>ma2L#oTzL(kLyMw9H*JYokbtf~4rO zxi#YDiqYC)U<6$sxn%a(X<6*M}a<4c5q}ktFbgyvnj$UYy{PX@CUSp(fCM8d|VsRCl_a3ELyX|ma*K+8EtN3jxHX5>!ISG{Z;nx z`(EDgfBNjp0Q~areVN8F&ZOPC7)<^lxpZ!tsZC$Wt*Z=&TN5%i}nd=^4 zodM5X-DKJ{l&!(51R+zjO0izxg}`_hv5RP`=N;aK-%p#CRQB<04UG+fs@9@pg3>8S zg~OsE8`>V&?2f<+pK0d2^wG-0<6>mG_YR?=eho>YyA(x`evEfZI@*$21LGm1;V$dW zaXigf%LAe#2AmOTP9UYS%xRSdjqRo5OIzqq^E>%RcO2=nWd?`vEA0e@5&3w zsBt7(QpJJeQh$K(P?tlH84o}92v5BEG~?ZCOeeP(j!Wt*SJ~URMLXI<=^WdJBO%Qe zZM{NOPVu&3vDal~Wq=*6;jM|sk>KWF+9}3)lnz6UH1D#svWlrDOeQ5C{qRS5@r9S! z+X`)kR2iK-Wi(BqSC>M_l-9K*O3kduh(suy1*v8okPHu-a6X(f-K}lskb!Xqp$kS6 zOK)ifr&hrCK=kk~#X5;l66HkvQSkvG9KyFWlP#p2Fq{l&qQ`xy`)oSJZM(p>T%=Or z*xke^G2tbi5U!yS^s|gC)g0;fIMMH5s~QOyVA^^vUfT%YS14+y>E??}CI&mL!Q5%61j(#^swj=I2zCvGHit!rftzUUqg`f3pPaOSUzvrX?_`f&&FWug_ z`K#OBk);K#^)zi8o_taT3l< z;{_*HkMU3c>wgkH*f`qx(~p0GKm72AP%7y6s>Wc=*Bcj);a1aSocAfC2GxlKPo$+dL*hKmcue>3VU7(3hk8I-XRu*l9&4wWNunZ4#{YWO)beQYOQgOzm6B(GFYd z*Lm#ZeZ2iGk8%G!C;71-3;eOqJbj4|e*8}%N#^2ZAtX{N91ba?3LyGK%>ZVQAT`JY zONz5OF5U|jPxsb?a~VZ`gsgiUdL5{ZxM38s|xol__BE)G?tAG4_6;sahWN~ zwj#?EfBfZZzjAC*qnhT2q_aPiXh~jlQCWv;8{52m?ItGPTOl=4YCMuAK5%R6@o9%T zTHJWAD6#^9qoC#Qy!kW_9!pVG!y#q)jc<1h>lL4)G6tvjo)mT#P#97vC`Vx;oup~#50zx; z@FDIw^C08#n0_Z5S2nkYjLThY;!$Ksy+FSQrZsF0YbF;r*xnfP*{5!hB%kBdslz1E z+PRZS9y)u5x4!jl{G*4S;NE*rv$MU<^-Isv%?tub-L@EGX_P}GYwMeeUMrPZ!>ROge(~iZ&0_}SYJ~~!GsPQE|74qR|Pvs zpH}y=B1P*+LbeX&1%oVQp<9r7$H|xq-2k_C_ZS=SX@MUsQ8y#1sbMmX$K%rCtVAM% zQ);Sc+6tLyylp|v;@S=jh#WCj)9fdG3l|cng}}szfKmaGD|ODRL&K%*F&dCA6l@_X ztlP#4iBFFqwML2n$2b=r5-N*0Yg6KlK}GGRFfASJ5$%L#^BVW%r+9RcAAC$?pZK<& z5`Ht+d+$4P8Mq8EsCIwz?>>IdyR$<_o`323_&V{5!C~S&Evb-D??d<G|;|Z;G zBq|IM-t%2&`I*1_1fTx$3#b^@@cFMk%a!Z9-~>0)^aF>uy~*`UoEi$=6JC<8cs?apc$;(Cyp^kNI&)2A-Qp!53jNBV?ef%p=fz zgcy7P*;Na!#G4UiHAMBhG@`>WJH$wahg{h%(#S)QJpTn=ulS;Hc1e=pk_p6Thg=>kCYCX%D@S99x{snQXM&H-Xlaf8Xm-^W*+?# zfs_g%t>xnW_JTH}mPdZO3%A z;h|Hd|T5R{-W1^etPM1Gv@pM^y$mqY`lWXmhmD* z=-JV#i%zpZ?2Mq|tQ&H^p~w_P>XCMb!ZjS}HRP#cU_0#Xgk$wi+ zY3rybdz?7bW92`3jMgi@_}oj}9!^$dSOne)^TKgigR1GOyA4^&uH?3KFNZetsW>3`GW+MTb$dFEDvs!3rZ}FM{kT z?0Y+dD5DXOMR-6Oup4!(r#wP9Y-G?2m4L7~0a8c?N4jXG;`^6KT%dB8I*Pw} zovKC(u=N;WTktkmWG5<4YXzyx*x4Intf6(mQN-wkR45XefRm&V6Ba@toeU}jZ^@)a zMdy!WM-E|kU*jj=7Cyrhi@e%}|Mqby{s7>Y|2FWj{wmjF$GQvMcf4t%)t#(Dqq_m5 zeEISwH+RQOO$#!?sdTQ}3+&&L$z)2dN^BEM=xo_g8V!>Wy|o~6db)`OMjNpN3sO^i zMI$qstWQe|GR4Pus8o6i57o^z-uHj~I)^;$-nhm+_uRvY!-vTd&8^!vxO)8xHj*Rr ztP`=U0;HgvMUo^O>cD^X4}O4r?=^fiMteuQeUrmU!d0z#=iA=GpM3UNYUfdr zU*u&*Z9UJwbd4{6>3NC_d<6?VxN`M6r%oNBNCkPGGM!e8rY+-1=sMD3f$6kiG#m%c z*>FPLIF6nQf4{yvMy46QDghJ1Ob-?-o%*|D_Lo)h9*H zu2qF5Ht>aMMVOa0N%g?hpE}^P<=sTWZ_1>_67Y{G7I~|fFkz6WaJr zw@XhY{M-*e!d+bl+hc?eap>APd^zEf#V%LQp5eupu5$kJHArTBI7eOEcsR&#mBkxF zy$c`z^mPQ+(TX^+4Q0QLr?ae(I4`JcOD9ipts}`ZUfy^mZ2s1J4jM&_~O5QKtwj<=ECpxTlJZRpw|-KZ2$ zq?E>ERYtBQt6jmMD^b3|r#WkF_<8594cRr8?qG?$pQ6(Y;S|y;n$j`enV>ABQX-8( zDvK?rWZvM+HeKhacLFY1-_rC}@8i*h;>o}0UjF~JAJ#wniATkUuKWJK{&$}qW^F>Y zaEwOuus$9Gykt@WjbpSorEn#KE~J@YVH|XQsch*m;+}rRVip!&Dq6fz>`XMp?wDSc zkR)BK48BH2fV6_6-D52GJ(vkJRiIxS;8XRFE|cULm#+qL?AiMt2nE1e&>Eo&)^|gw5sQ}y+X?Q#+^+#g;sOvOVc!Twd5^l?}d6Y??xm7k0cc- znHMbdyC^NN&IKF=Fer57Pve>Zk|Tpt05SMADai7i-O-37FR(7$2P-?E6LjK&L#s8o z7~%>rs&{$k*$4Q&KlsMpXnco=_ZiD9Iww|GWPMT5g6 z3ag^FoxsaNh`^7+Aqicb^bQ%11qz4o`yy%SC5dz_9?hx8yJStx-GhX?yL~bnFj%h= zCbeW^Dv(;S+!ZWz6sCbzD-sjF_u`<776T{-G!CrwXptekV&p1}t#GwL0J$^d!js9C zw?FbA58r!+a-(7~g6_wA$;ZEQS-j_OwKV5j)_t86BS8F{HUH>mU)X)_xhvbWx=Z79 zz@c=`)JvSoa7jOyfVT~kDm*#if6pE&9Xxi#^uWvG$@an4}gYWS-KMKIz_uj{szxXt@_cWEGElcFy zlv?#Uw))M#_j?|CoTiR`@nsn(7ig4D1A)|=ppyiwt65xHVsm2+yRwMd$83>8V4O$b z7!0~R^vJ`!bZe8mzZ55oTY2B!`NOa%Yn~&1js&%7pKJ_q!1~ z)tk3N*U?#`ah^_*gY#6=F{Z81k%ZZ}3Y}PB%9+zAaCVBogySB8X9of)!>~ZaW3h7< zr4%-%%X~d!xLLN}L1ws&;kVv7gmg$zlg51jPVVv(8#5u42K!JuE6OIeVwrq zJ1pZH?#eVhpb?rI(=e&Mdg~fvpjJ9&SO&F(n|U}RQNkl!u*Ff{kouY=<{B#BAcaFY zgK#b;NjsX-kTp}%dc>f}IKGe|>@;@2IceHsYbe;B!p;PeB%x^1q z|GSUBg5A1~S~`hJ`gob*t)fBFwt`UwTayND%iP^b9o*hRgdT!G@yAB;X#L~hbf|UWJyzk5zo_PCr zV9T0UUU-SBZo(Kj>;Hw{_XCf=9f0#sJ&9@Sz}tz$$+m4-9E45wU;d+ih;AyLzw|8M zfBzB%0(n4>CWMH(yo#eoyL|6=zX>A}oEMBHOVnkBvMrCEJjtW?p2CkuoH%@ho7)rq z?8&F8CJjly0IwMCj4`omn3grI7l<^+Sx4O(s(Q-zz2lt#{P2&wo71O{gPY=A3BJV> z0z>7TYh>pT`FS77! z3N~)+U|NE}KG=Lwmn92Ia^KynoaigQ>;45+B!oLN3ga6oP1)SJ zsduhB1?w++z5TxB6DRLF{;$rj+jl>6c@rZ7JKi~sP#W(Nyw5>crrV*7Z;im~f?`dP z+we5%>kMsbw6zp&!jfvZ?{J3!72fR8v}3gBQ*=&oA)AsZ4>rWRd+Xj%Bv#p23t;6; z1iiO6LMnyobg7KRqe+SmW!?Uz-@6bAZCix^4T872w=IXFBk7O-*n7DD#1URO{|sBh zDMxd40Gw7>Z*anq>oDl|#^4P>mo~F8l!6n3C5|ri*jZeqS(`F^X^m?)uJgqgF4J2+ zOk0--9LH7z=S=1WH@9{fkEb|iNRtFRZFu;RfYtrtFaATCb{A`>KpRt>12*Qo56-Oz zG;uC^)Xy3w;rxuuG4HhG?11R!qKL>P3h%+q8RIkIyhLh`l?jz7*sL@5)PRZX2LZLM z$Zg4j3l0-K*&)$2m$x>#Ii9jr1`JDgx)jcW)wHdrkQ(DXLh7(KWHcf4hSat6+>kR1 zu$qQ{ubM5iouDHZt+E20Ed*Ir+NG&2#w#X9b9Fm(W#eJPGb9-M%XZY zbTen&4u$S;YwJ4IutCcN$CM<^l*B{pT9nXphtE0A^uPn`Tn~88Z@uq*06g;6xAC)o{~sVxOok)Q zefcX)%NpzUn0)ceEG#W@*ZpU{srP*4!o@kQ!CD)K4FShEcr<$D!V6q~AG{9|rTAAt2#%*2?V+sU$ifPSob_87MIu>T==1QKA7*>& zHsAZMck-_P`1_em#=QRnzr)o({xgyy57dDqVvBZmpA6oHFb_w2Kz<{lC)t51-$9oG zZ{soV8^;<1SBIG`ho8?BXCQqr1l<1;D+H}bn6`qUYjFiE@Jg0*sL9A-FM3(_l~t z3aZxPC}?~_?NVydrA&Kl=y25E^F6FQ#Gc4eYKbK6Q%(cdUyGbN+7KmCj82o1lcBvv zcuyiMo*F+IQdH1UmTy(Dx>K;e(e!LG#hc(811=EqY;}JMNi&*K?Sg2JO85aSf zrKQ5VimLB9cl#yE#xrn+1*5rl`50BzV0KE*J%5363Ry3qF%J86vIJe^cZJY7&=S_y z*SUWECarheb^mEr78ZHw#q&%jBb0>8=g%R8;I0QAe4YE~%}ZC9PRA5Q!C)|;nvCav zcjCkeHn(=^cDtl$HcxH_=yWxJvlcr^n~tYW)tiP zP63+WT#?|>zTwod75=lIcn?pVdyVTiUS*+^GRP#oLefbxPM%n%ZYpXoNRos}IgMiV z1DH~jl!PQ_AAF>wkB$}5R$WSrwWwKVH8Zf|Yw@aiS0zN~s)WF+&{@qUcHRd`3QA%d zI|t)u)Cp-SsCQ7_v7j#CNc^OKDPe zH->Z)#dOqAPaCqN6CYxrWJRJ9RGWs`umz1k7=yN!)lQe9f};J_9`o-Mtgmyav_oqJ z!U>!Yg~~Y(UIuZf1EKObB$L#&<<{*6sppe$5~)a>V12t`;8*CQ*&a`LV0n?Ilj7Pj z-E0+SdpHYC?V; z8M8etgOJ%d_I7qjl8mOcSR0J>oOA4LZL)sz20jv=oU!x{AExSb$aFGijL)vdIF>sF zi_1$~f9WOO|B=t|kAL8CGGCL%Ba)B;BljHvP!b^(RtiuFNvB7m5~|x9OkcZ2Rapl8 zqbwDU2k%1E z%A=cgQS$Y`xs+nR1N$bzI%d=e|As#g?^g!0yi9ObqLm`^u-Zw~ zDZv}G6Da3->o0Y!t#7ht6D-eCr?@Id$bZPmYbwI7m>E5 zcX*ZCbFw%1}xpWy*gj zF-b<7m^4ip4~Jk3H=X12pZ{|f`hBKV3DT2hIa+H>>#(iC7!#~wq$Eo_q={fUsYu0a z?& z5*gA}^tGeNJtcK?ooz^kMNfwiJ1Hp@g%DT|!nX9IpH-4}Y1`n?A!YDu3!PSYJ(Frm z-8L8@aH2!wGe)hTjDaYP>frM}V=F0LpB>d>xL_H!9jqGQbO&oSLM8|sw!U&H!lr1e zDJYR9LHa=J6`t4GO3S!5g_k(*f_eatGKP*6yhV!N{#NYEFI~R$+FCgQxYJ=Bygu?L zU-+d>u}qz=;u{yf_oYpfhz zA(2b$Ztn$2O^hG2&dsfwt7?i?0$~lpSo%>ubL!|3di?>f-d<bT;H`~CLEv2YwRIlvqE1gL6afd4HXKQZYU||!sY#`pnILL+aLJ*P=H?Vy2N zo0|_hDNw0q+!}5UD;nFON(b!ef(ti;>SBzhiDc(WDC#6<&!!mNqpTBlwo2MYkR=5( zsI;D1q)QM+BVC4e3BrX*sSxUQ+%!SZR=NWQh)Q^ruym4dT_&^6Qu1ibcBfz+>|naf zXthe?dw7xJg$mQ41H?iz7mdyqb?CUH$e7c=okJna$M&rX z+AP@DT0&I4wRmH{sn?ozx_G70NkY|Dh(z+^KmAiAQt^BL>UWrqJ*Kf}tvRxK1g%qq z5NvO4P*284>yg&5Tm&rc(Gw?ecy8am&5heP5m~~SM<1T|du?mcE)*-gB#|LqM~UE6 z;9>!=#?uH#l1QWyI3!Y~DCtnb;%t~kdS`Jy_CF%nOeelXCMh_{kc{_#^iw?f#pgKj z_;<$6)#9a?yTry1AQsGEzPK;P5&OXS>+Gxp2roQy-=~?#XkM`1F!GR6W4w!9btGwc zflw)+k$Q>cBYCi=5ssNRzMEOMco%{s-U#q}4+o~I&IG19B7VK}2<2(Lqcon8%o*hc zSGI?&O$&BOah(-z$^f9(GRMjcD^nU2jm@dOM$p3;$>!~CXf#?1luzc}5<()KM0*)U zRDORb;r1n1MEq~&P9X>Z9^SNI-M4ICK6vQxZw^iS^LGl?8!k(NCBZ8lbZ=s202f>< zy#p;(w2ozd^nh?wbaA{RWk~Fi1WR6x#Fq`*w{G+MU;GpwzIBDYmtUapillW|E2(V- zO3yYIM0_PfpZ1HHidCG8HlK1suOQnHtN~Yqnd(jcLPBiZ_N0`erXh%YEpoyzmF^$^Pq>LgD>>$LVb7 zUZoP~M19Nl<##L}`UT(@?i8#yc33kj7J?_%EcQM8+Rgp0U-$ftwk^iCb5X3rqNT(6 zhK{lnFfQkAr=p(z`tqX`RXi>%``PD!)|Ycw7~-83|6OIIJ7Jl8ZSJfw&j_vn_RhZlco)FoXyS6Ilknqecgr%HZMWs96BsJZ(wGkVF^L1 z6I1E~1gYYKN6azFgS3WO;hA%~R5S(@A~aHf6~SIuMB=G`!}<`hBlF(RH-D5;BfW$e zvI;QVyFp!UA!I}4Eo5D`Dj13dhUpPrYZESQOPWrXQgvu_kH)5$*(6WO5Dz9phv!9* z_jo74dJ;6=YqZyBq2|ZiS>ltA0`G(OAo6TcO5m)GRz+ezC^lw0E*-i9y8q478I(dw z8NgH}XkClY8skjpu)GVwsB=khh+=XAytMNW3cNv@hE!A}Wyzvcoatul>}`>Z_vo9J z`wtCx`+YKq5+@Q!3U2Sg=STk8cl5>McM8_u&?S^a z#%{`a3yHvc6OIMmf(RXz!v_y+z$*_j{9eiMXWG^*b|iMV!}^QQ@Rg@N!zcIF>Fura zwxfrsuZ&o(8#Z6Ph)oNyEs_L*XEGXd?X_zhJ$d(k@U`B5CU{=ivLe+9MkYApF^$37 z*>ovvxb4j?(ln)9uemN ze8iXbEoc1v;I>b44PO8I<3bzBpyBso?pmti!@)$xdprhuKgWHXvseOlC2>d*J*IXKI&d^dhy$uqdq1$O8q%M;BS) z9h%^2ucRPX2|6_lmBR{;vj>mVdaetXN(DRbSkzTK4)1rH!IB3durb%XMdN&z-~Gd< zIF^kb`?Fo|-?b>jor3i@aJ2|pZ$YOa5J`%NSGjptGe6Obd5?wGl7%86j~`QE8qOSE z;MAK|dH*Lrh`sO(qs=w?%JRUY4|DeW-o?g^Ye=nVivq2J@;z0WL8ph+36s4cFMM^v z(&0mM5JpGF^Wnq$t_*3K&Zk+z<03hQOB4p zDIrZHMYqGvtJeVdgWvr<`n`gUTelGi@=llKqsJItd70x&J(L$1yG?^+ds_4C#n(7_ z=An5p+1glR*fxCfBY(*0yY6OpXP30or4g3nXYOY@ol=RKr0Dad=Ps}_3RqrQ8}dA# z4+NWPX>>zo4_ z9$C&?WQ=9AqJ!=nWpLMNHXZ!l#nPYb%U9odBs+7bV0{a(CXG5Z;Rwn!gPCR9iD>dK zCDyi>xX7Hd4Dx~_hmWujCnYcZ$!B=wl@~ZHE#>(yvD^&l&~Vf`)b=K|v@GN~mp3+O zT8CF69OI;efAdd!N16Uh7-$_rA~jywBs>Dc!Qi&D|2>?(5c)Z7J0iilZ>*|5%B zqsGR76+BY-RQ5#&=<#6;{=>ZsDA~{kPopzJ|5yxn$M5FWKJ2lT zhYboFB3v<>VH826#?R6~H;%4Wbd*6khw_%rN}uD!7UKq*P|zkGmQaR^=Xa@xZ7iQ< zEC*fiAeQ8%34~<8;haxut}`XE4DSLT`P?=B;L#_^n;qVC&*nW}&#+$R@iU)0|0A`^ zU)>6IS1LC)t;tR~Z8mmWmH*!7FEDlujqt3WI8NTnXp_T;^B$!I!FhtSm_%G`rbGHl zux6&LCe7;4zyDX@$uDwoe8`qjY}uN-*88096r5h|(~QTsEN9{akACrsw5CKGgTpZ$ z4VgCk)XsC}uDd~J*i>Q^iR%)AV}I|E^_5lD*Ei{OIy8-BI2^OLcfe#aS(=qQ+8~H& zezewdLb97mt$~)Tul8_z6^It4AeW9Zt&lvAqdv+g{B*>*XD;!#f9%Kk?l(QcU;eY- zffttEpi90T_`(0^`}xj4|9w!VCW28w&YQpS4V2&hR`#EMiYrf?gVxaos6ybrSHBMb zEB}fop1p|6`lw{!T4p6*{Osqsbmm}jKIez6Zocg)<{?Qyb{w)T+<&JW|t52Qgp0yQ5H*eAoha9#o zk3aP+hglBg3Zv;1nP)g3kU9du5`nK8R3@1w3EgSx^35KosVNb`QP&MkH6?gKUAIgp zEg=X(5Q(837K#EP#CbX&z3$qyAg@ji8DD%7CoNg&5wc}6y1{J5yYV%7Ub4QnMx|hP z?ogQ&907?(HJlihOcF zTMdyiAPU3o;g}~L{XF5^6)G<%^Db48=(IG)P0jG;4Q}4J2EIk-8iL~5m6-W`?Bicx zba;!p8i5F@TwCB@Gzg*RVEGHtBw{9&u6Q8MMLLUAAVruD zz=t_M$)+GxQx7lFRJYKo#^=N>JUOMwHkU)A1QD` zZdlVfb#~}~q~1JDD{|Tp%MGF9LO^(o6ey(_S5ty=RP8pp?I3hCnG_<9dZ-ZSNWmao zx>B~>xcoH#=qG-htps4pOBc9*wZ}?5<-T6YaS`ZxM|X9AEW0#^V-7D}W803X$k52h z6$}upB{zzCJmSg6&oZ1&>GWf^amPIo5@?)Ftn~_S8?r3JqzSyH=J=VDjO#JiEk_`rugilrno zC1tlql^#L^^okNuWLW3W2Brdj{a;4K-FLm~7tqPgOre6Ax|+z6kZAxrEJ-pqRFiF*$u*R!aCU<5Em|+M z;6o6gGa8XIbur6p%aTBbkQq3O!eYeCTTv%DYMppta;AOyock-0nPhu^57X;#b2PzP zi!M6sPCfgz=b(aaKUt1VV!%a+$iMOnhoKO{Ts%4??qQ^fM7I0PhcnvOS*){cuJrh} zZ~tCibprnD5H=nb;?|$~fc4kj{hQ(4pZpAsFjy()E!{ccZ{~}pG>rwPG$HFSL1Tpg zm2S1H5h7qzbi>seOcBtTrqdIctf6WvGNH(`9O)d&HI$8K275nr{5T(Y;xXK3KFN*U zxT~BJaQ~?-R<)!v9x)m2;nf+&-eJ9<(HWxX5~>NA(wLyoCTCbz)E11E5Inm#uQ8f7 z36$JI;#amSfSJJaBDw~jJV;DZl}QbfYFL!)v{lW*qdDBsjH7t_BN1|C=VN* z9_7j!&+No?-b^NB>m{#!>;I(C5?>_pmmEe9LXYp`8kO084iaKT2=-H0h^j@9xdct-X=CaMqxck*cv{`lcionyIY`qQ#pYb;ucGaKg;z8zFfk9s&KqW3eu< zKc2)AIz(|sKk;1On{st~h$E*cl9ypH)Glh5DdAI>&?A*hIALmb1dm7Iyo+{l5@Zl_ zoqQ)^H+1X7CXYM}ePHDIza9(WM_$RG^(Qi5<^4V#(}`{P`Qnnv(kUbzCxI6RB_y>M zSgGkMg~|+Brcw*KCA3otBPa`n(g9->b=v?Vy!8x}BF{?-1=DJZtSYWQewJVU#dpVZ zIXIwuu+QlLMY_3nl^yQwlxSNs$h!llwbw28I_nNb`&*5P0@Gv^u++Lr0wEp9)3FJ@(pAOe@K zU1q1*6A<7XJGZ1CIv`lI~VPy8&M z?f~rtU7d5=${N|qfWtawem6#=I54dZIGDB>Cr+#<^V1kyRB-&IzwkDWt(A-q_OPx3 z9BtcTt!Ff;@lr9IRQ&jl{W$;6PyRFkN0yf~O-o}f)-QnbnVx(I0ULaJpN1PZukyeA zt^c0C_MiU{LN>{tkf_5iW-ND$l%ys~#J{A_@m|c!tC^WDtmT^9^7t68XE1hSLZbZMayXS^y4NvB>2l^RWpMubxV;RQ~I^qC4RWz>rc5}^a+k|!>m=g}wbr6(tB_51JWX7U|B z_0$0yt9|;pNNb6w|4d)p`==&gmA0bAlY5=^xdgDL8e4gV(K%Lorlvp-`lzyG_wWFz zDvCVb?5_6EPAFx=+MuLqChyu`14ELy6Kha)mP z_jkHH^6-O^YOuf09l7DuDm4A$98RWKlc7w>%?p>9;1Du!+v*0&N$#?a>%QT>^-Xr$ znrF6m2-@IWAd`Zt7cU+uSsr-gAsX9KhL9VT0QfZdSmK+%5C96i0iI}ThZ(1^P0+xUF zQ}56AgIN3Yl8jynT4cPk{4%u2S_H|S(J?QkE5 zr>?3Ln-zJUqnb8%BTuXW)ewRud(q;`_H8^2#SA|L9?I4k&WNN3>bdgGvcXF@_m4@DZ8!$bE2pZu-y2i`4XJNicDr5rr z6(Iy16TEL}Mc@<9>=3F$I{GHUwNzC_x0B(kh~bH9c+bCh@>Y2Dz3U$a zDB&Mx@Vdg&!A|!&8TFx;UfcNfX4wb1z8ZRkTb zyv9_m^7*HqrS7ewiY`<&D@BKURmO~?c)~lVr;OW{9x!zw>S_xymz9|uMjp@OpZ`2{ z8%xE>Xw2TuHn;FdktBhgpU=?6k&^TuX|`^#wu);TyfcIlyM)sz^aov5`d!xVxr^W| zBD72rcv?uwdLht2wR?-K=%AJ2o@2+TfvbBvT)%vaFFf`Hf|ied^fQ!Y!oP+?aFJYF zW(9Rq(^a1|bxaQN{25&Tn(? zZ6(Lob5{EqwwciBb?It>50>HnE?X;-W8GNbwGM;|RMsLi6k=BVfSY}W^+*r4_SB)J z=m>uFzxf~edw=(T(|Fh7aWkd?-ize$y@D4OD;@ZTAR<31KKz;x1V&~E z6#ZnS)yqVjm!vzsB$V6P8O#y_NTs1PO=m_eNF%>;_ zea&8*v9+;D?X%c%OuwT<7a7EnP0_pbvzlG+1<}^oz;rYvD-^xe9wI2lV~IpjXi2Sn z(z#a%JhtmN#3f)qQYoI82CD1!TL7ke+uw3*wa3q1-lv~QR<-0i)_dYlWtY(IJjJTf zcu~>KJVDpwCf?S*^5jC`>Kff>oD-M^Kw+ki>2QbJSGV~6U;cG=&pr)J;F1lLO~siq z$|0{A!Tp0Co4zGWV=P-)4a<&OgH?vy;QZAqcrs3}o#c#s;bGDHjY0KRXo`ZHRn4us znwLM*Q4Agjhqn+)GTPn2IXBmWl46c6&-KP*_i6^T$Bxpg-u%q~94|G`p8Ep;o_XvR zt82%oTA&UD7ig*}MIKEk>T!#!0;@euS84`YQ<#iwWd)}-g%Di7wM$7xz@U9jsN;F( zs!wBE3^B8CNL&pf)D)eJytOpDyQpp#B?XOb$%@#?)s35j;>(9IdBPzTN*aFcy&vE$ zuQ|g*_a5hs-|!#;MLTIYfAwkhha*f@@|XVH+xWr1_#a@hF1rW&jH{Z)#nI!S^gP81 zav`bWyuf?IaN_xI|K{J~VB)xZaY|cxf}3^8X8DLfsT_i2W9vbniBJB_X6!i%6A=hf zvGEh1P4+s9@=6jhznZ2+y5sJ^sJihZX7Hqg?xh_x_}i zjNVjq|Lxbq%EyS+e40vUWTppR{Gq{W zcHEOI2rVNm*st7NBTHwq2WloN=P|-31Bfu^<0u5~IkLXqM@pr$i+^3+*kIDQ)Omz* zH-s+4VxIIMe6@Lgo-M0%fEUNHI6Zh(LFU zpAiy;SvTd)qorZiX9A4QKCt z-(dPT;ns(wG{Z_aZ*on$QHty%0GU$fzVE?5Km3W``MD4M=wJQo-$5-=s=!SegbRqK z!T7+cQfvgt?Sqp0U;QxEjjNn!VwYvrd-`ts1;5w+v3uCR`8ZGAx=Dj(qrb^LS?5Jx zmtZa4#R2T)GDs$kc`3u3@EB&qK@o>8mK|Sa;&Z`!R@T?%??0-iT)7!%_G+Q{$)Ejo z-v5E$VzhsQ!~GG*RySBFBVXs{PQ$VF(`YZzglJ*!1S$kHf|LDD%uw&AvV?&(oM)?_m+3zbddq83M1bFh z2(s5QXA*iGhz_+`!Ag^K&6>!A%cD+Q+$b02`{MmGT%Fc)J!WIWaC`S8n-aQMe)z6C z{`i)J#<)#<^FS`@*C1_Qihx3#S|ZTYA%vVDVv*t1Eh*&?VV(^#0(Anl>1Kg=xJB;9B?Kdq4i}v*#YW{2lqB!?co6 zj}TRZ@tzD%Mxemc1Joo@r++!r3@i3?Bi z#QCdaGOGDrxW0?=k(zMti8HLPZIPQC*|ubPNud>Gmd`O17l^8(AwE>38O(*Dg{Sc@ zl5v}s!WeArXzGTs^$fLS+;#|MkG6?;oho~%ym)>vmkT8dWXARFU9Mf-MtdkS$O~v& zXq!lHunuwsoeaL~dv52ESKoo~Q|j8Hb%{VxBqtu3HlxYj4OTYRF@?uAV`O5;2SDiA z!zVz)}D z{_Foct=H7knznWLb|J6ZR5ig0d@I?KeOyyxY~c3IO$JIL+J?+ql(ii1^;kEC&ScD% zn!MomczhbqrD4ofFM0aHWojf~c;o63y!Hp8TzF6b@?g2xSQQC$+ z0uuzghle;9b;yM>=qzS4N{L9V0F;u^uv7@@W=g3uf^89l0cBaBl%ff6?(8`ZOvawl zbl2j1omt-?FP@*3iaFCeW-uG;>tvw@TT>PpLO|QL_=KY<6+3Ik$JPF>I-98tPu`Ti_K1m%%UN!x}`CclMrn@bf+poFz-8 zY}t^GeCkNuek<-;EVXu{JE3H+LX)j-&n$h(xd_nm(%0@l?lqqob@-j!>gd)MH- zJu-kQg^uLEEF;hJp_1lVAw*-8zKYaW(t^kZ`l`2`51qR22Y%WQmNiGCs5cCMV>C{P14SG!WZqYRgZCke5!$hKc;b8TwTI16f&H`{N zI9gc{WKQso{43lSRMNB(M|MAsW=|m`<;TTL*_^TM;|yfC+vCAEzWK;|?{4pN-y0sJ ze|ix}?|<_f0l0SlJQsIIWGlznuVT6T^z|J?HRT3^En|4_#1>hm*}cAxZ5yhlLP;}M zHBf5750WA>p%sGG*GzQApwq)kL9H~0)^dGPF*OBar4gMjTW9W!owM7{yr9ngj3N}Q zBiO(lXKp784Jvqowm*CE-;hgnawDL;NsA{vm916 z*<=sVw+sa|vcl?UK7v-*5E~YjNH?-eL0jrbN>vHN>M&(pwhZd0K0KWKDp(1VvoR~1 zmDTZg-zoX}@%7{D$JdWPA;;GP*4K}(A74NI#2jDKlJGsh@XmL1yXM)0L;pEzyC1O4 z_DpNP9)YfIM>iLqkh}AubF{`Qs{a4)a~}k%lb9{`Zs^>^#Alf{BPuL zm&_YfYbg?lu7p4ZKabWb#GzRgJUN0A57)0^#~oIJW9v)UZq1IfVZc~r>?Wy_!yxe< zHV3QRZ;F?J?Iq=bV2@=e2_s7Cp}|2Ksh9x~0f85=fAG>wNC$V`$;t7Q+yA{+ z@!?~vd)^yT>^oTTU9QFQZo!S|tLCp2FqDE9yc2FYSznMey zb4+EVA_?Y&IsIeiCjblQpSkq1h+wuzSebVgAr-;rNSQCd;Am$P!FnA_L}4V#TRf4W zFT#QqA6?BI@<{F?2|BUbXWH)&U5T&=8oa$qkYhI26czh8)Iu*zs-%?_E%IDQ9*j$$ zA(bFYU0G=>3U6s{euCY$MhBBVJG!pp7u=7pX~6oyANWsxDH8%{=W-ZHtuQ5>)wD{`9F@zjMc(oY|w6ZORVKxU#! zM6eE}B8H_z><%hva84#iCBGEN7I@=KSz+GUjU9uiHH84-QF5u>5BS(6pRWOtOfx?dF}vG<%^+h5f*Y4A{odEPe>hN1i0Dx%sQ4{5QLdiF=7CYtUe_TiSCyC2%{I2 zB+@hrf%QkZ}YRH~b*gJYkt_ zhF`OQ_5Sz#<^w7OPnRjoC+Fon@GkZQkr>ATfh6+^JsMKt z=}!(h={C{Akr_#Evi-8o{el>9X&lAac4^pE8N1blB8v~vMz=>U6t|0)XMHr={bz^K zaVPDbzKt%hzHyB5*fGBN@sDt@w;N3~QuYvpz}gmq;N%^5e8uN*-|Js9|NFIf+)Z)M zZM^UA|DQ->xNbdt7mzlff=7flxdVHITy~ua5keLU7vc<_%?tLWW;+P#5Va3{Q4(s4 zT*^w9gVm)A7qQb3j8D-{C$n4tLW^%(3?bQPEgn8GHwH;kFg~CYLf zjcubYm~#pdqAt6L;tq3}6gSsOCvid=D_^?+=5RY8Z*G&&lNWCVoqI| zeV-X*j##)b2j`QuS(1L4Qzt?K-va_0Gbtf)LSThFy0MAq1~sF=M0x3C-Z8s}EanW2 z@W@UdMMXV5q;U;W=QuC%Qqm%ELKB3<1sMa6Q1hodu8nx#0EBbYSa2S#HLVXwqhg0K zefn%8_^Ji0SKt4duzmdo8XX;i2?!Zm&1IJJU;fY!vte@jB2WrY#6_sF?B=+F(K;50>>@bNt}aEAqW|R&Qf(IN>vwF9Wbgpv9m?K{t)- zteAq^!pqm;kL1s=NZ+6HmgTWysa((mX;4NJMC__GZOi7?34}ICWnPi*{@Dw0l%g&S zRhDzzwp>4Vj-FPON@1H8h`Q&Iw7Jka_rfPN4T+N)Z*unAmZ~hNgvMz@Z*85nYM3+) zbrrJ+Q<(WyH5wi;-QVRC7tb?DIk@yKoh*+JWila+Syt+q`q;G#V#z=ii|~nkEmc%E z(4h09&~6am+`=v`(nw~~HS$PD_PIQ`8JRN%HUFjI;<-OSdVu}HU{%OebIjhCRASEQ z21{>~)D{RXeSRzv>w3cOa7?30yvngs&1JWJ3REuURJ1NRLj{qt^o7)pL!hMx(ISFG zixqB-Ce+qbls#InIhZyyLBvTBBDJ9nafHV%DZv`W+_5Q>n&2aO*BC=nTdcQu1jd*n z9oAPgV13tHzc&DU`?r28@A~PV!5>bLQei~QkBm|{7Z6QFCIh)`_?CxX#T^@Kw8OnQ zwuFx@*u_J8G>x6@E~lEkFL5?@=_z-w$oKpB2*&j`*G3iNL;`J`MWV=sqMrh)Zdx$e zD|TIH4+npU8ObAWe#`vl>HZGo>Lv%iRdTUTq|gw{I<2!f-W8UxuEgS(GDixH5IMHf zrJ5M~RR91W07*naRJEQUb13>;93C*V00kmVM^&NnwdqC-5Q2{JQjRJB=QX=;Q@?e}Ef}8FU9UO~bLl0O#5ibR2bC(HrzJ#xSj0hQlG<{(!^D zg!Q#e9)J8C`}>FJLXc&PU~gn3Ha63Wn^&*UOhy>(S>KF{ePyG=TGyayW?nBx5>Y9i zli9c^I2R>eMH(WO=!8wp8aT`MAj-J-`Rk&%LJVTwhUCsu@ zSd&PbX(E7)Mmq@Ef^hSp<5|hJz;R~ZCzYOl$tc3t3=eM6HdCaEv25x*-t?(-$xWx( zq06YvnIcu&waz0jP@1WO35NT8fvOVZHn3-}Cj1%w@$8KI!3s+?bFwVeYraB6FVgM*j> zAAk6M?2TKDt0_`SI(dOQzJBDro_gll`Oj->t4ocCSmG9)GTMXs1|0%x-FUrCJ4M=n z5H{MTOBszq@DT@{&D+k#Zk7S=q-Y@nbH&-Ci%!lh+2>i8Tn3>-(qLOEH$zJh4k_v= zOch)b#ajxaO3u9vp~d+)qOyN@1!Rp7E@DVYE=UmZoS5i5ccexwf$$z_Kxq}nVuHj4 zMQc`>w0)kq9=PTVQ`NXM=~a4DX5Zag|P80Ro`#e-|>4DuFZTci)jOuT$rgRdPX zMUWy$21?OQCEeYdC+Ia5$8*g}H6*hQ%A_u!5YYi71e7rtZ^2oZU34$f?&p`V0rBN= zfLHj~?HuF6{*X^yj9FDsB`t<-nM3R7CBWm1|EhULCj27~Is+8urKfId$2L$|Ht%9B zAKO=V*iMF}YbRIPJaytLI?v0aIMQ-$C(2MS#>>8@!N@%J$QjDNL3m zRvfujWJb*kde_wCDrOfQEg2MsV|~S1CuU*VI(%Ej%v~m5Jt>eu;UTv1=cO7)a3`OF zmP*;x?D8&ayKAA5GAx;~E`a&Dgm4J+Y$^ng3{ygTNC;D8k`7+x62uV~Me718%cy47 zWJOLB;)6ZY;umwgOe8Qw&Dr#xWHWCTYcSF(LNZ#-7+Fm#*O&}WFd4Rt+78zAv9gn% zHv>VX(HRkqR*9oD%L4gcr*m{3p(G+r5`-WyS&ks%#`QgJTpy!VNw*wef&v%MNhpb# zU3cqgN0y6wx6;P!2zJV5nR6ody!LfxI41ayzfFjDzHA=WpL_fFhY$S5`}w^O{x01V zKss$h(YD;b5kcU$K6o$L=ny#>Q??bNsZer}UeB|15jz$=g-X@ z!aUeSf4!(s5l2;IQdL-V+{9ejB6eewmOhKgmRNGNa{zk&|Kv>KSm7MWO(q5}DJ{5) z?d#_dZXYcj0vkJvv)RKS2`ZxrhOsQEvY1iswu)M=QKLW_gwo&z%8NPpJqP=}AV?95 z;Q3gkO0$R>i=+`56QQ}e+cL=w+oH?VbinkPCatn-mv#wOA&8=aZSZ&^wZVnifY4%g zGK6R_Y_crQu)2WJfUgl&lQkJwhnS4!!Bz=@$1R#=nM4^yv(z2Ubw;o846j{5zWPDF zZ9~8F1*?vix)`hB6ceBuJgaFJSQRjEk_{WVOJe&vx~(wYVMIV;BQY&WSd7N$)+e&QsTS zzx=Z-qLA9m|E@`c%b)$oN630TUiI47zPQhOFlIWR{QXamWro+j;TxV`I$qyl?|RI( z?t8<7FZ(+VPHw!Y*L6A_#7sNMI)w77RSxQtybn^D9pLN0{pe4^SU*%;?sT(2SqPg3A2 zj3;2xqCwC`Fg<}})8zRAbiC2^H-$)}KVfPC>xCIKdxJele`; zXExx8Ajc9uv;Y^?d;or}SX87`4i&;2OVU|EYaNq1YRPD+81x3z%@iXw!2&W4 z>_+yvo%7p7B4P>|RR|VIeavK4@`w~Z#D5BsWUjqLUx*;JOn#3k;?X+rtpg1*IHYp( zpkuVA#!}mw{b^u3k&t&?!ASL~%sO=_u`-KBrNYEAH=Xx#;Pqk2jfaRQ38CV!wA4{s zK2x+9yezR!qkB^O;vC8_KL*E*W< z0nU$j+xNVlZ#V<%ito<@zx@^|4qoc|`Mu5UYQ_u!*@8px5w3k z5jHWd_i`av%RBRHu?vAgaisJP*5O=BkY-K{_0bDsVR)Er_d_H)h)w%5?!m>7A>HZhMs_q3lvlFo8Q_Ozw*`C3}1A>TIsK%&=?^pQ1qn0 z9YnA-&o!B~=%o<>m8`6tjewh*kzGVmIrLGO!{g`U03?t!-iR=#n?#PwR}Q#eE;b2e zkMoyraG{aF%rC#ZLq5 zTz>v*$2WKBKBp7-{Lk3q!uj)LQZX5iBWCA3UM?VVB?Xz57^7*YEm~>v?#evPu|%of zHh_`^d&3FS>Kau&p{{FI*9K@)CdU>Tt*ipkOV0Lv;)386)Z4*iXLA>0O{1~;O<{vXn?G7359ujPP^nELk z2E46!@PU(@IKD;OID(JN_=BX~`{~bK#5Rh?Cs9HnsGB+};z~iTKqDx$z%}m7R|~#* z(E;o6FFZyj6s69{negBpcW^AtsO7dI3odd_QnQw&Ht^9blcBl zW5dx}-6dV<7km8vt%{-Z1f5~U4z1qjFw2=t3dTvH(Ge1ErjP-2@MK7&^)HJ;ad%Ji z%*Y-IRsiFdm|@KWUE8FRFp=l-A{E=7!e|b6cVAS%nrCi>K}b1g8h$~Xhnr4sFHw)<1WPEwIE`HYButs zlp%O%Jy8N#Mry-wG{%}}@Orq{Fy5PD(^@oAQ?*lsuMokrxhip1k(V$W!%Qhz1&<8L z0!$`NE+0!oXKRG>w6;bD=;Z3BzvcmJ(CecKxN3sI(vg8q`fbrfL3}lb$)6uu78ckd z;twKrH)2X1@qsvtCE&<#W*{hyl_K(5zFg^79;eoZC!TqX>-Cr#iJk4lNHSfpQLH6Q zr;T8$Ygy^_>Es2nb(rwd1IxObu-c2|*4>>UcfXKyyZp+s#F@J0On5Ljk1~QxYucva z;L2sTx3@86$?MQ!uLky<5@IYFCl!QP~y9*-%8HNLf|oe9BPq*imLmY?w4y)2EI$jN;m>JPRM8w!E8`Do=aMknk+H-Jgh|vYpp<~nx(HMNK(V>{* zX;NsEbkt4F?(RP0@j6CFLh0UK!%?-}et!csP5b<+Aw7?&I9WCCvm1A+XNj5I7&5uBB3FA^FTFKg~+7Ptomg z>h{xLp2o2o8vs>RvAw;Gb1rT!A{l=!h)1)h@<>A@2H`lg+U*T^_!|}h^Yf2>b}4I# zb74(2<@A}zaDMU&kJ3&j)Z=k{uOwqETS=8z@}@ZChlS0Gcv0XA#NsOp~^7B zWsz|PR;8{TUa`IvH-wGjXAs(A$NNaxFdoKxAe#wV3o;|3(quLSlw>}#CxpPxDaPt(MK3PRpddW0k@xL#s7@w%dh( z*P5{rJo?0W_6S%MO&Y>jD0|OZrZJecC_EYwMC5b@L4ig$7UAMe$inP5;?Onf#npku z{$)zD_Pjv+C2=${_{#7%shB3?h&FYvWS)bJln130_uP9wK}fD%y~=3!7PL`gy^|O0 z?%krPTk;~Kswz624#9bfqF^{2;*!R_F$Sd~*|Kfh=z!wfLW@`>@?r{Rd6vhSFr~

-)YSViINQdNXNs)I=qSjV35Rxv=`b*G1zHbi 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 YKd(0vKAUm6N&o-=07*qoM6N<$f)Om-*8l(j literal 0 HcmV?d00001 diff --git a/Assets/Characters/warrior/super_attack.png.import b/Assets/Characters/warrior/super_attack.png.import new file mode 100644 index 0000000..92b29f1 --- /dev/null +++ b/Assets/Characters/warrior/super_attack.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/super_attack.png-633190e19ed593ab2a2ddf9b68781b2d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Characters/warrior/super_attack.png" +dest_files=[ "res://.import/super_attack.png-633190e19ed593ab2a2ddf9b68781b2d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/digit_arrow.png b/Assets/SkillAnimation/digit_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8c3dcfa5024c507d7bfa6e91d0c79b0652fc2a GIT binary patch literal 26249 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 VK3`u5y!Uzme3Dg_sg*JX{SW^tWOV=l literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/digit_arrow.png.import b/Assets/SkillAnimation/digit_arrow.png.import new file mode 100644 index 0000000..b450a95 --- /dev/null +++ b/Assets/SkillAnimation/digit_arrow.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/digit_arrow.png-ab848d6fe8f3279f18f1517bb8377629.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/digit_arrow.png" +dest_files=[ "res://.import/digit_arrow.png-ab848d6fe8f3279f18f1517bb8377629.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/ice_spear-1.png b/Assets/SkillAnimation/ice_spear-1.png new file mode 100644 index 0000000000000000000000000000000000000000..17f5b68ef13cfbc882b0a14155778ce64a294a75 GIT binary patch literal 31906 zcmd>F^K&L$uzq7Z8{62}wr$(CZQJ(7wz)AjwvCOGH_qL!Zr#7){%~qepP8vsH9h@w z&(qIDDauPAz~aCH000CjNl|400Oa2k1ON^B@1W~kVg8@xqAVc{vOe)M;GY3*AtWaR z05m4ReHcOfvx!V3mE`~cZwde)FcbiI`?nN$1^~D*0st3=004I;0D$S3+oi<&?*yc= zjD#p)7VrXi7Iet`cQpXUQBunV0DwdLZ-4-@bFuy{Lb*!Gi9uaJf*>M+v^|3?{M!T| zB`T!qxpCF&Q**qkcKWJibF+KHd)@ogp+>){=1k}7Y53=J;r&02^ZK2Jr*%37Fj1(_|cNJ%{C#l@b8EQyDj%-Lu%M&Dm` zv2w^i%hkWTV>3hOQ{X}yl;}JVPy6LZSADV7b(*{Tn%BFkpK$X=kHu&>5C{SW3IG3T zvUiDyZ9fPIpygu6qzB=cF+NkAKl%v`OyplzG67n z2ZjJh-Ct)RJINxPNn!~l!PT-`rU%z(lnRka@RR^uz1F1dtoyD_k2(7pWzd)2eR@RV z0T##`|Bw9wZoAL#mEQxrJQKvHvHKm|>jT?^cper%g(Z6ol`#7$gP)~GygbM`1|PH4b)VA>&f&;=O=Is{4xb?j0iiA> z>Hc=Y%H+hE*f?Ml@F>KQ$d1CRCRMD(rF{XDbuJXX0jp>2UE^3ke!l*q(ZSsGhcU9h zj*we}Uz2jV)|^I|Oc%*zz29`2oQKeL=ZTVz+|ee^RQ1_w@`=GaZ137w68gU5eXhNZ z*TvWI<2aXR)?z?nlCB_eszDf$NwGpxxh!WN*c0xOs}&r{-UD9h$8f)gQ@rvBxj)Yu z$-EcyPYKs#&JkGY%-hass%Gg075_P85*6Yu;&;|OIbz%|fzQdA62f=w-S6kWF7*N| zo3D9zqP_VHAe0A4^3V>r`yL~y*M7%ol>F>9Rf7OsjE=>{Q3Kw$KVd-sw?*B|*h~rX z1aZ$rLmE$ZQGB;ZoB>o~T++P(lDogF0y&t3TwmMusD3voxDUG?mv#5U6h_S&_Qayl zuv8@cE*Vi>c2VQHzuTwRRLy8f3N(&t9<81)Xcc;nZ@lrpU+*HmTT}wFWE3$6@Z6^9 ztXK(R^*nAa>-z7y!_(M80SZ1n9!x%e57!v-Vv-)@N(oy_l|-N_s5He#BG)5NTCl9M zM)MlEaP`c&Z#F$oUSH=L|L%{%Nf2b+ulPAu1@<~aV2t5 zE$U$&i3KeMiL#2QSw=aRSZly=p_9g;Bh%L+C)IHHKU8&ZIN5L1lWKo@7o+gQ5Ye+J zWkrQ%aqEy6(KEumNX0cl-2T8*E`2V&Mx;NM?=CB z4=iE}c&)yF8ckiv>$HijVf@a9Oo+~!hmLh7nLY7+mzz5ji>NySJYT9D3G_)H_(br$ zm=RBQvb5XZTz}BE^K$)*GvDRqRYc&~B|N_U;BKsk*Y|^k$X@CYSA-pi4bIP0_<#|s zCZ>so9dh;=uK1p#_tMvSqlfPq&*dW0n;DF4^wE6{CubWcN@au?{$}| zX|g{Y2&@R$B7hlr6Zy=U%wk(Ii^aXPViEKAYC}{1h%7t*cePbpBo7ltfC6pLVPi`F zo1?tI9cH<_v$hc>jn){M8XgE5?~`cgOxy9=Xr>6Y3so#<`s;wovG~nEzh*_x&=$wG zo*eAowVp36Fdme_Ud5zkhUj-uNBC)&)Lob=s^G|+Dtobyoj*WI4zjO%5B%Qygzvt( z@76iLF9k$eyMH^&d`x@-KSxfV-PZ}k+_Ter*Zx?M!D&jfQjtcr_;mN|y|nf`Mx*IM zFnrS|3Ha00-3a7)KQ@2g6l{4ttcz=fO8&BSH?a5h&^2qFSe6Mr&6jDS#I2gDm>cwa z(nJ9bCZV~I2-%!>a*uB>31B{oh6KBf9q`?1TAa&@qqOxI&52x1X%@128{s6Uh#8r` z(uITS(>tPeG7~s*ziQ^OaM;n#aqd%d|Dg-Eo);*rNJiziYp@hic&{#%<bEW#h?h0 zxOEig=!>8g^zO0*o z^7m0F!j6c)f7#kr#UJH{hwxyMOd$sdOV8?AWe~>8_0wB$Th#X*s-WV5uy|uwa;94H6R#Wt4<4AK8tn zrd2A7n~H}s5LsM7n;usf-JKkV_P?3+)o3Q{DK}BaR4*d2;7dMI_z=H;a$ywZJP;xqJadcdcqnIvxnIVR0r8{%ogzcn)&O!AT^IT%_kbJk=IR9GQ%) ziD-=~fpKIgvOFTK)j!9O$6Frt43^H}&CLR1`c5YN=TuAy8b;b+x=}MZg79?S%zP0v zXDjBcf|Q^`Q?p$8Bw+A_uU**t2DylE3r(-$_G4T@a5lz0D6Tj*Q0SH{LGeq zHl3dx*MEw>&nNu*fgPV~dPv(-VNO%m9U~u7X+Ps(B_|~>u*+mwEjC0~SofN_a2xlD zMj`*GYV=7+KHa3fsqleNh6(1!p9>SwW=>V9W^U6sjYIdMVBpt^z_na^UT`tzJAVW= zm^hkW{wzU8LBUC7n)U26T!;-9`=G>Fn6KLucHlK|-Zw&gPihC$9E?QuU`Onsc5?P6z*? zKB8FA$OjN7GDU*S#1q8^I`mz0*IAFsHnE6hh7Y(dHSy=?UJJWCZdhzXqe`PH=AuYn zamRyhkt z`GIe{-IwvZy^MJcng)kSud%EICPlwhk!fedi7i&9y(Z*19CN8JIqmrVg3V%?M58gn zo8|lPKSp(PEze2Gl_CX+NtaSAK+tI$9x_P{=rO9HkLgi6&?Fj>O~%ywv9B)d_(6Xy zSBvI9=fx5BfA`r4w7bN!>X|4=+mXgpQ}k-yH-7tAcxwL%Q}LIs=J<2Nnb{p^B<0PdMLF!p?P9_N z38U3Ze286)#8)6T7w;ONp}=mJ4(aFae!d0p3HNz9n8fu`g}K+j5*uR|!#15oRa&IR zT4iKDN41J$osLM#Z1Y7HnyRL$rh1=;?4?k{-Dt4}@k8PfM`0Eai%zp(3t2-17DjTB zM0<*td1BUbWlWtwL9fHCpJU>;&`G7q2XPiFL@CN-mMHDb=X&Lo1N-F<3Z*#z6-|)+ z&l&}{yZ!HTYxr`U)eU^sT2!ux#UNWzpc~|M8=9wYaUwOqsJL7%JWvzc)>kHpmfS6K zaZu;Knz>%T;1X5OAyC6roZG4&Wf_&HYDK>k=!C-IE%@_HLalv-_t^;AOu{e;2>bLE`%@~{8uTjPkgU~8ZI(r zIjJGN=ca$JFAin;CU^)uCzO7A%q_KYNe1&lNX|ssGgH*dol78SiJ0vy^MB>a=sJv! zqpIYxg<_Ofwt8a@)6VS%&c>2W3Wq`r35V_w(~?b@23_q@{R%p2>mmRy&=yuz3$TdE z45*Hmq;GB;1axknYRLFbF=czy7L|cDU67eFgfmAiL`ZUAH?NAjQ<%&S=-fC5j1q)~ zK;5Dj!b!t|IOwQOVlma9HUes4aqVKJyHVduVjY(d+EsbMf4t=?fwLMG{c*P#pr4J0 zejsuUv>K4fRg`y2y7!tCi(%#3NSEj?JvTOy^`tV^))#wg507{Y~K){vg^9$R}!NyC!oXvm};^O4Ms0 zI;P19$A|GXY8;yu`EG+d<-hF$i^zBK3M#_8N8gk9`cU{xX|{9UO!w!dIF7AGr}vY` zv((mq%*DlaxN&+ijl2AX8%xK8x_k4YBK9-Gt~{v|wt&}5fYQTbJcYVkWlV%;b2|9I zu12(Qp~=L+{XzvdMmNLRsBBmvW&SZrE-vdgSy$1fAvQoshtQJn(9P4GPSjUmLS^_GEsxvNl`C$0pBO*r{@T-=)I+=I<=M` zIJc`T5kr#DYbKDv32~ zAs40z@v+n0RP7OoGqsI8d1B50lrr!@WAypvC#N$NYwSJ2Lmwr3(owkO07P<#~E5173T)L&kQ~wyee&Qzr^lL?A9&*m=h%t1)B)>7Sq%#{rcaL1Fk6 zk~|~{It!+vtE^Xh(_mLdrC6F3&5HHQkVfL>^rO>pSv)?S7D0_ReBJ5m6H#2Vb!O(& zOjB85xNy0>shqoW>!X~Q9~#$>J$D|T`71D?+j^rh@eP{DE=im$ETI6@@nTovCg>!8 z^mR4ONXLk>ODH760fXTPUP2#B;D-QD9vWsBCHuj<@%~I1?X|wP=NOLH^Zc;w(MXZ| zh<{z5>Ak{@eTp%emDI`8qbUkELhekK7up1qu@F;6KUYPH*HiafY2WLp+W$v1(qH zz%AOju;(EMeNM6QS=GmDu*TQlH~IoEp^wl8t}|}^$P|YKe4CK+Q4gKX7MvD{oTv~= zdVZrjEWM$q6cxd|&BX_U0N)?Jdmk$?bD7^`0-Zn?4uKZG_}|7szhpQ79$gL}qhtK= zML)Y@SA})YpLv`e^Dy}?DcDg~oN$;sl0?@AU-te%nri<5r3$wTZ>o8bevw8|0tgxi zhis~%-q*rbGdxEN`E@jMO#|O1IXi+>tZA5NYpO_lPk;eDdk_>P7-Jw0L+++$sX@=F zZ?y#B8rRrF9zF%Ja|8YZ@!S}F*^?WTe-9>gXhC75AUwzf43kADqd1mYU4LfERzu;m z)3dQ5N6V3t)xkM$36A5BCMtp-^{*Z%#H;zA~s_^U|k)jLjP+d)33NRPPrfYPA*P8PpThqq8z&2U~HS z*iKu*@UAiOJES*FuXDS<4hwupc6X~qci!dazNf^WIpk-?^Bq-WfoQ?zof}o34OagG z4PaQ0;J~?iF`q}VP@f=mm@bB%EIj1!W<3|+A@E+g=<0BtePH}-Zwajy3YM)66X{mW z`1FWGoan?|h)LOspa=i+AL7ZxCqdL~c>B=mi^;=q438JaMyteIv%GwAi6Mp|PdCVx`j|5qNL) zji^t$tuK$^Iuw)WK8wtcq~GggW^{9V&cP11`^Sa?t~WO02|I3f+U@HTq9hU+9dI#( zU?6*G!U?}N^S^BhzB;~-DVg5r)G!5C5Wl_Lc0$>;j{mhWi6lfoWgPNW?u7*V+OJ;^pmghr`(Fu~Et zWvoyT94oAU%q{VMLB;{eb@z&4gQ3+aQd2c`CR@{h{g#|jnCvB%N+bloC5N!h4h_*@ zip)sauRISvdPFwU`CRz##)m&PDpUHhVrQoNy`I=s`;L|Sr)(%MU6~xal;q70gUJ## zlkNqzCTw@W@+s`pUKDE%Q0gFUY1Ibn!6jt1MFiu0Za=X_~9vA zeZ^3>5t|k}kA(a${%uG#i+o?4nAU`SC6;axjRe*R+tjvfn9)28(&9{@d0e3llf)g8 zR{LfK3!4)aO27FgPfXHmA7kJ_DlD_?B2is_%|zM!!rfxrFocy=rydvnfrw5#uXx-q z^s(HpmhjnHX)!(v*xQ)dnKer6;Xhcc9={P22L<+*5?A0lMU7Yj# zCcJ|m zVL4F2?RynHop)&8Z~JXIQb%*@@(YbPCWFZcl>Y69LA}k;6viR*z+vu_Se!)5ukH%a zEoB@ZQAPA5!Gw9GH9xU6k#XXN+|LXfxzB^OFB$%F@|I}7j)^Mpj$8ywbFt^@n|XVo z9OgqYb5W2`Y zjmqz8&y(G7t;u?sVplmL4sv}CIy4?xn|oRMSzaE#D2Q2gj>G+RE_tTIpKvF}kDZ&V z`y3Iu$Ws-#<}g6nd(}|>i(f;^=NPh;{PbqsnJftMIm{`knZKqvvC%>^(M<59qBM1E zmtj>D(-A~q*Aa&AVr0x)N1)0UP>g?u!wFtEs@3+w%lqLaA~%}BFp&ozA4Fxc%pP;A z{NvwCDH>MUbMZO0B!DZsz~5uLt2f);mAjYXP2X-!92QMyR^}|(M=ezI*5?cPUZRD> zP>v{H{c{2Cr_GqNwcAd+799a?Q*F>LK_kqx`BzFU;0oq?(6iQL+H+nvNt(tf-+GSoAKf@rFwUq;?#F%e24f-$qQ-bU$o(fX7^nE zx-x6#ITq>0wG_+&P{GNVp;!JGUIqtgW?mDGBTa#s>psD06EV~Ym6$C!z1kt5hE13~ z`S{B7XlT>yaWrA?|7^c`MHldV;0Rb|-nYp<@AscF@PCZU*?Gw1(aD$6mmdt5Ry&FE ziVgws#5o9|B=prERfui*+?%TJyGX`W4MZ2=9|lJS}5Fb)?OUh(;ZOLz}OK%>$%!{fYNHN8o6Vb3|PGJfd8? z;Bk(<^85wX#h&~=ZtQw)TrXkT%#KxM1tIN zrr*u#7gB52-X|R(N4k|=L}|7cZSNb+=f=Qs#&54Zz!HaLj0v*q_)F^zkXiL)%kQQ* zD7DQ&1~rv@Jfdil!QMzhey$SDj2%lQ+JVm%ffjSC*azL2PQc&GcTQ_((Z9ARIG8k3{b- zU9#E&8Uv52m=vT)C=yyuxy759SXA3%r3|abNxEg?OcI%d3%WP{EX7FfJ#=LZDEaaC zo0$g~9fIi|0M6tMFExtC+1~z6>+#rq<1g0y{EzLT7uoXK9~uqo-EJgJp+9zjpx0Vz zN^yRhRh1Gtw_fQ1*sA3kX;d_S86(4W}GeC zl!edLpY8yD9BN)D#pV9RbghcSrJGcPLSk`>wB!;GA!#(CA0_SP(H)259dW+*nVIO$ z&aiaIvk zSol+xbNR3HAZi{B9B`q;5oMnul5{;QlF{k#qE&It|ze8@xEeoacKanl=H@;oNo3b+Y)8=LF8D?o(Y zJHNg+anL053WM0yg;n&t80B)t>nMF*KY5%$}Q4?Fey(r#j(meQ$dloEM?YWCG zO1D7iUgGPu-q+H@0A9Ln5S?tB$uVT`eYf=DbIBv={6fXpmj zgXV)zO;_J!dqWpBNYr$&Uu`Cwfu&{MYiDI`xu;*(nnZ%s$Ey8ohV8^6A~K>o?uml0 z6_25V-9@6JPJs&3jJ0k<>bF@3FG$R6H4kws%zzQ`#O}C*zd8_kasHxQ1HRH?ls8Tw zoy>g67$$h_bHaJ!(*2}XY|tF~N?Z22#)FCZr7-a|DpqD?vuTe&FklvlHv|*q6s~k| zlG|=P2^60I>R;I8j_&fufKz*Cqiufa3KW{SeNUneOWH*eZ8gzxJ#xd>gkr}VsT)7%`sfOC6}S{{ zt{*SW2DiQjlWORRJ%+T>*6W&7;e9cjV*SK5*A3MV#RJoOik&=#YwfKZ0m2jwb0(y) zudMOlPS}YMf>u6rr2;J*`bwr?;)aZwPlW%xMGL1&4pf1AziR0~Wr(&H8{>g;(KJ`^ zS~qWgTlRg5?6T~|%!NB{rgIbWd}Ecn>=$G#*4iS5E!b%&2vr`or(lZh=tnn<;9sxy z3m<_55>z+omg(nbFzc34v`077@i0k7#bwC7!#2T@FAR&5VgHf6{&tpO;$9P4prva5o~Y& z(jb?qe8NQZVHpYH>KawkQcFdi&*BxGvp}`zFj+7%{v$e4er-e7yv?9922IYp*PL)Zu?je}6U# z91i)8w%EP)UFLt5{7bLd2hS0N-hTEQXcq1seHm+e<|%=>eM>V)w_gf=_iYTWENwXh z*Onv3OTs)=X0_U&C5V6in1$+Xt%m;TUgWyUW(ipZ`F_{CzB}x;fHhI1jZuId+hvGu z%vg7A*7Z4=I#G#8WFd9Y<`|`F1Sh`op3AB;;Q*hFxUgCxE9*vK3|1u#EV5_4j@9M- z6VJ(lG%BOX z4fzu$XicIub><{GNoLF;inE1Uhk~+p%>v|ohJMT9~@-6f?o@Y#7QxT{Io`7l>?%8leL%KR&= z>OP$L+F?c?92S_8)JIuS*qOVOl#Dq}ZuzYW@qRl~qU z8!ZB!0Tr^cycT;tmLhFI_lkus$muf~{&e5P;^j~wApEa*Ry!S!G7V_4^mM#w zNtE>U+rp)T*~1wB;7%-)x>fzLDrJN5Cv7Su{uDSu+7OyeFjDLQd}e|+Mv7JCV1!_u z7i9IZ1g50%k#-fUbcM-D$1#Zpg>YR}m{>UxksOhkNDGKl)A7*qjQHcdmq&H_04TA| z-xOrCd5_;%<*|H1jp-KL^fF+7s(XlvIEp|pDZ#gYBxOx^%bYj`j6XCQeBb6xF9wS( zCT_!|M@=YsZ(uc=rY)hK2~(q)mr)E#kM^ON@lciD=A4e}!K~SXHCMPTFo^w%aqeOe z6B<(HlZaj`*ETmDIx(Fl&SCzGnj@rH{UeY|oN|a@wg={F{|~tFj}3TG6O?RIQ9EdR z(Ph+s4ThPu2E1st_I$1Dm}Et}h}z1|>;_#5K(%KCoK`H?kUnl!JA$4nuP85-ePt?4 zZPRxP8P8NfxQ`mKzB+vR>km3^n0z=5K@orps+qbGBQ?JFN$wVxf`HpdZtW|9i<++S z9g#SB=i2-t$BKQxLQp za_N^7vs6h91RRyaui3~--!8ru#K+7<1}4k_&WVlL9mPPHZ&=xrf^GTNUN2GcTm zIp74oPIY1^vNgw znQrLWO}u9-wS(W)UAcrK7MoAS5=uLzsmHI5);p9R52yF~Y*pSpI1M#G2P3tIZqiXG-Bb3d3u(I{00WY)oApZTDf2 z@-sT|2y+f27cI9FQ&;>df&u-Ch978=yc7)|?C7ZF^oFPKs@t@(gpIg0kyS{{p>_|A z0=A10($2pYpTiOIz~9iw=`BAw&GY#z3Z8dS_<;-7+O6lau#6qy`HPI?JO#_YVfB1B zjqtgT(nAv$nW4+H)!`d&+F_Jt0m2DNV}aGk@Hj!OoW`WAHB!dGe`=E5%r-Idznz=r z#KZ+<%=uKwciOBJL-VJfXW8?Bo_~hSYn0b2VR+ed=Enp{7PHW@X;jp+F|yd{H1N4a zb24hj`V`)xglEa=)`g4llbGQk8{Z89$o1T&StbCsX^Tpj20hgWfuWzzV75R~-)MdIr}Uq;5qY3~hZV&2TT_>Z}tT%f?umCf9T zXnc+Qeg*(+G}mJpV0^6q){B5E0C6KS!Z@*OLx^)YOXc9rQAw>NNpd<1?Gnmso{gg+ zoS7#6E!t5P57-dBE5js2&s-A(F$xhY(D~gwtvogq^QM3S;iQjzz3;jJJDHYpR{i|)>>P>z{^=g*7a5I ztHIYi&yMeAjKO_C&-2-`0GI8P12S0RZw1Le*qsX+7gD;`D;aes%n>(oB+F`aa4j9p zW&ZJ-(Y|Po;(|8fErRH@$IPb7@T5ie=P1FW+@LaF-U@oBNJbjT zpNO{h1haWG>i4+oIyLgKB_^@9kxnu&$L`Hb59Do^voc%f{<9GVllq#Dm2?<%VYy9< zjk*5Qu~eyx_6BK3SWxRkkyaaM{yRtG`l$@tl)fdKuzSxT zcm3&aW#HnP#L27U=(*F(uG5f?Cr3`1WNfIAT4$9t!T5ELI|?SbCP(3|X`E@)#T_Qi zo;6YC3F!Yi@BTbQ@(aqF5fQttUdd(HvE;(!u3Lu8Ih+00iIH*er{|FyW*_BC;2Wx3 z$HP{D&GYagH*nsVnuOB~$55PLXu|vbL;dEwxD3AS9xvJ^r}j4V2ZPke7Ftioevy3t z3}QhSP(PScZm~gt9XKEB?82`9 zOL4jD|2FU8_dQ>&?{Ww9+>Ft`7dZ|7n8d!Hf1vR_Su*)I4v&=Js(y}WQauvGcYojx z0(#z)QUqF8pEyozDVv;za!F+OtK&SR%D=}5yaO3B8+~p8JVlS6)l+@5+hVxtNy_aR z)8f!QdlxpH0NcYWTL%|+AE+&@BUSEWdS=N1Yvws+SRT5#U>g11xoOGN(!y2Q&SiPw z)z3HIIwx;OBUI2lFm-1v#i7jJEzG|`y?hiUDDq?4JQP1qbeV7-K4z*p6^G%EjfaqY ztu%sCex|TC+3*p*9Z{ZbND_t}y~iIqUpT68WO-I%q>d8bPGp8j|1DFLb)E?spPW*r z6D2_rG9fw+WetL&&pll#AvABEv%Q+O_ZbUQ>3`b*)2PvXz2Wlx?ZCkD8F2Re%irR3 zhO&F4*iI_7$qI3H8jbM&Yt2LQ;iX}l!32y^;S*@SeAs)8d8GYaUmk^FWm}*deebZ! z`g3F*#;isiqY_=M^6Bg%U8cqhFigjYDp7kX2n`O3yPoM9#d~pAp?3U>#;iH@YUgw* zM{5~;O@M2=RQ9QMvkuy%hg(|bzaH_0? zbt;-;wD6?%x;h0;G$*+RR87{ADqW7}Umd_RLP_mmrzfF~OBR!cuSdy1?Wd&G4{eyM zW~3&gZ9$|>`%DzCidxcsF!<`3%Tj_a6+dTd9LsF8M#(LR?>GMWZ9U)K^Hjvp<5e;> zlDeK^?20$e1R%gdr8eQk+p(GIv2~!GKk&H)Ff+@Wr+P-itX3#a8^_^Gb$$P07mj)Ous`?T~avUb(1hCTizvRW+yQ3v%;$b*a%Hz* zxArQ{X-s4;7!aXyHPs1c>dUUgR5vb_*7Sy?E+W~B5>yk;a5i` z-RC7{ztTQgG9G+>g=_ylF`=~DR+_?ie|-IQ$^V*A@bD49{Z9?{kNLGV&k1X3*7cQk zC=0iJ(H>R!u&dv{PARswslHdy3R5rZlnJVSe8YS$(2B|kkwm$64BK+C<=wv>C7wOR z^IXBIMuDPht-+xi&clkPdCGu;W{5?j8+@&^oWT~u0 za8uNWi~GH@7iL1B9J7i#KG-h%mbwjQd){e`0wbr@Vfwfwkf>juLKhIcdMJTc|FoiTn|hPuHq2lcVzkmsJ8 z2FK$p@ZRmb&e}NO*Z2P?>HdxrZ~;oqFDW!gH_&xY4TRlk$ax)ocKBu)VSL(%gbGn$~1qF5|===L`TU0*vBW1Hinj!vs2gnB9|H<*5l z(fSC&Vs>~?QcYvx$K*;j8lktS6G`(ZU<1>lraGThB|y*U8nH=ty@y>STbmkISY^jq zD{ViHO^Hmg@0Z^9r}p#S7mlHRq1kslkg9}6OjR$-<4r97f64BqI~G+k*=Vcfj;@nTHZ*TOvzX%=!#jNUCnOh|$WkisY5RuK|J?AHGAa0crF;fvd9Yx7 z#(rICg&RdCl|vsY&eJ#EJoQ7`I{ zK`f4#WH8(v9cF0OX!IOB68JcHqV<+i$y_?+7s$voP(!F3$5Qm2veh3WR31hdO^opa zsT69{C3l&Yn2H;-bK6;6<1Jac)lK#f(x!ff4?R22d|J#YM@bL-9u%qCI>rkw@YWR< z`SYYkGVqYUts>V7jgSR%$PZXr3QULC2#PL9a78I~2#o z2^%T&Z}Xa&ERL-;7rvXx7^II!76t!XH--R1r>DJJU_$GG)cm%dx_U>SZZZaoa@bhC zLBQDe-H6yO{ga9v5@B_HOq!@uX2{bOKqy3NXCMRMVXYSEJ7U%mnBi`z{IXa@7MZASw{=G+OF)8&g3p?nNY6sqG=}i1!^6=EB8UAJ^tT}5k=hRkgzb-| zqv5c@INJC3>9HYB$j1_rjz?7kQcqiUb>sba@N-VY>k16&c5W*y-Zz|yU$bDu6v^&4 z4$g)m#rV#}qL?(DSnCpR+3OQozd0ERP4KjIvDrrb=^K-TM5Ca5OPjU_>1{P3i5;HX zKsXiI*CD{?4vJfeKnU~iFjoPaza{$Cf1 z-$rTI!ERP_@BaRFym9*5P$!pk<7!eYs z+%X7-{36c9nZ(r6Mmc+#pd~bV^5~e-t4^Ve!&&8sPdE$42~LLGMXXC`6l8g}ZE?J; zpZM~U@ddTfz2p*#G{rErX?cAjbWYYQPK$Zl^PD)ee#+{oa;vSfkA?2F6&QY5^h(+a zret9`Jt#f!O=?wXw6Yl~#WHjvFT-F>SE1J(t*8YsvV8ugqB?X~qv-pb z>g8rTI2BH^xE;-3YIG_=DgWyXdX~ImB%~;%DEBbCXXU7O1}!IQY!ibe_-Bxan^7 z{|nV`suc_InxZhUX{L_b^B98zr}IoYjjjIP;mhmJfj03LElO!;xUe#779=%y#p_+Z z8PC)4`5p@a+6?=hQq>YN2{uyL5Ud?H->+N9>M{OduE*2w=W>BrVBfvkwhji*92^Kc z;pO{-&__5tqk9Q;I@^JbDmRf4r)mnv&&=~DyWt=a}CZP9neH8aqp2{`5Oml@?gQKlQrkgICBK;&i+R88PK1%Md!_r_(AH=VLe` z@q_>KH^bfd7qNw&=cx!%5-Uhl&8Q_M76=Kn!KbKz6+82tj(@;|2PK%wrYxzzpG*(F ziCkm(4Ca{M)X#x_sAcHpCW9`Q1(`~?&4wed2PzqzEd*Ieq}6$gypD4a=2U)gEJ+wz z>BzUz&Se^>K@T3zUmx3B176WXiv@3V$z!f$<8pL>?NSFCL!#RL>F=JbSK z*z6>Vd<3bsX=Q`jQxy7PVvR?yAL$C26`s|Ur&0tO|9~fpFvxAzVV5)RxlXY)GZW|- zt0+3(LT^=Y(nKkRUYa4ejVPZGk-xP~zb_^E;#0cvyx8Pn_@`hLtf87N;OE}Tm`?PQ zMuL%inEVu%kJ5(i_(T4CEXixN^$0*or!hSWqLOI3lqyNXL=uX1JQLOmJymxIC~}Y+ zg$4}^WlBN+k?|v0VlP6v=LD|s-+!D&(kh6sDOtiAm9B<~%N<;o0ecx+2Jh}k5e0KT zRvtDnMe(t2(4f+nP+41jpuSW5rL5ABMeXVhD-~rr#;z`${PO7DkQ?_1tUJBNLA-6Bo1!U z8X6N`i64tc)H=V-3UL0s*bnRDc}TC_KJ7uAc6qa{8m{gYcP~Z@EeVK&;$2P`E#mAD*!I&=ev!V%x6+PJ?D3EzHCVOnHe>cAnk zKxnXPon~@Pwa>QshCZ zGrgX27KN-Z9>G-lD)u9c=e}6ly%Rt&1#Vqf^=K@D4=3MSljtgheJ;Foi%~B3cRF%n6;aHkQ z={GaycaO%a6?beqS}2_-DoJ3nMkdW(!jSf5Idfn+;l*5k<@2?ov-6dEb6L>k{K`?k zbXQc;Hu#+VN13x0A9FU>f6uPDmSLw3(3e&ZHhXx$i;l60={J;x&sgiz1yz+bf1uUUo*QsRO8t=@YhM($$z6H)6X!!?d08 zR!`P!P2lsxXiT9I;e<l!87Dy-C&)7TC^HhP3qezbZxV-0vdHrAYceEdWJ&frhu- z6`4`>W;8TosI&y}J?vYJ?dqfvoANHm(2TZbR0^LfAP-lMu3|K^mBbabD-^~gKPbx! zyyX#JxxC&gnlTEY%JLUQMGSV`P!Ki8k=M(2FY^r#cb-wP(Za>BXKTOy*KvT`)4hbn z;Y(5bw%ZNne_)-w2I%i8GSj6SwNtxcX|3;AH>j}jf4ESy zu1v){A^M-%uCY6luIa`TXJRK4I};~YILXAeZQGpKwr$(CZQFKoC3$kM_cy#>`ctpf z>zuCcUA52NRonwi^f(20UPY7{yv!*3xyJZlBE8zr!S&VX-*%} z>jk|+EKS7jNQ>i#h`{~NbXNs9Fo)5HOUK{mPU$0p&>=QJ6mcu*sW~tK#AS=6>Ea6~ z<=sIJf?_raK)LxfW4VXeqn$R`D%f@vdQYJk3E>xlcBUzWjjO~n>(^LmkH_|n2jmWg z7jQ1w#`~hne-XtI16?rd#6>VBnEEf3tGFf=i3}qXSUsn$I0`c|=i&=czW9(ZPAAH& zr&TSPYqS8Tusy9Fxj`vEi6|}F2vo4G#l-jj&lVRplDD)eAw^;8+f;6@DHDJAB5iDebg|O>v&bA7G=Jn>jG#fQ zZV6;*It7y?^HI{9$t>V&=p^8+H<;4Xuq{LzXJ$SEWj&wlB9EZ6LI^S^u?!6)w6 zf9^=-a)?eMvQ4exE{EI>J17;|iAjrCjwDUhMy2lyOx|oI3ato=Rchp*3-%RCw)@=z z{o%=!49}E3OG;x11Nzub0$S8~tf-K9UJ5#=gk||% z(Yto<2egVE{W2@zTcr#`1iFOTe8T{~gI|%MbRq*Qpbn&~tUx8RJT?a}{rSiQU9gB} z7Dy%WNXCdfV>1q$lO$pOXl|0iqS)jA9;2v9GT#ocXLxQfT@-YRgl&joIe;bB|z&&A$rT!tKwELUL9GCt<42 ze7jId*=MD)QPm>?aVu0xA|2z>G@9g~KL&Wd46pvN`~KC~D78Z)=jG2z3*rRj&8r|N z*P})gpf!k_QC1^k?ZBv$M%EsdI|ebJn?M%DHyKQ&OP)YCB-r%C@oIG(OB;}5rpFFV zfFCk$ZW13#Eff{q5)ZX7*!1)%o0B!{OAs@S%$Y;;(rEuS7(o z;;(T7M80ok|F?a3to6)y<9q7;1oz{|_VdH%WHvJ@I)aBe3ae6go7|WutCjCr^k-Ib z_g<&{F@X2}K>_%*Xrg{EIm=S|Bu%R=Cq9LTzQ0S6wIiMkIJBj9+3-3;(?Bt6S)0*` zV$BuX2j=DmD1JgN(p#~`NRi#l^@JYVJlpJOad8p8_++^P z^T~mqp(hrN<`mwG1Jk_A-J49WeAijOx6+R^E^MyvP6j0oUbz zW{wJ$+XeH<@A@a_XkrbvleFzIq;O!fM-sIWCv&W*`WOA|2s4Gjg%k6Z=QfQS!Vp5n zZzKuc2Mt0KodDeZo*#UVc1@ZmNiitHq3aEj*^U5^q3+V;=LTzfypFV##)j6wYCZS>NCd^AvuxD z*O%JZdN>S46FaC-G{XKO2$XH=h$pH!%5MoP#2b$IU9mILAvN*gE0v``*SUFSHY{^W zQN2uXq_*T2CE0d2^x{fj5K9s+>8iFndMRU$!x^OP0v^3~=AbD@3s_TzBKe_-1r*jG z1k=BE)k9~qLi#IAE|?@-CYZ-b;h{UB%xRlTgPJrtmzNf@O9a+3Qr5`PrB<;ML8nh) zFEx1=Ro-A(`pY2cmc+1lw!f!}9i?e>pWA@K4WqKKskfjCT^;4a6dLjVs zpgufB(fObChZ0&l0`EN-f=;`{--LL!2Scm#CMB>;v;dst*}o}&Xo-hw53TxBUB7De zFpl!DLao@_oN`GP{0si&p;3Y2N8Wp_vB{)VlCrfZ*Sd}{L=UG?3`kJ~O6y#@4R8K_ zfBDVh<(9fZprhmwT~0rwe{8B(-nay(JQrvNDM3 zFYNqmic*Z&VGw6UTmp~gwu>#co7;_B-u6H`K3;d!3f2fMx#4)CY)pI`6w?x^+@~`W zTntPgMe!uN7*@!$nRr&H$FLYD3(=kat>u>Xd#hv0oHyTeuLrgrR_iJcJ4_yCxgh<= zk!2oG9CuuZB&o{Em}f|v?>O>#dpiD{RYqeMPNiD*-IXp}2-=-7KY1UouSiGGT(q+m zEQ_6VPi*=(0lleL*4b0@w%c-lPye;YTWF^fosEQ+$&xIr(&I*3Li5K3v&_fzdfwLy zzQ-}I_jjNudru%ICgP}&jmmFUhb|W00q6agALYhEk{S0Z@--qvH~87>A4WyzbGWHo zDlGI=tM{*L3Ija|jv<%SXE)^V%OWlt%0&^(Wvt-lg#Zm>Hd;V#jm48?i>sD%>87Jv z*?I`u0?AO`_&CbJWiu;Y0vChcj+xjsF?_gscgiH#x>+_X|kNP|khY4;8|qBx7N zz-m;^PB)~On==iw=VLQcY)}d@Fa*SyIQydW*D4jyAIq`?zeTuT%T;PnXZN?#Y>Z{` zB0{7kE+f;-D`am^!%%Ut7ul8ZQT=OyN3@6&*rTbOInVqhe1oWU@Tz8R85w zh6a&&iKIP>Ca23YF&N}ha7R%hiO-SpE58*)D9Z+HfxWeYTei-%GB@>gw>3vfF<6oq zqcGQTn9(}!|3gZRgVHpPAyo}Va3V+GI(oUc-U+N8NTR6z$%ud+b_SR>%RN$I=7#+* zK}FAY;k)UP0pojp^u}wZq`-2xxTk2=8B;hdwft6yrl`VAa%7FJ7qC84E_3OM zm`s3OqEa++7KJwU#^Q=N8I~lb?Znc^)OV3U@Mp5n)In3hSq~GZthleS20~wKjPZ1- z*X~cXR?<1!XPl_9MwunoAhY1L*u41Ck??CAG;y&bMpKsiJ}M*J-9TI=!c4e#{5v>M zjokMHw~hND%gU;5E49-oR-?sMjY*(KyF&{xHEDuZd7My*pHv_94I8@H@hEQKQg+yo zxtF)xPC&K!{Ds;`H{2u5hS@X-88+u5_5Go>ZlB6KOGrwVmDveY}_VY>hN<{C*26ATF^sfw1HsRZb0Is{KS{haGisC z%x+O@LJ}+EuP%P?#HLo$aS_VG8lH4!2eQf^SL>UHl{T&<8dM5nKPd{S=UzYtBlT-x z&}kQlr>jY^#%3)h;rinY}XW}*-Vt8wL+=tz<Q_?>iF#N2@r`jrBd7!@L145BtT;gw3JN##Wg1;aGC;r0;Eo z;{&oynI))M*z%XaAt6hBw!LSQSjEYa&e@Du2(Hpae z_g7x+xYS3r+VlyZiK;WJqfU%*d!{S{C?*+NLpvHEAfwNwAn=wpMt?P0z73B}oSL+$ z0p}Cpx0&^>zklk)-rjDSnO}<*DkA{YrI$KDY}7XXoaxgrdB&u1?d|Tlu&zR7WN86G zI{m~c#o2FU27&scDARf1@F;f?gjNxos|Y}EgKB}YlU3NB3Qn8fg6ud3^Z95&@4$4! z1W);dc>XX#jpvD+bZ{f&E1-EhU6-m)Jpa@rFG5gqB{HR>rkr_W`9W}J6fJ@?cdh~^ z$FK|x$K@CCAc|$r86#q*C#V4(X<~@pJv7Q?8j_ww0_2#b`=wH;0a@V=wkh)i_w{G( z>Q=qoUG9SC5|obz?9HCH@_GKV=M`ME-h%VjLXw3KjiCbhy4|_DjE$p>CimKQZBbOZ zriDVv@Bx=ey_f1dd_l;iIj*FWi2XYURm`5YG3AZ&?#LGOIOkvWO7eFBo+&!Y7KlgH}}q-eYS=99hLw})=|6_48!zWld`)@ zkz&U2eKGEYE)pypgznC)ae51wYu!2=O;=KPev`QE-9OU^xH_B>j+pJ2V<&N{!gZnS z^G+B2cow1yJL9u>F>J`1Sz9QNo7gBQpYK z1HKVAs5rZ0;z?DFHW|3XwKZkgB$SP^5Zg8C`j>WK$jSs4Q7;@5wO7dhxjNLM99^fw zEz;9*z_N3%xBdD6Xo*W_aKKWwhao){Rdef%qPwVvmttmol$(ZDKKpYiX zKsPF4Lq$?fC8YbSR=~FH1a#ye5(!T=z(;syXyCvh4KX*}(k>99UI-`2^x5a=+*cjbopdY}2cF>YjM{lvrm9`ze< z>tKXhi5QJ^?1=5&x)5l0Hf8th>c5vJ?j4PsERh#dw~gb2oQkgWw^wZsUX7~Eboqyu ziGj}{1h8Qa(?B~@&50An&w3bQjOA)(fPM-?+*q(8lC*syEM%E_51s>jt^>BuDPj)I z$1*@@whS#c2=V%7B(;$dt8kD&`Y0h>4w~89KMiSxofNH;fr6Z0mXq&E;|#@9?obJ> zZ^rz_QnjyQH9wCLLGrr`u6Y`?8Qjp#bw)Xj<6i zv7TVQce5sW%&g}mPEB-L6YC1)gbWQ@Y)1-=+z_J0*;$TwCL5prbPf`6n<+_BVGAhc z>IpdvV?%LI1Y%Wrr~nJ2!Rl|l$%Y`d{lWcW0+v{XVyiL~_i;;pvqyU(PG{JHVLzQz zv28}(1)C6pjNDnz08oJkk=Tr)%43j~2%x8=x;R3nO2X~n*kehFHo4K*i2pA!)cC+D zKC2^f=Uw|*_zLY~_OceZ@A9NU__;>jT^F!}mY|+bHiMJ96gNE~#7-3Q-~0W#2ao%F zlW~7#cDR2}fNrK;g6CzEb4pkv9;I%&osd};X%wA6kA7j2>m2}42j=1hF_df`F6Q5| zw&iL?7kf&UPz4si8VL@@)-sh3bwq3w;(L%b#l@@#l2VvW4&a>j5S)~s30KP2*P!j* znUAvSt~yolQ2Wk+LO*yV+)_0%%u)Ikx?NL{?HbairRCy=#i^i0E|)B6?A}+NI?r{T zBmCiHE9#w#FnM}j)q=ifvA6aJmYzp5ffYm#!0uGJ`uSSQNBxoQMZ{;p%w=)4uDq(q zIi>Od@|jud@ZSno>jQy;CP4H@EV@^YUxPCVq9`odr|k%;@)Unc1Bpb}{lqH$udKG{ zy{u`GtW>QS#1!h}P!R@)dN}eLV|WrAtP{5~yA(0#E!Ff?0=N9Ln0-Y9N(ABtR%)B< zvc*|mm9G{y>QPKqk45i^((I3BKca(Fnb%ktN*eynu3e1nH46yA50+&=95zSs(zPhE zck@XJ5v$X>L(ub-I-D^u=rV*`O=d0fr4%u!v7m%3@8|!1IJTV1lJTVyqhJx3r&W!K zI=iIlk+?dIjV4DT^u~vBZi{kgZ_j-j@0+ySG4>B}55JH`l&2}SpOz$6-mn#p{q?>i zJ_#u4w8Fz|4X|2pB`%j4ifvVzn!=zZb-XVv1Y@iK1lFwgIN@KKGtkAspk7f(tJ&C? zv)DuXrZH!6LCqGCOWJMTV*IVLr}YzOEOIPQ4|$aO+FwF-s*gG_v?(BJ*)MaXvA=8~ zv9TigcZNb#8JQ!f@IGHLGJkCEKXL!;={bnrvnmOnr!I!8C2UHo4|~&yHU2HQ`0XcB zYoQil2z4I&e$|=X%>Ckywo-g&5$zq6?|t)r>x~lI)*bI)Z3B>HX0~wa0g%^fc%B`OeCvlzP;&)bQ9hQ+z+Jo!Hx)P3# z;{IJcQcpjNKQHLK41Ohhx9X2a2t78vnA!A(1c9d%1&p#^i;890plAJ?(v7HkO|yh!D&k?zSYZ6aZ!&ibk`b_ zBWe2JREY}27sL+%CnC6BCgNmQ@~{<2xQ)sYrb~qh>g>D+12mXb(ctXnhrcN3qbI* z`{>L*-LY4QfX5E(P4#eB5g#PsjtEW^ZlSQqOa8eh-_fTvAjQ$c;-T@?@i~y=b=k)W z*3w^mrcHk-ZlYvPAA2m_I8Jf-)c~?cZXU;!V}0Am#_iJRYv_%)FsqG}%9co8T!pg+ zdjHZc7O0NET--3Nqv&>Y5|f|)J~7mH>~IwM+Xs>->><^nT#1yhd8Emq4g!(Mp;&bY$_E3c zw&oaVeLKR5Re{w72>%Syf+X!V9r{V@E5Jz)8DM@;W&BGKs%R4=nVooXuV@R(aC#0D z7bvL><=R1Se8D!aE!TlFzW5GCeM?wa(=%c)+Cl_w1DwXl$q)m;{li%Z#qi%LCuZut zCY2+4I;M^EiWS_WbvE4yQosW^(?{E6C&g|gcB1SCel##IVG1y;)RQ;L-eOBS#M|ct z`#uVgRdo?hoH#+B#VfXXH$@E^|GD z$q84ZxtNEI8HCo5i}nsmoGaAS?hrG$lF?L5VzY?&%>?}JXZw{@{al)dneua=?#in# zV=|^6+tW0*EqjaYUE~{AlW*cTM%CEE9nM@W#1}Y&)(}N_ZU>9AkJcJ3HX2oJVRxmz z?dd$>oBs@0q`Zs8voOK|fI?I`om=AyR*WZ8r+%Oe)u0#WXpl^dJmyVok$A=2?aATr z>qNYaECw86{oO)M(S%6^4hegF19GS2_WUR$Yhu5co+iQVLGtf7i9_HLMz#A6zqG|3 zZQqvXlA@c_ylBXkPmwERa2dXTA7-`o?p!49!k}L|4mOFsMl3_1Tz^I* zEqXqa1b_vMfS;7=0W(?qWZFr}D?OZ+4cP$VP}JgZqjcWqLTkNPdjY2Rd%4H257a6R zOAb`QDw{Z{Gv%zbN)gRrevQD6!^iW3elnNK%>4=dWGks}r=Zj^7X(H8~=T*$Cd-pM9y={H2qtOUL4l}GOG{)1!e_g zS-8V||48tNFhp<{%j~_y;%iIkzs2`{Nlf@}mHH!eszOx63upuR62U(_4;-Rv&N$7b zRr!!eT^nm4HCWK3idUY0p+;I);6f;+4RTr#C(8;upA>g3Wgq{@ez{AJPT;Gx_b`B$ zo4rx@v;2AMueijg&=wIY zM>+>}#nvXai^X-tVZ~V+5IX%a!rwnlX_rV$emXPQBS>{w7l_pHm!*=6%ZC{!^+@Tm zUaL(q8H8yIMaPFThbfrT5{V&#fZ+E1HzT0%AglHk&EFm`NpF6jEVbgN&=`&u5^Y(% z7PXtI&!l)yB%G{aEDJu4WjG)$L6HW#`$gVWXL}1I>-Zjg-Q@Gl=hpZ6clyDiHox%D)$wwLE9t<|C_a-naHX1s!1frc`r zII?_()DdJE5ouLG6=T1l-`{0pboH!5l9|tTnaAhD;=`?MeKCNyig-C})um;G+_sVI zcQ~-v7{{z3h2V*KvJ;p^` z5l#V8u|jx3b`95vD`{u6OvuWv>mobV~ z2}|)rzWteewE(VtIK(Q$DTSh~XaufUduP}n0-aIdY(qXw2Dg{|BUu>K`Y*p}?Ov-_ z1=P~b(PA}1yOJe$u6o2-zd1s3PJl8;>0aZ&V*w6xKo`zElkHew{hnpMBL*I?l{COi zddM%%f(B;9j(US5ZwS;7%>=oZ`zF*sP57(LLwM^l>VFxELrUo!Y zf~7;WCUt=Jk+083dhdURn&N8Lp|qfb{H4P7-2)OkZnHKZf0t`BrU7+hja~appS3#9 zUsafGFd#s=QJ<%3@0aAQc8?m;=s-pabJz|gv0P-Vinun>IhbU%;KqLuVgt->GnwMz z0#wc!fRos35*)Jj?3QvF7jLUcwiAJ$iW(WOXmk9MbORh1w;>yGhb|kB)sA_lR0npy zB8Mz_Y>jJo(1zGTQ!yKonjS?JZU*;Ul*I3GD&p#*8Kz7Y)S}HCS?5$whQ~T0E|SLZ zN3vbpNBX<>K2euTuP--qF=nn-WJz;>Jp{qHAbs`YxqY#p@#t$m{XwP~kI;#ePg>P! z>A(4g(8>nTkQ(VRYKknezT=?&clzp~alWSoRN(3TZ;#$(-yhA*VukWenDAw}W%Coc zeMY#g%0H6!f7;5zfLW8iO24{cIA)^GgD9S|$c-BgKIU8$K<{&xDrH|)(8mKYI>i35 z!vHYqeW@56N#<5h;EUASVr2_3FswH^J<>dynpO#5pD!%!gi(0rGks7#1QT*agRR-eGI_ba}S$Y>_= zK@8?9c#F@~>QCIJCGg^lZSdcCD*Dhsd2bN9;`QOKeUH%pQap!&bHU-_P2Rn-JMS;7=2C-I2dyXC#_WB z%y(;Na=o?S|M_^GO1O=jdMNjKELn$x@Zc0XH+>CpNoRg={LVcV(g77Ucu_mUKKpkl zIw>by6>9B6!aJ-%b`4Gl!h1t=_0>OU?RUR#PkFK$Pv9&3=Kww!wC~ty6K~Ffm zi{TVTsVR$V!}G&joLR=~-&{k_v3n9qmvW^x`{vByyw2z(e<3Z7w&4n7D#EH$GdnmB z^-ZY)!t4C!J#sOHDy>sq$tNq9&4Y<+z?9QC#6$a~vD*ex1oVTtDgW$~i|NdqyKUj4FgjUL%WWNdJRwkbAXR_ z?0h`*)}4@N0_dAgon`8?COJ-+Mb??U*FG@$PCk!p7ECSVgQAXU(lIF zA!x}|J;b$CX_abrw;E6#-hRsPj6oCMrVwk*`?dDpH)r=QOd3^y<>!nkaT%eq%oCLd zvDqJYDR6Je=Pk{$9yr=%nXytt!<02v3jsO08Hk&G}=Va5VwjJ%Ba z2|~|J3l3(qsS1&+ga?<;r{(#Fzt0b@d(f24`+6%Zn38;M7mX>qV zk354BB3WG%$>Mr)uo~<(chyhTU!~XEJoo!L&*7XEgzG}B`QsO95Frjc|0n@4N2OxE z{sIyRpi*&y%abSVR|B0qbM_{4_~EV`f-`v;tJY8>y1e~+7mRbx3M$G&YEwh4(OFpK*$Lr!E)Xpx?L639IC zX^gn+A+^;{5ihuOfp2n*3yB9qPpTa0fj=y&lq;wTMFhL13vEU=D7K+2t|1}a^R($ zyZhwx2Vw2wQ=PJ5k{!(m^f&W>MN`amO#d>!9WvNW#gS3CBcZ)F9S(%;k+&3&vy-2b zTJa|}s_=6cY8&8$kpTYaM$UewGkG4H*6w(DcAxaQ?H$B$0WGJmb=;TDC|;sLBqMII zhZV4<3i2RAo@^f*t@?1395S9I8w_SVy0wl_zAY1#k3stxKDyaN1RM}$gmY}PZ%eOb zMRUf4n<}XbWIz=~fJBs4#1d-pbnNLuUs*fCE~jmu;0%0h{h8$*JJ2?mj}FK+T_{oX z^Lj}n>*>C`mC+jVzBqk^mB5}z1!PR&S93ch&6l%2iw{3bJnwI}p!SMUN4pSbw{?Pc zgk(2|By|JN2_tRcgKN#UGHv(GB%0)qM2{%9TZ&EyTd%viA%KOa%U^3eguO^wxt}ZV zyszh)1j`Xx(;TbNZ-|%fLA7ih$u_PpsNgydun!n>SBI4}+b$`v=jN9XPmwy>=^nCe zDJZ1O_NCkp_|?0;mCPAJt3`7LMBvuT@Ct=FcpzU#vD5ZOs*Df#B4VnC12tl3*1x8W z;V8W`JZLHO=Q(;e(zCkXPi0=FJ%I+A(_>CB*8yp>ewuc%}JENS_!H6#*xx62AP2#AB2wl#J=b4UWwEj@7xQmIyuS z!B`Hw7T_;)p9ozwyn8v*EBeC8OdlLfG>P?#FUGXq{|+?mJ!6#!z7NJaMzV#d9znSgN$avOtL**04dLyn=-^M}e%6ZUXOb zU2~}D%@HOv@h^A|ksgk5S``w5WNZZqh9tq;(Uy&u;P~YgFI2)H5m&Q*i|w_SbLK>P zd+5#BLu4*WjX{9HcE{$*uwHJNiV5e}|FM}Jr&}I;>BjdeeDfw%#{MW@O_W~H@oHB2d410;&eRcB>X{qt6M@d8G%kkagsQ+78HVtJ{2@?dwZ zmuQ;SxwTe3Us=qp4kLKHW=B;V&-IYJMp}F_l1dkK@DCgGtyn`oj(X5R4pb)pc1y^q zTB?Tu96oaO#aV_5&&{vbA>RAJG!^UYw+r@jp4#U6`|QrcD-XEl?Bpr36Ywja1LDu$ zpNBS{2^2%Vb{M%S1(aI%swtJrmeC|!`y-|OWM8N2TdzqjTXx6SW#qu@>g2EW`TjeZ zB=4aWKc*tu4(VSW8j_3OE&mD8EY)f~gn?4vrkgnc5`NuChmhOdY0oeT5%!#L=qm!E z#J-6}xzKY*encN%7K(gm1BJ)bB3sNR&)rIfU%0PnpLdviK3j1Yt)qMR z&)vZN=Hw5F60nr4Yt+}(=hhFG_Ve9fq_Yw69F<7X6Xm?1ULiFlgXZ&_g6?zKkXME- zAM!g23%c|a^JP(R@m3O=6Ws^mV2vA8KYE01+*o#TIzGeE=5WZ7c^H|GKYw^U#3JDr z7{d$zjMixX$_6+ic?KZ(QDPqkLc6Mb~%x}PUqr9>{IR0V)fE7xT0pdcAIOJ5(ShqFk(Exu0x z@jOu|$T2kASr8oy=hP0hOs-zEO!^8*qX`M*?({A|^;<$9qz}o9JpJ zSN6j+SyvpMg`BLO)_0&HA_)qpAOwt|#3%_ey~($7uwLxMZ-v=tPdUbQ%XS)j#ege% zCB!EM>pGayp?71QJWnjKQBgJWfWtd>>&**lE`!1(-}>zVKg}>Yvf6|66_u86;sp1* zyAR!1x98p5c54(c(aStV{d;VovGCX&@Fvlrwf!aki_bH1xk~H(z5D5O+pzn*HUszT z_esxc;8bQSpt{r6H@VaE`1ZiL6c$tYe9?pV@r0y}FUoaFb^jDyNjzD#dYM#?6X7_k zfL>6J3POzj!}#H(;ZIBuS%nn$t}=T7vCW_TpDK&Cmuf~wwnf*i^MTDBK>n#*A9wzb z)8?@Ynz6SZF4MNj!B=00Cez;YSf1COH%f$EoeSUUkuMz&muHJ%rzJb!dqtzM@iedZ zD4@x5xmXN5N}P&5F&9!$af4DG3|(F>P>^N^3a0S`j(P#EK%0n&eh1|d3MLfpPvuWJ zr9TgyKWR-R;HU=@C8RP~q@pej-Ym2l{;rJSn99Xz9(|Fo4=A~VxV zRo`;IW6>!04Gx*iNAcNlc@LiI?8n^e1Zh#}Br4Rr2(v>Pjk zGn=IECOfsJ(uTr0Qbwf4NPuJXB_r_jIe>dy^)xa%%|zVZtU($8Vk9nX5~;H<$6 zEO#?B!NY2tkUO{^r7La1oW}QK8xFybxXdc5>0l_$z9p{WO06w}GJ;dwJYP z$iApvfX_%eFesbbJ1&^+*7q_Pcz>t@a%JtNC;(+W;q%0W+kNL&FH;o^yu_7c(Gnp6 zofJ0huykuh!^=WzIR&lPbmtBq!wuBdWt@=jzWV8b`D>_5EP{~%XGV}5 z*&5@p2px)5e7z3QsmQl1w{QX9%fVj;w$>O-JrgvAp|60}UXO;2`-y~a$ZYOMcFaw% z_riB%c?>K(Nq)rDTB-gpNN78+Ef}ceu3?Wn_?e@|FintM{1K2$GH_(n$zX&7I^;_a zEdk>QsNcW^gnCZMcz=fq!JW{2zmC@v)A<4e3qn5S-;#ANhY&*=G=DrWlpHj&fY#CB z3i8*KxCvD>k}4>+f8;W>qzhub{UeNUKtGo5OOXw@f9(>Vdvk+)#bzT!8C1TPR73k; zUH4!r#h~XnEU;=uTllK+?h_D;Y1Ecwj{_pe@c=gt-PWJOp$4V9CR^@FBnn5O@OWaU zce@L~ErHAVWA-TT`EAhu0{La4Fr1Go&~_=nA3re8>2Uyw&wiagIlB#b$>(}?6#0B; zmeIW%NQ4C-eF6(;Dt*2r`h|iep86vmiZay{+3YC#-x{|#ydTC|UV{)|31W%>@YEPT z!gZub@{F^0sqPX|W(}t6o0q{R@ZAT3?<+fb+j0Ffx@r|iUsp18gFFb0vb3;)6_j!) zB#9~50m};7k@0&VPJ{I6Ws$&&Mm-jD_+wA5rfLOLl3Q6n#}fGP&WHEiJNmzOK3CvG z`j<$+V{+HKru)MIuJw8-OQ55&0%wY(rr#2`HyF_Z-Y44v5k8m`0w3!@laYb+>Eym3 zd?2i;3y#QQ5C#%SM(mG?%dtw*E7AIp_r$TL|@?PNm=9~@L6^hMb2i)h;or^ah zorjpQO7di~KxI~ns48NPLTnpsQ1Z=f|==8wnWek`S25hTD#Py5qv3?XI@qS1_Ixc5Zn2(GS;iF1RVto!?iK`Y7bY z#bP$B=gie1He z^g+JO{legzxj{y9Z80x{3O2yW_1E{0%f@7aZB&o1O1rm6U{mJ=$e zf`C7Yg{Pcj9Qvc#A|9Zw_-+>uPe>7^Zvzf0pWc4;K@Sjr7yV>OTEt6vJ|J>q|Ey-? z{yNl^HI019@aNjYJE+~B(ts7wAFuAb?d7uX{%Du+S^d1A!Nhup1ZN2B`4%c+oj2)a zf{{VgQ717E_So}tS5L$JOW#hgYf<&fP>!$Eud`#26M6U*B*B;`kj7+Wy-VjHoDFPd z>^aW@prUkA+&)A?VHLU6yCM1sXWnpDmj@)>jzNdpRmxg;%h@tF5hUg&x@ zcgE?z(~o_fuQIJj-^~(d^O01*8!ZeG;p>!OTXA+MJm)O?4Zj4t#sbsi2$QaJRU`!sS?Kw2Y^N# zJuq0jmEPw86m|bbnB3!8A2lA^fOBQ6w!sNXjoc4MqV-8Y%{sv=~Ln27~d4YJ!LS6F$;h0v6Z(w$h z0Mye44o`JvUN+5pcYYoi*CP2$AXQ?5xLj+%RHTil69X=7xXWZ-^Zy-63Y_Q<)GZ|$ zlskmsDqtAn;ZR7I-qFmxxo3ahuQLicj-7{62}nW4DIIse+%TeK1oPDwj{s9PRa~v< z8Dg;YoI`r+eE{3JV&?NcL%09~2P@U%bQRLMZSLdOldX&t@e6OtCJ643SgAI77qcmMzZ literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/ice_spear-1.png.import b/Assets/SkillAnimation/ice_spear-1.png.import new file mode 100644 index 0000000..490f2c7 --- /dev/null +++ b/Assets/SkillAnimation/ice_spear-1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ice_spear-1.png-f15385af1dff55dac62c53c93bee3f68.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/ice_spear-1.png" +dest_files=[ "res://.import/ice_spear-1.png-f15385af1dff55dac62c53c93bee3f68.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/ice_spear-2.png b/Assets/SkillAnimation/ice_spear-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0b90730df7096d25d5326b952a4632f82876e275 GIT binary patch literal 23118 zcmeEuRaYE57cN#{UfkVXio3g8p+(BzUZ60zySuv-hZc8t7~G4y4el^Fr{Bf7J3rxE zWFZfKKI>|C5|G<)vU( zMp^y;2?$n_s**4;b@3>#CZGPvlx7N=sxUBK^e`|1Auuq{|FQy(U|?K1U|>#+VPJ$Z zU|G<`Fp4sgUp-dOx;!h-SH5jM>3KiC`9aoqHlT*F)yy40wl#~r0y|Vr z7Z@{A;3qg#vfkoU7|l62SNR#278u!$=7mB)6}p-RHF6|e6($yTuUsU9$aX+%Y~Qe( zC!_i|x5=7KpG#55YgpIPiTK0ircMM^D`QN>S^VAC%fH_4&$$gthI{UkC7KmqnNyYi zfAs%W!9k6nCPg1Xy#LKRbonitSIdr)PsQ33OGe|H41#k|1mzEzK-noE9A)RZD3FifCG_#TePV1_eehxe$DafOEfcZJveUX!1nVw5-#5R#_TCz57Zoij4@lom0-Uo0a|h6Lnxdbtn0XOA>aYGwl+W88 z(67b^S2LRsT2GG5N0^!i!X5<|If$Cw-4}fOjdUe*Q*-(JtE!U$+?#@jgULcCWVPLC zZ0UctSBRmY?FKxm(RVTO2cxO`ZtXoi*K7*=Ld3m3yjiQX&ByPM*}M=hGZrGE@p|OTjM04<+w++z(!O ze^7g-=0A>osBLmp8$FjFENwY^cx-r!L5bKbWG5ZvQ{iwHzG3{*MC-*FK4^Zb8#t%? zQ*A;fGAigI29`I3Y2f4-kMQ`4Lrp#>6Fi`K2z2cH%h%GQi67r#=r7;kL*e*Vb98v` z|9Cz5hp(`;nNB?uL<&M&>C09%aw}_f|Ep8;Z&3VUH_g4kdX*jfp>IdaJc-@0mBCgx z@V+>DPrYME=+ee`G=B(J8b2d#HpHQY_kj$#Au@s}J+Er>7wpfzP3aH*?1loMCp2u!|So!8Hz3wd$ z)eW_fDWc)PLcV;~N?fAe2SYBYI)6xh1w_ z8$$mB#rqV95Aa8IypZwvzD@BMqV9!++_-}Jh1v5@4gGe1zpFRhh;8e~^C(xh?N~0z zFL;L8(3T|HoSA&Dt7&T2_@}9a+oNf8{k6)a;cd|s!FuOys)Lx!#QDLH-FlW4-|CdN ze<&kn>7;%*Bk>8R4>c*Z$9*$>dXJ>E*aPcXr2cPH&h>Ct48})Ptb_Fqlz2~C@^PJC z$r+jtfjlBcru&_|U0Ozw5tAihD`WdF?jS91=y7n?iquKZBcS7$J7+j}>_i*(AOBI? zwcnRP>Cv2)L4(a>ef^{Ex42n}V*{co1?zeehilx62YVWYd<nLH?x)23CySS+mUsL?I&7M)dw0Xh`z0d`^RVDspWOj}h3^!*OjM|a#h~8dJcpiJ zyq?Eg_K(%e8gQu>jM4MYkJ^*>jmuX8a{5_zf;-g#o{r}ek#cM)7}Zv%ERY}#V>#BO zqjo1e9_A&-xB6h#JX8UzjK>v}S}-A8A5{j^Av|+GZGR|e@DG*&C#oqXq;6}T38ejK zvCYm4Sb7do79B)K7zUa9cS#00g8T=ny3UMV)?x078+K1dUb#zk7B=w1Af4C z-?hyQF5NS@>)w-u(R0a$^TJ|<+t4G#9{|#01=Lz?s8xs@{&Q}?(8Cf*wv5O#SBlEx zHtGWwOF&bM&0uyq0Uw@og9( zd7mR!@ejC1dYq{x(zbI)NgJozc)%YJNRkTX14JkCFrAPx$5oIJWuJSQ{y@GenLGst zFZn#aPj@|-BCq?tqo#)@-TfD6H{?oy#iQ;K;x?AU1&;0T&cU2cgL){1=SKtx;+o-_ zMCHkY13Sn)15yc`Q0Y>7(}ORRT7G3y{K*XDW(`hMR^}{e4`4Rk9=s~G+iA0KPbX=1 zTjtzZJxH35uJV5+1D%5NM+O@w#mF`ldttinU<+IsNh#r5h zGRBTKh2?Yi$5ltqfC&jE?v+W@OHsaXOt3FP8pZr~)`&m?X%zs|PIw@_ zMH)Tpr*=Em=Rg8OXL#|O!kR~A&#LZwdH*r7n@ps-p(KK?J6WHPtq(R04kQR0T7)eo zLyqSoYtLI;%Wa+bBTQAGG7g`GPhQ4i`s0iL<=@xkt+%-EQk7J_Mre@Em(X}4G4-0Y z%4Yn#YEmV5k)UjBwNyrQ$>>uDIev>~aN_(jMz`jA{&N3|QzE&?63OHPaBPcUQUVPU zY98iHo-(q+an}BpeOFGASCP$$Fp5Tk8vz z*E=^d2384pACe*={ZbiZOH#R(6wqZbuTy>aT+}$YEy;B#PwPF{EJ#}FmGv9;k){3Z z^A_l`)qlgwcJw!(n7$BBFLn6Ws1hj-O0XQNqLPc$h}^t7uwn0U9{mIBl4ETxoWRn! zUX!S{jkNq=kUJhVWh@8?s)<94_&RQ^E^&oeMc;XNLrptWaJwETfqWNW$1bSb{EC$A z_tZh_H;walCS*0jQ+R^q?19ue^6Qt0q#MUmFFmxi)Z%3yU0;lH9zm$kSG@*4T&udQ zA`Hd|_&yEo9%plh6>I|szhxnzLy63SJ>!|J$5>IT-4Y>NjyO6rcEVIb>ID5A_+s5n z-@LbSg&8*Q%Y0*7PF!A;?mBcv{$POk#edK^Jil%2aUdr{b&-*W;05Ad;$s60GAVg9 zc!L6$CVpP|+&AQp$9b4eB^)Ld6Y$7g2s?*)Pl@QFS6DvKI!SRanS+-$oK8m_TA$k) zih+-lAKUV01Npugc%NIk9_czyE?+S!=Ld&lHW6a;m>8M~@@$)l)f}2!esjdiFnGia z3zBz#h>6|3L+5$XR3jq3FtcXaOnOXWymt|kf5q62+_N8eJ~VnfZ*gXl*M5tt0~Blc zk&Y_KTuseB&@g0&t=0IAk#y^?=j(sHJ@<6pC`mEAeTetDLYlJUQ?Vbwg@5TK6gec@ z6}3cn=5j|g?3+;1@6B-$`OP}=>R#oc2L4nAaDkQ57yAjr*Gq(jFnweqqo*oL03Lk$ zn`L#!zmAgQL!DPt3UH!sk3+GVx*6twWtajQf^Nb{JQmN{O`U4Vmw>LOeQ0IPg0Afa z@a8Ahq9w&PS2NOa(APeSq=o{f;P0bN<`#djHr!q z0c+A=3wq}aU@nz}PKKcX zrQU_!Nh1H=$)E3a-gIz6-tY&lfrL|Em|+D-Nk4?VB&F&oV+0e;D4UgUW|E7na0ToJ zHgWDrc~y^=lLsC5dPBp>57$fZ^u2ZJI-HY&LA2R4f4E|B6!g3GLcd0lB4DV_2e=yt zVPIiVm0=O2`Vr5TZu|jP5eG1Y@Mm|Q!Oq$0sQz-d$dpS?A#>&-A`Z@=GG<+9o$B+i z`go6pko)}=O=s(Trxe({KUU{JoL=SwIu4uQ%r0|8m`)Yln&Di|<_P}8O%Xpi_^#c_ zuH`NV_*73AR4~;bxgwu|DH27gA`#Ce7;X!d6ZI%z6yStEK^%rFNN9{(%h_-z)!|r-P={6hZ?8A_1pVu}TYCu8?YQZ5{Hna=wG_VT-DcZ{ z8ya2~xb9)DvfjFWke&BJtwvR2(5p{!Ce5Bc^WiBD{kTWEtb=a4v(HD8Eoxv#s_3${kmn5 zP3G9c8L5=ple&aw<`(RYb^sm??5NG1hS@4F!`rzU-}Rc)me)&hdy4lnqWzE9v3Zj5IzWkw55C#ITbTn^dR=ttiH)7Sazvq)XgGh)HFeU6#*?` z2!Kv7fW?rfRl~;?D{EV6S;A(c%RKX~LY!RC4N)>yF7==L-iANGzZNSw?M!-%{Z%2kYCYe84vKnRFXc%|@DJOM{h2x-?M^(WN z3uL~ukgS8&OE9(nX5V&Q&c5bKDBoVm8XlP}cLnU09PN%6kxp6q;1)fDz58* zoI0+01D5MC@C%u5P;PG>!+ro|kV0g{n8d>1PM^g{=9|gnfuDi8Aumikjmg3CeA_Yo zZ>RZDtsJMkgLcS@aEH+h#0&hqyV-tfcyA>3RA=Kztg@;iZxxvde)c|rV_iviN^_|hB;$VJI(;YUD!9l`DpUX4^NqB@_vlhf@UU%e+> zwj*D?|APrS28N)!r!0G1ZPQRyi)eaoa#==_$=x7J2wbQPx5$LEu-xk)#Z%#3y+5X(gE(c?T7$ie#>71UodIpQELNkS% zpTfri60I-FOlHHLF;!sXcNM22=3RZV9Go z1z{_I1pzdA^n&tk*P!%u7eYr*iJK7*$H2csw?IR*v-l|epP+eFb&I;DU`rE!|NWwT zFPMD(+O}Tq>a~N_`3@fPEJ9>_Osf*ZjOd*^wWId9p$EQ6C#0q%O4lq<0I$7hs?h}Z z{nAMX@4#se8Z=KQ>Lci&#mHgamJK{oYn|C1$0S#ZnSol5f1l5?;d7uZCiIHl7w(zC zklGd$iqMSahT8niW;l^<#)L;eX?DiCi^V?=S3H(S&t@S)a8FYzEJPVFj5YclF&sEr z+A$}f@jX5m+!2v1QEH8MG)pv)fm%xF5x%m=1-BO68_DPRR$;H^f_|#gsHTSqp7Tzl zs=v!S66JKsaLL#jcJ*#OKtD0TR)9O9%-$Axq~uXknhv&f$s*)q88(q7M;flPB1B}X z`Qi5u4E?|R{8&Hd-CE3=T_t#^`*@}Cx5nVUeo*&~d0G5JjfoAPtk9MS!Oqb{^qmlO zBj}waVA){b#C4D>8b-+nv8Zo|j&jkxrmWZs2dPp@HAm9M@oepvxw|bV8cYC+=m*1- zI&ZOt6ogVOiLnMfo!Fv8enmL{3LATUn_SdqTn*h!b)&}HxrLCItcigxd%BDB-4 zk3L$eJ9eDGh*$64M$TI$$~8m6>pup>U!&6BvD{yD{4ZR={_mMvujOy^{!h_7=WKI) zA+pL7II)DIV;Q$RfNVt@1DOr<@HWCZdyL#*N)9@@XN}^8fVDhdmXA~MS6F%$ME;Vm zzY(-W0trMQX!t6~n-t>>7L|;j6>Y@E2qmM!Ed>ka!zi9Mb(Us!M(tp-Dk-9TKbSkq z64~v9r!F_4MC7h{_w^RvU1It;vvwFc8=Xt^YhrGc1g#tT)dBDblS&9aQ;$ruw0n&h zKxJbF9-cmqTt_wzW1rVN_1mKz*b}&J`_}9BQ!FC{xnyPm^?dq;5ObxP$XTv1tAz=H zsiY0Y`9k2K&2j7#F#k8y(xPUGcFM6s?Z$P5D9}jE7{x z4_5icRbejy`!??{O$0MbPB5`^6`Dzp{vXZz%*gp3mq%V zE~Z`9X0g_^mxw{OQu~CAX4?lU3MB zD?}v61D6I_mQKNZ@r^&B?T#P3sY{=M^(}H>L`qVdq<<%Cqbk|X#26r>L7Evk;J3Zg zU_~X<+}v!PBY!KiH;_YNJjIUdz7o1?A5vO=^+?6FKQ$j#$UeZ(u`o)Bk!*CBz zg`~-azK9dsr}iRW)M=CT@4W7_R)2-&utf@lMh#8nFVnRF*|q|X;v+41)XRwprp5Zp z`+t1RlQZr-A)ZjmAGH3AkxQZQXI$iM(W(~T`Z`3S0v-A8M*@ACYH-n4jJQL_Amn)t z?CiKs;!)vVSiumHXjk}Ux*SJR)F8?Ql${}0E#!Jn;YrV6 zIuNVR;Antkw)@&PE{^gVDXl4eSYqFTCYBxylEXGrQo{iIBuUQS` zXO?qbfHh-d+7c^3Ur5MCCxvtEEVW>x*SITl1=pcZHc$!H|w(6 z+_2Pjv2!9*e3$Z^YgfJ$dC`D=be-B~-`X2Db;+)-m{82{O=Uu`=aE9K457Gc_Lsi| zx%VgF38wzHYM79_&ym^Y;JUZ2I#2Wam8-p&y(Lf@&4ozA>ShO5#t8~e73}wuG1jN0 zAyZgV+Y1kTEn7|`(Vj`emZ3W`Hg5)rPwVfV7dXqULO@^0n2(aM*IUvzKfj=q(?zNw265(sLT-ZUK8 zY^Fg=Up^t_H*m)*b5C1#9O06yUfD1a#;3tl3PoZZohV>8N%)-v;h?J^`|~-~il5zP zv_yp1ce?=TVlUnAI9;K_T9EwXMKICJ$ss<6d!8rd^}hxyu2>(a|Hp5N*TtImoBTiI zy~!b*k8ATziiUisoC%#QCtb4PNDN{7D%m@wxykFT&RNKI9M9d5-FJ%=4)-BW+efA( zdZ841QZl*0y)W4P2Y;z39v=1B;V(X z=J$fo<{F`54pE@u(zGOUQL7~<3Op~#m(If`Pc2ZQT1$15BTt4G8k@}%?-{bX^v)3UzDk|FNoER(N!{*n@Hi? zH0RN>q^hQcZa-4OJ%TGgn4f)9eElVqD~`Q!t^V7!?gGP?0{B&dzRx`ThW<2rKj7y_ zq(aKuTI>17!#(@5rE_-bcj$0E>zJmUOfU!QVm>Qx)v}=RAvSCE($oE>#2=rum)!-j zrkn(rXPt|8REuRgW^ma|i~visC-5d^*kjtjdt+aXG#BTIsb;Le0#y=7oh(!-?w`%F zdV`<1BvK8`6C`f1T5zv~Rptl17L^nlNKOWKid7t=h+;{rtaK)d2cMj$Wr(WV>pQTx zV>HPXm^e=mzwKGqBuC5~qF!K|%1zDJL5&#)yaud4><`iN8xbW`AL966B3Z;sq2%;t z3^HkA+XErDnUl4L?>UrSh}*Bv0aU8ADZ|311a)7(n_BSU24Oo2uq1n-TeJW~Zl6gG z?{|kU9?+NEl%-lit^9DZ69QFc>19ObfhX8_K>`b7(36}2;rQ%;;K;Y=bPbfFAv6Q@ zgUg)SF7Ke9ZRS$Zb(+$*604QVYa6>p{%0}guGf&#f*#e{%^{D`mPwj_cDl!&zJD@_ zgE#(o70%=GlxO(d*@DLm)6St!NX0L9HL4AW~^dyyo zQWB|bMbx~a5wWsf=u77_BFK#jKak<^7B2Qd%!!C~Oa>IXQ585DQGwr2ba?tr@M<~< z>l1nVhk)W~<>N6Cs z%pye~({z(lXb1E0u1((a=n6*vAF>|a{AOsEAl(V>d3zD@SYkLXKKN}J-gsf-E3Fin zo#)5RFZyPwZ9{nwqY&!Q=yKq?7+Wd8>CVO1);fb)%pqZ+CQY0D}e^hsGe#D}5$M8YO{~_@RjVVqn zPIG&j9BH48;=7xnRcdbyOvNsmfs(W@ z&pLR8*_abDEDrR_F)UQ>6E@kBum4|P04KR{SPCI}Bj8n_?r=7PS+dtu&0-}_vVtrY zqlG5%_*6*W5q=(K%eYHEd=obP;5PEacxWMm3IHw4A(VAkh=~djc(uQ7QfjvtZq5W) z25BOG8^j)$jaCTbNdyO0#G-clylehp3it1Zjz{LoY7ctKX$_)6#(Ni8|Mu2VX9w6^ zb9Dv}Pm3abM-3bW8rqYzSJ|%~08C?Iw1y*Rn?Ey^?Bc1y*8y}rZW>v{ZP0q#0WI-; z$-x65b7$NgnYn%VwIWWEOu7DtWQu(+mYeHZ3*NcJu^ydjx7l2K*Ch^HmFp^k(m{mq z_Ba|W4pQPL1RoaTOd$L%RA>)W0`M#0>g+vVWtIejX~C)$E(KDMnjlptTsd52zhiOhqq8AGz0{)7UM!n$uA^|H##vK+FwPZ9 ztVDXkgM;vonz0_|Nks*%$+Z)H`TX|!<=3@ecWy5e50z=w7t$$|%ja{b)5n_?2f;Bv z4UE)!?@_o%@gMy_eU(rCxDI_AyL`JK`?K*0X|teX?arPNdquK;TCKA&2P+zD{lXUcOLLJS~ep zx&gHJM}sFCUbBwM>edBr)dE@R^mB(e4}odv|4|N2s{TN*@tBS7Nh({v`--mPOH>OW z2W6U|opa6c)*=U_B4lqTtW4S?%q^HM?n<@2VLM(^f@Yv+XLdVXWwCS>8N<6bhdi9I z@NskYjNLABS%4tQ+wGKJx>Fezg%~`X+tMKCepYklDU;+KY06|9X+|`WhL@iyiYnJ2 zd^09dbW$DnG!ddvQu} zzoU+k=fnJ;DYndw#^kmY&0sW_#O%BN&Rt&2Ac2=txE8F#3K4XwlZu|Nb4bK4KGFqQ zSP|#j< z5HA;hFh_R$Zz_8L?J@1gG*j8H1J@X0VF`nKL_dE=&z%L2>>DI*W?}ebrMs>A2!&|I zaZ^s%cCn^&;gnJq zQ0a~9E)sBzB@NinnyX{(7zh321D0~Mjif}wHtN-UyHbd0W!sjWt?&R?(<>cMxU@|K z3GjO>w1ucs3TVlU%M=QLM|0`;f!@5`ryB5+aXH+X)r{hh2@X3#EzYyQFg{orGCxTI zaHAFE@WJLKFHzQNJ1}vjSX-{kYsYH021>}; zNMmS4q_sOS_JQlyAd&57TlHDj{t1N411={`gSRvyWfU#>jjhW;EE+_l_bY6By{W;r0~im(G&PN zgkjGRPusR)^{6%&#y@|fIGOBYT&6q@t6CiYq8}wh>^c%^5d+|&muH|sC}`pEuZ!N| zy(O{KCW_h_PS*-K7UVu2`8aEz)oy`X?yVdxu*wyU8J4ur&a3gCJ6Xxm)boW=Cy(ud-Lp>OnXjD@&azH7{A|PK|J;)k2`pIJmnu41w(a<%1BV)YAYtG9zA0Ytl zvmBbS!dFw29@i#VF+}7VvR%H6jn0k?rUiblA*vi4K-~YDWM>eND_Q`MxDvUF0JVPK z8&=7R2@X~ni&7&BXQvylq>MTiQ7sc6If)zZ2+n9T1b$&5ih28sQ4i8vWdw^l;tvjaTdn zoXfTk1_Iw=!RsMyy3L%K+k>Djn(&BoGoh&((36*Zm>2}0E>{Yl_mZ=QiKMzTr_oBco?L}8R0bqv&=<`(pVlmBg0k|?m5Sel?(m~5CUDS zx1GR>V0CVswRdO}C{y%U*5B^0n40N~NmBODz-KD;8YPmLQeuO&h}rz^jxw4f-d2r>rtbU!ddCD%%0-3fQc zf=C@-+({+G$zdNh5eM{W9Dd9q^*Hp{_#KIzJNO$rj}TIyh^&Z~;)|R<;(eKR`gLRW z@F+-WSu%OM<-jL^Q3qgkOLHkGNsK_p(H$<6iN^X0uqzq}$xLWMtrXC~4PK>eRXoPP zIMT5#WOssnIYmSIIbg~;+emgIatbo#(5M-#UJsgWx$`t7ls9cK_vdwlT1|1F!)M=* zy!Z8Hz=t4CBsTmyQJNY6+6b9mSZC)416OoVzlS9(GZolKjl23a_x8*g(U^ z+nVBNDFeASjHrtd~z?OQlEM#(9=^AxQtfgw(PmE|4qQvF02i_z5+piIA`Rq)L`e`_*KQU& z1xKWOND(cLW|FAq?thy0qE}|$pA0FV8SJ$Zd!rP;<^F)14XZxQcn+k0*3@YZDYfx) zp6a?+t8Ifz7;0D-R0OgrS~jk&@vI52KUhq&7=|+%khHlRV?(A5h7|{&(67%$tQ;3+ zZZbALIX5Jh0xi)jJ9O6HXn0MBC@%RjP7hZc`7rHzwY*-6oGF#ohHsh<>EC&(+72po zZt>Xt=%d@l*xnDE&|Fb2m%xB!NI%zn-_x@OM~i{YKr z`>cCcVH#|{b=c5N$)DU$>4UoAVVnZ=?7GMnLKCQWm;}B$gA}E=`8dnt> z9{=TIS;GRflZTl}nKS99*gAclqz1NE3;Dj?VttNw&eWl(0 z5=Xn*8DDb${gBo7YQIiJ(~Cm6wQxw-2}H7G$9WtQ7GUSDGKpRgm_z(*6Fm6IZ0znQ zl6_i6>xx8>yDYPsQ-7$+6wWM@;`c?H&}nTRIxV(oK_UkH=AT4CtlWoSzJmImW5zVBR%80I9@*WdjOdf!tNOsuxWYsmS8He!GtYgJx2jG$USq@ zA}j%b%!%Abpgz#aRl=(liYdG-*DF8Laf#vy^{UOaIck|O7Wdh3)dGZiIB zrJ(1Hew&Bz323u@y}2VoJAS)w+&@J3*oNW%vkkAMmuFXs_TLq;9+M*BWxq&?mB3aC z)2Lv%w$cVyNn(m7=pJ&e6tPX4w*QAkl+c7v;vu4Z=P>CCX`CH6Eq7y{w4V7dE=!)`C;{VR0L_kB?=W5v7dbg5{NwCS{caA| zz3unx?&9fLqYlh%{wdL$0gSl$Q#O0v&f8=PNT-!#a<9$QC$$dk~ z!ObF+PQa-X#*Sm;n5>DQ0B%(|qOAyH1poOX45ZRyaiVJ-?sC*~nqV)BFLRJTtlu6_ zgB}XxkK5@CT6)6+GC5GC6K9<+I5T~uuVQ|bI|KdaCxOm;s^)NFd_yEkWA8&K#eUK; zbulk|i6lQ;$w9I@><5W_kM)Nl()Eb6l-*s}nvdA*R=LRJcB_u2OzSQiOhK_j+#s_2 zP6!pbhfD0U{luqwyrBcn)ZLuo&vpJvduFsVu*$53dujT4QqYeUXmwwfg_ZBtrCxd$ z)LXFSVt&I}OC364%@a_Zh!{gB9foC0#QG(TRG~Nkg)tpX00iXX#H#p8C05L;!%WAl zxKhlK&WsdEi${xNt{5s2RfPfvh~>%3#CJZ;JH9wRZR`HmaQnf)Dr7=H(%Pkt>vNUS zU!P+^$epKqk8PK&==AN!$LG6qR{z4^XR$Nx=xZ@o$OLRgX0}$5T)axC-|Qo*8A1jN zV<`_gd@NkeLXxh}XSe1()mzU3lUP*UD{Dkr%>Lc6 zpXutq2OJSUi}XL^bT3_HdJhYmS2IQNwRX@Wd~ep+lHXaCOoU=jvsuOH#hk>PymBGc z!S}NfX11pjLh=e4OL)w(dA>Ky4Y~F=fpqol-DBhLMK8MgO{{6$&(#OZb!gh)tm<%e z|99#&?+p!&$;E>Zpbxj)JQOzR;ASz#icKucoow-YC%nC!j178?I;b`NPw=Vym^~2% zyb=WNH=`^qC8r6?P;MDRCEu?M4x+%2f_5>+w^ihGpXk#ig4XQ}HM!1{19y$%^)T;8 z6oQpZSH{`aZNN`OTKzvZsYOe`h>(N`v9&6Bl9jFYDKiYw5Y@b4Vq`2^9x+5(*%)F= z1!;Bhj^S*>7w*>uqYh^mn!I9%Ry4{5UgaW=#a*-BvV=c#0U-(cu1KQdRRAheL}|># z46E}$top8E*mkK6unB#!h-xvV9@yw6>AfTJmCl}|-)tH+2?ed+Q2WSa3LUU+4wJV^ zKpgccJMNP<5}bf9sJEN*dIPMVS01<@w5Y%JyST~_vv?ir5vkV}M%I}D`DIdzM$irC z`?jNI@k?wg@xC5iMH@UXa%QP;0xG}6s0^O=mRB5kgGao6{B?GjGiAta`11L(7l-N1_ z#STeU)Rf#iZxSw9No%e1v1!af7x1*gqRRF)4BreFF`pO9wORhF5Skx+)GA*DZO$no zO{tGB)~MpJ-qJQ8S`aU?LN%ki?1s!zV2J7|ID`-rJIRZl&t&~9?7Voxkwk(k%^GcV z|JuL@-=%zTyEXgrnv*##sjN>kVg&OxbtIUFlUQgACuTS~IpDK#*jP1@dAS+(w>8Zc zHuYtqSWUn&yf${KHZ5dUY^J<3QUd>)kyl`?g7h;!;1`@CYT-9G1hqt6mNf2g6>y{d z^w8TW>nVbnY|U+joN2MDef8XF0HZi+7o$`_sSPIH7uY<(7Xhnj(b4+&obDGkwY<*Q z1E0umqD4Z+8918J0ukrvLTXpzWTsm<8~>F~5j-~=>*=5?i9JdPDi0_T#{|6{`DY)eQF>2-$7!^E-AR+WE7&-#xzaIANE z-(^1qmj*2sJ%jlav)XXQO31J;ypNDpGA6KcLSfJ^(U$)^R_C-qID9rIDb42?lF9FM z3vwCOPDmj*!YRL7n8YUmO_rhv;SA?Y7Fr2ow!u>v(4x#L&(leN9)~VCTxCg0z;Rt zR=qEaXIDzsp3t>)?0%A)2*LHI44KL~igr^JxVo*@J)C8S*%+!tqtZGCZk& z704mGt5428*C-g8Oa+Vo0m#izi$;mZ_LHN&1q!iwg4tgOpl@Ycb8Bm#;*lL2Az!4-MA~A}H`bt^*t{!i7`VQ~{cPd1`Iu&D zZAxmR5rfjOv3Q~QN5JWa!jd0yM3#Fc?h)F>Id9B4~l5fky~lZkVMvqO%o2~g_9}VW__%&Jwe-?? zJj`XBZxB&``>FRM8Y6LKoiqEu)a(p?3~9!!GIZNX-o!lgdL#%jH7kcRAxx@v`Z9I< z`;Q`P&FS|Bb#AU1FzF>9acu2*jzx=cov!gW%FoS$-#;FwuRjO0UHh3x20><=7!X;B z58%y0&>qW!$fSJc&1bPx3|r%5E=2*7w%!?2!nbkZ)A<8#aWrF&caNN?0QY5jtoqn6 z)W4^}{rZN3LHnwVbebW>n$1hts$O}C-!!7=qSOE@Rt(!g3?+jn<`atEDABe$k?jL4 zSDf3L>6f`e2}c4g-myil!N+j(ze^W+Z`n9)^`-K58RYV{g5QE{$gXc~ms@+!TUg!X zRpKk>y^%TVkFX~j3o$5%6LJbq8+?}GQ>znFl9P!`%CEkDH~Z#xsrWrnX6K8p7R8va z7IMhZH5;~B_+TC(uC_4{($PsgTpuf;r9ZqEmcUFM?4iu6v?ke~i~iOD=gLPFE9Ig= ziafBNu{=MEiS>R1JEku z_C@&24F#VH(+gaY{j;>0x5YlsSZTLn-#hy0_$u2gy#NqjiIG14-Wg?(t}N{ zo!a8jgXs5f8dlk-W3)d7J%iFWTv>+c<=Xc~u4!VJ`@-`q2wLlTA-fOQ-_&RMPM@uW zJAgf2bUFiOyQ>dDGtdcloKbd8p(S0~Pcq-yMyyygF?ai}{sxjH&@w06(#~2ye&yy8 z^(`SlT3sxnt!nI&CsNM4LNFpRMHiXd*uIi|?eby%h>%ke zndxwL-Q+qvB|_=wAIy2@O^d$kHZw!>CTZmBnk5yMsSva(Is=O(UCdRxBZ`qFZIY@z zPevPj&fffc8Hu&eQzCO6_ebbe=N(;qLuuxt=3B@h;eJ=&7z3+vKP8U}^thp*T^+TJ z`&=ZJ>B>oOs5I1pP4m^?I^waA#@VVSI4rZ_d1yZ+1^o)i5NX+T%W9$luVhbyI63t) zO<6=452zW`$svb(f9}q)Rf~VfWysBX#u8N}+HKGM^=%g;@#AnoR9Iox2xA%+sVc9t z9DG925%hP98%!(uqa_Bl%7>_nzh75QXd#-No@Hm;95s~Nx&2-j`#4MYd+&q3CR6zG zhLX6$>o(wR`JF1Z)7a*GyyjE!g@=R@hRe#^Zl6J;8+*~OqCdQq%2c+xWWkU@$z#vG zeztu+W4GvI06oig!@3q)9FJiC9|GiWsc2%yN3nfW%f$^%^1B-GdEtrm;(bXn`rlY9 z;mpdbhW=Et%m?Ftmi71eF(TV6;6Y?gA*Sf5q~7@}Xc$2iHPK?rX?H}`I{EQp$%g=} zgSMtK#chP3O`o-@JpuW=`nB;kf{2Lz54g6--m7fpFM(%>^{;7|^{D)xeh;H(!^PNLOg46#EmU%nt5)1ubNr0WI7-C4;Z~N;@wlN~!fN+j zYpfk=XBRJ~y<$I!U4F_QlTm!YZ@O@K#Bc3-5Qj?JajjwYR5_?(<45xKEv^ zugIkv97;Ib-cKjF0zAHul3EdIBQT{cKdZn9Wd7dCdB+$dkX5WePx3R0%OfyPL8eaK zRNQm5&-qlF4+e(F>wo_Oup42B1>`BHb$eF>Whu z#!B|tGJ;r(x)`%OW+)u8Ute{Z`5C|RDPchB%B8Q!rJtDc!DXDNuf|l>4cY545xi`4 zw_Iu>qGz^p$Y;qXAX;ujOOJRra~QJjP4KINw*bm$#*y^v5^(F=|9{H4%C9IKrb|k* zv?u~Uq)S4&yURtod+9ETl@93!>F(~7Sa4|&2}KsEC8Qgc-G}$@ct6d@d*+@wbEfVf z-A-=P;a4^ZJv8Z9ap;==wFmY8)$1B+;<~2^#=JZ4Gru_mOyAN4=+`8#QmdkuE>G+3 zkb{x96A6Qke_~*W4s~tR9<1-691XO{ET47Y1jQZ@F-2EdJBEnkF!&RuRm1;{l9=N5 zSn!Y}PSTl-qE4-vugQ8zcuQ4q-znNN%;N_%7?G@MhnWKc!D-yXOemrI*TvUXDa>l5 z1#{reD;IZHJ`*fABgybSDTk2ucsBv(AA$-r8g{vj?#(dqo1m$;xKH&q?JhZ|Gl5qN z%7I%gtd56xYAali3fU9`u&Gw#$i@O$82m(el3dhr{?*lhvP;B%{D=3Go%@wgA$ziY z;0Q?ZePj3I)y(q=^@K2M4Apw4emk*g{ds}i+KmwdwXF)mlPwamA+%B``h{U9)r4Wn zp^jtj{80u!iTab@`MRG=X4li7F5V8jObHG`gQk5Q>(-y3c%MsJWSus+y8ezP1QYG< zFZ56u=`Fs}y@yeDpKvXH8rtZg@~fqkceI_pbU(UA$d?38>&;d@ zra)7|KT5l9Y>IouPVzR#Q(o5q>y(7%Og^ZYG^%Uu^qrHu`i`!{?Ag`zl#U)3wlN0O zP%fi>T^A?pBtu!iqOvz0+lA{ER)D7 zL>uaP&ud+U)lQC-6KLm`{DGAMIaV-%Z^F&UW<@F3C$fCK2jQnkEYz{dNp@?-P?Qkb z=jf}2H(|LKGVwpxMkcBIkIu&>+%YX#d+5HB$zl~@EboMNyjkt`DCW^d6*{Uc;xpsp zVThF4QqsJ=lbzot5hL}9XS2h_B_JaxTVv=W>*7t116AU59ZW~EFf_^u{BGvytl(; z%*5P%2yxNiL5JV@ei`|5viT`EjXIlc^WT-NUcJ>MTUN69wdqlSgNFrMRF&H|%3V$& zoXdxmU4|V6Nw!r~)p7zg)-+jnjPOodr-eHRYIh7!DnD_?0BH{>4ECLy@rY?)3ywS z=5~?n^y|HysxVN|f7ppt9V5v=RDeeJcwr+KwF99kUqkI0M&vmhnwxCSdZ%w(lI`ac)hC7F zAc~b=A*L14`Hv;l!Xir`r~%q54zxE|AJpU^kzR2zQunOQzgs6`-GY)|Kr3Glr$!?N zypyG8D=y&&y~NI5$0Ho-@ly0PWmR&q$KeL+zT&XULt(GOEJi?O=muzqjIA`w*C(++ zV-7(-bUWM?yjL_LrL=S-fU)$LbwJdnjiv@zOo zjDW&Ad)Sm?+uI}u@8Ay2?3Rkv8J0|+O!aCpqa0WNZ8orSRuq zTkW1Xagnid*;fIZGsxi3zdvEzLq)%yfpfi2duk~F7X30upMXC%W9V81snk!dA9Dt< z69j!W7>vo8NpvS=Y1phOZo+LkS9VE13h>!wnyM65W48#I#6wI=sNRZ&=@rLlJd6_d zmnhaKHmmUs4ax@}zJ08gxg0*%{fn+~%V=j@y*EA`JqEbgda zXsz6O3QH-6m@!XJ8H*_R5sYo-wBO-qYpxy_ATelY+0W{j$fm9lwqZBp7`yh0m8nQ_ zpOTF`W>*YI{6=$hhdz^qMX>vXE?|LndXklRmT`+wj48ppx}4axn;Z|UgSI3JDbvpz z*XJT5*)9g(f}rdJlcE`992KNRGu#>Oj_pc7g`Pr=S3oaN+?^ZL`c^E+fCtIAseUt> z?CR!mE6HP{6;Wn=5Ovh|DDaco<^A+K+;QVt4snL2dM(2OEf9y5g{7!PO4@i7c4_o| zXxTh_+AmQ(FKS_VL_SBL03JE*>*SLVqf9%@fG}S)^mJe$kjBd#(1^i@gk(**OL|Qm zAvF)d`?)p~QaU_)SKE98Y@K^k2x6(pRv27Wqh{rY2fQuyD5t7!_oqTa^b$ z`SAr^9%YEM^p5v-d>nuq{?t*wiB-n?#EYLe3fl#aHEL~+ebE2P$6 z7Mi`qK|Aq_bBA)PX~bNi%OBX##XXob!P zJ~!yp)EWuJ{{p#}r`acARPbt!Laz{%+9jn{Wq(A+eRiGm9_Q(iiQVL1MXZVf=>i`x z=KH~nP4MsYuert4jH|H#%bQDI%e(!bRKn;4HPTaqRB)w=ms(%#r$p#q z3_=q1;>3g-N(6%l{>7eU5FHX?4X0N=mStxT*Ey2xKdkh4|JEc$X1c_ zb-^m^cg0&^IwLeAxqP2wsQ4npD9{e`?pGjWrmK15-I{(pZACY4QA;d3J^3Zc{Sfe> zhMx4kf#>=Od^(#AjY$Ll#D0FsgIax=d;i&hcq|+@T^(x@d_1h_=sGJTj$^zo;}DC)29M!_#o>@`P$(YC+z8EM*z0F7|Vpl3#6BGKVs zRkG9^TX}4N_U~I4v%`Z%yeydpisNO$N-^sQc%MZOz4Ex=9Wgv8Hf-mUocMNQ_PXh( zTOP7O#}lhl)pN$vrytsq9-f2AtS#nx>mj!3i5uRgj>t=c{tNZNWtiq4>5yCcr@z0O z#>PerB?8rW3CY7$Dfp)kVlsU9jE`K9f`~vphoYf`akMUVoc(^xce=Cb{0N0G10e4#f{ao(vdF&)M|Z`4`U69aO)UDI8l`~J&*po) zHS*z9uBgRRGxdu(7Bke%FPx9eS6Ja}R0HzA@mcx${Mj`<&@-bc%t#Yv)2u0>%RB7W zx+5&ZB6HuD6NXpkkyXH%ELqP=tqG75S&mYFA?Ul@c2Oq*Uv~Ohl z^`&ijNec6Um?}7(s}gXQ@|gIcvHU6rxonbE@<7pnUn>HtL z&$QA@T;rUkFH%I{Igw0TQCnMY6H_Aj(%XE)WqhI5YQU}9hKf6i;vl?A@p*2oed_++ z0Iw>VYHzcWlimNnkJcc@G;JzAVBdGMBW00+-f^{97q-ANm9(y>vj(2~eS#3Bp@*TT zqw*?ctM*ycmGjVyR$b4*m1OYB6TnibE;46^zstWfV21$E($xmBP)+66*cv>%tS`j7H>71X0veq1L*RlofOM?FM0I1%sT504II>hSL0`YGu$53z{@bI>o0Z3Y4$B+vkp1C;YxU)sIBxkXv~X0Gn8~{ zqqBz7>$R8VDeAUZI8$v$?^fHdfyC<0#&^msD=uv58NL=i$aMU3+~ZD%q(NPV53QlU zyr4=ed}}aNZILF4_YYgUbf^B|fL`=TGP3%nrXL@p_l+wvtz07GPN*xe%bMrxcdL8r z>W@VI0uvea*y^gDiS9R)^LtPwwIhUgcGW0KK0aRVn!rR}JRF zzDK=m3hqEd$i`PSl7?PxI}`J|4c$GuH#LUSo$-}0(|8=#T6YeOk~<83Bew{q z{(u)e#@%>XIdmS<|2T9H9XhK$f3!Q!Alif^B(;m(DM4f;YY$XRi%wf;-emXf;(Trr znYnKIBKG(2?c;q{5iqrYxVaTS^>o`*=4vcj5GcwKNoPbTf(1F8G<|3X5btLK9}w z$6Vvuvb>qlOake5%L9~OeKWZ92J7qqx8Ia8l{b#!vt`2X08VH)x?wS)5pkpSvZ|?= z^jj3xNh3+Ay?}(iLTIalfJN)#Q%ou(zNI0yvc{=?p<?XXH-)$PVpqEF@?-@$2S6J2=3|H(ds_+3jTBVwP5)H)Spe?{`!%+ZZi#OMU)>q( zyll$m&OEAFC?~nVSn0`R<@gejU^^EIl&c%I=8|$it9=n;O-rs9xm|`gp&ZYMzN}Bi zs=S@pw9*!E`zVco76jhD7B|{XFG5PpfD-iN`uqz{hfqO|KFMm5`i|{sTx~38X1Ade z`$L@0J74qM@l^MMbP*Nc%PKG;>HSLMR(tfILx$yR%(8(Hiwe>oAmZ_B)|uvjBU?uX(9L^dU!*Jm5bTH`lPo@vh4E+LDPM$!pI!W^5@dC&`4`i;C&$fz{5B3eGsMZ~MC#IkE zhX5Jm@V4n(jc+lpw$nsSWkBhqcJ5K}s=`NTyAOO~*Nc*b}~Li&!4&@wok zZ_feRh3`;)QC`@0_IArlfPcwK|2RFAWbpK2v5JUYhw-CY(Sym)m7&7KzH@YlvI)ON z(q(69+auIDk9HuN$gxngMn+P&nc_@YM(~X3g-U6o8JZ^c02j5v;(H)yCdoON* z(3O&`UE7C%vtmjl zO-g44eyZ^*yLOw7&}W)hK>69X7$Q@j9t6^?7H}48Vd7r@F;s@kmurk-*Wy#x!X>&b>pu>fWHMs%FlsMM z-`F=buiYBQHOM})FMt#&B{=!cEJ7zjc3}gV(vq)%9vO1(ZSlX zWX?#TR^=-}C&x&u18BAxD@U-f!Y+ zB!>QvUE7ns?ZzK8G&I`2dQs#T14Zy@S>g_iv{6kw(sZ&iTvme>bAv+55*;=Q{3yBq fH|7pifWiUP*nCEhZhijTjE1JFsHM;-XBqxKdQ23F literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/ice_spear-2.png.import b/Assets/SkillAnimation/ice_spear-2.png.import new file mode 100644 index 0000000..3c1483a --- /dev/null +++ b/Assets/SkillAnimation/ice_spear-2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ice_spear-2.png-2ac56cb1417d84f4934144826ebd5e68.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/ice_spear-2.png" +dest_files=[ "res://.import/ice_spear-2.png-2ac56cb1417d84f4934144826ebd5e68.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/ice_spear-3.png b/Assets/SkillAnimation/ice_spear-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d41d0ce729f2217169f7cc885721a7e7dd4a8480 GIT binary patch literal 20287 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�!L-@LaYT_nba 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 bXh84-{ysZ>dGWIkbpWe-f0+?XyyE@`_#gIi literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/ice_spear-3.png.import b/Assets/SkillAnimation/ice_spear-3.png.import new file mode 100644 index 0000000..a7748b3 --- /dev/null +++ b/Assets/SkillAnimation/ice_spear-3.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ice_spear-3.png-f05297fe0b1015db0c423258b10854d8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/ice_spear-3.png" +dest_files=[ "res://.import/ice_spear-3.png-f05297fe0b1015db0c423258b10854d8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/ice_spear-4.png b/Assets/SkillAnimation/ice_spear-4.png new file mode 100644 index 0000000000000000000000000000000000000000..7f75f55f980d9b17df6c5d2269e0deecff4e6eeb GIT binary patch literal 30492 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%0D64gVD2u*EC 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 z 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

l8hP&Qm`A}fYy(kJ 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%0DPRB;M2J**w(lLczOrypW98wQ;!agIw?4 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 z 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/roundhouse-slash.png.import b/Assets/SkillAnimation/roundhouse-slash.png.import new file mode 100644 index 0000000..c45204f --- /dev/null +++ b/Assets/SkillAnimation/roundhouse-slash.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/roundhouse-slash.png-8194ab7ba1d330f17df8f9dfd3e6468a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/roundhouse-slash.png" +dest_files=[ "res://.import/roundhouse-slash.png-8194ab7ba1d330f17df8f9dfd3e6468a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Assets/SkillAnimation/super_arrow.png b/Assets/SkillAnimation/super_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d61581827b02a7f5da42c79586d8d426644c12b1 GIT binary patch literal 38687 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 I>JAbA1N3@GMgRZ+ literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/super_arrow.png.import b/Assets/SkillAnimation/super_arrow.png.import new file mode 100644 index 0000000..ca983de --- /dev/null +++ b/Assets/SkillAnimation/super_arrow.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/super_arrow.png-c8853dbab1a97b880a75245e7cae8153.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/super_arrow.png" +dest_files=[ "res://.import/super_arrow.png-c8853dbab1a97b880a75245e7cae8153.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Scripts/Auth/PlayerProfileSnapshot.cs b/Scripts/Auth/PlayerProfileSnapshot.cs index 1230a45..48ebabc 100644 --- a/Scripts/Auth/PlayerProfileSnapshot.cs +++ b/Scripts/Auth/PlayerProfileSnapshot.cs @@ -477,6 +477,34 @@ public static PlayerProfileSnapshot FromDictionary(Godot.Collections.Dictionary return snapshot; } + private static Godot.Collections.Array EncodeSkills(List skills) + { + var array = new Godot.Collections.Array(); + if (skills == null) + { + return array; + } + + foreach (var skill in skills) + { + if (skill == null) + { + continue; + } + + var dict = new Godot.Collections.Dictionary + { + ["skill_id"] = skill.SkillId ?? string.Empty, + ["name"] = skill.Name ?? string.Empty, + ["cooldown_seconds"] = skill.CooldownSeconds, + ["display_order"] = skill.DisplayOrder, + }; + array.Add(dict); + } + + return array; + } + public Godot.Collections.Dictionary ToUpdatePayload(string sessionId, int sequence) { return new Godot.Collections.Dictionary @@ -492,6 +520,7 @@ public Godot.Collections.Dictionary ToUpdatePayload(string sessionId, int sequen ["inventory_items"] = InventoryItems ?? new Godot.Collections.Array(), ["discarded_items"] = DiscardedItems ?? new Godot.Collections.Array(), ["equipped_items"] = EquippedItemsPayload ?? new Godot.Collections.Dictionary(), + ["skills"] = EncodeSkills(Skills), }; } diff --git a/Scripts/Characters/Player.cs b/Scripts/Characters/Player.cs index 23bb1a6..ee8b165 100644 --- a/Scripts/Characters/Player.cs +++ b/Scripts/Characters/Player.cs @@ -502,7 +502,29 @@ public void ApplyProfile(PlayerProfileSnapshot snapshot) PlayerClass restoredClass = PlayerClassData.Deserialize(snapshot.ClassName); SetClass(restoredClass, rebuildSkills: false); - _combatSystem?.SetSkills(BuildSkillsFromSnapshot(snapshot.Skills, restoredClass)); + var newSkills = BuildSkillsFromSnapshot(snapshot.Skills, restoredClass); + + // Check if the new list of skills matches our current skills in ID and order exactly. + // If they match, keep the current live skill instances to avoid resetting their local cooldowns. + var currentSkills = _combatSystem?.CurrentSkills; + bool skillsMatch = false; + if (currentSkills != null && currentSkills.Count == newSkills.Count) + { + skillsMatch = true; + for (int i = 0; i < currentSkills.Count; i++) + { + if (ResolveSkillId(currentSkills[i]) != ResolveSkillId(newSkills[i])) + { + skillsMatch = false; + break; + } + } + } + + if (!skillsMatch) + { + _combatSystem?.SetSkills(newSkills); + } // Re-broadcast HP to refresh HUD after profile application. if (Attributes?.HP != null) @@ -587,69 +609,20 @@ private List BuildSkillsFromSnapshot(IReadOnlyList continue; } - if (string.Equals(snapshot.SkillId, "basic_attack", StringComparison.OrdinalIgnoreCase)) - { - var basicAttack = new BasicAttackSkill - { - EffectRenderer = new BasicAttackEffectRenderer(), - }; - skills.Add(basicAttack); - continue; - } - - if (string.Equals(snapshot.SkillId, "bow_attack", StringComparison.OrdinalIgnoreCase)) - { - skills.Add(new BowAttackSkill()); - continue; - } - - if (string.Equals(snapshot.SkillId, "fireball", StringComparison.OrdinalIgnoreCase)) - { - skills.Add(new FireballSkill()); - continue; - } - - if (string.Equals(snapshot.SkillId, "triple_fireball", StringComparison.OrdinalIgnoreCase)) - { - skills.Add(new TripleFireballSkill()); - continue; - } - - if (string.Equals(snapshot.SkillId, "giant_fireball", StringComparison.OrdinalIgnoreCase)) - { - skills.Add(new GiantFireballSkill()); - continue; - } - - if (string.Equals(snapshot.SkillId, "triple_arrow", StringComparison.OrdinalIgnoreCase)) - { - skills.Add(new TripleArrowSkill()); - continue; - } - - if (string.Equals(snapshot.SkillId, "ricochet_arrow", StringComparison.OrdinalIgnoreCase)) - { - skills.Add(new RicochetArrowSkill()); - continue; - } - - if (string.Equals(snapshot.SkillId, "flying_sword", StringComparison.OrdinalIgnoreCase)) + var skill = CreateSkillFromId(snapshot.SkillId); + if (skill == null) { - skills.Add(new FlyingSwordSkill()); - continue; + // Fall back to remote skill mapping if it's a remote/external skill not recognized locally + skill = new RemoteSkill( + snapshot.SkillId, + snapshot.Name, + snapshot.CooldownSeconds); } - if (string.Equals(snapshot.SkillId, "defense_stance", StringComparison.OrdinalIgnoreCase)) + if (skill != null) { - skills.Add(new DefenseStanceSkill()); - continue; + skills.Add(skill); } - - var remoteSkill = new RemoteSkill( - snapshot.SkillId, - snapshot.Name, - snapshot.CooldownSeconds); - skills.Add(remoteSkill); } EnsureClassCoreSkills(skills, cls); @@ -720,6 +693,36 @@ private static string ResolveSkillId(Skills skill) return "defense_stance"; } + if (skill is MagicSlashSkill) + { + return "magic_slash"; + } + + if (skill is IceSpearSkill) + { + return "ice_spear"; + } + + if (skill is DigitArrowSkill) + { + return "digit_arrow"; + } + + if (skill is SuperArrowSkill) + { + return "super_arrow"; + } + + if (skill is RoundhouseSlashSkill) + { + return "roundhouse_slash"; + } + + if (skill is KnightExploseSkill) + { + return "knight_explose"; + } + if (skill is RemoteSkill remoteSkill) { return remoteSkill.SkillId; @@ -790,64 +793,19 @@ private static void EnsureClassCoreSkills(List skills, PlayerClass cls) // Remove skills that are not allowed for this class skills.RemoveAll(s => !allowed.Contains(ResolveSkillId(s))); - // Ensure the class's primary skill exists - bool hasSword = skills.Any(s => s is BasicAttackSkill); - bool hasBow = skills.Any(s => s is BowAttackSkill); - bool hasTripleArrow = skills.Any(s => s is TripleArrowSkill); - bool hasRicochetArrow = skills.Any(s => s is RicochetArrowSkill); - bool hasFireball = skills.Any(s => s is FireballSkill); - bool hasTripleFireball = skills.Any(s => s is TripleFireballSkill); - bool hasGiantFireball = skills.Any(s => s is GiantFireballSkill); - bool hasFlyingSword = skills.Any(s => s is FlyingSwordSkill); - bool hasDefenseStance = skills.Any(s => s is DefenseStanceSkill); - - if (allowed.Contains(PlayerClassData.SkillIdSword) && !hasSword) + // If the player currently has no skills (newly initialized or class changed), + // populate with the class's default 3-skill loadout. + if (skills.Count == 0) { - var basicAttack = new BasicAttackSkill + var defaults = PlayerClassData.GetDefaultSkillLoadout(cls); + foreach (var skillId in defaults) { - EffectRenderer = new BasicAttackEffectRenderer(), - }; - skills.Insert(0, basicAttack); - } - - if (allowed.Contains(PlayerClassData.SkillIdBow) && !hasBow) - { - skills.Add(new BowAttackSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdTripleArrow) && !hasTripleArrow) - { - skills.Add(new TripleArrowSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdRicochetArrow) && !hasRicochetArrow) - { - skills.Add(new RicochetArrowSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdFireball) && !hasFireball) - { - skills.Add(new FireballSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdTripleFireball) && !hasTripleFireball) - { - skills.Add(new TripleFireballSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdGiantFireball) && !hasGiantFireball) - { - skills.Add(new GiantFireballSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdFlyingSword) && !hasFlyingSword) - { - skills.Add(new FlyingSwordSkill()); - } - - if (allowed.Contains(PlayerClassData.SkillIdDefenseStance) && !hasDefenseStance) - { - skills.Add(new DefenseStanceSkill()); + var skill = CreateSkillFromId(skillId); + if (skill != null) + { + skills.Add(skill); + } + } } } @@ -882,10 +840,19 @@ private void ApplyClassSkills(PlayerClass cls) return; } - var current = _combatSystem.CurrentSkills.ToList(); - EnsureClassCoreSkills(current, cls); - _combatSystem.SetSkills(current); - GD.Print($"[Player] Skills rebuilt for class {cls}: {string.Join(", ", current.Select(ResolveSkillId))}"); + var defaultSkills = new List(); + var defaults = PlayerClassData.GetDefaultSkillLoadout(cls); + foreach (var skillId in defaults) + { + var skill = CreateSkillFromId(skillId); + if (skill != null) + { + defaultSkills.Add(skill); + } + } + + _combatSystem.SetSkills(defaultSkills); + GD.Print($"[Player] Skills rebuilt for class {cls}: {string.Join(", ", defaultSkills.Select(ResolveSkillId))}"); } ///

@@ -1026,6 +993,11 @@ private void RestoreEquippedItems(Godot.Collections.Dictionary data) /// public bool IsAttacking => _animationController?.IsAttacking ?? false; + /// + /// Expose player's facing direction (1.0f for right, -1.0f for left). + /// + public float FacingDirection => _animationController?.GetFacingDirection() ?? 1f; + /// /// Update skill cooldowns (called by PhysicsController) /// @@ -1082,6 +1054,75 @@ public System.Collections.Generic.List GetEquippedSkillIds() return ids; } + /// + /// Creates a Skills instance based on the unique skill ID string. + /// + private static Skills CreateSkillFromId(string key) + { + string cleanKey = (key ?? string.Empty).ToLowerInvariant(); + if (cleanKey == "basic_attack") + { + return new BasicAttackSkill { EffectRenderer = new BasicAttackEffectRenderer() }; + } + if (cleanKey == "bow_attack") + { + return new BowAttackSkill(); + } + if (cleanKey == "triple_arrow") + { + return new TripleArrowSkill(); + } + if (cleanKey == "ricochet_arrow") + { + return new RicochetArrowSkill(); + } + if (cleanKey == "fireball") + { + return new FireballSkill(); + } + if (cleanKey == "triple_fireball") + { + return new TripleFireballSkill(); + } + if (cleanKey == "giant_fireball") + { + return new GiantFireballSkill(); + } + if (cleanKey == "flying_sword") + { + return new FlyingSwordSkill(); + } + if (cleanKey == "defense_stance") + { + return new DefenseStanceSkill(); + } + if (cleanKey == "magic_slash") + { + return new MagicSlashSkill(); + } + if (cleanKey == "ice_spear") + { + return new IceSpearSkill(); + } + if (cleanKey == "digit_arrow") + { + return new DigitArrowSkill(); + } + if (cleanKey == "super_arrow") + { + return new SuperArrowSkill(); + } + if (cleanKey == "roundhouse_slash") + { + return new RoundhouseSlashSkill(); + } + if (cleanKey == "knight_explose") + { + return new KnightExploseSkill(); + } + return null; + } + /// /// Translates an ordered list of skill IDs into live skill instances, /// filtering out any IDs not allowed for the given class. @@ -1100,41 +1141,10 @@ private static System.Collections.Generic.List BuildSkillsFromIds( string key = (id ?? string.Empty).ToLowerInvariant(); if (!allowed.Contains(key)) continue; - if (key == "basic_attack") - { - skills.Add(new BasicAttackSkill { EffectRenderer = new BasicAttackEffectRenderer() }); - } - else if (key == "bow_attack") - { - skills.Add(new BowAttackSkill()); - } - else if (key == "triple_arrow") - { - skills.Add(new TripleArrowSkill()); - } - else if (key == "ricochet_arrow") - { - skills.Add(new RicochetArrowSkill()); - } - else if (key == "fireball") - { - skills.Add(new FireballSkill()); - } - else if (key == "triple_fireball") - { - skills.Add(new TripleFireballSkill()); - } - else if (key == "giant_fireball") - { - skills.Add(new GiantFireballSkill()); - } - else if (key == "flying_sword") - { - skills.Add(new FlyingSwordSkill()); - } - else if (key == "defense_stance") + var skill = CreateSkillFromId(key); + if (skill != null) { - skills.Add(new DefenseStanceSkill()); + skills.Add(skill); } } } diff --git a/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs b/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs index fd8aae2..45604ee 100644 --- a/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs +++ b/Scripts/Characters/PlayerSystems/PlayerAnimationController.cs @@ -7,6 +7,8 @@ public enum AttackAnimationStyle Sword, Bow, Fireball, + ArcherShot, + KnightExplose, } /// @@ -27,6 +29,8 @@ public class PlayerAnimationController private Texture[] _swordAttackFrames; private Texture[] _bowAttackFrames; private Texture[] _fireballAttackFrames; + private readonly Texture[] _archerShotFrames; + private readonly Texture[] _knightExploseFrames; private Texture _defenseTexture; private Texture _counterTexture; @@ -68,6 +72,16 @@ public PlayerAnimationController( _bowAttackFrames = BuildFrames(DefaultBowPaths[0], DefaultBowPaths[1], DefaultBowPaths[2]); _fireballAttackFrames = BuildFrames(DefaultFireballPaths[0], DefaultFireballPaths[1], DefaultFireballPaths[2]); + + _archerShotFrames = new[] + { + GD.Load("res://Assets/Characters/archer/shot.png"), + GD.Load("res://Assets/Characters/archer/shot1.png") + }; + _knightExploseFrames = new[] + { + GD.Load("res://Assets/Characters/warrior/super_attack.png") + }; } /// @@ -138,6 +152,14 @@ public void PlayAttackAnimation(AttackAnimationStyle style = AttackAnimationStyl { selectedFrames = _fireballAttackFrames; } + else if (style == AttackAnimationStyle.ArcherShot) + { + selectedFrames = _archerShotFrames; + } + else if (style == AttackAnimationStyle.KnightExplose) + { + selectedFrames = _knightExploseFrames; + } _animationSystem.SetAttackFrames(selectedFrames); _animationSystem.PlayAttackAnimation(); diff --git a/Scripts/Characters/PlayerSystems/PlayerCombatController.cs b/Scripts/Characters/PlayerSystems/PlayerCombatController.cs index 1343c16..7fb5eea 100644 --- a/Scripts/Characters/PlayerSystems/PlayerCombatController.cs +++ b/Scripts/Characters/PlayerSystems/PlayerCombatController.cs @@ -130,11 +130,21 @@ private static AttackAnimationStyle GetAttackAnimationStyle(Skills skill) return AttackAnimationStyle.Bow; } - if (skill is FireballSkill || skill is TripleFireballSkill || skill is GiantFireballSkill) + if (skill is DigitArrowSkill || skill is SuperArrowSkill) + { + return AttackAnimationStyle.ArcherShot; + } + + if (skill is FireballSkill || skill is TripleFireballSkill || skill is GiantFireballSkill || skill is IceSpearSkill || skill is MagicSlashSkill) { return AttackAnimationStyle.Fireball; } + if (skill is KnightExploseSkill) + { + return AttackAnimationStyle.KnightExplose; + } + return AttackAnimationStyle.Sword; } diff --git a/Scripts/Core/Data/PlayerClass.cs b/Scripts/Core/Data/PlayerClass.cs index 20fec76..c8240f7 100644 --- a/Scripts/Core/Data/PlayerClass.cs +++ b/Scripts/Core/Data/PlayerClass.cs @@ -109,6 +109,12 @@ public static class PlayerClassData public const string SkillIdRicochetArrow = "ricochet_arrow"; public const string SkillIdFlyingSword = "flying_sword"; public const string SkillIdDefenseStance = "defense_stance"; + public const string SkillIdMagicSlash = "magic_slash"; + public const string SkillIdIceSpear = "ice_spear"; + public const string SkillIdDigitArrow = "digit_arrow"; + public const string SkillIdSuperArrow = "super_arrow"; + public const string SkillIdRoundhouseSlash = "roundhouse_slash"; + public const string SkillIdKnightExplose = "knight_explose"; // ── Allowed skills per class ─────────────────────────────────────── @@ -119,17 +125,17 @@ public static class PlayerClassData private static readonly HashSet MageSkills = new HashSet { - SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball + SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball, SkillIdMagicSlash, SkillIdIceSpear }; private static readonly HashSet ArcherSkills = new HashSet { - SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow + SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow, SkillIdDigitArrow, SkillIdSuperArrow }; private static readonly HashSet WarriorSkills = new HashSet { - SkillIdSword, SkillIdFlyingSword, SkillIdDefenseStance + SkillIdSword, SkillIdFlyingSword, SkillIdDefenseStance, SkillIdRoundhouseSlash, SkillIdKnightExplose }; /// @@ -269,6 +275,60 @@ public static string GetSkillListText(PlayerClass cls) CooldownSec = 8.0f, }; + private static readonly SkillDefinition DefMagicSlash = new SkillDefinition + { + Id = SkillIdMagicSlash, + DisplayName = "Magic Slash", + Description = "Strike with arcane energy, cutting through magic.", + Emoji = "✨", + CooldownSec = 1.0f, + }; + + private static readonly SkillDefinition DefIceSpear = new SkillDefinition + { + Id = SkillIdIceSpear, + DisplayName = "Ice Spear", + Description = "Launch a spear of ice that pierces and freezes enemies.", + Emoji = "❄️", + CooldownSec = 1.8f, + }; + + private static readonly SkillDefinition DefDigitArrow = new SkillDefinition + { + Id = SkillIdDigitArrow, + DisplayName = "Digit Arrow", + Description = "Fire an arrow that passes through obstacles and enemies, traveling a set distance.", + Emoji = "🏹", + CooldownSec = 1.2f, + }; + + private static readonly SkillDefinition DefSuperArrow = new SkillDefinition + { + Id = SkillIdSuperArrow, + DisplayName = "Super Arrow", + Description = "Fire a powerful arrow that paralyzes enemies for 5 seconds.", + Emoji = "💫", + CooldownSec = 30.0f, + }; + + private static readonly SkillDefinition DefRoundhouseSlash = new SkillDefinition + { + Id = SkillIdRoundhouseSlash, + DisplayName = "Roundhouse Slash", + Description = "Spin and strike all nearby enemies with a powerful slash.", + Emoji = "⚡", + CooldownSec = 2.0f, + }; + + private static readonly SkillDefinition DefKnightExplose = new SkillDefinition + { + Id = SkillIdKnightExplose, + DisplayName = "Knight Explosion", + Description = "Create an expanding explosion at your location that damages enemies inside it repeatedly.", + Emoji = "💥", + CooldownSec = 30.0f, + }; + /// /// Returns the ordered list of all s that /// the given class is permitted to equip. Used to build the skill-equip UI. @@ -278,11 +338,11 @@ public static ReadOnlyCollection GetAllSkillDefinitions(PlayerC switch (cls) { case PlayerClass.Mage: - return new ReadOnlyCollection(new[] { DefFireball, DefTripleFireball, DefGiantFireball }); + return new ReadOnlyCollection(new[] { DefFireball, DefTripleFireball, DefGiantFireball, DefMagicSlash, DefIceSpear }); case PlayerClass.Archer: - return new ReadOnlyCollection(new[] { DefBow, DefTripleArrow, DefRicochetArrow }); + return new ReadOnlyCollection(new[] { DefBow, DefTripleArrow, DefRicochetArrow, DefDigitArrow, DefSuperArrow }); case PlayerClass.Warrior: - return new ReadOnlyCollection(new[] { DefSword, DefFlyingSword, DefDefenseStance }); + return new ReadOnlyCollection(new[] { DefSword, DefFlyingSword, DefDefenseStance, DefRoundhouseSlash, DefKnightExplose }); default: // Adventurer return new ReadOnlyCollection(new[] { DefSword, DefBow, DefFireball }); } @@ -296,9 +356,9 @@ public static ReadOnlyCollection GetDefaultSkillLoadout(PlayerClass cls) { switch (cls) { - case PlayerClass.Mage: return new ReadOnlyCollection(new[] { SkillIdFireball, SkillIdTripleFireball, SkillIdGiantFireball }); - case PlayerClass.Archer: return new ReadOnlyCollection(new[] { SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow }); - case PlayerClass.Warrior: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdFlyingSword, SkillIdDefenseStance }); + case PlayerClass.Mage: return new ReadOnlyCollection(new[] { SkillIdFireball, SkillIdMagicSlash, SkillIdIceSpear }); + case PlayerClass.Archer: return new ReadOnlyCollection(new[] { SkillIdBow, SkillIdDigitArrow, SkillIdSuperArrow }); + case PlayerClass.Warrior: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdRoundhouseSlash, SkillIdKnightExplose }); default: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdBow, SkillIdFireball }); } } diff --git a/Scripts/Core/Data/Skills/DigitArrowSkill.cs b/Scripts/Core/Data/Skills/DigitArrowSkill.cs new file mode 100644 index 0000000..dadafde --- /dev/null +++ b/Scripts/Core/Data/Skills/DigitArrowSkill.cs @@ -0,0 +1,35 @@ +using Godot; + +using QuestFantasy.Characters; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Digit arrow skill for the Archer. + /// Fires an arrow that passes through obstacles and enemies, + /// traveling a set distance without being blocked. + /// + public class DigitArrowSkill : Attributes.Skills + { + public DigitArrowSkill() + { + Name = "Digit Arrow"; + Description = "Fire an arrow that passes through obstacles and enemies, traveling a set distance."; + } + + public override float MaxRange => 400f; + + public override float GetCooldownDuration() => 1.2f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + // Spawn a digit arrow that passes through obstacles + SkillProjectileSpawner.SpawnDigitArrow(player, target, MaxRange); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/IceSpearSkill.cs b/Scripts/Core/Data/Skills/IceSpearSkill.cs new file mode 100644 index 0000000..0d9bf7a --- /dev/null +++ b/Scripts/Core/Data/Skills/IceSpearSkill.cs @@ -0,0 +1,40 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Systems.StatusEffects; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Ice spear skill for the Mage. + /// Launches a spear of ice that pierces and freezes enemies. + /// + public class IceSpearSkill : Attributes.Skills + { + public IceSpearSkill() + { + Name = "Ice Spear"; + Description = "Launch a spear of ice that pierces and freezes enemies."; + } + + public override float MaxRange => 280f; + + public override float GetCooldownDuration() => 1.8f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + // Spawn an ice spear projectile + SkillProjectileSpawner.SpawnIceSpear( + player, + target, + MaxRange, + onHitEffect: () => new FreezeEffect(1.0f), // 1 second freeze + onHitChance: 1.0f); // Always freeze + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/KnightExploseSkill.cs b/Scripts/Core/Data/Skills/KnightExploseSkill.cs new file mode 100644 index 0000000..78c6b10 --- /dev/null +++ b/Scripts/Core/Data/Skills/KnightExploseSkill.cs @@ -0,0 +1,35 @@ +using Godot; + +using QuestFantasy.Characters; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Knight explosion skill for the Warrior. + /// Creates an expanding explosion at the player's location that continuously + /// damages enemies within its expanding radius. + /// + public class KnightExploseSkill : Attributes.Skills + { + public KnightExploseSkill() + { + Name = "Knight Explosion"; + Description = "Create an expanding explosion at your location that damages enemies inside it repeatedly."; + } + + public override float MaxRange => 0f; // Centered on player + + public override float GetCooldownDuration() => 30.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + // Spawn knight explosion at player location + SkillProjectileSpawner.SpawnKnightExplosion(player); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/MagicSlashSkill.cs b/Scripts/Core/Data/Skills/MagicSlashSkill.cs new file mode 100644 index 0000000..fed8967 --- /dev/null +++ b/Scripts/Core/Data/Skills/MagicSlashSkill.cs @@ -0,0 +1,83 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Base; +using QuestFantasy.Core.Data.Attributes; +using QuestFantasy.Core.Systems.StatusEffects; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Magic slash skill for the Mage. + /// Strikes with arcane energy, hitting nearby enemies. + /// + public class MagicSlashSkill : Attributes.Skills + { + private const float DAMAGE_VARIANCE_MIN = 0.9f; + private const float DAMAGE_VARIANCE_MAX = 1.1f; + private const float DAMAGE_REDUCTION_FACTOR = 0.5f; + + public MagicSlashSkill() + { + Name = "Magic Slash"; + Description = "Strike with arcane energy, cutting through magic."; + } + + public override float MaxRange => 100f; + + public override float GetCooldownDuration() => 1.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + // Determine aim direction (mouse position or target position) + Vector2 targetPos = target != null ? target.GlobalPosition : player.GetGlobalMousePosition(); + Vector2 towardTarget = targetPos - player.GlobalPosition; + Vector2 dir = towardTarget.LengthSquared() > 0.0001f ? towardTarget.Normalized() : Vector2.Right; + + // Spawn visual slash effect 36 pixels in front of the player (offset vertically slightly) + Vector2 effectPos = player.GlobalPosition + dir * 36f; + effectPos.y -= 8f; + + // Spawn visual slash effect, rotated to face aim direction + SkillProjectileSpawner.SpawnTemporaryVisualEffect( + player, + "res://Assets/SkillAnimation/magic_slash-2.png", + effectPos, + 0.3f, + 0.3f, + 0.35f, + 0f, + false, + dir.Angle() + ); + + // Get attacker stats + int attackerAtk = player.Attributes?.EffectiveAtk ?? 1; + int defenderDef = 0; + + // Damage to each enemy + float variance = GD.Randf() * (DAMAGE_VARIANCE_MAX - DAMAGE_VARIANCE_MIN) + DAMAGE_VARIANCE_MIN; + + // If we have a specific target, damage them more + if (target != null) + { + defenderDef = target.Attributes?.EffectiveDef ?? 0; + int baseDamage = Mathf.Max(1, attackerAtk - Mathf.FloorToInt(defenderDef * DAMAGE_REDUCTION_FACTOR)); + int finalDamage = Mathf.RoundToInt(baseDamage * variance); + + target.TakeDamage(finalDamage); + GD.Print($"[COMBAT] {player.EntityName} casts Magic Slash on {target.EntityName} for {finalDamage} damage!"); + } + else + { + // Empty cast + GD.Print("[MagicSlashSkill] Empty cast - no targets in range"); + } + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs b/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs new file mode 100644 index 0000000..0d6e51e --- /dev/null +++ b/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs @@ -0,0 +1,92 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Base; +using QuestFantasy.Core.Data.Attributes; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Roundhouse slash skill for the Warrior. + /// A spinning attack that hits all nearby enemies. + /// + public class RoundhouseSlashSkill : Attributes.Skills + { + private const float DAMAGE_VARIANCE_MIN = 0.85f; + private const float DAMAGE_VARIANCE_MAX = 1.15f; + private const float DAMAGE_REDUCTION_FACTOR = 0.5f; + + public RoundhouseSlashSkill() + { + Name = "Roundhouse Slash"; + Description = "Spin and strike all nearby enemies with a powerful slash."; + } + + public override float MaxRange => 120f; + + public override float GetCooldownDuration() => 2.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + int attackerAtk = player.Attributes?.EffectiveAtk ?? 1; + + // Spawn spinning roundhouse slash visual effect + SkillProjectileSpawner.SpawnTemporaryVisualEffect( + player, + "res://Assets/SkillAnimation/roundhouse-slash.png", + player.GlobalPosition, + 0.3f, + 0.4f, + 0.5f, + 15f + ); + + // Get all Character objects in the scene tree and damage those in range + var root = player.GetTree()?.Root; + if (root != null) + { + var characters = GetAllNodesOfType(root); + foreach (var enemy in characters) + { + if (enemy == null || enemy == player || enemy.Attributes?.HP?.IsAlive != true) + { + continue; + } + + float distance = player.GlobalPosition.DistanceTo(enemy.GlobalPosition); + if (distance <= MaxRange) + { + int defenderDef = enemy.Attributes?.EffectiveDef ?? 0; + int baseDamage = Mathf.Max(1, attackerAtk - Mathf.FloorToInt(defenderDef * DAMAGE_REDUCTION_FACTOR)); + float variance = GD.Randf() * (DAMAGE_VARIANCE_MAX - DAMAGE_VARIANCE_MIN) + DAMAGE_VARIANCE_MIN; + int finalDamage = Mathf.RoundToInt(baseDamage * variance); + + enemy.TakeDamage(finalDamage); + GD.Print($"[COMBAT] {player.EntityName} performs Roundhouse Slash on {enemy.EntityName} for {finalDamage} damage!"); + } + } + } + } + + private System.Collections.Generic.List GetAllNodesOfType(Node root) where T : Node + { + var result = new System.Collections.Generic.List(); + if (root is T tNode) + { + result.Add(tNode); + } + + foreach (Node child in root.GetChildren()) + { + result.AddRange(GetAllNodesOfType(child)); + } + + return result; + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs index d6eea8d..9a44008 100644 --- a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs +++ b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs @@ -119,6 +119,74 @@ public static void SpawnRicochetArrow( AttachToScene(player, node); } + public static void SpawnKnightExplosion(Player player) + { + if (player == null) + { + return; + } + + var node = new KnightExplosionNode(player); + AttachToScene(player, node); + node.GlobalPosition = player.GlobalPosition; + + GD.Print($"[KnightExplosion] Spawned at {player.GlobalPosition}"); + } + + public static void SpawnDigitArrow(Player player, Character target, float maxRange) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateDigitArrow(player, direction, maxRange); + AttachToScene(player, node); + } + + public static void SpawnSuperArrow( + Player player, + Character target, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateSuperArrow(player, direction, maxRange, onHitEffect, onHitChance); + AttachToScene(player, node); + } + + public static void SpawnIceSpear( + Player player, + Character target, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateIceSpear(player, direction, maxRange, onHitEffect, onHitChance); + AttachToScene(player, node); + } + + public static void SpawnMagicSlash(Player player, Character target, float maxRange) + { + Vector2 direction = ResolveDirection(player, target); + var node = SkillProjectileNode.CreateMagicSlash(player, direction, maxRange); + AttachToScene(player, node); + } + + public static void SpawnTemporaryVisualEffect( + Player player, + string texturePath, + Vector2 position, + float duration, + float initialScale, + float targetScale = -1f, + float rotationSpeed = 0f, + bool flipH = false, + float initialRotation = 0f) + { + var node = new TemporaryVisualEffectNode(texturePath, duration, initialScale, targetScale, rotationSpeed, flipH, initialRotation); + AttachToScene(player, node); + node.GlobalPosition = position; + } + private static Vector2 ResolveDirection(Player player, Character target) { if (target != null && Godot.Object.IsInstanceValid(target)) @@ -139,7 +207,7 @@ private static Vector2 ResolveDirection(Player player, Character target) return Vector2.Right; } - private static void AttachToScene(Player player, SkillProjectileNode node) + private static void AttachToScene(Player player, Node2D node) { if (player == null || !Godot.Object.IsInstanceValid(player)) { @@ -205,6 +273,8 @@ internal class SkillProjectileNode : Node2D private bool _isPiercing = false; private bool _isReturning = false; private bool _returningPhase = false; + private bool _ignoreWalls = false; + private bool _loopFlightAnimation = true; public static SkillProjectileNode CreateArrow( Player owner, @@ -372,6 +442,148 @@ public static SkillProjectileNode CreateFlyingSword( }; } + public static SkillProjectileNode CreateDigitArrow( + Player owner, + Vector2 direction, + float maxRange) + { + return new SkillProjectileNode + { + _owner = owner, + _map = FindMap(owner), + _direction = direction, + _speed = ArrowSpeed * 1.3f, + _maxDistance = Mathf.Max(10f, maxRange), + _hitRadius = 12f, + _damageMin = 4, + _damageMax = 7, + _isAoe = false, + _isPiercing = true, + _ignoreWalls = true, + _projectileTexture = GD.Load("res://Assets/SkillAnimation/digit_arrow.png"), + _projectileScale = 0.25f, + _impactScale = 0.25f, + _flightFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/digit_arrow.png"), + }, + _impactFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/digit_arrow.png"), + } + }; + } + + public static SkillProjectileNode CreateSuperArrow( + Player owner, + Vector2 direction, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + return new SkillProjectileNode + { + _owner = owner, + _map = FindMap(owner), + _direction = direction, + _speed = ArrowSpeed * 0.75f, + _maxDistance = Mathf.Max(10f, maxRange), + _hitRadius = 28f, + _damageMin = 8, + _damageMax = 15, + _isAoe = false, + _ignoreWalls = true, + _isPiercing = true, + _onHitEffect = onHitEffect, + _onHitChance = onHitChance, + _projectileTexture = GD.Load("res://Assets/SkillAnimation/super_arrow.png"), + _projectileScale = 0.55f, + _impactScale = 0.55f, + _flightFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/super_arrow.png"), + }, + _impactFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/super_arrow.png"), + } + }; + } + + public static SkillProjectileNode CreateIceSpear( + Player owner, + Vector2 direction, + float maxRange, + Func onHitEffect = null, + float onHitChance = 0f) + { + return new SkillProjectileNode + { + _owner = owner, + _map = FindMap(owner), + _direction = direction, + _speed = ArrowSpeed * 0.6f, + _maxDistance = Mathf.Max(10f, maxRange), + _hitRadius = 15f, + _damageMin = 5, + _damageMax = 9, + _isAoe = false, + _onHitEffect = onHitEffect, + _onHitChance = onHitChance, + _projectileTexture = GD.Load("res://Assets/SkillAnimation/ice_spear-1.png"), + _projectileScale = 0.3f, + _impactScale = 0.35f, + _flightFrameDuration = 0.1f, + _impactFrameDuration = 0.08f, + _loopFlightAnimation = false, + _flightFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/ice_spear-1.png"), + GD.Load("res://Assets/SkillAnimation/ice_spear-2.png"), + GD.Load("res://Assets/SkillAnimation/ice_spear-3.png"), + GD.Load("res://Assets/SkillAnimation/ice_spear-4.png"), + }, + _impactFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/ice_spear-hit.png"), + } + }; + } + + public static SkillProjectileNode CreateMagicSlash( + Player owner, + Vector2 direction, + float maxRange) + { + return new SkillProjectileNode + { + _owner = owner, + _map = FindMap(owner), + _direction = direction, + _speed = ArrowSpeed * 1.2f, + _maxDistance = Mathf.Max(10f, maxRange), + _hitRadius = 20f, + _damageMin = 4, + _damageMax = 8, + _isAoe = false, + _onHitEffect = null, + _onHitChance = 0f, + _projectileTexture = GD.Load("res://Assets/SkillAnimation/magic_slash-2.png"), + _projectileScale = 0.3f, + _impactScale = 0.3f, + _flightFrameDuration = 0f, + _impactFrameDuration = ArrowImpactFrameDuration, + _flightFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/magic_slash-2.png"), + }, + _impactFrames = new[] + { + GD.Load("res://Assets/SkillAnimation/magic_slash-2.png"), + } + }; + } + public override void _Ready() { Texture firstFlightTexture = _projectileTexture; @@ -430,7 +642,11 @@ public override void _Process(float delta) if (IsBlockedByWall(nextPosition) && !_returningPhase) { - if (_bouncesRemaining > 0) + if (_ignoreWalls) + { + // Do not block - pierce the wall/obstacle! + } + else if (_bouncesRemaining > 0) { _bouncesRemaining--; @@ -632,7 +848,22 @@ private void UpdateFlightAnimation(float delta) } _flightFrameTimer = 0f; - _flightFrameIndex = (_flightFrameIndex + 1) % _flightFrames.Length; + int nextIndex = _flightFrameIndex + 1; + if (nextIndex >= _flightFrames.Length) + { + if (_loopFlightAnimation) + { + _flightFrameIndex = 0; + } + else + { + _flightFrameIndex = _flightFrames.Length - 1; // Hold on the last frame + } + } + else + { + _flightFrameIndex = nextIndex; + } _sprite.Texture = _flightFrames[_flightFrameIndex] ?? _sprite.Texture; } @@ -779,4 +1010,196 @@ private bool IsOwnerAlive() return _owner != null && Godot.Object.IsInstanceValid(_owner); } } + + internal class TemporaryVisualEffectNode : Node2D + { + private readonly string _texturePath; + private readonly float _duration; + private readonly float _initialScale; + private readonly float _targetScale; + private readonly float _rotationSpeed; + private readonly bool _flipH; + private readonly float _initialRotation; + + private Sprite _sprite; + private float _elapsed = 0f; + + public TemporaryVisualEffectNode(string texturePath, float duration, float initialScale, float targetScale = -1f, float rotationSpeed = 0f, bool flipH = false, float initialRotation = 0f) + { + _texturePath = texturePath; + _duration = duration; + _initialScale = initialScale; + _targetScale = targetScale < 0f ? initialScale : targetScale; + _rotationSpeed = rotationSpeed; + _flipH = flipH; + _initialRotation = initialRotation; + } + + public override void _Ready() + { + Texture tex = GD.Load(_texturePath); + _sprite = new Sprite + { + Texture = tex, + Centered = true, + Scale = new Vector2(_initialScale, _initialScale), + FlipH = _flipH + }; + AddChild(_sprite); + Rotation = _initialRotation; + SetProcess(true); + } + + public override void _Process(float delta) + { + _elapsed += delta; + if (_elapsed >= _duration) + { + QueueFree(); + return; + } + + // Lerp scale + float t = _elapsed / _duration; + float currentScale = Mathf.Lerp(_initialScale, _targetScale, t); + _sprite.Scale = new Vector2(currentScale, currentScale); + + // Lerp opacity (fade out) + float opacity = Mathf.Lerp(1f, 0f, t); + _sprite.Modulate = new Color(1f, 1f, 1f, opacity); + + // Rotate + if (_rotationSpeed != 0f) + { + Rotation += _rotationSpeed * delta; + } + } + } + + internal class KnightExplosionNode : Node2D + { + private const float DURATION = 3.0f; // 3 seconds duration + private const float INITIAL_SCALE = 0.25f; + private const float TARGET_SCALE = 0.5f; // growing to 2x initial scale (0.25 * 2 = 0.5) + private const float DAMAGE_TICK_INTERVAL = 0.5f; // damage tick every 0.5s + private const float BASE_RADIUS = 160f; // base radius of explosion at scale 1.0 + + private readonly Player _owner; + private Sprite _sprite; + private float _elapsed = 0f; + private float _tickTimer = 0f; + + public KnightExplosionNode(Player owner) + { + _owner = owner; + } + + public override void _Ready() + { + Texture tex = GD.Load("res://Assets/SkillAnimation/knight_explose.png"); + _sprite = new Sprite + { + Texture = tex, + Centered = true, + Scale = new Vector2(INITIAL_SCALE, INITIAL_SCALE) + }; + AddChild(_sprite); + SetProcess(true); + + // Deal first tick immediately + DealExplosionDamage(); + } + + public override void _Process(float delta) + { + if (_owner == null || !Godot.Object.IsInstanceValid(_owner)) + { + QueueFree(); + return; + } + + _elapsed += delta; + if (_elapsed >= DURATION) + { + QueueFree(); + return; + } + + // Lerp scale + float t = _elapsed / DURATION; + float currentScale = Mathf.Lerp(INITIAL_SCALE, TARGET_SCALE, t); + _sprite.Scale = new Vector2(currentScale, currentScale); + + // Lerp opacity (fade out towards the end) + float opacity = t > 0.8f ? Mathf.Lerp(1f, 0f, (t - 0.8f) / 0.2f) : 1f; + _sprite.Modulate = new Color(1f, 1f, 1f, opacity); + + // Tick damage + _tickTimer += delta; + if (_tickTimer >= DAMAGE_TICK_INTERVAL) + { + _tickTimer -= DAMAGE_TICK_INTERVAL; + DealExplosionDamage(); + } + } + + private void DealExplosionDamage() + { + if (_owner == null || !Godot.Object.IsInstanceValid(_owner)) + { + return; + } + + float currentScale = _sprite.Scale.x; + float currentRadius = BASE_RADIUS * currentScale; + + int attackerAtk = _owner.Attributes?.EffectiveAtk ?? 1; + + foreach (Character enemy in EnumerateEnemyCharacters()) + { + if (enemy?.Attributes?.HP == null || !enemy.Attributes.HP.IsAlive) + { + continue; + } + + if (enemy.GlobalPosition.DistanceTo(GlobalPosition) <= currentRadius) + { + int defenderDef = enemy.Attributes?.EffectiveDef ?? 0; + int baseDamage = Mathf.Max(1, attackerAtk - Mathf.FloorToInt(defenderDef * 0.4f)); + // Roll smaller random damage per tick + int rolled = Mathf.RoundToInt((float)GD.RandRange(1, 3)); + int damage = Mathf.Max(1, baseDamage + rolled); + + enemy.TakeDamage(damage); + GD.Print($"[COMBAT] Knight Explosion ticked on {enemy.EntityName} for {damage} damage!"); + } + } + } + + private IEnumerable EnumerateEnemyCharacters() + { + Node root = _owner?.GetTree()?.Root; + if (root == null) + { + yield break; + } + + var stack = new Stack(); + stack.Push(root); + + while (stack.Count > 0) + { + Node node = stack.Pop(); + if (node is Character character && character != _owner) + { + yield return character; + } + + foreach (Node child in node.GetChildren()) + { + stack.Push(child); + } + } + } + } } \ No newline at end of file diff --git a/Scripts/Core/Data/Skills/SuperArrowSkill.cs b/Scripts/Core/Data/Skills/SuperArrowSkill.cs new file mode 100644 index 0000000..a111b34 --- /dev/null +++ b/Scripts/Core/Data/Skills/SuperArrowSkill.cs @@ -0,0 +1,41 @@ +using Godot; + +using QuestFantasy.Characters; +using QuestFantasy.Core.Systems.StatusEffects; + +namespace QuestFantasy.Core.Data.Skills +{ + /// + /// Super arrow skill for the Archer. + /// A powerful arrow that paralyzes enemies for 5 seconds on hit. + /// Long cooldown skill. + /// + public class SuperArrowSkill : Attributes.Skills + { + public SuperArrowSkill() + { + Name = "Super Arrow"; + Description = "Fire a powerful arrow that paralyzes enemies for 5 seconds."; + } + + public override float MaxRange => 350f; + + public override float GetCooldownDuration() => 30.0f; + + public override void Effect(Player player, Character target) + { + if (player == null) + { + return; + } + + // Spawn an arrow that applies stun effect on hit + SkillProjectileSpawner.SpawnSuperArrow( + player, + target, + MaxRange, + onHitEffect: () => new StunEffect(5.0f), // 5 seconds stun (paralysis) + onHitChance: 1.0f); // Always apply + } + } +} \ No newline at end of file diff --git a/Scripts/UI/ClassSelectUI.cs b/Scripts/UI/ClassSelectUI.cs index 3e09c5d..e199e79 100644 --- a/Scripts/UI/ClassSelectUI.cs +++ b/Scripts/UI/ClassSelectUI.cs @@ -283,16 +283,27 @@ private void BuildSkillTabContent() slotsBox.AddChild(slotPanel); } - // Skill grid (Middle) - // We use a container that will hold the skill cards based on current class + // Scroll container for skills (Middle) + var scroll = new ScrollContainer(); + scroll.Name = "ScrollContainer"; + scroll.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); + scroll.MarginLeft = 24f; + scroll.MarginRight = -24f; + scroll.MarginTop = 100f; + scroll.MarginBottom = 385f; + scroll.RectMinSize = new Vector2(0f, 285f); + scroll.ScrollVerticalEnabled = false; + scroll.ScrollHorizontalEnabled = true; + _skillTabContent.AddChild(scroll); + + // Skill grid inside scroll container var gridBox = new HBoxContainer(); gridBox.Name = "SkillGrid"; - gridBox.SetAnchorsAndMarginsPreset(Control.LayoutPreset.TopWide); - gridBox.MarginTop = 100f; - gridBox.MarginBottom = 340f; + gridBox.SizeFlagsHorizontal = (int)Control.SizeFlags.ExpandFill; + gridBox.SizeFlagsVertical = (int)Control.SizeFlags.ExpandFill; gridBox.Alignment = BoxContainer.AlignMode.Center; gridBox.AddConstantOverride("separation", (int)CardSpacing); - _skillTabContent.AddChild(gridBox); + scroll.AddChild(gridBox); // Footer (Bottom) float footerY = PanelHeight - FooterHeight - 50f; @@ -621,7 +632,7 @@ private void RefreshSkillTab() } // Rebuild grid - var gridBox = _skillTabContent.GetNodeOrNull("SkillGrid"); + var gridBox = _skillTabContent.GetNodeOrNull("ScrollContainer/SkillGrid"); if (gridBox != null) { foreach (Node child in gridBox.GetChildren()) diff --git a/Scripts/UI/PlayerHud.cs b/Scripts/UI/PlayerHud.cs index 0ceb01f..2e6046e 100644 --- a/Scripts/UI/PlayerHud.cs +++ b/Scripts/UI/PlayerHud.cs @@ -24,6 +24,12 @@ public class PlayerHud : CanvasLayer ["giant_fireball"] = "res://Assets/SkillAnimation/fireball3.png", ["flying_sword"] = "res://Assets/SkillAnimation/fly_sword.png", ["defense_stance"] = "res://Assets/Characters/warrior/defense.png", + ["magic_slash"] = "res://Assets/SkillAnimation/magic_slash-2.png", + ["ice_spear"] = "res://Assets/SkillAnimation/ice_spear-4.png", + ["digit_arrow"] = "res://Assets/SkillAnimation/digit_arrow.png", + ["super_arrow"] = "res://Assets/SkillAnimation/super_arrow.png", + ["roundhouse_slash"] = "res://Assets/SkillAnimation/roundhouse-slash.png", + ["knight_explose"] = "res://Assets/SkillAnimation/knight_explose.png", }; private readonly List _skillSlots = new List(); From 675f5b54bb30b6ca1a313b7f5619dcc8eed762c9 Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Tue, 2 Jun 2026 00:02:52 +0800 Subject: [PATCH 08/13] feat: sort player skills by DisplayOrder to ensure correct sequence on load --- Scripts/Auth/PlayerProfileSnapshot.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Scripts/Auth/PlayerProfileSnapshot.cs b/Scripts/Auth/PlayerProfileSnapshot.cs index 48ebabc..7dd4b82 100644 --- a/Scripts/Auth/PlayerProfileSnapshot.cs +++ b/Scripts/Auth/PlayerProfileSnapshot.cs @@ -467,6 +467,9 @@ public static PlayerProfileSnapshot FromDictionary(Godot.Collections.Dictionary DisplayOrder = ReadInt(skillDict, "display_order", i, min: 0), }); } + + // Sort skills in-place by DisplayOrder to guarantee correct sequence on frontend load + snapshot.Skills.Sort((a, b) => a.DisplayOrder.CompareTo(b.DisplayOrder)); } if (snapshot.Skills.Count == 0) From e74fc227bce60e994cb7a3c40188c3a02c01bee7 Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Tue, 2 Jun 2026 09:26:49 +0800 Subject: [PATCH 09/13] feat: add slash effect visual to Warrior basic attack --- Assets/SkillAnimation/slash-effect.png | Bin 0 -> 16619 bytes Assets/SkillAnimation/slash-effect.png.import | 35 ++++++++++++++++++ Scripts/Core/Data/Skills/BasicAttackSkill.cs | 24 ++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 Assets/SkillAnimation/slash-effect.png create mode 100644 Assets/SkillAnimation/slash-effect.png.import diff --git a/Assets/SkillAnimation/slash-effect.png b/Assets/SkillAnimation/slash-effect.png new file mode 100644 index 0000000000000000000000000000000000000000..229dca72bc7bc642e4a1eff26c87a68ca44e58b7 GIT binary patch literal 16619 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 literal 0 HcmV?d00001 diff --git a/Assets/SkillAnimation/slash-effect.png.import b/Assets/SkillAnimation/slash-effect.png.import new file mode 100644 index 0000000..0e57cc9 --- /dev/null +++ b/Assets/SkillAnimation/slash-effect.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/slash-effect.png-a39f77a5b4b6117d9c824bfa5b5046cb.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/SkillAnimation/slash-effect.png" +dest_files=[ "res://.import/slash-effect.png-a39f77a5b4b6117d9c824bfa5b5046cb.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Scripts/Core/Data/Skills/BasicAttackSkill.cs b/Scripts/Core/Data/Skills/BasicAttackSkill.cs index 1e2edbb..5447309 100644 --- a/Scripts/Core/Data/Skills/BasicAttackSkill.cs +++ b/Scripts/Core/Data/Skills/BasicAttackSkill.cs @@ -2,6 +2,7 @@ using QuestFantasy.Characters; using QuestFantasy.Core.Base; +using QuestFantasy.Core.Data; using QuestFantasy.Core.Data.Attributes; using QuestFantasy.Core.Systems.StatusEffects; @@ -50,6 +51,29 @@ public override void Effect(Player player, Character target) return; } + // Determine aim direction + Vector2 targetPos = target != null ? target.GlobalPosition : player.GetGlobalMousePosition(); + Vector2 towardTarget = targetPos - player.GlobalPosition; + Vector2 dir = towardTarget.LengthSquared() > 0.0001f ? towardTarget.Normalized() : Vector2.Right; + Vector2 effectPos = player.GlobalPosition + dir * 30f; + effectPos.y -= 8f; + + // Spawn standard slash effect only for Warrior (Sword Slash) + if (player.PlayerClass == PlayerClass.Warrior) + { + SkillProjectileSpawner.SpawnTemporaryVisualEffect( + player, + "res://Assets/SkillAnimation/slash-effect.png", + effectPos, + 0.25f, + 0.25f, + 0.3f, + 0f, + false, + dir.Angle() + ); + } + // Allow empty swing if no target if (target == null) { From 818adbdc4f78d07c18a744e67e58c3a8b0f4d98c Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Tue, 2 Jun 2026 10:25:20 +0800 Subject: [PATCH 10/13] refactor: rename Warrior class to Knight throughout codebase --- Scripts/Auth/PlayerProfileSnapshot.cs | 2 +- Scripts/Core/Data/PlayerClass.cs | 23 ++++++++++---------- Scripts/Core/Data/Skills/BasicAttackSkill.cs | 4 ++-- Scripts/UI/ClassSelectUI.cs | 6 ++--- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Scripts/Auth/PlayerProfileSnapshot.cs b/Scripts/Auth/PlayerProfileSnapshot.cs index 7dd4b82..15bf248 100644 --- a/Scripts/Auth/PlayerProfileSnapshot.cs +++ b/Scripts/Auth/PlayerProfileSnapshot.cs @@ -410,7 +410,7 @@ public class PlayerProfileSnapshot public Godot.Collections.Array DiscardedItems { get; set; } = new Godot.Collections.Array(); public Godot.Collections.Dictionary EquippedItemsPayload { get; set; } = new Godot.Collections.Dictionary(); - /// Serialised class name, e.g. "adventurer", "mage", "archer", "warrior". + /// Serialised class name, e.g. "adventurer", "mage", "archer", "knight". public string ClassName { get; set; } = "adventurer"; public List Skills { get; set; } = new List(); diff --git a/Scripts/Core/Data/PlayerClass.cs b/Scripts/Core/Data/PlayerClass.cs index c8240f7..57e97a0 100644 --- a/Scripts/Core/Data/PlayerClass.cs +++ b/Scripts/Core/Data/PlayerClass.cs @@ -12,7 +12,7 @@ public enum PlayerClass Adventurer, Mage, Archer, - Warrior + Knight } /// @@ -133,7 +133,7 @@ public static class PlayerClassData SkillIdBow, SkillIdTripleArrow, SkillIdRicochetArrow, SkillIdDigitArrow, SkillIdSuperArrow }; - private static readonly HashSet WarriorSkills = new HashSet + private static readonly HashSet KnightSkills = new HashSet { SkillIdSword, SkillIdFlyingSword, SkillIdDefenseStance, SkillIdRoundhouseSlash, SkillIdKnightExplose }; @@ -147,7 +147,7 @@ public static HashSet GetAllowedSkillIds(PlayerClass cls) { case PlayerClass.Mage: return MageSkills; case PlayerClass.Archer: return ArcherSkills; - case PlayerClass.Warrior: return WarriorSkills; + case PlayerClass.Knight: return KnightSkills; default: return AdventurerSkills; } } @@ -159,7 +159,7 @@ public static string GetDisplayName(PlayerClass cls) { case PlayerClass.Mage: return "Mage"; case PlayerClass.Archer: return "Archer"; - case PlayerClass.Warrior: return "Warrior"; + case PlayerClass.Knight: return "Knight"; default: return "Adventurer"; } } @@ -173,7 +173,7 @@ public static string GetDescription(PlayerClass cls) return "Wields the arcane arts.\nMasters the art of Fireball magic."; case PlayerClass.Archer: return "Swift and precise.\nStrikes enemies from a distance with arrows."; - case PlayerClass.Warrior: + case PlayerClass.Knight: return "Unyielding and fierce.\nCleaves foes with a powerful sword slash."; default: return "The all-rounder.\nCommands sword, bow, and magic freely."; @@ -187,7 +187,7 @@ public static string GetSkillListText(PlayerClass cls) { case PlayerClass.Mage: return "Fireball"; case PlayerClass.Archer: return "Arrow Shot"; - case PlayerClass.Warrior: return "Sword Slash"; + case PlayerClass.Knight: return "Sword Slash"; default: return "Sword Slash, Arrow Shot, Fireball"; } } @@ -341,7 +341,7 @@ public static ReadOnlyCollection GetAllSkillDefinitions(PlayerC return new ReadOnlyCollection(new[] { DefFireball, DefTripleFireball, DefGiantFireball, DefMagicSlash, DefIceSpear }); case PlayerClass.Archer: return new ReadOnlyCollection(new[] { DefBow, DefTripleArrow, DefRicochetArrow, DefDigitArrow, DefSuperArrow }); - case PlayerClass.Warrior: + case PlayerClass.Knight: return new ReadOnlyCollection(new[] { DefSword, DefFlyingSword, DefDefenseStance, DefRoundhouseSlash, DefKnightExplose }); default: // Adventurer return new ReadOnlyCollection(new[] { DefSword, DefBow, DefFireball }); @@ -358,7 +358,7 @@ public static ReadOnlyCollection GetDefaultSkillLoadout(PlayerClass cls) { case PlayerClass.Mage: return new ReadOnlyCollection(new[] { SkillIdFireball, SkillIdMagicSlash, SkillIdIceSpear }); case PlayerClass.Archer: return new ReadOnlyCollection(new[] { SkillIdBow, SkillIdDigitArrow, SkillIdSuperArrow }); - case PlayerClass.Warrior: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdRoundhouseSlash, SkillIdKnightExplose }); + case PlayerClass.Knight: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdRoundhouseSlash, SkillIdKnightExplose }); default: return new ReadOnlyCollection(new[] { SkillIdSword, SkillIdBow, SkillIdFireball }); } } @@ -415,7 +415,7 @@ public static ClassSpritePaths GetSpritePaths(PlayerClass cls) }; } - case PlayerClass.Warrior: + case PlayerClass.Knight: { const string W = "res://Assets/Characters/warrior/"; return new ClassSpritePaths @@ -473,7 +473,7 @@ public static string Serialize(PlayerClass cls) { case PlayerClass.Mage: return "mage"; case PlayerClass.Archer: return "archer"; - case PlayerClass.Warrior: return "warrior"; + case PlayerClass.Knight: return "knight"; default: return "adventurer"; } } @@ -488,7 +488,8 @@ public static PlayerClass Deserialize(string value) { case "mage": return PlayerClass.Mage; case "archer": return PlayerClass.Archer; - case "warrior": return PlayerClass.Warrior; + case "knight": + case "warrior": return PlayerClass.Knight; default: return PlayerClass.Adventurer; } } diff --git a/Scripts/Core/Data/Skills/BasicAttackSkill.cs b/Scripts/Core/Data/Skills/BasicAttackSkill.cs index 5447309..5ef6bbc 100644 --- a/Scripts/Core/Data/Skills/BasicAttackSkill.cs +++ b/Scripts/Core/Data/Skills/BasicAttackSkill.cs @@ -58,8 +58,8 @@ public override void Effect(Player player, Character target) Vector2 effectPos = player.GlobalPosition + dir * 30f; effectPos.y -= 8f; - // Spawn standard slash effect only for Warrior (Sword Slash) - if (player.PlayerClass == PlayerClass.Warrior) + // Spawn standard slash effect only for Knight (Sword Slash) + if (player.PlayerClass == PlayerClass.Knight) { SkillProjectileSpawner.SpawnTemporaryVisualEffect( player, diff --git a/Scripts/UI/ClassSelectUI.cs b/Scripts/UI/ClassSelectUI.cs index e199e79..3eb87e0 100644 --- a/Scripts/UI/ClassSelectUI.cs +++ b/Scripts/UI/ClassSelectUI.cs @@ -71,7 +71,7 @@ public class ClassSelectUI : CanvasLayer PlayerClass.Adventurer, PlayerClass.Mage, PlayerClass.Archer, - PlayerClass.Warrior + PlayerClass.Knight }; // ── Class accent colours ────────────────────────────────────────── @@ -81,7 +81,7 @@ private static Color GetClassAccent(PlayerClass cls) { case PlayerClass.Mage: return new Color(0.75f, 0.40f, 1.00f, 1f); case PlayerClass.Archer: return new Color(0.40f, 0.90f, 0.50f, 1f); - case PlayerClass.Warrior: return new Color(1.00f, 0.50f, 0.25f, 1f); + case PlayerClass.Knight: return new Color(1.00f, 0.50f, 0.25f, 1f); default: return new Color(0.40f, 0.70f, 1.00f, 1f); } } @@ -92,7 +92,7 @@ private static string GetClassEmoji(PlayerClass cls) { case PlayerClass.Mage: return "🔮"; case PlayerClass.Archer: return "🏹"; - case PlayerClass.Warrior: return "⚔️"; + case PlayerClass.Knight: return "⚔️"; default: return "🗺️"; } } From 0cf02fba06a225992126cacd131e38b4a46e2c3a Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Tue, 2 Jun 2026 10:27:15 +0800 Subject: [PATCH 11/13] fix: reduce MaxRange for RoundhouseSlashSkill from 120f to 80f --- Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs b/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs index 0d6e51e..5f10fdc 100644 --- a/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs +++ b/Scripts/Core/Data/Skills/RoundhouseSlashSkill.cs @@ -22,7 +22,7 @@ public RoundhouseSlashSkill() Description = "Spin and strike all nearby enemies with a powerful slash."; } - public override float MaxRange => 120f; + public override float MaxRange => 80f; public override float GetCooldownDuration() => 2.0f; From b9704ad7844658edd40da3bbcd6749f9da433f77 Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Tue, 2 Jun 2026 13:23:05 +0800 Subject: [PATCH 12/13] feat: reduce Super Arrow skill cooldown from 30 to 10 seconds --- Scripts/Core/Data/PlayerClass.cs | 2 +- Scripts/Core/Data/Skills/SuperArrowSkill.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/Core/Data/PlayerClass.cs b/Scripts/Core/Data/PlayerClass.cs index 57e97a0..b25182c 100644 --- a/Scripts/Core/Data/PlayerClass.cs +++ b/Scripts/Core/Data/PlayerClass.cs @@ -308,7 +308,7 @@ public static string GetSkillListText(PlayerClass cls) DisplayName = "Super Arrow", Description = "Fire a powerful arrow that paralyzes enemies for 5 seconds.", Emoji = "💫", - CooldownSec = 30.0f, + CooldownSec = 10.0f, }; private static readonly SkillDefinition DefRoundhouseSlash = new SkillDefinition diff --git a/Scripts/Core/Data/Skills/SuperArrowSkill.cs b/Scripts/Core/Data/Skills/SuperArrowSkill.cs index a111b34..a1d3f50 100644 --- a/Scripts/Core/Data/Skills/SuperArrowSkill.cs +++ b/Scripts/Core/Data/Skills/SuperArrowSkill.cs @@ -20,7 +20,7 @@ public SuperArrowSkill() public override float MaxRange => 350f; - public override float GetCooldownDuration() => 30.0f; + public override float GetCooldownDuration() => 10.0f; public override void Effect(Player player, Character target) { From e0390f16366111491f8fb011b1d40a81c992be03 Mon Sep 17 00:00:00 2001 From: Darrin-Lin Date: Tue, 2 Jun 2026 13:30:27 +0800 Subject: [PATCH 13/13] feat: update projectile bouncing logic to allow non-consecutive re-hits on targets --- .../Data/Skills/SkillProjectileSpawner.cs | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs index 9a44008..5fc155d 100644 --- a/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs +++ b/Scripts/Core/Data/Skills/SkillProjectileSpawner.cs @@ -275,6 +275,7 @@ internal class SkillProjectileNode : Node2D private bool _returningPhase = false; private bool _ignoreWalls = false; private bool _loopFlightAnimation = true; + private Character _lastHitTarget = null; public static SkillProjectileNode CreateArrow( Player owner, @@ -694,8 +695,7 @@ public override void _Process(float delta) } else { - // No target to bounce to, just impact - BeginImpact(hitTarget.GlobalPosition, hitTarget); + // No target to bounce to, just continue flying in current direction so it can bounce off walls later! return; } } @@ -761,9 +761,20 @@ private Character FindHitTarget(Vector2 position) continue; } - if (_damagedTargets.Contains(enemy)) + // For bouncing projectiles (ricochet arrow), we only prevent hitting the immediate last hit target consecutively + if (_bouncesRemaining > 0) { - continue; + if (enemy == _lastHitTarget) + { + continue; + } + } + else + { + if (_damagedTargets.Contains(enemy)) + { + continue; + } } if (enemy.GlobalPosition.DistanceTo(position) <= _hitRadius) @@ -792,8 +803,8 @@ private Character FindNextBounceTarget(Vector2 currentPosition) continue; } - // Do not bounce back to already hit targets - if (_damagedTargets.Contains(enemy)) + // Do not bounce back to the immediate last hit target consecutively + if (enemy == _lastHitTarget) { continue; } @@ -918,9 +929,20 @@ private void ApplyDamage(Character target) return; } - if (_damagedTargets.Contains(target)) + // For bouncing projectiles, allow re-damaging targets on subsequent bounces, but not consecutively + if (_bouncesRemaining > 0) { - return; + if (target == _lastHitTarget) + { + return; + } + } + else + { + if (_damagedTargets.Contains(target)) + { + return; + } } // Use effective stats so Burn (ATK debuff) and Bleed (DEF debuff) are reflected @@ -931,6 +953,7 @@ private void ApplyDamage(Character target) target.TakeDamage(damage); _damagedTargets.Add(target); + _lastHitTarget = target; GD.Print($"[COMBAT] {_owner.EntityName} hit {target.EntityName} with projectile for {damage}. HP={target.Attributes.HP.CurrentHP}/{target.Attributes.HP.MaxHP}");