From 7ef8385d5ca1fb4ac42fa24ddaf8ac1581ea423d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Thu, 22 Jan 2026 06:08:02 -0300 Subject: [PATCH 1/9] feat: imbue 1511 and fix img imbue 1412 --- data/images/game/imbuing/basic-button.png | Bin 0 -> 9283 bytes data/images/game/imbuing/blocked-panel.png | Bin 0 -> 20058 bytes data/images/game/imbuing/blocked-panels.png | Bin 0 -> 30499 bytes .../game/imbuing/imbue-scroll-button.png | Bin 0 -> 13057 bytes .../game/imbuing/imbuement-icons-64.png | Bin 0 -> 66452 bytes data/images/game/imbuing/imbui-progress.png | Bin 0 -> 252 bytes data/images/game/imbuing/imbui-timer-bg.png | Bin 0 -> 3973 bytes data/images/game/imbuing/intricate-button.png | Bin 0 -> 10166 bytes data/images/game/imbuing/pick-item-button.png | Bin 0 -> 11604 bytes data/images/game/imbuing/powerfull-button.png | Bin 0 -> 10072 bytes data/images/game/imbuing/slot.png | Bin 1532 -> 2349 bytes data/images/game/prey/balanceBg.png | Bin 0 -> 1973 bytes data/images/ui/infoPanel.png | Bin 0 -> 1969 bytes data/images/ui/item66.png | Bin 0 -> 3322 bytes data/images/ui/right-arrow.png | Bin 0 -> 831 bytes .../ui/t2pixel-up-frame-borderimage_2.png | Bin 0 -> 33660 bytes modules/game_imbui/classes/imbuementitem.lua | 440 +++++++++ .../game_imbui/classes/imbuementscroll.lua | 230 +++++ .../game_imbui/classes/imbuementselection.lua | 93 ++ modules/game_imbui/t_imbui.lua | 313 ++++++ modules/game_imbui/t_imbui.otmod | 6 + modules/game_imbui/t_imbui.otui | 903 ++++++++++++++++++ modules/game_imbuing/imbuing.lua | 162 +++- modules/game_imbuing/imbuing.otui | 96 +- modules/game_interface/interface.otmod | 1 + src/client/game.cpp | 16 + src/client/game.h | 2 + src/client/luafunctions.cpp | 2 + src/client/protocolcodes.h | 1 + src/client/protocolgame.h | 1 + src/client/protocolgameparse.cpp | 1 + src/client/protocolgamesend.cpp | 15 + 32 files changed, 2245 insertions(+), 37 deletions(-) create mode 100644 data/images/game/imbuing/basic-button.png create mode 100644 data/images/game/imbuing/blocked-panel.png create mode 100644 data/images/game/imbuing/blocked-panels.png create mode 100644 data/images/game/imbuing/imbue-scroll-button.png create mode 100644 data/images/game/imbuing/imbuement-icons-64.png create mode 100644 data/images/game/imbuing/imbui-progress.png create mode 100644 data/images/game/imbuing/imbui-timer-bg.png create mode 100644 data/images/game/imbuing/intricate-button.png create mode 100644 data/images/game/imbuing/pick-item-button.png create mode 100644 data/images/game/imbuing/powerfull-button.png create mode 100644 data/images/game/prey/balanceBg.png create mode 100644 data/images/ui/infoPanel.png create mode 100644 data/images/ui/item66.png create mode 100644 data/images/ui/right-arrow.png create mode 100644 data/images/ui/t2pixel-up-frame-borderimage_2.png create mode 100644 modules/game_imbui/classes/imbuementitem.lua create mode 100644 modules/game_imbui/classes/imbuementscroll.lua create mode 100644 modules/game_imbui/classes/imbuementselection.lua create mode 100644 modules/game_imbui/t_imbui.lua create mode 100644 modules/game_imbui/t_imbui.otmod create mode 100644 modules/game_imbui/t_imbui.otui diff --git a/data/images/game/imbuing/basic-button.png b/data/images/game/imbuing/basic-button.png new file mode 100644 index 0000000000000000000000000000000000000000..807bea630286abe660f6029579af7dd5a114d7b6 GIT binary patch literal 9283 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%0AY~0pjj@{rN_hy%LJzpW~LW^>o z3jzqK&3Cc&rR!~%9kLTJ7g<)GJpk^huRDS$b&#Z9iy8tYCtPh^__H>_o;JL2m10A# z>C$3OLSjxjdyw4P*qQGxtLZ}o@PwWKL)%m-oR$A1`so4v72@{_vmcaZh1^5)R!2Ed z_fO8%cdIq^?LvD4&@rfz6U5HhF5#bgp)HKt<%!f&4eV!-Gk%7xF*{HF?GMbKYrQJb zbGy6i)JbWshRvRS%WUS<)P!VGwSe90dLOeed17B#o_Gj;A5eO(}leEk*Bc)+`X&V3Y;cdPgPlH>GL zp^~w=nsqG`{NJaknaEA(8+M_4jxsRw`WDz5XffW0go~bqWYj~WP46C4ZB0`5Ocn5xXt{jyVQ=G+nyQuyWY{fU;Ns<47l(0PsQZyM3KN& zmQgKqPj@m|7YJ3{{hI+chjLs(*L5zi2p#ibHUt0`B)Cl|TQ8=VDO87jCZ)Oztq^A- zYnZyo8*JimYLNer>^COY0I~;g!dY`N?AoDI(KfgZ;VOB)f{~37BG?o_5ONU|+#SvQ za*RfcUtda<3c)%+e%b?e8S&>AZYt@eNQ9L9gaz#^k#`iKfE)wHC*K@b)@+Sig|7!T zPo%2pt_~rIyLVu+bTu@CJY$8a+xE`BylZBXWRjEvj@92vDo~0;biiNF{Lb~dBT(+# z8JSQvA1M2BDq664Vri6qfu}QJvN5BIsN(WR_rb1>RCpvW`bZqj_fEDKjy6VhQqG6E z-D(BCy=vGxZalCwg>be-_;jANY~-H{mcqC#i$T3NXrz8}ll@!vsflQIPc^qBkyN>D zn~6Az=ja&P`+n+eDc=WwEP9USHMy+zb-l{iLd=>zXdp#wo@y&|R;U;ni1)RUP#2Qk zL5o$(tdTZGk#Iele#GjJm%=vGhfcQ2irR&dvQt#JW11HG7Ve1d=8E&lc^KeFltX^M zsQEVo%Sq|+nURZ!a`QVb(ORfpVQ$?gU{Y4Beci)VLWdHnnz&mem;5w$=*w|A_SH8G5W#GN%T==1WqCT2C8R<$sk%hvKy|f-i1{Rt~hi;VJR%fx@;9e=k-nv~TG0zpX zEEVp4*!NhQO;j}Bi`@!4;y~9RSmJ1sOXlekXmUbd**q%aGItAA*}8Wd5~`De-@nL@ z9XA$VGTa!-jh{E)oq6h^j%wU7;@2)2zkC+L;Y8041;n-qs3GPw!aGyoJ|`M#LSl$i z7-O0g6xb%fKNLVebgG5+WRb0&4K8s!Cw;b6;L#u?IPFyaZs5X7#!{Uo6rwwRF!`2ULbC2P zP>dae4DtONA9Al76+fdn?PMn6-0GVwwFxmMv1XXeR`KUm-pIm|4-ZleLn>iTtEnLn zC#kiiKu0$!MT8{UYPvutt1y$tIFSo>wi^r2xEqnVKV_@LRwOghH}qX$w@-Jg z;A#;!PVkAEC`V5p1xJaw2xQhu4IGc(0SBVRs*LcO{?L+yKcw@|L)wqip_Fdv(bmaT zhtop#9_^3Ck>s%nE)|gBBMB4fw|W+5`v4v{~9$ zF|AXf${oB9V>V_tns5QN#YlbJqzn0asXrIm0|l0zsM9)!&w%8u2%IwKzosj`J|-=J z^EayC<)Wyo(<%&glCO#I>hXbB${rO+v{rb;MRD=`bIKN?t;*+f3|c4G3*}_BI_^wFmX5_FK!}7P*io>o*dS;LuAivPCEla$KTI9X0v!h7A&ZCxRi%i}o zhYu84EGB6gS9K)U4E2Cj4OyDji^tWa1)wGy1x_#9)9BNDTJn3+Ug*%`v-9kF#5V_J zw*)rF!*@8JZm?F@74WQ-V%N})+p<_1)JOq(OO;qe-tr_awcB4@DqHeomm$qkt-y4Q z7Vsi9gtIo!&65VE>r<<4<(`yy*3#+M(M?kgWM1zRNHgfEJtQuT3*yv>VsyWOc!3sK z{eS3s3#h2R^$mDbM3GQJKvDrgq)QqMIu${hp+P`Fq$Fk#lctT5C2vOFuY5BWt*9ZPTvV^ZxT#0@k=*bqpn?!0+g>+aWmH z2)nJLs=$LGBv*_lIBY_A(ffx@gy808x+(%jg~j!0?tJP?^9335+Efx^h*h`holhLV zT~RH?0<9bx+4)qO`Xk`)Rk-b>tN2n9+p8?bkI5RuYTF2%pAbQ+5j7!9CO%m_>N7TZ zasN`xx+M!(OmLg>tHc*+%m|MX`NP^{>=gExRBE>#9@q_A;d#$hy|Z45y>i@qWyen# z4Lv^2Vf>YY`IEt6*4`cz40oQiue10CMvi(OAY%p|W^%!T0Br=e*K4G6zjvgxZ`HB9#;}5+mR~@yv2jT`DFm$Lr0?3 zB%RjQ@_p%v{A-s4V_ZYHz&iGMDZBq8Aqh|aH)s$z;Ghgd*RRjbHU(3I)79F|473T# ze90a9aXbaa(F5v@SCVXGigI@FAZKT15O2`yj2c^CFR-NrLVJ?uObw4=LQKdbX_)5J zvob-eFXLF0{&sPB9X_MSnk^lo_T5V&mHgJ z9KYnSvrEUC^IXK^^|cv?tKbKK2F=)Xo>OUmrn{LwgiokJu93VQ7%kneXal|}$YL9z zXPLgfRW>jRDfq~E&lT=9++BMaSg5(yEs2@0p~5heu{S%6;kre^aNxq#qO=mZCwzDF z7l%Qnj>~rJ4B!Z6aB-ar8po<4c#7m6EFc5&OjTjPl^dx&@_Pu78DK~2p_r>$wUlj~ zChOJ@5A@3!&kqS2+v~|RT&oXBKvf_k8PYOf@tJONAGbHpr)#=qA#V5bnJ~jIs|z*n zUUrz^d!qZV&#t}Ac^~^`%WKURcVx`XrNMfDRGQ#3(lcR^nk&&%Mn=(Ja!PSoG4e>a zKLg8kI#dAFQUNd+!BCks0?g^OJ0s>e&i*1q4*BLk?GVh{Fts*I z)$8YjU3`BwGF?lUv-o?+e0ik+czl>cx9_V1w@oevDBOeS=osW?jWN76#9N8M&7CIk#o`+&k7B9=m|q3fX4ub2-PeVN3dZb40x*>PR_pmm+h z>B1x@NV5QuOh7U84Ujzz5@y#)Y44|^O$EwiIdU!I(gL*s9T^Dahda|fx###ns(B35 zIC7h6<0%7}26r!=-wRm$1jTF-_7SgMV=(`rdE^YLTn_Pp!Qd zF=p8x8z2l{Y6rUAdtA(r+ntEY++Y%c_U>Q#np6O?1F8psOH~Axvs8=2%k%8$ZjSJ| zv{$v{_Gk6_JI39Nh@$oWpKF+z8(}lmBZ(u=AN0LOv2McGJa&4nBj5isG8wu7O#@AK zNYI6`8f8^QfE^kUExjWVK=9|-Gb`8@K(V-?F@D}tx9W_}utTe*ZW^Ky1N|)L!etkeWuOAb<#83E* z^OwG3*W5vXD}N?0ttButAOqye0Oi806|0tQkQPTTq`5ef14ounNkd-1fa5XH4!XE6 zP!F7>!1KM`%&1RaD*ZxghJ10j{>vT6Px&siLLFwTYtVGqs((R@{|a#$n}#aLV>2vL zf@ms9=25@DGx<936|0WrO&1iTO<)`J_oFA@En?#k(>*9XQH7`&?8+PIT=ICHsJLf4lP{Lf-r6C;~34fdso%13cvbDDWGEuvrVNIK(*28?T`TBzS zv%)|s85=_hAsPn|=jYix?&8WEHrNC0>Bup31Ky37PSrX9;S+K<3K#PQ#8LdbVUfUjHBnG#5~o%XI^kQS9RRg(-Q-W%pzNMNVdTv#_9K42!gh@)X_OdlBUaDNxuM%`q6K3c)Su_$|5AU> zj_xRjFQatRho*qb!sooh354oHEp?vG6(z92^Y{G69{<*hIB8VY72jIMFWSp_UBihI z$C%#&v*uuju0BrFW@t_vP=CXE@LcpzWi{s*iS+W2#iXeq1E`j|O)|}@dx;2bCM-52 zK%NF!SlFpUs0i15`#3k-_Ts{T`g1cpX)Rlyh25q+H9Ub)2}cwYu<Q76RQ7wU z&7r%YCs=T6O}LtJQSd3qqE!4)UZ8Sz2Promn8}Y^Qtwxrv^|>mhyx)V(u;V5`TPSCEkzr7ztQ}F0y`Cy`p3CZMra&P zv;>>K(pj~#AY^2pnn43)I@tmUfR?T8g&iEHg(a9t9D6foema4rhRDCUG5*y1ia4*v zAP5$RiJCcf)f1qAptRy(NFVeaF`kfYJ=xXV-fZ>(Y5Y632hvYLB@FqBnSw-Hus&oh z^!L*i3yUTDmrj%4R54zw9Sgf^XM6UtHg^YgGoJ)!_Nb?c+_8PM3c8bjEoqLQ={peY zanJ!eFBs$@uGb+*Q?Ono$Uj2?WR>^I8L`--z3J%OE+%@t0e5san-tf7UE6+57I&@p ztN0rv{`XVyipouU1BzeZc#vL@t2h8R=DY|D$X?k~0D@-v>=R>U(yXQ#PNceQ7bzhX zxF+vsz?zV&`@C#1zKaKQlYId2;>=ICoI!DFaiojp$o`&^7szk`iv4G* zye2o^B^qbndl<S6gg1xV_^0I#~ixX;P@Dn{)d|;ftIV<{=ZeSZ<&_Lxe zYZo{%YP4aY@ZmDz)9QAij{pV1ihtgp8yx-cjnBL@nRON6rqGLIP50MO529977T{`t z=tMdUvg)YEpRxv>XWH!rK{^j5@PX82_gLNBb^9}G!prJ&cdb_C8^ECIZ^9uCAYjG? z&XRze22I5p74}NM{W3tcBYRJ=Aj-ypOG4KB`;(kA)~$?=+~WyecrrWl)Sp~pnia_xQ+o(pxF*{%LC31n#*6ag@XB*^c`XNdy5=b zAK<`LMv#&ffY*vs&icukASUN@>8O8Pdi(uu6P8^4&%k^pN1wXP zQjShe;+YYE-Nz$241Yd0QKT_GbY%ZVkR3)k`SWal^LkCKosr}l24EfyB4PQej&by) z@2dtjrvVo}=%@fybHK_=xTmjwO@Yf|fxtNTJKZtMx4ucogN7yqVMQytuU{5m9W(4b zKDFZ_j9N8J!%T$T$V1?SFI52`F_;nf$%SZE@^xI{tR%P`kQH)IDX-Klx!y3x zB95BC%t5=)kU1RhD?ffmV_zOk(Pq})&CC`(9drS$*fuA7P3>=iK`=aKhTH&jCoZh) zS55~%Xfi{bnLEsVfV0V(i`W_~BLq4>M8|*{k>2n!MM?bK6AXg5uDhE2L0fL7I1@xMqR8S#_AZ~~2(;0goU*QVfbidS+-Df38 zrk-J_?zv*5cA@Q)LiWp^T$s~+=qx=F+kPId;~+qwA1V{IpcTz;Jr9j9yZjbK;hvr{ zZ*PL3_6GH7`M1Q#B!yM_?ay-F79XG88+p&;P%}lly7g;brOm?U!Xj|HeG)f4U0(;9 zneh1*g}DIhXo6Bttz@B%z~ig;IrqoQw%1rk0Qh$P!OEhxkr{Livt=Qp>4B>$A&xLS zDx4-CP>Du16vlUPJhTWlI35mJ04PNOyk4JNgPtm^+1ToBAD+i*ZcYeLZzsw(hh?#4 z8(78zEWZ#EkPd#^%TKx13aX(^KFmIdv80ID-yeaQI81T9aL@HJb{~m7%C}DynV~)n zz9)QEVYz@R?Zz;6AFQ(KJl*5y9lcZy0s}+{`^_H4wK!ItGNC&hq1EVp&L6dfHArys zhg`v&<=liVjW8d3jqYcYAz$Ne43gC?xbFIrYqI)N_4s*+KnnBZR=lUo@qLNO_AxQT zDK1|SC}0ff0Q}34;JnyBO@X#Ds`Q~P8rSQ^6EK7%a>Kv~?%SVM1sKE}OB>O7N0=?E zi+Hu?zO@;47;7&EpqT!FWgc6^{E~Wror!{+Rj1O(T$Elf1m}MTOJ{yEew_9Ak=(^1 z*{sK;IFhCzef!Ih^~q`~0Re$jVh2F-ieQ!x1AhW;lUtpIO5FhJ;l&C35_l6{^tk;v zKiRhzDXKZ7Ff<S1 z<3fP0So?bU-BvBqj;AfJhO7nC45>EL$HCTJFRW?bq6a z>D9AUNGd%^D?NLM@t*g8X_o8$!-&CbZI>ZDFXKv+ueK^L;ZXK!bxys`?^)F_PTXK+ zMWVWE94`a^QEAcjY(jtg(6x>n*A&ruD_l2Bff9)`51_Qsk3j(>vO}f~IMU0wPmyif zK!g}XFQ>R-JbL;&n91Ec0PESO-jc5yrj6ragK_}c1)l{f$^~24N)POsE~!7k;!T2k znJ%YNj`LSZ7$lZo!Y=bId_ZNrcKx2;XpPGR=MluIB9hd>1+2M-^@D=Tz%j4b+i3>% z_XkP(XUILPinBE2<>^yK=>~!R{srgS4JmY|YaM5Q+VfWSjNS!{u$z0L^3PL&HTgT> zkEc3ZU7PVFucF3o8mRh8MW3)^M*Cf7Jx>aHC&sYi_Hk&e*9p&s^GqUUQ5+h#(j6~Q zDwomTPS-y6uGz&^S3d-Y`aq=OWyh6-ogs}T`3U_qE6VOgcUG$jY9-n{wtRb;=+K$w zJo#<;CoM^_(&jM?_)GDT-VpNvTTYrs+)yX#pCAJS3}q*J)m=7cD|8C$8v>BGG8joVbyOS)iZ}FpR%Gm z4V%VVv|@oOA-wnW$FKs-1eT(Z+GJcKyln*}DnXrc3#R|QxAN|$7(s}hi5V9U56b!B z14VT>In}nQVYb>g5bA=!O=5?Fb)@H^RntWrD>L&Rv_@iyw;oqhx&XmJe&T0rtBzkD z0syCWJk&rl%`?{^*wE<$wp98gg!w=>9HSq82Iu-GkGPJV#b#|u9)7hW(NfHQGkYqr z*LHK?1;?pVwJYxfn9g>CN$4t8Ze*uPzZ9&Ox#H06Cu~Nw>e$Tk6$jt+NHnfn6PCH6 zS1f|>-)4)}9~oOkS0(EwfxCa4{6Px76B%oSFqH|twd zT0+QxlS?440HTw@UyK8|vSzK?#WPJ?Cs5xfXF1?XAUHe`vIk_BfUV2sQdD#^+y~bw zgFGmnZdA@uH?!Lh;UE@TZUS-aR#F5)#2EdpTBB37{mGo0Pk-Zpbtywgq{xP zl_j)-8GDKe7=Bz?d0CsnukF;r**$D^Dc#xj}DdYxQyem)KY!fQ-nXVpKckPUiO(ARCj%5cC17C?H&s4*Y zxAO^Ku%9&YkUg#C&8Ij6sXk$5oYPg~bRw7vKvD-{X8<^2h|ZH~tBn|GHeyJdaDYiO zgVsBw9>_k|*cFNasBeZJj&WEW6JTSfrN6|t%nxkvKdtVYxEy{9(m`VJG|~1|ml+wZ z^M+dg(V7IlK+21|Oc#8WLe$law$UB#f=gg?X_;|Yr!?Qrj=oPyK&@$t9+~~HWHpo_ z3f>4Jb)@ia6nhK*BOaKK9DI3_2UPEQ8+^_grb>6#o_SyQ+I)m^EqnPDO!|#DP(Zjf zIA0$A>K6t{ipAp4D#KM+o~*O-!C#0t$ho$pbULjG>y!MXlVBKsqA}~9t>l7LGVYVL zNs}?_V?o+WrOH~jOj=tB19Xa=0c(914s&AE`TAPcSf8WDM<*@0k&#)vvBtH=t-lur z)oMS7=hNuEpx#p&p4A%!Y37N?IOM1}cZbZ5+krVK)Y`j%6!N8~e8fO^1SFTwRI~+r)!y;&=eQz zEdRs;V_xU^hT8~w-_md~{$|jC-MO})dPL2p4dS4yG---8U7E8!aVXk4{7x@}Kz4&x zKi(JMR?fVV+(iM{@$zZ_h!a0WL4{fN1qV9ou+i{2)ZoFDK<}}ZGdME_i<9{k-o?Vf z>k!JT5_!=h_;TW@meHlRT>e*1G1wGRZkTG{>w@!+1Z^+Kx%@hzFR!mJI%gJe8 zS-X}V-^})Aw<9YlxEXxU&Y#%bW0u2pnu4k>oVfHYfP)7A489vgI-iDFS*Tuy!#hbd1F=`Hm$ngo>@)A&c@}(^f<|=t zs}Bt``CVzc$?*j)#ok?0z~fj^22>3j^pmR1(2gZKq675V^HxO`F^>l^)8g^2a$)Ik&Xl9-YTw|B z30e+y7NUm_b%|52qE4Zpq>KpK%49%iNAn!0Rk+JfY|TGS#`~SVuyKpNnkl$iy(^Q~ zvGd{N67oDYE)v6f-e=YY7|YGRW}qlC z7hTkCpM{#fht{^m2=8un&q;@aCOaH6hw#*2#YGzNPfy%U$pAe}A~}xpQp&*v$Hxl2Q|#5`6Ojkx={HrB6Z9!s1J&2{6oj5*%(qCteplTA2@s zkAZ&U9e+(nvYCL7fjd-ud>AHx^8-(52r?$=)2^P#eY{w6HtX}l&23hyw(ze12yh8}6jb{&NbQ@Kd$4rou?>FdSQGSkc5S|92$Kxq>G#rm`)Ne%OlI3**XPWq?D@_r~T_9%h^<=X#>~&8tnk`P%=;TRJ4h^fJ$%cYT(_Vk@0RSid*G0O2 z>5_s_C!JV;C}3P;A4K<64lK9io16@O`iGjSt9BMAWC=7WJM_*6x|67X^_*p?#HH>v z8XyS(yVF3lG`Jf{1r1y6!6FbetksckE)r35s{Ngts~OsYNJV?_fj+|baO~~rKt1i? z|52PnDqZ@XDyIh&`Bo3gnYUyK9|7hKK3F+;+es( zU>AlA<*x4!%4pqsy06>3*0N<78dJ#me{ntiM*88zG;v%{|1a@Oy8*O49wuKDI~)u@ zr;y71RVFJyzV`Bbl%$}#XMee%01avxMHJ$@%3ba$Xo1n^>1hl?M`mW zt$gX}`o-Yt;X{3jv{tn**lnqO`YHd%HZMEnjJW)uk|^JABoj{ewq5x>X0!a}|C0|2 zuu2Kl1O3fjC!2X=tF0UBrWeNL0f_q*<7hZ&FZA|wd9{a3+7J#c1b)~MuH=kPF?e^N z@?@7y%wx3;tOovfGYkJY%Ac@bx51J1dcArIP} zvi8T+_VY$z{Uh!`y;ahwG3@7bE5L*ZvcT1~)6a>rK-bRyhkony*FB`ET|UsZp_PB6 zlH*WA*ELb=`pe|?#&!8O@|l;ysTOS?Nc-A(2(juGq9bKIWQX>DX@1@^-)z$U%WL%y zF;!=`^W1RXUv{kGwmrCUb3o&SMx~9=zpsA5X%s0Gn|y6QMa59!-wLAD6n_;&|MeXX z9o}KKHpW(X%QcJiI=gR=8-*&q;D9rcAzIu;1!$MW-@U;YJlR`gwZd>^ocAGAXQ%R z{QTym6`t|G>aw9?SY}pV>sp#7^PK2_0~h9aPFmeG-9Q`7e~XR+F@|RNG zIc2-tkkyN%sjsZMfYC7aKzyy$zG)VqjBui(E1=^{1xh0vR=wW_&|_|mdthZnsCE8B zq?J8Z1RwXEBj+nG$=wnwaaez2n zN5aIVN;UQkB^3+G^9rF_>R?(Qg95SnP3JnfqFX-!>UFLHR7&qKl+vXBP0pSRuSyS0 z2Lccx5J`>3${qg?(HiX=jQr}(6QGQ`ZufeS^ZB_lYCjMXJXc12tu*u;hQ1_B->|>O zMqdDkZvw9Gi}A$WY&>V`$|JZ>ZG$>fodbN;v|-W#FJEvL?B=slLo!geY}Nl6;;G<} zQTbTnqhnVC*Q@bHqASL#YDPcfxR=n{#M0-=sH|U&ziu440%_H%5g@IqQW{d*h5#to zkj14qg^9nUV~!ce_N&wWOIAjX-@>@mjBgKZOsG@**Vp(RyOsIu*f&{laaR^q?oM{~ zr`s-Q4?0(8MM@n0%5cu7zxe^%LoDvF+i~~G+Q&c^_v&(y-??lxs}+{B+B_HWo^T=I zu2#K5o3jg**(d)yU9T|m-!AlZb~s4*ftB}7tUcOTl1Z9Y@xHCiI!>2WQ%6OaT<{;N zFy#w&nGHMC?$_gZbe4=fFH4>x@`0$ToK0yL`D90k4j<7v^&`PLezvGj9+>H2G|asFB{H+bC_$kuM&yeVD;v*6{8RDvQyH=8n1W(!yy0-73y`kVPYrwf_84fgqf4ol$!&xyL304IE*ev^xLDy_QqLo$5X4 zn>^LBq58dUe_BMHE8Wrw6SKevO-Sdu<;t*vl=#Td9S1>&`Q$1C_3z}R zmH+XPv^D6yfjodztjO;q+&u28tTND+r`yXdlQ;M~%zrYbPIsVRVb?pa#B*`zxUc++ zluXfYo|}g!Bj3!+hV?~8?r2QL3)~aFkJDFL0`c;B6bGsvAeUZFhCMzs?p+)mrQ3b` zj*}|Bm+~bCvVus)BV9X1S~BtxOYw>LA>A^`cLP2xnR_(2QU-FS!SQo(sq#A(fy)%@ zWCgKjNKHLC`-ZAjbo^rJ2$_B;r+7t~K#yat0co#70N^0NPGe>s)85OwJm}ItW7z)W zl3_yf1OJAVvTN%a1o3Rz%wi2QH{#;s4TWyp7cI+9A{eX~Fh!|6*mCe_!cm6tJPH0N z)2pl1in?;c8Z2Nu%dQ@2q6$;C~3w;vHqpul;C8D=h@+3=9pM9Cx%f(G{({WCK%!Ma1V= zduwpz29--i?J4idw3RdfXsaEqUTwAI_+8La38<_1$|DXX>-WS)+s*f!B~hP1GF1)Z zh)Q28yA9H796Nxns%Qgb>2dD|_o{$YRfpya8pSWxS7#1+#axP#8rqvIILF($_u9-I z-X$6~ITaTHWH-|sKXN@}!yPAlnc3QuEEts@d1EZYWPMe&<%rOQ00>C7*YMvmFtQxh zDALj1vo*c5#*gf~Jbpj}?)6OYp(I7HoWW)N3%BX6eE~#M%nYUTPlOtLlJW3GcWlGu zLtRHy+2Ekw*s>5DmYzS`RenO_9mMtl%zZ8D1#OW!Pk zMCVS~T}nPV>ZA@tserNqm0c!begV_2x)kO~(ac!`PBF)VKAj}sCkyBGP;JC#U{B3P* zpRj&%wR0`Y1qy%vo_*RTd;W8hFg6=Gm-UHR1%EmH(F8I}EthP&Z+@4C67V46P)Aye zq&Ihs1Y|KQef_Bd&vlt`V7h5@CxS)=xcWfI#Na0Yg7<&?N~i5+@m0(Zxq=ielO zY)8u@AU*b3iOP7d5FTXaiQf`UDfKkdp5&gcH|jHuMcBXrkZP4|f7kM*L%g}Zq3R1X={ z@fi|5pyAVM(aTbmz4W&EPJHP#ZmXMpqYEmd?`cgk`Gc+VoL|nTbj%dGQ1jDt@>3)t zOHiUB_g{FgDqGet2+szxusTO`k{LMGxX*KaFDskbVN2}^_?EiyN=G4^Fv>Vj@yqDE zI{c=-G%DI&c+MQQSU#ImKp;lCtK}i2p{zwB&(v;L2`T-&uB+?UOF*ViY+@Q}m=;-QKBA=^I^d~i-Who{|D~htJeeY|F6`_m$949F zAUoc0kqhI4LE1Fe{;n50r)GUy<>`vbibH+lA680B9fYem7vepuZ?OTvP9s<^b}9N+ zq>wyQK`T4g+Zo5JJC`4}ATUsvjT?H3K4sP(#eac)-q9w%pkY+!nra!hFFNXO0`6kz zEAmZ*PmNJ+4(=;K_46v40y|OaJqvCd3-J(${Asv}hpX_IxR}GqgzTMqvGU8?3nS*O ztngyDHm4{mbrw~&cT&M*&ljy=lF}cOA4RHJ3EiR?pq?2r*J**c*Ou&8(P+f4hJ=RQ zU*NAD-cRW0M!N=0E6wH^72yqzn_^{I z(s=CC8r7xZ*t#2rN}RqO9cTXhe#Sz)z_R&_^BwA;7zybr`|Brg6#M2&TRw@ypIM~) z``<^Wjt&+E!Z*j6F_hMwLg_XyU;iB6O1(kWv34}C^h1>;KAF7*-O*kDtoNcIUEn9R zpnY4ZLpytcWXLl=#uPlSqn=WcF*uQTvCLSPd5_v?IBYkkYLzRVCs7q2yzs(fLIQcM zn|+A|k33uZf@OxOo;=A8H!I6teas)4TEvB$m>8(#$?^cZCm1Tp>`__&9T{&a^3~V> zteeh5xR;~6boDX7i}cziI(;WKUr;)?~PyRJ%< zv7M9VRfKC;O=A4%DG#>gcB47z0};EvNsqL}rl3>Z1f~6aF$oPbp zdVr2_`3)77y)BFPWXM;?@$-$iw}Jh>k^O=(+cN#JH=p!gya2q!=H)v=MW1JfjEXGp zh-G~rR#1@b1`m0}e2i6sd5Mw@$B49#fBFbJHQbO2QN1g}`nhx}P({!z0=kPebRJ~# z;G+y-7LE5|e$j-!*&$u&#HAi*9CId5rfBq}R|Q6FK-1cqJ!U~t3);?Gb8qNff+@eK zMKkSK#A#i9sPOGQ?VbJCJGX`r24p5NwIU2k#t-5e&>F1Fd)lnHeR}O_l7Z|Zm0!n5rn+EN=Fh$7?lcQAy7gd!)n1)Hgx?0~ zv8=mqXWuw-Ea-W_uxN!5nu|Acoi=(ybelj95p859Met+l5Wa}8gXNz=!_4_ZAHJ=% zR8^2fau&@4il;@WEha!9So2<1r18mmB`|iSe(9X8`((i-*!^AQuEpq&RDoQzf1-xH zG(RTt_P6t#P1__*JcfzZD&OtzfEJ?%cg7QxGlj@h(jMTyYYwLJFGZOmt%L0rj6ja;M({7pKTLf57 ze&1}p_y}mss}^)@C)mz`UtV6KOoTpk%U$u)Y9&f(!LHQVf3D47W~-+#(OP6zKb~i- zj+Q?A^{mXTHt3NM3OtqePJ8$lc#RtqyOF;UEHpH1Hsg8Dwl7s(C|H_-VOOd?%)9Td zSbeLu=W#jOXo^;sHmgvD!NnPt8^q05=YmPZ{POQP^_kEwTgn=I#*Ro^9Y<`^GNS3~- zWMcAwJ(KFJ1sg9L6>F{0ntLik8H>|J-j{sr}<|nFEA55EeLSPT>U;|`lm18UT)k%JZB@Yt@Xfu{tTWLzsF$z z_DSeWnNBMYZlREb1yO$9WqB%WF1N{U?AGbLTDyh?pR$8+LAG3e|tZc zR2ss|sBBYmy#FQM*z4%QnEQH6%p-2);+4dJMXBAfaF=&g=J(6|b%+QuU& z%u9n42%BS>g45sXgFRpW*6K|fQcZBBN4-E(*V~fq5l13=1>tl`Q`6R(FM-M^k#MgC zFWDVd8hu-=61?$*!if33WwdIJt~1L96w7H}+J_4cYg+ij;OyC&ou#a`a8 zF9|F-ex}H$YkITqc(FaQ;)@IouO%5~wS!CbaC$_u=-O<9jt+DEJ@Th_k#uD7{d4A+ zYfDFioc5o(xJ@0UzzFl}$S2*BQMTq8Bhwly1-a;?6n*Xudz<}HceqAS8SJ2ZvVX`2 zI442iV@x0P&Z3s17UDY=a$R`gAOAT=vdBr_ky%qZJr>v|MSZhpj)_`1-X8eC#aXB(QjPgbFbIE z{vga<0+;R4rKZ+?V9UT`=k1-YN}5i`mqIoazI`;;6U5g=oJxbYg;a7`DcxKixgE?y zX0*QtHub9tk&*tgkEld!*mgS^QBT~HPak!k)0G~db}-Iv3BUu8b$^<-y1EHg?gk_D zdoySJ@!~m=sjK5G^Hdgec`Q0MQpDPZWg4(bPj2(sTfkQe#k=%~a6Zoj%n!YtjYVrmA*Ni)x&eY4MbR3;Ux003FuZ` zcCZHdk;w#~>?JjgMf$)x9+gr26A=CiG{yg*S$zjfmaV-$KPfFA*Bed9r(=fY<75V+ung}Ru zGVKR+)Td)!;J@UQl+Wb9VXBEBe;h-ga8dEK``&V$WW`ZxA&}dGY=gfqZ%&1*Bwo#C zHRFhao+KoNe92)G_Ro|PN1592XQPnGy*jnuv8Oi43KsSPxR>$`GN^u$KJ0!c9y>J= z@J7m)cWo%QkVgzgBAz-byI+~@mVQ7?cPJi|ojBO?huFE0g2}E3;!Z>N{6Mk7UpyKg zNkoG^oqt?9D%(pR$I!juNTZatur5tzgc|brUZr}sC+z6D?dD!rr0~vJJp6-iw-gVH z&e9L>2xBmN`Aumm7T2PTH|XiJ$?PP7r`?Ut>p^^~t*xe&cAFXZ+vu2&_k0!!tY;z0 zg5XDe<%M#AazKj^WlR$O#2gc;nZ%IL6rDmVE5{JgK3~mfgx*Bcaff^?Uirg#4JEXT zy5TciH1n9%t}2^35CNQ`NYv3*TMW@TYi8k!7xA`46yZI?3s{Ot{FlKJ(KsH>E;>jnNNnx_o?df-P;ZFTMe1Cfg zWUTy$HA{l$>=O&=TqnxGL6XdVT{p?s?In!)pIf1!)p{{gy+DP7^b#;4QsghB2sCOb zOV^Q}q(u0y?DM&Tr))VsMSw{XLTxDVLU2>Lbsn_H&3yMHdoqe}-?{wrHquCPm(mEV z_~IB9_T%Q?IkDwn5$Nx%30$~f%|cy>y4Q|K^}}DcIeLjl-Nd-@`WNmO3ZFN@}e)1D-kU2i#dqD)n`V2-A@F;jEYa-R-_D#{#mL4!M?`J z-7iZFtsJ$xtvrpzY}El%TvExE4{|C~7>>HJ>(9Pp#=={3BW?iHVNU7tWN)q~ec5Za zKILgR3$jBg?QaCE;mt~^u{}^h6#WpTw9|S$JeYv)o59qRHz&f#`W*}u0-3tvP=lpn zdJ@R$YBtx8Pavl~zA`T_RM{a+prRZtch-76qWwW}(myNpfbEe>2{wp0b|T6?W9bX$ zLr4{D^_#!p&lHIj7$bqK%Wb zYFnxGl4v22_d|L_B={fKqiDyM7pMXeRbvxx%o$)r6D<}OECac|3pNi3GFziPqqx);=SSdwAYExF zBDOHEh-jnhTlK&j%&4>n1~?S&Q&ON_Dth?|6c(dm@yA89iRG#D?xlqIGhXREDt9s# z|Gf5ECDTNU(@>*ZL&-#=o!8dgKDP@J{<9bl*ycYf@#@Jvi8Ee%iM0Y5iRjoIY#7Uq ztm=jCwARVGYI}s`%Ukc*gC8FwLKcUH7L*m(;{Z4!H_qb)Q@cqJ5OIkgP3rVq( zV1bXv8kcPv^i#K8B>FDJ#F9YAQm-H*IZ{Uakb5osSG?nN7x(OA-U3})jkHdAvh@sT z8sAm^ptbs!PhOU#lvw@SAw2o4__^i*X=@=cVF-3qreaF+hOpaafzI)nHI@(0_tCS} zCuE#G2H}2HG{0uqRjJy)7k%-U*b&h8Rg^;Ix`@fRd`XFB1S?7aV{P{+<|!pPOM!x8 ziuB$sF@|M5_pL*l`8XxFQDWfr4bEySLJ-ZNIuaK8KD|2+!TbS#5$D!ls$4Mq{X3_( zw3he?wdNos$fJ~Eu_IdyX0l@YjxhE2cE+$avfKARAZqXzF#fJZ$8JsF9OF^uy?=+5 zz>-q^;8g=0#^d^I8_Cec7kM?KrF?VFOkDrM&z@~L5*u$b%9E(oe@r1`37+y&BDM_Q zF{_oOZoUKg(3T4%C33US{DfX|cfQq3W$Lz;Nxis_O!y~NrRUui{c|Rte7VXV)kYJ@ z>-DseHVEfF0=I^kT;iI%R;&1G0Vs}UZF*p?YHr!itclDo@r(|vh>VbitHysD#QLXYO{f;TDk4| z*J|eIiV}``YcC01pWe%nj#IcCR^f4fP=TarmX}eT^~lgrHrgojpya~mvPz?O?=N|O z>Cl~immEj4d>-Hj0Q1>I#wi*-&M2@`aOX7q!(g_%@N3yT$ zV4m9bsD)dtTv5h<6B*z4A1u_V$0yD03kn)L7*jqhB65du{stC>iQoafKoHdH)^{T% zA)%9={{C#xsE%1Ud&iym$}_r+b1cfZUx0KRfz(0a-V+G-o?VO?x{|JOI|=WEwg#Ud zJE-f`1(i-2(g@bq8QOkL1a+&K&8z0koa4T2uwV5uZ+7SGw<$e$8_^y1zomupHwVhA z)yHFg=Y^oqiQONL)1yRCzn0ywJRc;UONM!V!n`}EM|VJ#U{R3DGp?g*M16h=#TchQ zur(*-7{@W(yzT9jKNvQ1WX)^6h&Huu(e&)C8ueZ33bNDDwNve)4i|OIPNR!C7@q1i zS?28mH)gZ;lDYqpm0{OyjJ(xBTE8y~2IC z)cyo>QW<^Ijzw-@nC>#x=<9!&G|Cbn9Cg3p-Y0b_QW^=@7tsU>Tba%4^YZY%OY=ny zOX4WLH8))au;A8whv0U$wj5t&bmO3omRAY5v>Iv8u;EA7gAcU!KoDq!(b&MgAp2Z3 zc7bQ&2g}IF@>dN&QY6!~^O-Ij4$M93c;WRQ7LSF4+s$(FACFhvJ`>VkcQVSP_pwGVT7P57t1SP=}I?!%&k&i=8kqt&GnY7hAXbNfh9eNz?0 zEF%#!@{eYf3)o+h@u4eP?DdCe9LST4!8P|C`EcP zPFZjoGwR_N%>b=!c1VAM&7({yzwg0uIPZ`1AksmKr3UQ159l#)E&xA}nlVM}BQ9%T zMdGFWT#c(8;dyt+vH@f+L60h2fZ*Y&kLu|)fkpN5gtV5dBkskmWx z4xximDr>?TPtE8=frI^()QDxUj+%ySoQnC}asY3!7Oy|JNPj6>X(x-ql({|eJ%!^Q zEhIfNX$T%88?W>uG4@gaA)7pCT163F6FpTAqn){|>c`NED4&*mPla^70qLO$7>$C? zPP9V9Q3=Hti$KhB5n_a%dgSD4|GTG0wR8GXVcG0E63L^hQj8dz71Wt*`@e#Hiq9@; z=sneo`T6uoWfAL2-y8(LfNaobat6^LE|0x|3PCmn@XlS#KyL3{bqe=X4C<(1rV$cH zdwcm4%Lu8_M@t3};~)kx&;UH!t>vdmyn`6&2U5hhU3)Wea{^67J5DSio^&^Q{DR%z zLOALQdI|TPgtAl=`7Nr3OGAl>1Lrzzd5|o>s37`lQed!lwB>BO8aU{kkB7`JDIxo( z7uJ6YNuzeegmmBI90c&+oOM4=@1Per;FsiCKHz2od-xmv3p{Kwx49JRuIsfN1q;fV zAkM9Fd!)xj=d#!6`9b8*t#0T8g%Xc3z3qH*tWORJ<^l{fL|zV-(vA3cmNct1&4!o- zmdSV!VxrGrYpA{_*F+!jtu*72J8gGM1RS{+bcq%5dM+@U725refS zdX|Wsf*f(=g;<{bTi!2hrNPt0w`1&c_(*EmaE|^$PYF6*XnUw}Cmh8Qj(r~%TEQ=N z$9&*VWog`Oa2+}Oo_gA3PP~yfpTJW}DCF8}_eNkD)pwQ4@H0KD=}~v5<V&33D^@g5*1_ZYISq`imHO|g((4!2W}_XzHLMNpiA<0|-oVOn%I`&c~X zb}j=OH4zQ}*{%iVE~N%oMHa=_@eL9+kdN8WpQJ&_+WvW#xU@YOSR#etgD>oq+rQFn z)9kG60x|H738ybIVcOv}clk|n4fLkMFsxSiVWD9*VqTYeVkCfXgNT8~-bzs9bcINx z(l8LDxU^N}iww?&O@HkcUeOlRwoQacd~NUt~fgMw4%hUIKStxyY&{ND%Vdk?@jLX|O5Tz4(GAa>WWmHJ0azK6evh(T*aH+6t?-wl9)V;M_rK zz=EO~8H6X~e1g=Bm!V_^)u)G)T6Gfc79%ezg+TE@bRD}RQ}TK94}#$xA)*!?wX*Za z#+m^*JCJ#rlAB38zrZMC=n}jPGjHABM<{_b6YTp-$6&>+OFKM_zO0Z4KV_VHS;5$f z_*3{)F-a1Hr<q9YbE3a@ z2TgNWy#pEEXKMnv-C(6Z=75#~9qaxWm%)VweP$H~C%4eWkY5QCc=AxGLNdFi0CBKp z$|kTI1q6y@1r$*}s6=G)@ddMY0)=xGz?o|yi9hlX1v}y3%1;ekZZBT{YYBuMI3hc> zIpaH<{$_1{!l)AB;U~PCHujLef=fH$B1~7)f8t4t(=(7XXM@*0 zbw)ji)<5a9s{GP9qWS-{_2uzUMt|E=ma?RxP)*6cQ_ub`q`VLg_6%dU{90f>(!_As+%lMooay{1xOi_kq;pH)(~% zLB3)Uprzr(c6>6=L3M$(0n)Ng*jyd6?Si%u_*S4X5faZUA;Tb_@{9$sI?AkwFmayziTrie?qL!U;B^ovGmp z_yY45nEV;}Hp^%bL+=5f14N)EASu#rfRE42=T#`D1wt5h^(DG-?cA^o}sX=24!B0;jt)Zj(>2s8uroX@;#kH1!4{!}X{b_q=1!OQ_Z zVm&fuQhMkea|0z8myz)zg%aZUx7`&va2jcNBE)(0hd`Sc=sb+WcR_pspqhjQvG_PY zsC5SO^=0Qa(DG`6VKwb{MDDznaTCAuM$B=1tcDA>gRmz(+#GAxezn++HaBJmoIgT% zU+j!0J*@|u^;-B%#$>S_Llws2f@z*#L}d!z`Xzi~}&yH|97pn0VvGLt=yz2@y+l{mV)W~JLgNs(F*TrroYfHqK*H)6-6CPX}Ytnvtlk2Bd&rEd1=9heSx1$dt z7T6Ole(-s5A|Eg!)j16?Psrlw*up}cTV1TGN&SZ)lKx)T&FuJ4!7%GCG2X_vYq5=b z55X=Ns=eSc-*WnRewtlj_7Y62Kq`e2Ehwv%SHU-(Ko(D;A!h~=RG#Pe_stiWzTFVj zxjr40w@BPzUz(`swhD-loU2;E4AY2(*&4z@%3eFHw|H8_m3~;%f{pRX!y55w@)24c zTc)mu8eZeNHh$WW}=L_wsMZ~^% z`MSbUJSZqtkUQJvknzibFdq2G?y*qBUisvjb_D*9K0uG}0=_3Az?dzxgkc=kD?PNt z2Yp#spVU@6ir6*K;pZka))mUeu{quf}~Wd?dR!*RbZ-c9A07!J7y-?dF1r* zOEOo$&4BY)&Z*t(oW7+w3Emz}14Q~@TVhQTv|Q!cUpS?8{54yw9ZVK_EO$*NlfJMt zJoBz@l1|0XpwV;|Y3V6afTDcoamH@cX8>&%9zKW@ISxE6BeRwAlYP(=Cz4?M5noac zK?7<7h}xXOSCbjE-gItvO^B@(alrv-0KAU(wIN!^NwTLNy^$sh6B&8u8hpk8x}%z` z+`b-@+6vr1k`+{NtIcDGFDbn-mc#S!3LiUh$v-@3Cx+b^LPQ=04Q;3r1>C&I^914M zx7I^msc111R0|dwC0-Xsa%>xl2tlmtKU$~mNki<2=tmsQ9)n>W#oOvQHCk3qqVK~2 zJrx20#*5-fZ-Iihyqz0*^nJ2vpNX4C+_e&`)BB!m6 zB^7`EJW_2KzHTF#ChX-xf+bRNu|VEb=T1o@uzT_%FQwQ8(4?P}w22eY7~Yq*4i+VU zMA~KggW^D;O0lM0IB{_o9gzmDOwFpFyx-Ztt)9etAAfgG=kWWHp%EP>v%aM-Eqd&d4f>ZAFYuo3 zT!>6fIov*|487n28IKlpOE5hozm8 z4@!KsjKM620v&1KSzKs{CO=wJ6Sub6pp=}eyO*}7B7dsSQ+Fts|Mm3gsM)X1XBaI# zE-G_0PuLk<4Rpns-Sj;IdGcgdCm0EHwJV905Y5fpnvq~ORKk28$ zW#8yQQP3HwMJW3%Sn2R;I_PrRBro5nq4AWEyGaqo&U>^Qi{C|fKC9R7t2C)izs9M79^ePKcqn-FpX=(W>IB{FSymW3T%c})gy!VKb__THmx6Qz zPiWJuAFm?6azUp&ud|}*^O@du33fP4Y4;@Hi_V0G_!uWKyd_pE$;RY(sE#!Jp>6Dl zBKXXJSp)Okd2d-V!%X_EoD_>*oWHe$g8(b6G|JkF~Ll-%`sP#$R6F&RHa@~Gos#}pJC z%IN(8xOP{Wqu8gollYROi@tL+gVtALHNE9&-??vl*%n0MTZj`UlbX~9)ypeTKLoT? ze0l<-P#IBtNP?SAF5+iP%@G>9(vBa)qp{5~_g%0_ zeheOX-Rq(#GGZv*=rjk|KYH&-R$*{Vg91qO0weijJuLKMF*IZ%4OMwjU2Q#A@`zWx z>e2;Jb>5L@msWQu{;8uIXEm-7U2nB(dv#Fr{jqs9wplb$lQ61cmuej92 z+qrnC5iG)<&{eqc{DLg2^vR$9r7f)p3~TF`T5@_xKryrP%C9qH0F(?_$t(u zrCS1X;UP#~c}hZGqkcp}^_`!G*TWBRU zJ>Cw&dZc$hk;1$7s+o5$l|3lTUd29|A{#7II}m|uKuR!(qeH5jC9Bav^fD%IGfAg> z&y{E@*uFGr?&>x9u2Elet!e|I*k{NSFk>#1We+HOoeQygHe!a1VTipY_QuA*XNlK{ z>6%^Z9Jp}7HNkcfz}<{X&Us`R7(}WE@Zzf$k?n-}o$c|n8G0II|IL+!Pr(28fseP6 zeD%Y9SwNG5{_UU%4D{TbpYEE?szyGwVAN{lZoKlibmx-005=4>49gc~vC+yuGA1=E z{{{5k$@`_of&8RKEhFh{qM3_tyM&XrP>l2yB=a~kvN3cQe~boMR;k->q>AaoAF&!~ zUkE~L?b|gjVINJliW%#Uitp~V3pcKO+Yca^_Is1t+jY56OTlIkEuJjW4O@w?0h5dA z8ttWsr(Gw_nlF_9zPNG3`_;HJnY3P;ysxjO+D%5XI^bD>eXo>`kL7(2T>A7tn_9b0 z03L9kw)16yF-H~nYp3;5Bels4>FwVE5p9$O7L%ur>2~>#{Ea23?(L6SxI^ zSRqZI1^Yp%WWx+aDkxcm2Q*Td7wH>Qfjfg}Ly39!d35{v6(+OU(iR8b9+Pks6nT4Z z+|oV%wYQriXJPMr**p4Sx^uvuci~b>lbw^IBVI3*)^Gwi@QD3IM(fqevU79_YU$5- z0B6?`nVa!KHAK4tYBF9-Hb~Y%i8_%rs5OapVbwhbx_&DSjlco$R8x7w^33jLM)7q} z>)F^ivl;XbmgIh4I`(kgwT3bet{$Q)rx!2CopPP)3e8(5ok~kQ0=G`xtcJg3O&Vkc zPx(r~}O1}T_ML|?Qs0X%NH_t6mlgiz6G)=uzW<@2GJ&I`aJ~>Qdv2D z-PPkKWpq;Qru-$CgxF17T4F#c(UxXTghP%Qx?YswxCNxc>6@u`m25MxkShXt&;}`T z)p*~4!-Eho02C^rdh$5Zkh_#`M6@B{dZT-ZG_?o5R&B`@b?!zNRE7kBm)JB*}b~2?z5}M?v1}4S)KB$ z?Wi%GQm2vHI8Yx@MMPi5!`klwV3EClOG;oLub^dKEhV?c5?|59w}+Jnb*UMC0e@e8 zx(i3JZms0F`hXm^g(|1c^xgp%RTqWr{ezg3mV`w~-g@lh&pzoNoiDp_yYP!#WW zKd$TdYCe>uTSxSf${A@g+liui(w{OCgw`VY%MWG@n3amjxi0gAMkjHT(8Pl%Giws zQbE<$tg+!qgzu5YVsO!eJ9|gn&cwIr-*cnMn%GRTcnI*r_5LDdjv0-1jY=&j=683s zEc#Cb%w0MixSbH?qW3w~nA;lltaV!TQi6uB)SJaA8_(NOvNR3|P$9{7i%Yp}Z57cy zLzh8%VPBMRA2Z0Sh)Mn9qgZs|Ohse7&)hI{d*$wlb$#iUuvvCbi%|TOcuLnWVecPJ zkav$$hKb%Rbk;&@HK&N!-#=V#fWaNX;7TMIj3p0Zel%&@B*vi5)A(#9s(aRX5cilv zp}QBed;c0tX$MlP z87xss1d=|9Ar0y>Lb!+#2?l|6QVTb=v;=o@S4#*KB4`$qk)AessTMMkFB-i z!gNOW9mQn8M|lMG+T9Arw}@r7F~8H0DbBxxM9y&S8jQR>2MjP&1I?0=JMngfTDm)) zS5c9Hi{XcuN`(sA&wpMBY@pY5<+^x}|HZ(SnrjgUE)?sF-gr0r*FlIIW3Q%v>%J~% zcyJb<-5;c7GOo?hEdH7!w-z^}cLMmI&FFd4>K4(kOq+<-o7QA?(XClcp+!B;lFm)S zGSIZ;N60^vNiSglFLCRT$%b9(lioi|>$(y0I7H)MXiXf|cN$Jw!=6*2_MfBPXMOu= z8d1AOj9P=QpkX{z@)p)Mjw(hL(7j;s)S`qJsXsH$!fs!Yrj}c&7|MSDVSXKtqb_&c z^}OfxVVZ)kJpnC)dR(eHyvn)xf$hkRPr-@$k}YEkmVp#d;aiOe-LO#p#~ChvGS&-D z?qDUFold!=9MK{vB_6Ij#u_8hv}Sbhs8?~#W{{Q>{!PD`$F1MM8vXGlMxN>^5lI#t z0Ovofc7Lo<$?7Kc!tXlxGTd#z>=L@%X|s!a#(w*DP)F6&z8#}5+JVy!*gzfBDC9Ko zHu9t6*i*pCqJgG=OGq=D{_&8P@}yOP6+BzxCa?wRpE{wxH@n=@^XcOhXt^1mHcy_( z;6SRWAo>Gxv_>}svY{}Di^K0GHXdHN8Nu51~t1nE`cF-s2o%jQwmZ-HR z%7faM?GBuYZG&z$+z0+RlmWb~~BJ&>GZ!Z;V&Ty`ii>j^C zwKH_SR!!9;9dHv=b9EH`@XGWuEQ`auu4a3Utp2T;-2qLZ|RXLgJ?`@8haD@^c8C`4>mI;7S@yNG} z0Xe3g(5C%K|F^pUzcY;xL^ZJ-e^UO9uXOS8D*@IcH&|!8JCWerv@l)2g&hl; zEa)&i`9#8ZIdpIB3{&4Sr;FJt_Z?S#oWrMViK^!$%7eq;*p3SNx!7P>CI9tB*ZY@V z0z>y@zq@R73N3-juoR0*CsVxPZU89~Edw)UEpMyZp{;iQh<>-Qc`Trprs&@md=U&a zlbylCf8)HTh`Y~LCv+rok)uFiUTw>(`9@ivA->ooEJV2EdQ_vVbxdFG|AiN-|9y|L zTrd1)DZTT5nICb{KN{W7Y7x3vtL63CTVUW31;dDyfOXz>m5!9l?e4vSMZi9)P#gQQd#GulK#!1iqN#Auc2MH#4(s((Q(_ zPls+3e$RW)D{JRfOiWCOJcdZls`qxyAlz4*M_IONi1d)w8L6+<-lSSH8GD<~Bq+IT z`Tg)%>F}cJV91&FM0ge@ExaoJk2;Z|@s-MdTb_SGs>4k+JE)%ucd-_zsn1ld&hij! z@sbzBP`(G;UiO;5XPV2Z!F)Yl+b5LU^_l&d4UrjWs=J}KnN&^T()S?cz>Ys2MoeiZcF4Fk?VdAFI=4%1>v z<*#9u1gFpIN)0dTi`O!ltX8$%M63rWK}?pc9zq#qf3mFEFihA+iiPycrRM_P{$3Q= zhca9K8mCf+*#gv{?Q;R~RP4ZVM|+TLxgANl_Uds-kI)8s$*1xe9p8ryq+#YU=qJ-& zM`oRiKB>9)bLya3a1%v;&O`Mlns*eYH{WOwXSE&Pz5cpcq=Sb~mwo}t6+wsesLK0p z^Y^Vv-#Sof-ujrQDPsYHVI<&1t_4NmpI2zKt7`@e{a^O<=7l}kwT?phXl*^orm+Pz zU#Uo-Wz?(0bBvS=i2I-T80soYM%f;cSt}M5FY)`a>aOZ`Id{}+dr9Jz?Tw*dV13Ij zBvn$ZS;&+ItE9KF#2N&^R;^sd%X`B5Jxxd?G zygv95^;}Rkzqqn%@yQtys81%fV@MA_jfSkMDerfFjzKDS_NU;z8GPZK&c9*zm;b&7 z$C)!pU!2^@geO;-=(Ar@f|b2GL!g4g3Ci-Ni6v*9pJ59;Sb%%i?KaN4E2qc2XviSz zCt;*SIFu|9#vM(jglwK_4QRH?@!$NPX@eL$O?)ZWE>u1hXc2zEh+t@LBhTI&5`9;_ zQbG_VXr6WWX7^9zcqMr)GaL>X^q2 zd)>ce8}L^K{S_H1vl^h-(^$n&H9ng6P+o?IAnG&#`lMU|11OY3+lT#_TWR-MlWCG) zvtvzr)Xs?20b28y<7bt<(2X__7$9Aq{D(FED;HrZ*Dz^FHqbe#(!JWO^?839iJm>N zSL!^l(EqSZ0HWcpf>JW@Tx+TuqJs$9Fx%-HiYc>g@ercWUyZo;yx=`(Sk$-8D+U`f zeOAk=q%T3=q_tc7+b9wR4~!hZw4wwLh|Hx$jGAE&WuEcnV$3C(^gb*+`@O980Oa07 zzUXI{2Do;~Nm>mfIHp55%P&u#eXJg>9zKsGJYRne4k#^)z$3Dlfq`2Xgc%uT&5-~K zDkOUZ`7$t6sWLD$G&3;#{12pG0<{=0FuY1&V6d9Oz#yJKDgLM%P;HZ^i(^Q|tv9!J zb2d1LxLgcfbNYgs&Vft3JS>a9wwoC)IB2QrQ&73#c28|3mxG5nuNy;CV5FHc!@(6X z+XWjELi$c~I2dSsHDD6xIrT1xaZ#XUFGB~{hwCds0vRU-e*DGkviQ+_t_fFWF$jn{ ugfIj$3Wz?4zPm??@kAvf1H=FS%nTWN;#WSM-lG6?4TGnvpUXO@geCy+m{05g literal 0 HcmV?d00001 diff --git a/data/images/game/imbuing/imbui-timer-bg.png b/data/images/game/imbuing/imbui-timer-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e77aa82db4221f5eaba2c4c470ccac72c77158ea GIT binary patch literal 3973 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 ZI_JM!^MYk)e>v{|_Mj`yT)R literal 0 HcmV?d00001 diff --git a/data/images/game/imbuing/intricate-button.png b/data/images/game/imbuing/intricate-button.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bd402205be92888bfacaaa3e09e6b32db2d0f5 GIT binary patch literal 10166 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 literal 0 HcmV?d00001 diff --git a/data/images/game/imbuing/pick-item-button.png b/data/images/game/imbuing/pick-item-button.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8f6fffcefa8c522f4c48aa6f647d7a792dc8b6 GIT binary patch literal 11604 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 WMeey3hVI7yo=;iXAxkVgul_G8PssKF literal 0 HcmV?d00001 diff --git a/data/images/game/imbuing/powerfull-button.png b/data/images/game/imbuing/powerfull-button.png new file mode 100644 index 0000000000000000000000000000000000000000..da5b3ec7c905c21ecad5b662ef7df652bf54b64e GIT binary patch literal 10072 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 Hu0mjf#^IMn diff --git a/data/images/game/prey/balanceBg.png b/data/images/game/prey/balanceBg.png new file mode 100644 index 0000000000000000000000000000000000000000..2028d1e3bb8e25fec4e330568607d760a0271a22 GIT binary patch literal 1973 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 DXUo(C literal 0 HcmV?d00001 diff --git a/data/images/ui/item66.png b/data/images/ui/item66.png new file mode 100644 index 0000000000000000000000000000000000000000..dd2a6954e51ef1f7d88783d01cd5259d2cf7d763 GIT binary patch literal 3322 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 JPDHLkV1k?cb-(}s literal 0 HcmV?d00001 diff --git a/data/images/ui/t2pixel-up-frame-borderimage_2.png b/data/images/ui/t2pixel-up-frame-borderimage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d12827bd0f810012ed077770a0b065ec913d493 GIT binary patch literal 33660 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 literal 0 HcmV?d00001 diff --git a/modules/game_imbui/classes/imbuementitem.lua b/modules/game_imbui/classes/imbuementitem.lua new file mode 100644 index 0000000000..f61ab217cd --- /dev/null +++ b/modules/game_imbui/classes/imbuementitem.lua @@ -0,0 +1,440 @@ +if not ImbuementItem then + ImbuementItem = { + window = nil, + confirmWindow = nil, + lastselectedwidget = nil, + selectedSlot = 0, + itemId = 0, + tier = 0, + slots = 0, + activeSlots = {}, + availableImbuements = {}, + needItems = {}, + } +end + +ImbuementItem.__index = ImbuementItem + +local self = ImbuementItem +function ImbuementItem.setup(itemId, tier, slots, activeSlots, availableImbuements, needItems) + self.itemId = itemId + self.tier = tier + self.slots = slots + + self.activeSlots = {} + for i = 0, #activeSlots do + self.activeSlots["slot"..i] = activeSlots[i] or {} + end + self.availableImbuements = availableImbuements or {} + self.needItems = needItems or {} + + for i = 0, 2 do + Imbuement.clearImbue:recursiveGetChildById("slot"..i):setBorderWidth(0) + Imbuement.selectImbue:recursiveGetChildById("slot"..i):setBorderWidth(0) + end + + self.selectedSlot = 0 + self.onSelectImbuementSlot(self.selectedSlot) + + -- Verificar se o slot 0 tem um imbuement ativo e passar para updateWindowState + local imbuement = self.activeSlots["slot0"] + self.updateWindowState(imbuement) + + self.configureWindow(Imbuement.selectImbue) + self.configureWindow(Imbuement.clearImbue) +end + +function ImbuementItem.configureWindow(window) + local slots = window:recursiveGetChildById("slots") + for i = 1, 3 do + local slotWidget = slots:getChildById("slot"..i - 1) + if slotWidget then + slotWidget.resource:setImageSource("/images/game/imbuing/icons/0") + if i <= self.slots then + slotWidget:setVisible(true) + local imbuement = self.activeSlots["slot"..i - 1] + if imbuement and imbuement[1] then + if imbuement[1].id and imbuement[1].id ~= 0 then + slotWidget.resource:setImageSource("/images/game/imbuing/icons/" .. imbuement[1]["imageId"]) + end + end + else + slotWidget:setVisible(false) + end + end + end + + local itemName = getItemNameById(self.itemId) + local itemWidget = window:recursiveGetChildById("item") + if itemWidget then + itemWidget:setItemId(self.itemId) + itemWidget:setImageSmooth(true) + itemWidget:setItemCount(1) + end + + local itemInformation = window:recursiveGetChildById("titleInformation") + if itemInformation then + itemInformation:setText(string.capitalize(itemName)) + end +end + +function ImbuementItem.onSelectSlot(widget) + local slot = widget:getId() + ImbuementItem.onSelectImbuementSlot(widget.slot) + local imbuement = self.activeSlots[slot] + self.updateWindowState(imbuement) +end + +function ImbuementItem.updateWindowState(imbuement) + if imbuement and imbuement[1] and imbuement[1].id ~= 0 then + Imbuement:toggleMenu("clearImbue") + self.window = Imbuement.clearImbue + self.onSelectSlotClear(imbuement) + else + Imbuement:toggleMenu("selectImbue") + self.window = Imbuement.selectImbue + self.onSelectSlotImbue() + end +end + +function ImbuementItem.onSelectImbuementSlot(slot) + Imbuement.clearImbue:recursiveGetChildById("slot"..self.selectedSlot):setBorderWidth(0) + Imbuement.selectImbue:recursiveGetChildById("slot"..self.selectedSlot):setBorderWidth(0) + + self.selectedSlot = slot + Imbuement.clearImbue:recursiveGetChildById("slot"..slot):setBorderWidth(1) + Imbuement.clearImbue:recursiveGetChildById("slot"..slot):setBorderColor("white") + Imbuement.selectImbue:recursiveGetChildById("slot"..slot):setBorderWidth(1) + Imbuement.selectImbue:recursiveGetChildById("slot"..slot):setBorderColor("white") +end + +function ImbuementItem:shutdown() + self.window = nil + self.itemId = 0 + self.tier = 0 + self.slots = 0 + self.activeSlots = {} + self.availableImbuements = {} + self.needItems = {} + if self.confirmWindow then + self.confirmWindow:destroy() + end + + if self.lastselectedwidget then + self.lastselectedwidget:destroy() + self.lastselectedwidget = nil + end + self.confirmWindow = nil +end + +function ImbuementItem.onSelectSlotClear(imbuement) + local title = self.window.cleanImbuePanel:getChildById("title") + if title then + title:setText(string.format('Clear Imbuement "%s"', imbuement[1].name)) + end + + local cleanImbuementsDetails = self.window:recursiveGetChildById("cleanImbuementsDetails") + if cleanImbuementsDetails then + cleanImbuementsDetails:setText('') + end + + local timeRemaining = self.window:recursiveGetChildById("timeRemaining") + if timeRemaining then + local time = imbuement[1].duration or 0 + timeRemaining:setMinimum(0) + timeRemaining:setMaximum(time) + timeRemaining:setValue(imbuement[2], 0, time) + end + + local imbuementReqContent = self.window:recursiveGetChildById("imbuementReqContent") + if imbuementReqContent then + local hours = string.format("%02.f", math.floor(imbuement[2]/3600)) + local mins = string.format("%02.f", math.floor(imbuement[2]/60 - (hours*60))) + + imbuementReqContent.time.textLabel:setText(string.format("%dh %dmin", hours, mins)) + imbuementReqContent.time.onHoverChange = function(widget, hovered, itemName, hasItem) + if hovered then + cleanImbuementsDetails:setText(tr("Show the time the imbuement is still active for.")) + else + cleanImbuementsDetails:setText("") + end + end + end + + local clearImbuementsList = self.window:recursiveGetChildById("clearImbuementsList") + clearImbuementsList:destroyChildren() + + local widget = g_ui.createWidget("SlotImbuing", clearImbuementsList) + widget.resource:setImageSource("/images/game/imbuing/icons/" .. imbuement[1]["imageId"]) + widget:setBorderWidth(1) + widget:setBorderColor("white") + + local selectedImbuementContent = self.window:recursiveGetChildById("selectedImbuementContent") + if selectedImbuementContent then + local imbuementsDetails = selectedImbuementContent:recursiveGetChildById("imbuementsDetails") + if imbuementsDetails then + imbuementsDetails:setText(imbuement[1].description or "") + end + end + + local balance = getPlayerBalance() + local clearButton = self.window:recursiveGetChildById("clear") + if clearButton then + clearButton:setEnabled(balance >= imbuement[3]) + clearButton.onClick = function() + if self.confirmWindow then + self.confirmWindow:destroy() + self.confirmWindow = nil + end + + Imbuement.hide() + + local function confirm() + g_game.clearImbuement(self.selectedSlot) + self.confirmWindow:destroy() + self.confirmWindow = nil + + Imbuement.show() + end + + local function cancelFunc() + if self.confirmWindow then + self.confirmWindow:destroy() + self.confirmWindow = nil + end + + Imbuement.show() + end + + self.confirmWindow = displayGeneralBox(tr('Confirm Clearing'), tr("Do you wish to spend %s gold coins to clear the imbuement \"%s\" from your item?", comma_value(imbuement[3]), string.capitalize(imbuement[1].name)), + { { text=tr('Yes'), callback=confirm }, + { text=tr('No'), callback=cancelFunc }, + }, confirm, cancelFunc) + end + + if balance >= imbuement[3] then + clearButton:setImageSource("/images/game/imbuing/clear") + clearButton:setImageClip("0 0 128 66") + else + clearButton:setImageSource("/images/game/imbuing/imbue_empty") + end + + clearButton.onHoverChange = function(widget, hovered, itemName, hasItem) + if hovered then + cleanImbuementsDetails:setText(tr("Your needs have changed? Click here to clear the imbuement from your item for a fee.")) + else + cleanImbuementsDetails:setText("") + end + end + end + + local costPanel = self.window:recursiveGetChildById("costPanel") + if costPanel then + costPanel.cost:setText(comma_value(imbuement[3])) + costPanel.cost:setColor(balance < imbuement[3] and "#C04040" or "#C0C0C0") + end +end + +function ImbuementItem.onSelectSlotImbue() + self.selectBaseType('basicButton') + + self.window:recursiveGetChildById('imbuementsDetails'):setVisible(false) +end + +function ImbuementItem.selectBaseType(selectedButtonId) + self.window:recursiveGetChildById('blockedPanels'):setVisible(true) + local qualityAndImbuementContent = self.window:recursiveGetChildById("qualityAndImbuementContent") + if not qualityAndImbuementContent then + return + end + + local basicButton = qualityAndImbuementContent.basicButton + local intricateButton = qualityAndImbuementContent.intricateButton + local powerfullButton = qualityAndImbuementContent.powerfullButton + + local baseImbuement = 0 + for _, button in pairs({basicButton, intricateButton, powerfullButton}) do + button:setOn(button:getId() == selectedButtonId) + if button:getId() == selectedButtonId then + baseImbuement = button.baseImbuement or 0 + end + end + + local imbuementsList = self.window:recursiveGetChildById("imbuementsList") + imbuementsList:setWidth(70) + imbuementsList:destroyChildren() + + local imbuementsDetails = self.window:recursiveGetChildById("imbuementsDetails") + imbuementsDetails:setVisible(false) + + local maxWidth = 0 + for id, imbuement in pairs(self.availableImbuements) do + local imbuementType = imbuement.type + if imbuementType == nil and imbuement.group then + if imbuement.group == 'Basic' then imbuementType = 0 + elseif imbuement.group == 'Intricate' then imbuementType = 1 + elseif imbuement.group == 'Powerful' then imbuementType = 2 + end + end + if imbuementType == baseImbuement then + local widget = g_ui.createWidget("SlotImbuing", imbuementsList) + widget:setId(tostring(id)) + widget.resource:setImageSource("/images/game/imbuing/icons/" .. imbuement.imageId) + + widget.onClick = function() + ImbuementItem.selectImbuementWidget(widget, imbuement) + end + + maxWidth = math.min(imbuementsList.maxWidth, maxWidth + imbuementsList.incrementwidth) + end + end + + imbuementsList:setWidth(maxWidth) +end + +function ImbuementItem.onSelectImbuement(widget) + local imbuementId = tonumber(widget:getId()) + local imbuement = self.availableImbuements[imbuementId] + if not imbuement then + return + end + + self.window:recursiveGetChildById('blockedPanels'):setVisible(false) + + local imbuementReqPanel = self.window:recursiveGetChildById("imbuementReqPanel") + if imbuementReqPanel then + imbuementReqPanel.title:setText(string.format('Imbue Empty Slot with "%s"', imbuement.name)) + end + local itensDetails = self.window:recursiveGetChildById("itensDetails") + if itensDetails then + itensDetails:setText("") + end +end + +function ImbuementItem.selectImbuementWidget(widget, imbuement) + if self.lastselectedwidget then + self.lastselectedwidget:setBorderWidth(1) + self.lastselectedwidget:setBorderColorTop("#797979") + self.lastselectedwidget:setBorderColorLeft("#797979") + self.lastselectedwidget:setBorderColorRight("#2e2e2e") + self.lastselectedwidget:setBorderColorBottom("#2e2e2e") + end + self.lastselectedwidget = widget + widget:setBorderWidth(1) + widget:setBorderColor("white") + + self.onSelectImbuement(widget) + + local imbuementsDetails = self.window:recursiveGetChildById("imbuementsDetails") + if imbuementsDetails then + imbuementsDetails:setVisible(true) + imbuementsDetails:setText(imbuement.description or "") + end + + local requiredItems = self.window:recursiveGetChildById("requiredItems") + local hasRequiredItems = true + if requiredItems then + for i = 1, 3 do + local itemWidget = requiredItems:getChildById("item"..i) + if itemWidget then + local source = imbuement.sources[i] + if source then + itemWidget.item:setItemId(source.item:getId()) + itemWidget:setVisible(true) + local itemCount = self.needItems[source.item:getId()] or 0 + itemWidget.count:setText(itemCount .."/" .. source.item:getCount()) + if itemCount >= source.item:getCount() then + itemWidget.count:setColor("#C0C0C0") + else + hasRequiredItems = false + itemWidget.count:setColor("#C04040") + end + + itemWidget.onHoverChange = function(widget, hovered) + local itensDetails = self.window:recursiveGetChildById("itensDetails") + if hovered then + local itemCount = self.needItems[source.item:getId()] or 0 + if itemCount >= source.item:getCount() then + itensDetails:setText(string.format("The imbuement you have selected requires %s.", source.description)) + else + itensDetails:setText(string.format("The imbuement requires %s. Unfortunately you do not own the needed amount.", source.description)) + end + else + if itensDetails then + itensDetails:setText("") + end + end + end + else + itemWidget:setVisible(false) + end + end + end + end + + local costPanel = self.window:recursiveGetChildById("costPanel") + if costPanel then + local cost = imbuement.cost or 0 + costPanel.cost:setText(comma_value(cost)) + local balance = getPlayerBalance() + + if balance < cost then + hasRequiredItems = false + end + + costPanel.cost:setColor(balance < cost and "#C04040" or "#C0C0C0") + end + + local imbueApply = self.window:recursiveGetChildById("imbueApply") + if imbueApply then + imbueApply:setEnabled(hasRequiredItems) + if not hasRequiredItems then + imbueApply:setImageSource("/images/game/imbuing/imbue_empty") + imbueApply:setImageClip("0 0 128 66") + else + imbueApply:setImageSource("/images/game/imbuing/imbue_green") + end + + imbueApply.onHoverChange = function(widget, hovered, itemName, hasItem) + local itensDetails = self.window:recursiveGetChildById("itensDetails") + if hovered then + itensDetails:setText(tr("Apply the selected imbuement. This will consume the required astral sources and gold.")) + else + if itensDetails then + itensDetails:setText("") + end + end + end + + imbueApply.onClick = function() + if self.confirmWindow then + self.confirmWindow:destroy() + self.confirmWindow = nil + end + + Imbuement.hide() + + local function confirm() + g_game.applyImbuement(self.selectedSlot, imbuement.id) + self.confirmWindow:destroy() + self.confirmWindow = nil + + Imbuement.show() + end + + local function cancelFunc() + if self.confirmWindow then + self.confirmWindow:destroy() + self.confirmWindow = nil + end + + Imbuement.show() + end + + self.confirmWindow = displayGeneralBox(tr('Confirm Imbuing'), tr("You are about to imbue your item with \"%s\". This will consume the required astral sources and %s\ngold coins. Do you wish to proceed?", string.capitalize(imbuement.name), comma_value(imbuement.cost)), + { { text=tr('Yes'), callback=confirm }, + { text=tr('No'), callback=cancelFunc }, + }, confirm, cancelFunc) + end + end +end \ No newline at end of file diff --git a/modules/game_imbui/classes/imbuementscroll.lua b/modules/game_imbui/classes/imbuementscroll.lua new file mode 100644 index 0000000000..7c67a26cc9 --- /dev/null +++ b/modules/game_imbui/classes/imbuementscroll.lua @@ -0,0 +1,230 @@ +if not ImbuementScroll then + ImbuementScroll = { + window = nil, + itemId = 51442, + confirmWindow = nil, + availableImbuements = {}, + needItems = {} + } +end + +ImbuementScroll.__index = ImbuementScroll + +local self = ImbuementScroll +function ImbuementScroll.setup(availableImbuements, needItems) + self.availableImbuements = availableImbuements or {} + self.needItems = needItems or {} + + self.window = Imbuement.scrollImbue + + local itemWidget = self.window:recursiveGetChildById("itemScroll") + if itemWidget then + itemWidget:setItemId(self.itemId) + itemWidget:setImageSmooth(true) + itemWidget:setItemCount(1) + end + + self.onSelectSlotImbue() +end + +function ImbuementScroll:shutdown() + self.window = nil + self.confirmWindow = nil + self.availableImbuements = {} + self.needItems = {} +end + +function ImbuementScroll.onSelectSlotImbue() + self.selectBaseType('powerfullButton') + self.window:recursiveGetChildById('imbuementsDetails'):setVisible(false) +end + +function ImbuementScroll.selectBaseType(selectedButtonId) + local qualityAndImbuementContent = self.window:recursiveGetChildById("qualityAndImbuementContent") + if not qualityAndImbuementContent then + return + end + + local intricateButton = qualityAndImbuementContent.intricateButton + local powerfullButton = qualityAndImbuementContent.powerfullButton + + local baseImbuement = 1 + for _, button in pairs({intricateButton, powerfullButton}) do + button:setOn(button:getId() == selectedButtonId) + if button:getId() == selectedButtonId then + baseImbuement = button.baseImbuement or 1 + end + end + + local imbuementsList = self.window:recursiveGetChildById("imbuementsList") + imbuementsList:destroyChildren() + + local imbuementsDetails = self.window:recursiveGetChildById("imbuementsDetails") + imbuementsDetails:setVisible(false) + + local selected = false + + for id, imbuement in ipairs(self.availableImbuements) do + if imbuement.type == baseImbuement then + local widget = g_ui.createWidget("SlotImbuing", imbuementsList) + widget:setId(tostring(id)) + widget.resource:setImageSource("/images/game/imbuing/icons/" .. imbuement.imageId) + + if not selected then + ImbuementScroll.selectImbuementWidget(widget, imbuement) + selected = true + end + + widget.onClick = function() + ImbuementScroll.selectImbuementWidget(widget, imbuement) + end + + end + end +end + +function ImbuementScroll.selectImbuementWidget(widget, imbuement) + if self.lastselectedwidget then + self.lastselectedwidget:setBorderWidth(1) + self.lastselectedwidget:setBorderColorTop("#797979") + self.lastselectedwidget:setBorderColorLeft("#797979") + self.lastselectedwidget:setBorderColorRight("#2e2e2e") + self.lastselectedwidget:setBorderColorBottom("#2e2e2e") + end + self.lastselectedwidget = widget + widget:setBorderWidth(1) + widget:setBorderColor("white") + + self.onSelectImbuement(widget) + + local imbuementsDetails = self.window:recursiveGetChildById("imbuementsDetails") + if imbuementsDetails then + imbuementsDetails:setVisible(true) + imbuementsDetails:setText(imbuement.description or "") + end + + local requiredItems = self.window:recursiveGetChildById("requiredItems") + local hasRequiredItems = true + if requiredItems then + for i = 1, 4 do + local itemWidget = requiredItems:getChildById("item"..i) + if itemWidget then + local source = imbuement.sources[i] + if source then + itemWidget.item:setItemId(source.item:getId()) + itemWidget:setVisible(true) + local itemCount = self.needItems[source.item:getId()] or 0 + itemWidget.count:setText(itemCount .."/" .. source.item:getCount()) + if itemCount >= source.item:getCount() then + itemWidget.count:setColor("#C0C0C0") + else + hasRequiredItems = false + itemWidget.count:setColor("#C04040") + end + + itemWidget.onHoverChange = function(widget, hovered) + local itensDetails = self.window:recursiveGetChildById("itensDetails") + if hovered then + local itemCount = self.needItems[source.item:getId()] or 0 + if itemCount >= source.item:getCount() then + itensDetails:setText(string.format("The imbuement you have selected requires %s.", source.description)) + else + itensDetails:setText(string.format("The imbuement requires %s. Unfortunately you do not own the needed amount.", source.description)) + end + else + if itensDetails then + itensDetails:setText("") + end + end + end + else + itemWidget:setVisible(false) + end + end + end + end + + local costPanel = self.window:recursiveGetChildById("costPanel") + if costPanel then + local cost = imbuement.cost or 0 + costPanel.cost:setText(comma_value(cost)) + local balance = getPlayerBalance() + + if balance < cost then + hasRequiredItems = false + end + + costPanel.cost:setColor(balance < cost and "#C04040" or "#C0C0C0") + end + + local imbuescrollApply = self.window:recursiveGetChildById("imbuescrollApply") + if imbuescrollApply then + imbuescrollApply:setEnabled(hasRequiredItems) + if not hasRequiredItems then + imbuescrollApply:setImageSource("/images/game/imbuing/imbue_empty") + imbuescrollApply:setImageClip("0 0 128 66") + else + imbuescrollApply:setImageSource("/images/game/imbuing/imbue_green") + end + + imbuescrollApply.onHoverChange = function(widget, hovered, itemName, hasItem) + local itensDetails = self.window:recursiveGetChildById("itensDetails") + if hovered then + itensDetails:setText(tr("Apply the selected imbuement. This will consume the required astral sources and gold.")) + else + if itensDetails then + itensDetails:setText("") + end + end + end + + imbuescrollApply.onClick = function() + if self.confirmWindow then + self.confirmWindow:destroy() + self.confirmWindow = nil + end + + Imbuement.hide() + + local function confirm() + g_game.applyImbuement(0, imbuement.id) + self.confirmWindow:destroy() + self.confirmWindow = nil + + Imbuement.show() + end + + local function cancelFunc() + if self.confirmWindow then + self.confirmWindow:destroy() + self.confirmWindow = nil + end + + Imbuement.show() + end + + self.confirmWindow = displayGeneralBox(tr('Confirm Imbuing'), tr("You are about to imbue your item with \"%s\". This will consume the required astral sources and %s\ngold coins. Do you wish to proceed?", string.capitalize(imbuement.name), comma_value(imbuement.cost)), + { { text=tr('Yes'), callback=confirm }, + { text=tr('No'), callback=cancelFunc }, + }, confirm, cancelFunc) + end + end +end + +function ImbuementScroll.onSelectImbuement(widget) + local imbuementId = tonumber(widget:getId()) + local imbuement = self.availableImbuements[imbuementId] + if not imbuement then + return + end + + + local imbuementReqPanel = self.window:recursiveGetChildById("imbuementReqPanel") + if imbuementReqPanel then + imbuementReqPanel.title:setText(string.format('Imbue Blank Scroll with "%s"', imbuement.name)) + end + local itensDetails = self.window:recursiveGetChildById("itensDetails") + if itensDetails then + itensDetails:setText("") + end +end diff --git a/modules/game_imbui/classes/imbuementselection.lua b/modules/game_imbui/classes/imbuementselection.lua new file mode 100644 index 0000000000..cb985ba467 --- /dev/null +++ b/modules/game_imbui/classes/imbuementselection.lua @@ -0,0 +1,93 @@ +if not ImbuementSelection then + ImbuementSelection = { + pickItem = nil, + } +end + +ImbuementSelection.__index = ImbuementSelection + +local self = ImbuementSelection +function ImbuementSelection.startUp() + self.pickItem = g_ui.createWidget('UIWidget') + self.pickItem:setVisible(false) + self.pickItem:setFocusable(false) + self.pickItem.onMouseRelease = self.onChooseItemMouseRelease +end + +function ImbuementSelection:shutdown() + if self.pickItem then + self.pickItem:destroy() + self.pickItem = nil + end +end + +function ImbuementSelection:selectItem() + if not self.pickItem then + self:startUp() + end + + if g_mouse.isPressed() then + return + end + + self.isSelectingScroll = false + self.pickItem:grabMouse() + g_mouse.pushCursor('target') +end + +function ImbuementSelection:selectScroll() + if not self.pickItem then + self:startUp() + end + + if g_mouse.isPressed() then + return + end + + self.isSelectingScroll = true + self.pickItem:grabMouse() + g_mouse.pushCursor('target') +end + +function ImbuementSelection.onChooseItemMouseRelease(widget, mousePosition, mouseButton) + local item = nil + if mouseButton == MouseLeftButton then + local clickedWidget = modules.game_interface.getRootPanel():recursiveGetChildByPos(mousePosition, false) + if clickedWidget then + if clickedWidget:getClassName() == 'UIGameMap' then + local tile = clickedWidget:getTile(mousePosition) + if tile then + local thing = tile:getTopMoveThing() + if thing and thing:isItem() then + item = thing + end + end + elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then + item = clickedWidget:getItem() + end + end + end + + if item and item:isPickupable() then + local pos = item:getPosition() + local itemId = item:getId() + local stackPos = item:getStackPos() + + if self.isSelectingScroll then + g_game.selectImbuementItem(itemId, pos, stackPos) + else + g_game.selectImbuementItem(itemId, pos, stackPos) + end + + self.pickItem:ungrabMouse() + g_mouse.popCursor('target') + + return true + else + modules.game_textmessage.displayFailureMessage(tr('Sorry, not possible.')) + end + + self.pickItem:ungrabMouse() + g_mouse.popCursor('target') + return true +end diff --git a/modules/game_imbui/t_imbui.lua b/modules/game_imbui/t_imbui.lua new file mode 100644 index 0000000000..d862cf8bfd --- /dev/null +++ b/modules/game_imbui/t_imbui.lua @@ -0,0 +1,313 @@ +if not Imbuement then + Imbuement = { + window = nil, + selectItemOrScroll = nil, + scrollImbue = nil, + selectImbue = nil, + clearImbue = nil, + + messageWindow = nil, + + bankGold = 0, + inventoryGold = 0, + } + Imbuement.__index = Imbuement +end + +-- Funcao auxiliar para calcular a posicao de um sprite em um spritesheet +function getFramePosition(frameIndex, frameWidth, frameHeight, columns) + local row = math.floor(frameIndex / columns) + local col = frameIndex % columns + local x = col * frameWidth + local y = row * frameHeight + return string.format("%d %d", x, y) +end + +-- Funcao auxiliar para obter o saldo total do player (banco + inventario) +function getPlayerBalance() + local player = g_game.getLocalPlayer() + if not player then return 0 end + + local bankGold = player:getResourceBalance(1) or 0 -- BANK_BALANCE + local inventoryGold = player:getResourceBalance(0) or 0 -- GOLD_EQUIPPED + return bankGold + inventoryGold +end + +-- Funcao auxiliar para formatar numeros com virgulas (separador de milhares) +function comma_value(amount) + if not amount then return "0" end + local formatted = tostring(amount) + -- Usar virgula como separador de milhares (formato: 5,561,475) + while true do + formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') + if k == 0 then break end + end + return formatted +end + +-- Adicionar capitalize a string se nao existir +if not string.capitalize then + function string.capitalize(str) + if not str or str == "" then return str end + return str:sub(1, 1):upper() .. str:sub(2) + end +end + +-- Funcao auxiliar para obter o nome de um item por ID +function getItemNameById(itemId) + local itemType = g_things.getThingType(itemId, ThingCategoryItem) + if itemType and itemType.getName and type(itemType.getName) == "function" then + return itemType:getName() or "Unknown Item" + end + return "Unknown Item" +end + +Imbuement.MessageDialog = { + ImbuementSuccess = 0, + ImbuementError = 1, + ImbuementRollFailed = 2, + ImbuingStationNotFound = 3, + ClearingCharmSuccess = 10, + ClearingCharmError = 11, + PreyMessage = 20, + PreyError = 21, +} + +local self = Imbuement +function Imbuement.init() + self.window = g_ui.displayUI('t_imbui') + self:hide() + + ImbuementSelection:startUp() + + self.selectItemOrScroll = self.window:recursiveGetChildById('selectItemOrScroll') + self.scrollImbue = self.window:recursiveGetChildById('scrollImbue') + self.selectImbue = self.window:recursiveGetChildById('selectImbue') + self.clearImbue = self.window:recursiveGetChildById('clearImbue') + + connect(g_game, { + onGameStart = self.offline, + onGameEnd = self.offline, + onOpenImbuementWindow = self.onOpenImbuementWindow, + onImbuementItem = self.onImbuementItem, + onImbuementScroll = self.onImbuementScroll, + onCloseImbuementWindow = self.offline, + onMessageDialog = self.onMessageDialog, + }) +end + +function Imbuement.terminate() + disconnect(g_game, { + onGameStart = self.offline, + onGameEnd = self.offline, + onOpenImbuementWindow = self.onOpenImbuementWindow, + onImbuementItem = self.onImbuementItem, + onImbuementScroll = self.onImbuementScroll, + onResourceBalance = self.onResourceBalance, + onCloseImbuementWindow = self.offline, + onMessageDialog = self.onMessageDialog, + }) + + + if self.messageWindow then + self.messageWindow:destroy() + self.messageWindow = nil + end + + ImbuementItem:shutdown() + ImbuementSelection:shutdown() + ImbuementScroll:shutdown() + if self.selectItemOrScroll then + self.selectItemOrScroll:destroy() + self.selectItemOrScroll = nil + end + + if self.scrollImbue then + self.scrollImbue:destroy() + self.scrollImbue = nil + end + + if self.selectImbue then + self.selectImbue:destroy() + self.selectImbue = nil + end + + if self.clearImbue then + self.clearImbue:destroy() + self.clearImbue = nil + end + + if self.window then + self.window:destroy() + self.window = nil + end +end + +function Imbuement.online() + self:hide() + if self.messageWindow then + self.messageWindow:destroy() + self.messageWindow = nil + end +end + +function Imbuement.offline() + self:hide() + ImbuementItem:shutdown() + ImbuementScroll:shutdown() + if self.messageWindow then + self.messageWindow:destroy() + self.messageWindow = nil + end +end + +function Imbuement.show() + self.window:show(true) + self.window:raise() + self.window:focus() + if self.messageWindow then + self.messageWindow:destroy() + self.messageWindow = nil + end +end + +function Imbuement.hide() + self.window:hide() +end + +function Imbuement.close() + if g_game.isOnline() then + g_game.closeImbuingWindow() + end + self.window:hide() +end + +-- testOpen removed (temporary debug button deleted) + +function Imbuement:toggleMenu(menu) + for key, value in pairs(self) do + if type(value) ~= 'userdata' or key == 'window' then + goto continue + end + + if key == menu then + value:show() + -- Ajustar tamanho da janela baseado no menu + if menu == 'selectItemOrScroll' then + self.window:setHeight(388) + elseif menu == 'scrollImbue' then + self.window:setHeight(655) + elseif menu == 'selectImbue' then + self.window:setHeight(528) + elseif menu == 'clearImbue' then + self.window:setHeight(502) + end + else + value:hide() + end + + ::continue:: + end +end + +function Imbuement.onOpenImbuementWindow() + self:show() + -- Atualizar recursos do player + local player = g_game.getLocalPlayer() + if player then + local bankGold = player:getResourceBalance(ResourceTypes.BANK_BALANCE) or 0 + local inventoryGold = player:getResourceBalance(ResourceTypes.GOLD_EQUIPPED) or 0 + local totalGold = bankGold + inventoryGold + self.window.contentPanel.gold.gold:setText(comma_value(totalGold)) + end + self:toggleMenu("selectItemOrScroll") +end + +-- Funcao para contar itens no inventario do jogador +function getPlayerItemCount(itemId) + local player = g_game.getLocalPlayer() + if not player then return 0 end + + local totalCount = 0 + + -- Contar nos slots do inventario + for slot = InventorySlotFirst, InventorySlotLast do + local item = player:getInventoryItem(slot) + if item then + if item:getId() == itemId then + totalCount = totalCount + item:getCount() + end + end + end + + return totalCount +end + +function Imbuement.onImbuementItem(itemId, tier, slots, activeSlots, availableImbuements, needItems) + local needItemsTable = {} + + for i, item in ipairs(needItems) do + if item and item.getId then + local itemId = item:getId() + local count = item:getCount() or 0 + needItemsTable[itemId] = count + end + end + + self:show() + self:toggleMenu("selectImbue") + ImbuementItem.setup(itemId, tier, slots, activeSlots, availableImbuements, needItemsTable) +end + +function Imbuement.onImbuementScroll(availableImbuements, needItems) + -- Converter needItems de array de Items para tabela {itemId -> count} + -- USAR O COUNT QUE VEM DO SERVIDOR (ja esta no Item) + local needItemsTable = {} + + for i, item in ipairs(needItems) do + if item and item.getId then + local itemId = item:getId() + local count = item:getCount() or 0 -- Usar o count que o servidor enviou + needItemsTable[itemId] = count + end + end + + self:toggleMenu("scrollImbue") + ImbuementScroll.setup(availableImbuements, needItemsTable) +end + +function Imbuement.onSelectItem() + self:hide() + ImbuementSelection:selectItem() +end + +function Imbuement.onSelectScroll() + g_game.selectImbuementScroll() +end + +function Imbuement.onMessageDialog(type, content) + if type > Imbuement.MessageDialog.ImbuingStationNotFound or not self.window:isVisible() then + return + end + + self:hide() + local message = content or "" + if self.messageWindow then + self.messageWindow:destroy() + self.messageWindow = nil + end + + local function confirm() + self.messageWindow:destroy() + self.messageWindow = nil + + Imbuement.show() + end + + self.messageWindow = displayGeneralBox(tr('Message Dialog'), content, + { { text=tr('Ok'), callback=confirm }, + }, confirm, confirm) + + + -- g_client.setInputLockWidget(self.messageWindow) -- deprecated +end \ No newline at end of file diff --git a/modules/game_imbui/t_imbui.otmod b/modules/game_imbui/t_imbui.otmod new file mode 100644 index 0000000000..ce5f3f4d90 --- /dev/null +++ b/modules/game_imbui/t_imbui.otmod @@ -0,0 +1,6 @@ +Module + name: game_imbui + sandboxed: true + scripts: [ t_imbui, classes/imbuementselection, classes/imbuementitem, classes/imbuementscroll ] + @onLoad: Imbuement.init() + @onUnload: Imbuement.terminate() diff --git a/modules/game_imbui/t_imbui.otui b/modules/game_imbui/t_imbui.otui new file mode 100644 index 0000000000..09019112ad --- /dev/null +++ b/modules/game_imbui/t_imbui.otui @@ -0,0 +1,903 @@ +PickItemButton < UIButton + id: itemButton + size: 96 64 + anchors.top: parent.top + anchors.left: parent.left + image-source: /images/game/imbuing/pick-item-button + image-clip: 0 0 96 64 + @onClick: modules.game_imbui.Imbuement.onSelectItem() + $hover !pressed: + image-clip: 0 0 96 64 + $pressed: + image-clip: 0 64 96 64 + +ScrollItemButton < UIButton + id: scrollButton + size: 96 64 + anchors.top: parent.top + anchors.left: itemButton.right + margin-left: 6 + image-source: /images/game/imbuing/imbue-scroll-button + image-clip: 0 0 96 64 + @onClick: modules.game_imbui.Imbuement.onSelectScroll() + $hover !pressed: + image-clip: 0 0 96 64 + $pressed: + image-clip: 0 64 96 64 + +SlotImbuing < UIButton + size: 66 66 + border-width: 1 + border-color-top: #797979 + border-color-left: #797979 + border-color-bottom: #2e2e2e + border-color-right: #2e2e2e + $checked: + border-color-top: #181818 + border-color-left: #181818 + border-color-bottom: #727272 + border-color-right: #727272 + UIWidget + id: resource + size: 64 64 + anchors.left: parent.left + margin-left: 1 + anchors.verticalCenter: parent.verticalCenter + image-source: /images/game/imbuing/imbuement-icons-64 + image-clip: 0 0 64 64 + phantom: true + +RequiredItem < UIWidget + size: 66 90 + UIItem + id: item + size: 66 66 + anchors.left: parent.left + anchors.top: parent.top + priceable: false + virtual: true + phantom: true + image-source: /images/ui/item66 + draggable: false + FlatLabel + id: count + margin-top: 3 + text-align: center + anchors.left: prev.left + anchors.right: prev.right + anchors.top: prev.bottom + image-source: /images/ui/infoPanel + font: verdana-11px-rounded + color: white + text-offset: -2 1 + +SelectItemOrScroll < UIWidget + anchors.fill: parent + Panel + id: itemOrScrollPanel + height: 93 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 5 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Pick Item or Imbue a Blank Scroll') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: itemOrScrollContent + anchors.fill: parent + margin: 22 12 10 12 + PickItemButton + ScrollItemButton + + UIWidget + id: blockedPanels + size: 708 198 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/game/imbuing/blocked-panels + margin-top: 11 + +SelectImbue < UIWidget + anchors.fill: parent + Panel + id: itemOrScrollPanel + height: 103 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 5 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Pick Item or Imbue a Blank Scroll') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: itemOrScrollContent + anchors.fill: parent + margin: 27 12 10 12 + PickItemButton + ScrollItemButton + + + Panel + id: slots + size: 208 66 + anchors.top: prev.top + anchors.right: parent.right + margin-top: -1 + margin-right: 18 + SlotImbuing + id: slot0 + margin-right: 6 + &slot: 0 + anchors.right: next.left + @onClick: modules.game_imbui.ImbuementItem.onSelectSlot(self) + SlotImbuing + id: slot1 + margin-right: 6 + anchors.right: next.left + &slot: 1 + phantom: false + @onClick: modules.game_imbui.ImbuementItem.onSelectSlot(self) + SlotImbuing + id: slot2 + &slot: 2 + anchors.right: parent.right + @onClick: modules.game_imbui.ImbuementItem.onSelectSlot(self) + + UIItem + id: item + size: 64 64 + anchors.top: prev.top + anchors.right: prev.left + priceable: false + virtual: true + margin-top: 1 + margin-right: 22 + phantom: true + draggable: false + Label + id: titleInformation + anchors.top: prev.top + anchors.right: prev.left + !text: tr('Item Information') + font: verdana-11px-rounded + color: white + text-auto-resize: true + margin-top: 24 + margin-right: 22 + + Panel + id: qualityAndImbuementPanel + height: 177 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 17 + margin-top: 11 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Select Quality and Imbuement') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: qualityAndImbuementContent + anchors.fill: parent + margin: 27 12 9 12 + UIButton + id: basicButton + size: 144 37 + anchors.top: parent.top + anchors.left: parent.left + &baseImbuement: 0 + margin-left: 116 + image-source: /images/game/imbuing/basic-button + image-clip: 0 0 144 37 + $hover !pressed: + image-clip: 0 0 144 37 + $pressed: + image-clip: 0 37 144 37 + $on: + image-clip: 0 37 144 37 + @onClick: modules.game_imbui.ImbuementItem.selectBaseType(self:getId()) + + UIButton + id: intricateButton + size: 144 37 + anchors.top: parent.top + anchors.left: prev.right + &baseImbuement: 1 + margin-left: 11 + image-source: /images/game/imbuing/intricate-button + image-clip: 0 0 144 37 + $hover !pressed: + image-clip: 0 0 144 37 + $pressed: + image-clip: 0 37 144 37 + $on: + image-clip: 0 37 144 37 + @onClick: modules.game_imbui.ImbuementItem.selectBaseType(self:getId()) + + UIButton + id: powerfullButton + size: 144 37 + anchors.top: parent.top + anchors.left: prev.right + &baseImbuement: 2 + margin-left: 11 + image-source: /images/game/imbuing/powerfull-button + image-clip: 0 0 144 37 + $hover !pressed: + image-clip: 0 0 144 37 + $pressed: + image-clip: 0 37 144 37 + $on: + image-clip: 0 37 144 37 + @onClick: modules.game_imbui.ImbuementItem.selectBaseType(self:getId()) + + ScrollablePanel + id: imbuementsList + height: 70 + width: 70 + &originalwidth: 680 + &maxWidth: 675 + &incrementwidth: 73 + anchors.top: prev.bottom + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 11 + layout: + type: grid + cell-spacing: 5 + cell-size: 66 66 + num-columns: 9 + num-rows: 3 + + Label + id: imbuementsDetails + anchors.bottom: parent.bottom + anchors.left: parent.left + !text: tr('Raises your walking speed by 30. Lasts for 20h 0min while equipped.') + font: verdana-11px-rounded + color: white + text-auto-resize: true + + Panel + id: imbuementReqPanel + height: 141 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 17 + margin-top: 11 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Imbue Empty Slot with "Imbuement Name"') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: imbuementReqContent + anchors.fill: parent + margin: 27 12 10 12 + Panel + id: requiredItems + width: 210 + height: 90 + anchors.top: parent.top + anchors.left: parent.left + RequiredItem + id: item1 + anchors.top: parent.top + anchors.left: parent.left + RequiredItem + id: item2 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 6 + RequiredItem + id: item3 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 6 + + UIWidget + id: horizontalArrow + size: 14 25 + anchors.left: prev.right + anchors.verticalCenter: requiredItems.verticalCenter + margin-left: 171 + image-source: /images/ui/right-arrow + phantom: false + + Label + id: itensDetails + anchors.bottom: parent.bottom + anchors.left: parent.left + !text: tr('') + font: verdana-11px-rounded + color: white + text-auto-resize: true + visible: true + + UIButton + id: imbueApply + size: 128 66 + anchors.top: requiredItems.top + anchors.right: parent.right + image-source: /images/game/imbuing/imbue_empty + image-clip: 0 0 128 66 + $pressed: + image-clip: 0 66 128 66 + + FlatLabel + id: costPanel + margin-top: 3 + anchors.left: prev.left + anchors.right: prev.right + anchors.top: prev.bottom + image-source: /images/ui/infoPanel + Label + id: cost + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + margin-right: 5 + margin-top: 3 + text: 200 + text-align: center + font: verdana-11px-rounded + color: white + text-auto-resize: true + UIWidget + size: 9 9 + anchors.top: cost.top + anchors.left: cost.right + margin-top: 3 + margin-left: 2 + image-source: /images/game/cyclopedia/icons/icon-goldcoin + + UIWidget + id: blockedPanels + size: 708 141 + anchors.top: prev.top + anchors.left: prev.left + image-source: /images/game/imbuing/blocked-panel + visible: false + +ClearImbue < UIWidget + anchors.fill: parent + Panel + id: itemOrScrollPanel + height: 103 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 5 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Pick Item or Imbue a Blank Scroll') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: itemOrScrollContent + anchors.fill: parent + margin: 27 12 10 12 + PickItemButton + ScrollItemButton + + Panel + id: slots + size: 208 66 + anchors.top: prev.top + anchors.right: parent.right + margin-top: -1 + margin-right: 18 + SlotImbuing + id: slot0 + margin-right: 6 + &slot: 0 + anchors.right: next.left + @onClick: modules.game_imbui.ImbuementItem.onSelectSlot(self) + SlotImbuing + id: slot1 + margin-right: 6 + anchors.right: next.left + &slot: 1 + phantom: false + @onClick: modules.game_imbui.ImbuementItem.onSelectSlot(self) + SlotImbuing + id: slot2 + &slot: 2 + anchors.right: parent.right + @onClick: modules.game_imbui.ImbuementItem.onSelectSlot(self) + + UIItem + id: item + size: 64 64 + anchors.top: prev.top + anchors.right: prev.left + priceable: false + virtual: true + phantom: true + draggable: false + margin-top: 1 + margin-right: 22 + Label + id: titleInformation + anchors.top: prev.top + anchors.right: prev.left + !text: tr('Item Information') + font: verdana-11px-rounded + color: white + text-auto-resize: true + margin-top: 24 + margin-right: 22 + + Panel + id: selectedImbuementPanel + height: 152 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 17 + margin-top: 11 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Selected Imbuement') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: selectedImbuementContent + anchors.fill: parent + margin: 27 12 9 12 + ScrollablePanel + id: clearImbuementsList + height: 70 + width: 70 + &originalwidth: 680 + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 20 + layout: + type: grid + cell-spacing: 6 + cell-size: 66 66 + num-columns: 9 + num-rows: 3 + + Label + id: imbuementsDetails + anchors.bottom: parent.bottom + anchors.left: parent.left + !text: tr('Raises your walking speed by 30. Lasts for 20h 0min while equipped.') + font: verdana-11px-rounded + color: white + text-auto-resize: true + + Panel + id: cleanImbuePanel + height: 141 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 17 + margin-top: 11 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Clear Imbuement "Imbuement Name"') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: imbuementReqContent + anchors.fill: parent + margin: 27 12 10 12 + Panel + id: time + size: 279 20 + image-source: /images/game/imbuing/imbui-timer-bg + anchors.top: parent.top + anchors.left: parent.left + margin-top: 34 + margin-left: 91 + phantom: false + ProgressBarSD + id: timeRemaining + size: 277 18 + anchors.fill: parent + image-source: /images/game/imbuing/imbui-progress + margin: 1 1 1 1 + phantom: true + percent: 1 + Label + id: textLabel + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + text-align: center + font: verdana-11px-rounded + color: white + text-auto-resize: true + margin-top: 2 + phantom: true + + Label + id: cleanImbuementsDetails + anchors.bottom: parent.bottom + anchors.left: parent.left + font: verdana-11px-rounded + color: white + text-auto-resize: true + + UIButton + id: clear + size: 128 66 + anchors.top: parent.top + anchors.right: parent.right + image-source: /images/game/imbuing/clear + image-clip: 0 0 128 66 + $pressed: + image-clip: 0 66 128 66 + FlatLabel + id: costPanel + margin-top: 3 + anchors.left: prev.left + anchors.right: prev.right + anchors.top: prev.bottom + image-source: /images/ui/infoPanel + Label + id: cost + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + margin-right: 5 + margin-top: 3 + text: 200 + text-align: center + font: verdana-11px-rounded + color: white + text-auto-resize: true + UIWidget + size: 9 9 + anchors.top: cost.top + anchors.left: cost.right + margin-top: 3 + margin-left: 2 + image-source: /images/game/cyclopedia/icons/icon-goldcoin + +ScrollImbue < UIWidget + anchors.fill: parent + Panel + id: itemOrScrollPanel + height: 93 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 5 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Pick Item or Imbue a Blank Scroll') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: itemOrScrollContent + anchors.fill: parent + margin: 22 12 10 12 + PickItemButton + ScrollItemButton + + + UIItem + id: itemScroll + size: 64 64 + anchors.top: prev.top + anchors.right: parent.right + priceable: false + virtual: true + draggable: false + phantom: true + margin-top: 1 + margin-right: 77 + + Label + id: titleScroll + anchors.top: prev.top + anchors.right: prev.left + !text: tr('Blank Imbuement Scroll') + font: verdana-11px-rounded + color: white + text-auto-resize: true + margin-top: 24 + margin-right: 22 + + Panel + id: selectImbuementPanel + height: 314 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 17 + margin-top: 11 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Select an Imbuement') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: qualityAndImbuementContent + anchors.fill: parent + margin: 22 12 9 12 + UIButton + id: intricateButton + size: 144 37 + anchors.top: parent.top + anchors.left: parent.left + margin-left: 193 + &baseImbuement: 1 + image-source: /images/game/imbuing/intricate-button + image-clip: 0 0 144 37 + $hover !pressed: + image-clip: 0 0 144 37 + $pressed: + image-clip: 0 37 144 37 + $on: + image-clip: 0 37 144 37 + @onClick: modules.game_imbui.ImbuementScroll.selectBaseType(self:getId()) + + UIButton + id: powerfullButton + size: 144 37 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 11 + &baseImbuement: 2 + image-source: /images/game/imbuing/powerfull-button + image-clip: 0 0 144 37 + $hover !pressed: + image-clip: 0 0 144 37 + $pressed: + image-clip: 0 37 144 37 + $on: + image-clip: 0 37 144 37 + @onClick: modules.game_imbui.ImbuementScroll.selectBaseType(self:getId()) + + ScrollablePanel + id: imbuementsList + height: 206 + width: 680 + anchors.top: prev.bottom + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 6 + padding-left: 25 + layout: + type: grid + cell-spacing: 4 + cell-size: 66 66 + num-columns: 9 + num-rows: 3 + Label + id: imbuementsDetails + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + !text: tr('Raises your walking speed by 30. Lasts for 20h 0min while equipped.') + font: verdana-11px-rounded + color: white + text-auto-resize: true + text-wrap: true + + Panel + id: imbuementReqPanel + height: 141 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 17 + margin-top: 11 + Label + id: title + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + margin-top: 2 + !text: tr('Imbue Blank Scroll with "Imbuement Name"') + font: verdana-11px-rounded + color: #AAAAAA + text-auto-resize: true + Panel + id: imbuementReqContent + anchors.fill: parent + margin: 27 12 10 12 + Panel + id: requiredItems + width: 280 + height: 90 + anchors.top: parent.top + anchors.left: parent.left + RequiredItem + id: item1 + anchors.top: parent.top + anchors.left: parent.left + RequiredItem + id: item2 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 6 + RequiredItem + id: item3 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 6 + RequiredItem + id: item4 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 6 + + UIWidget + id: horizontalArrow + size: 14 25 + anchors.left: prev.right + anchors.verticalCenter: requiredItems.verticalCenter + margin-left: 171 + image-source: /images/ui/right-arrow + phantom: false + + Label + id: itensDetails + anchors.bottom: parent.bottom + anchors.left: parent.left + !text: tr('') + font: verdana-11px-rounded + color: white + text-auto-resize: true + visible: true + + UIButton + id: imbuescrollApply + size: 128 66 + anchors.top: requiredItems.top + anchors.right: parent.right + image-source: /images/game/imbuing/imbue_empty + image-clip: 0 0 128 66 + $pressed: + image-clip: 0 0 128 66 + + FlatLabel + id: costPanel + margin-top: 3 + anchors.left: prev.left + anchors.right: prev.right + anchors.top: prev.bottom + image-source: /images/ui/infoPanel + Label + id: cost + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + margin-right: 5 + margin-top: 3 + text: 200 + text-align: center + font: verdana-11px-rounded + color: white + text-auto-resize: true + UIWidget + size: 9 9 + anchors.top: cost.top + anchors.left: cost.right + margin-top: 3 + margin-left: 2 + image-source: /images/game/cyclopedia/icons/icon-goldcoin + +NewMainWindow + id: imbuingWindow + !text: tr('Imbuement Shrine') + size: 740 640 + @onEscape: modules.game_imbui.Imbuement.close() + Panel + id: contentPanel + anchors.fill: parent + margin: 12 12 12 12 + + SelectItemOrScroll + id: selectItemOrScroll + main-window-size: 740 388 + visible: true + + ScrollImbue + id: scrollImbue + main-window-size: 740 655 + visible: false + + SelectImbue + id: selectImbue + main-window-size: 740 528 + visible: false + + ClearImbue + id: clearImbue + main-window-size: 740 502 + visible: false + + HorizontalSeparator + id: bottomSep + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: close.top + margin-bottom: 11 + Button + id: close + !text: tr('Close') + size: 43 20 + anchors.right: parent.right + anchors.bottom: parent.bottom + @onClick: modules.game_imbui.Imbuement.close() + Panel + id: gold + size: 160 20 + anchors.left: parent.left + anchors.bottom: parent.bottom + image-source: /images/game/prey/balanceBg + UIWidget + id: goldIcon + anchors.top: parent.top + anchors.right: parent.right + margin-top: 6 + margin-right: 3 + image-source: /images/game/prey/prey_gold + UIWidget + id: gold + anchors.top: parent.top + anchors.right: prev.left + anchors.left: parent.left + margin-top: 3 + margin-right: 2 + text-align: right + text: 0 + font: verdana-11px-rounded + color: white + text-auto-resize: true \ No newline at end of file diff --git a/modules/game_imbuing/imbuing.lua b/modules/game_imbuing/imbuing.lua index 36e95446dd..bde9153029 100644 --- a/modules/game_imbuing/imbuing.lua +++ b/modules/game_imbuing/imbuing.lua @@ -13,6 +13,17 @@ local imbueItems = {} local protection = false local clearConfirmWindow local imbueConfirmWindow +local infoPanel + +local function getCorrectIconId(id) + local iconId = id + if iconId >= 16 then iconId = iconId + 3 end -- pula 16, 17, 18 + if iconId >= 22 then iconId = iconId + 3 end -- pula 22, 23, 24 + if iconId >= 43 then iconId = iconId + 3 end -- pula 43, 44, 45 + if iconId >= 61 then iconId = iconId + 3 end -- pula 61, 62, 63 + if iconId >= 79 then iconId = iconId + 3 end -- pula 79, 80, 81 + return iconId +end function init() connect(g_game, { @@ -28,12 +39,13 @@ function init() imbueLevelsCombo = emptyImbue.imbuement protectionBtn = emptyImbue.protection clearImbue = imbuingWindow.clearImbue + infoPanel = imbuingWindow.infoPanel imbuingWindow:hide() local player = g_game.getLocalPlayer() if player then bankGold = player:getResourceBalance(ResourceTypes.BANK_BALANCE) inventoryGold = player:getResourceBalance(ResourceTypes.GOLD_EQUIPPED) - imbuingWindow.balance:setText(tr('Balance') .. ':\n' .. (player:getTotalMoney())) + imbuingWindow.balance:setText(tr(comma_value (player:getTotalMoney()))) end groupsCombo.onOptionChange = function(widget) @@ -69,21 +81,19 @@ function init() emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') emptyImbue.requiredItems:getChildByIndex(i).count:setColor('red') end - emptyImbue.requiredItems:getChildByIndex(i).count:setText(item:getCount() .. '/' .. - source['item']:getCount()) + emptyImbue.requiredItems:getChildByIndex(i).count:setText(item:getCount() .. '/' .. source['item']:getCount()) end end emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(source['item']:getId()) - emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip('The imbuement requires ' .. - source['description'] .. '.') + emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip('The imbuement requires ' .. source['description'] .. '.') end for i = 3, widget.currentIndex + 1, -1 do emptyImbue.requiredItems:getChildByIndex(i).count:setText('') emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(0) emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip('') end - emptyImbue.protectionCost:setText(imbuement['protectionCost']) - emptyImbue.cost:setText(imbuement['cost']) + emptyImbue.protectionCost:setText((comma_value(imbuement['protectionCost']))) + emptyImbue.cost:setText(comma_value(imbuement['cost'])) if not protection and (bankGold + inventoryGold) < imbuement['cost'] then emptyImbue.imbue:setEnabled(false) emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') @@ -115,18 +125,21 @@ function init() protectionBtn.onClick = function() setProtection(not protection) end + + -- Configurar hover events para exibir tooltips no painel + setupTooltipEvents() end function setProtection(value) protection = value if protection then - emptyImbue.cost:setText(selectedImbue['cost'] + selectedImbue['protectionCost']) + emptyImbue.cost:setText(comma_value(selectedImbue['cost'] + selectedImbue['protectionCost'])) emptyImbue.successRate:setText('100%') emptyImbue.successRate:setColor('green') protectionBtn:setImageClip(torect('66 0 66 66')) else if selectedImbue then - emptyImbue.cost:setText(selectedImbue['cost']) + emptyImbue.cost:setText(comma_value(selectedImbue['cost'])) emptyImbue.successRate:setText(selectedImbue['successRate'] .. '%') if selectedImbue['successRate'] > 50 then emptyImbue.successRate:setColor('white') @@ -152,19 +165,31 @@ end function resetSlots() emptyImbue:setVisible(false) clearImbue:setVisible(false) + if infoPanel then + local tooltipContent = infoPanel:recursiveGetChildById('tooltipContent') + if tooltipContent then tooltipContent:setText('') end + end for i = 1, 3 do - imbuingWindow.itemInfo.slots:getChildByIndex(i):setText('Slot ' .. i) - imbuingWindow.itemInfo.slots:getChildByIndex(i):setEnabled(false) - imbuingWindow.itemInfo.slots:getChildByIndex(i):setTooltip( + local slot = imbuingWindow.itemInfo.slots:getChildByIndex(i) + slot:setText('Slot ' .. i) + slot:getChildById('icon'):setVisible(false) + slot:setEnabled(false) + slot:setTooltip( 'Items can have up to three imbuements slots. This slot is not available for this item.') - imbuingWindow.itemInfo.slots:getChildByIndex(i).onClick = nil + slot.onClick = nil end end function selectSlot(widget, slotId, activeSlot) + local slotIcon = widget:getChildById('icon') + if activeSlot then emptyImbue:setVisible(false) - widget:setText(activeSlot[1]['name']) + widget:setText('') + slotIcon:setVisible(true) + local id = activeSlot[1]['id'] or 1 + slotIcon:setImageSource('/images/game/imbuing/icons/' .. getCorrectIconId(id)) + slotIcon:setImageClip(torect('0 0 64 64')) clearImbue.title:setText('Clear Imbuement "' .. activeSlot[1]['name'] .. '"') clearImbue.groups:clearOptions() clearImbue.groups:addOption(activeSlot[1]['group']) @@ -174,18 +199,24 @@ function selectSlot(widget, slotId, activeSlot) hours = string.format('%02.f', math.floor(activeSlot[2] / 3600)) mins = string.format('%02.f', math.floor(activeSlot[2] / 60 - (hours * 60))) - clearImbue.time.timeRemaining:setText(hours .. ':' .. mins .. 'h') + local totalTime = 72000 -- 20 hours in seconds + local percent = math.max(0, math.min(100, (activeSlot[2] / totalTime) * 100)) + + clearImbue.time.timerContainer.timeRemaining:setPercent(percent) + clearImbue.time.timerContainer.timeRemaining.text:setText(hours .. ':' .. mins .. 'h') - clearImbue.cost:setText(activeSlot[3]) + clearImbue.cost:setText(comma_value(activeSlot[3])) if (bankGold + inventoryGold) < activeSlot[3] then emptyImbue.clear:setEnabled(false) emptyImbue.clear:setImageSource('/images/game/imbuing/imbue_empty') emptyImbue.cost:setColor('red') + end local yesCallback = function() g_game.clearImbuement(slotId) widget:setText('Slot ' .. (slotId + 1)) + slotIcon:setVisible(true) if clearConfirmWindow then clearConfirmWindow:destroy() clearConfirmWindow = nil @@ -229,7 +260,9 @@ function selectSlot(widget, slotId, activeSlot) clearConfirmWindow:destroy() clearConfirmWindow = nil end - widget:setText(selectedImbue['name']) + slotIcon:setVisible(true) + local id = selectedImbue['id'] or 1 + slotIcon:setImageSource('/images/game/imbuing/icons/' .. getCorrectIconId(id)) imbuingWindow:show() end local noCallback = function() @@ -294,6 +327,14 @@ function Imbuing.onImbuementWindow(itemId, slots, activeSlots, imbuements, needI activeSlotBtn.onClick = function(widget) selectSlot(widget, i, slot) end + + -- Atualiza o ícone de todos os slots ativos imediatamente + local slotIcon = activeSlotBtn:getChildById('icon') + activeSlotBtn:setText('') + slotIcon:setVisible(true) + local id = slot[1]['id'] or 1 + slotIcon:setImageSource('/images/game/imbuing/icons/' .. getCorrectIconId(id)) + if activeSlotBtn:getId() == 'slot0' then selectSlot(activeSlotBtn, i, slot) end @@ -309,6 +350,9 @@ function Imbuing.onImbuementWindow(itemId, slots, activeSlots, imbuements, needI end end end + + -- Reconfigurar eventos de hover após carregar os slots + setupTooltipEvents() show() end @@ -321,7 +365,7 @@ function Imbuing.onResourcesBalanceChange(balance, oldBalance, type) local player = g_game.getLocalPlayer() if player then if type == ResourceTypes.BANK_BALANCE or type == ResourceTypes.GOLD_EQUIPPED then - imbuingWindow.balance:setText(tr('Balance') .. ':\n' .. (player:getTotalMoney())) + imbuingWindow.balance:setText(tr(comma_value (player:getTotalMoney()))) end end end @@ -347,3 +391,85 @@ function toggle() end show() end + +-- Função para formatar texto com quebra de linha automática +function formatTooltipText(text) + if not text then return '' end + + -- Definir largura máxima aproximada (em caracteres) + local maxWidth = 240 + + local formattedText = '' + local currentLine = '' + + -- Dividir o texto em palavras + for word in text:gmatch("%S+") do + -- Se adicionar a palavra exceder a largura máxima + if #currentLine + #word + 1 > maxWidth and #currentLine > 0 then + formattedText = formattedText .. currentLine .. '\n' + currentLine = word + else + if #currentLine > 0 then + currentLine = currentLine .. ' ' .. word + else + currentLine = word + end + end + end + + -- Adicionar a última linha + if #currentLine > 0 then + formattedText = formattedText .. currentLine + end + + return formattedText +end + +-- Função para configurar eventos de hover em elementos com tooltip +function setupTooltipEvents() + if not infoPanel then return end + + local tooltipContent = infoPanel:recursiveGetChildById('tooltipContent') + if not tooltipContent then return end + + -- Função para adicionar hover a um widget + local function addHoverToWidget(widget) + if not widget or not widget.getTooltip then return end + + widget.onHoverChange = function(self, hovered) + if hovered then + local tooltip = self:getTooltip() + if tooltip and tooltip ~= '' then + -- Adicionar quebras de linha para textos longos + local formattedText = formatTooltipText(tooltip) + tooltipContent:setText(formattedText) + else + tooltipContent:setText('') + end + else + tooltipContent:setText('') + end + end + end + + -- Adicionar hover aos botões principais + if emptyImbue.imbue then addHoverToWidget(emptyImbue.imbue) end + if emptyImbue.protection then addHoverToWidget(emptyImbue.protection) end + if clearImbue.clear then addHoverToWidget(clearImbue.clear) end + + -- Adicionar hover aos itens requeridos + if emptyImbue.requiredItems then + for i = 1, 3 do + local item = emptyImbue.requiredItems:getChildByIndex(i).item + if item then addHoverToWidget(item) end + end + end + + -- Adicionar hover aos slots + if imbuingWindow.itemInfo and imbuingWindow.itemInfo.slots then + for i = 1, 3 do + local slot = imbuingWindow.itemInfo.slots:getChildByIndex(i) + if slot then addHoverToWidget(slot) end + end + end +end diff --git a/modules/game_imbuing/imbuing.otui b/modules/game_imbuing/imbuing.otui index 424e8d2e35..a15b134737 100644 --- a/modules/game_imbuing/imbuing.otui +++ b/modules/game_imbuing/imbuing.otui @@ -1,11 +1,18 @@ Slot < Button - width: 70 + width: 66 height: 66 anchors.verticalCenter: parent.verticalCenter enabled: false text-wrap: true !tooltip: tr('Items can have up to three imbuements slots. This slot is not available for this item.') + UIWidget + id: icon + size: 64 64 + anchors.centerIn: parent + phantom: true + visible: false + RequiredItem < Panel width: 66 height: 90 @@ -16,6 +23,7 @@ RequiredItem < Panel width: 66 anchors.left: parent.left anchors.top: parent.top + image-source: /images/ui/item66 FlatLabel id: count @@ -24,11 +32,14 @@ RequiredItem < Panel anchors.left: prev.left anchors.right: prev.right anchors.top: prev.bottom + text-offset: 0 0 + image-source: /images/ui/infoPanel ItemInformation < Panel height: 100 - border: 1 black - padding: 5 + padding: 3 + image-source: /images/ui/t2pixel-up-frame-borderimage + image-border: 5 Label id: title @@ -86,8 +97,9 @@ ItemInformation < Panel EmptyImbue < Panel height: 240 - border: 1 black - padding: 5 + padding: 3 15 15 15 + image-source: /images/ui/t2pixel-up-frame-borderimage_2 + image-border: 5 Label id: title @@ -126,6 +138,7 @@ EmptyImbue < Panel anchors.bottom: prev.bottom anchors.left: parent.left !text: tr('Requires the following astral sources:') + margin-bottom: 10 Label id: successRate @@ -180,6 +193,7 @@ EmptyImbue < Panel anchors.left: prev.left anchors.right: prev.right anchors.top: prev.bottom + image-source: /images/ui/infoPanel UIWidget id: horizontalArrow @@ -214,11 +228,13 @@ EmptyImbue < Panel anchors.left: prev.left anchors.right: prev.right anchors.top: prev.bottom + image-source: /images/game/prey/balanceBg ClearImbue < Panel height: 240 - border: 1 black - padding: 5 + padding: 3 15 15 15 + image-source: /images/ui/t2pixel-up-frame-borderimage_2 + image-border: 5 Label id: title @@ -267,19 +283,29 @@ ClearImbue < Panel Panel id: time - width: 210 + width: 277 height: 90 anchors.left: parent.left anchors.bottom: parent.bottom - - FlatLabel - id: timeRemaining - size: 86 25 - margin-bottom: 20 - text-align: center - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter + + Panel + id: timerContainer + size: 277 18 + anchors.centerIn: parent + image-source: /images/game/imbuing/imbui-timer-bg + + UIProgressBar + id: timeRemaining + anchors.fill: parent + image-source: /images/game/imbuing/imbui-progress + background-color: alpha + Label + id: text + anchors.centerIn: parent + text-align: center + text-auto-resize: true + color: white + font: verdana-11px-rounded UIButton id: clear @@ -302,12 +328,29 @@ ClearImbue < Panel anchors.left: prev.left anchors.right: prev.right anchors.top: prev.bottom + image-source: /images/game/prey/balanceBg +infoPanelTolltip < Panel + height: 75 + padding: 10 + image-source: /images/ui/2pixel_up_frame_borderimage + image-border: 5 + + Label + id: tooltipContent + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + text-align: left + color: white + font: verdana-11px-rounded + text-wrap: true MainWindow id: imbuingWindow !text: tr('Imbue Item') - size: 550 430 + size: 572 520 background-color: #AAAAAA @onEscape: modules.game_imbuing.hide() @@ -330,6 +373,13 @@ MainWindow anchors.top: emptyImbue.top anchors.right: parent.right + infoPanelTolltip + id: infoPanel + anchors.left: parent.left + anchors.top: emptyImbue.bottom + anchors.right: parent.right + margin-top: 5 + Button id: close !text: tr('Close') @@ -341,6 +391,14 @@ MainWindow Label id: balance height: 25 - anchors.right: prev.left anchors.left: parent.left anchors.bottom: parent.bottom + text-align: right + text-offset: -20 0 + image-source: /images/game/prey/balanceBg + UIWidget + id: Icon + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + margin-right: 4 + image-source: /game_cyclopedia/images/icon-goldcoin diff --git a/modules/game_interface/interface.otmod b/modules/game_interface/interface.otmod index 467a1fe222..e5dbe1b849 100644 --- a/modules/game_interface/interface.otmod +++ b/modules/game_interface/interface.otmod @@ -16,6 +16,7 @@ Module - game_prey - game_imbuing - game_imbuementtracker + - game_imbui - game_hotkeys - game_questlog - game_textmessage diff --git a/src/client/game.cpp b/src/client/game.cpp index 0c69c615fd..616792ecc0 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1860,6 +1860,22 @@ void Game::closeImbuingWindow() m_protocolGame->sendCloseImbuingWindow(); } +void Game::selectImbuementItem(const uint16_t itemId, const Position& pos, const uint8_t stackpos) +{ + if (!canPerformGameAction()) + return; + + m_protocolGame->sendImbuementWindowAction(1, itemId, pos, stackpos); +} + +void Game::selectImbuementScroll() +{ + if (!canPerformGameAction()) + return; + + m_protocolGame->sendImbuementWindowAction(2); +} + void Game::imbuementDurations(const bool isOpen) { if (!canPerformGameAction()) diff --git a/src/client/game.h b/src/client/game.h index a6fc46c590..5d345867cd 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -390,6 +390,8 @@ class Game void clearImbuement(uint8_t slot); void closeImbuingWindow(); void imbuementDurations(bool isOpen = false); + void selectImbuementItem(uint16_t itemId, const Position& pos, uint8_t stackpos); + void selectImbuementScroll(); void enableTileThingLuaCallback(const bool value) { m_tileThingsLuaCallback = value; } bool isTileThingLuaCallbackEnabled() { return m_tileThingsLuaCallback; } diff --git a/src/client/luafunctions.cpp b/src/client/luafunctions.cpp index cd025610ef..55af37279a 100644 --- a/src/client/luafunctions.cpp +++ b/src/client/luafunctions.cpp @@ -378,6 +378,8 @@ void Client::registerLuaFunctions() g_lua.bindSingletonFunction("g_game", "applyImbuement", &Game::applyImbuement, &g_game); g_lua.bindSingletonFunction("g_game", "clearImbuement", &Game::clearImbuement, &g_game); g_lua.bindSingletonFunction("g_game", "closeImbuingWindow", &Game::closeImbuingWindow, &g_game); + g_lua.bindSingletonFunction("g_game", "selectImbuementItem", &Game::selectImbuementItem, &g_game); + g_lua.bindSingletonFunction("g_game", "selectImbuementScroll", &Game::selectImbuementScroll, &g_game); g_lua.bindSingletonFunction("g_game", "isUsingProtobuf", &Game::isUsingProtobuf, &g_game); g_lua.bindSingletonFunction("g_game", "enableTileThingLuaCallback", &Game::enableTileThingLuaCallback, &g_game); g_lua.bindSingletonFunction("g_game", "isTileThingLuaCallbackEnabled", &Game::isTileThingLuaCallbackEnabled, &g_game); diff --git a/src/client/protocolcodes.h b/src/client/protocolcodes.h index 0497f50db4..09ed0fcb5b 100644 --- a/src/client/protocolcodes.h +++ b/src/client/protocolcodes.h @@ -221,6 +221,7 @@ namespace Proto GameServerChannelEvent = 243, GameServerItemInfo = 244, GameServerPlayerInventory = 245, + GameServerInventoryImbuements = 96, // 0x60 - Inventory Imbuements opcode from server GameServerMarketEnter = 246, GameServerMarketLeave = 247, GameServerMarketDetail = 248, diff --git a/src/client/protocolgame.h b/src/client/protocolgame.h index 1a2e57c6b3..4f27f75632 100644 --- a/src/client/protocolgame.h +++ b/src/client/protocolgame.h @@ -142,6 +142,7 @@ class ProtocolGame final : public Protocol void sendApplyImbuement(uint8_t slot, uint32_t imbuementId, bool protectionCharm); void sendClearImbuement(uint8_t slot); void sendCloseImbuingWindow(); + void sendImbuementWindowAction(uint8_t type, uint16_t itemId = 0, const Position& pos = Position(), uint8_t stackpos = 0); void sendOpenRewardWall(); void sendOpenRewardHistory(); void sendGetRewardDaily(const uint8_t bonusShrine, const std::map& items); diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 4cb30ac9d6..972baa827e 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -817,6 +817,7 @@ void ProtocolGame::parseResourceBalance(const InputMessagePtr& msg) const break; } m_localPlayer->setResourceBalance(type, value); + g_lua.callGlobalField("g_game", "onResourceBalance", type, value); } void ProtocolGame::parseWorldTime(const InputMessagePtr& msg) diff --git a/src/client/protocolgamesend.cpp b/src/client/protocolgamesend.cpp index edcb164c31..a3b44f9783 100644 --- a/src/client/protocolgamesend.cpp +++ b/src/client/protocolgamesend.cpp @@ -1466,6 +1466,21 @@ void ProtocolGame::sendCloseImbuingWindow() send(msg); } +void ProtocolGame::sendImbuementWindowAction(const uint8_t type, const uint16_t itemId, const Position& pos, const uint8_t stackpos) +{ + const auto& msg = std::make_shared(); + msg->addU8(0xB2); // same opcode as parseImbuementWindow on server + msg->addU8(type); // 1 = SELECT_ITEM, 2 = SCROLL + + if (type == 1) { // SELECT_ITEM + addPosition(msg, pos); + msg->addU16(itemId); + msg->addU8(stackpos); + } + + send(msg); +} + void ProtocolGame::sendOpenRewardWall() { const auto& msg = std::make_shared(); From 880d688d8b4053877ce7e659065f7734e7958210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Sat, 24 Jan 2026 00:11:23 -0300 Subject: [PATCH 2/9] Update imbuementscroll.lua --- .../game_imbui/classes/imbuementscroll.lua | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/game_imbui/classes/imbuementscroll.lua b/modules/game_imbui/classes/imbuementscroll.lua index 7c67a26cc9..e828430c42 100644 --- a/modules/game_imbui/classes/imbuementscroll.lua +++ b/modules/game_imbui/classes/imbuementscroll.lua @@ -12,6 +12,9 @@ ImbuementScroll.__index = ImbuementScroll local self = ImbuementScroll function ImbuementScroll.setup(availableImbuements, needItems) + print("DEBUG: ImbuementScroll.setup chamado") + print("DEBUG: availableImbuements count:", availableImbuements and #availableImbuements or 0) + self.availableImbuements = availableImbuements or {} self.needItems = needItems or {} @@ -56,6 +59,9 @@ function ImbuementScroll.selectBaseType(selectedButtonId) end end + print("DEBUG: selectBaseType chamado com baseImbuement =", baseImbuement) + print("DEBUG: total availableImbuements =", #self.availableImbuements) + local imbuementsList = self.window:recursiveGetChildById("imbuementsList") imbuementsList:destroyChildren() @@ -63,9 +69,21 @@ function ImbuementScroll.selectBaseType(selectedButtonId) imbuementsDetails:setVisible(false) local selected = false + local matchedCount = 0 for id, imbuement in ipairs(self.availableImbuements) do - if imbuement.type == baseImbuement then + local imbuementType = imbuement.type + if imbuementType == nil and imbuement.group then + if imbuement.group == 'Basic' then imbuementType = 0 + elseif imbuement.group == 'Intricate' then imbuementType = 1 + elseif imbuement.group == 'Powerful' then imbuementType = 2 + end + end + + print("DEBUG: imbuement", id, "type =", imbuement.type, "group =", imbuement.group, "imbuementType =", imbuementType, "baseImbuement =", baseImbuement) + + if imbuementType == baseImbuement then + matchedCount = matchedCount + 1 local widget = g_ui.createWidget("SlotImbuing", imbuementsList) widget:setId(tostring(id)) widget.resource:setImageSource("/images/game/imbuing/icons/" .. imbuement.imageId) @@ -81,6 +99,8 @@ function ImbuementScroll.selectBaseType(selectedButtonId) end end + + print("DEBUG: matchedCount =", matchedCount) end function ImbuementScroll.selectImbuementWidget(widget, imbuement) From 5ce1c262355a46ccaf43e6b8138ed8e0ffc349da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Sat, 24 Jan 2026 18:24:09 -0300 Subject: [PATCH 3/9] progress bar 1412 --- data/styles/10-progressbars.otui | 34 ++++++++++++++++++++++++++++++- modules/game_imbuing/imbuing.lua | 24 +++++++++++++--------- modules/game_imbuing/imbuing.otui | 10 +++++++-- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/data/styles/10-progressbars.otui b/data/styles/10-progressbars.otui index 1946016d10..7025bae628 100644 --- a/data/styles/10-progressbars.otui +++ b/data/styles/10-progressbars.otui @@ -2,7 +2,7 @@ ProgressBar < UIProgressBar height: 16 background-color: red image-source: /images/ui/progressbar - image-border: 1 + image-border: 2 font: verdana-11px-rounded text-offset: 0 2 @@ -12,6 +12,9 @@ ProgressBar < UIProgressBar margin-bottom: 0 height: 0 +ThickProgressBar < ProgressBar + image-source: /images/ui/progressbar_thick + LifeProgressBar < UIProgressBar height: 16 background-color: green @@ -26,3 +29,32 @@ ProgressRect < UIProgressRect color: white background-color: #00000088 font: verdana-11px-rounded + +HealthBar < ProgressBar + image-source: /images/ui/progressbarhpmana + image-border: 3 + +ManaBar < ProgressBar + image-source: /images/ui/progressbarhpmana + image-border: 4 + background-color: #4444ff + +ProgressBarSD < UIProgressBarSD + height: 22 + tooltip-delayed: true + +HealthBarSD < ProgressBarSD + +ProgressBarSDInv < UIProgressBarSDInverted + +InvManaBar < UIProgressBarSDInverted + size: 10 30 + image-border: 1 + +InvVerticalBar < UIVerticalProgressBarSDInverted + size: 10 30 + image-border: 1 + +VerticalBar < UIVerticalProgressBarSD + size: 10 30 + image-border: 1 \ No newline at end of file diff --git a/modules/game_imbuing/imbuing.lua b/modules/game_imbuing/imbuing.lua index bde9153029..89d44e39e2 100644 --- a/modules/game_imbuing/imbuing.lua +++ b/modules/game_imbuing/imbuing.lua @@ -197,20 +197,24 @@ function selectSlot(widget, slotId, activeSlot) clearImbue.imbuement:addOption(activeSlot[1]['name']) clearImbue.description:setText(activeSlot[1]['description']) - hours = string.format('%02.f', math.floor(activeSlot[2] / 3600)) - mins = string.format('%02.f', math.floor(activeSlot[2] / 60 - (hours * 60))) - local totalTime = 72000 -- 20 hours in seconds - local percent = math.max(0, math.min(100, (activeSlot[2] / totalTime) * 100)) + local hours = string.format('%02.f', math.floor(activeSlot[2] / 3600)) + local mins = string.format('%02.f', math.floor(activeSlot[2] / 60 - (hours * 60))) + + local totalTime = activeSlot[1].duration or 72000 + local timeRemaining = clearImbue.time.timerContainer.timeRemaining + + if timeRemaining then + timeRemaining:setMinimum(0) + timeRemaining:setMaximum(totalTime) + timeRemaining:setValue(activeSlot[2], 0, totalTime) + end - clearImbue.time.timerContainer.timeRemaining:setPercent(percent) clearImbue.time.timerContainer.timeRemaining.text:setText(hours .. ':' .. mins .. 'h') - clearImbue.cost:setText(comma_value(activeSlot[3])) if (bankGold + inventoryGold) < activeSlot[3] then - emptyImbue.clear:setEnabled(false) - emptyImbue.clear:setImageSource('/images/game/imbuing/imbue_empty') - emptyImbue.cost:setColor('red') - + clearImbue.clear:setEnabled(false) + clearImbue.clear:setImageSource('/images/game/imbuing/imbue_empty') + clearImbue.cost:setColor('red') end local yesCallback = function() diff --git a/modules/game_imbuing/imbuing.otui b/modules/game_imbuing/imbuing.otui index a15b134737..204735342c 100644 --- a/modules/game_imbuing/imbuing.otui +++ b/modules/game_imbuing/imbuing.otui @@ -294,11 +294,15 @@ ClearImbue < Panel anchors.centerIn: parent image-source: /images/game/imbuing/imbui-timer-bg - UIProgressBar + ProgressBarSD id: timeRemaining + size: 277 18 anchors.fill: parent image-source: /images/game/imbuing/imbui-progress - background-color: alpha + margin: 1 + phantom: true + percent: 1 + Label id: text anchors.centerIn: parent @@ -306,6 +310,8 @@ ClearImbue < Panel text-auto-resize: true color: white font: verdana-11px-rounded + margin-top: 1 + phantom: true UIButton id: clear From ca7a6351917f4feb6c459145f7ec3a541e94df93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Sun, 25 Jan 2026 18:26:14 -0300 Subject: [PATCH 4/9] uiprogressbars --- .../ui/t2pixel-up-frame-borderimage.png | Bin 0 -> 16100 bytes data/styles/10-progressbars.otui | 10 +- modules/corelib/ui/uiprogressbarsd.lua | 109 +++++++++++++++++ modules/corelib/uiprogressbarsd.lua | 111 ++++++++++++++++++ modules/corelib/uiprogressbarsdinverted.lua | 110 +++++++++++++++++ 5 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 data/images/ui/t2pixel-up-frame-borderimage.png create mode 100644 modules/corelib/ui/uiprogressbarsd.lua create mode 100644 modules/corelib/uiprogressbarsd.lua create mode 100644 modules/corelib/uiprogressbarsdinverted.lua diff --git a/data/images/ui/t2pixel-up-frame-borderimage.png b/data/images/ui/t2pixel-up-frame-borderimage.png new file mode 100644 index 0000000000000000000000000000000000000000..d60e36a39fc23668606b6995d3624b02a66f9339 GIT binary patch literal 16100 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 literal 0 HcmV?d00001 diff --git a/data/styles/10-progressbars.otui b/data/styles/10-progressbars.otui index 7025bae628..07b648e0b1 100644 --- a/data/styles/10-progressbars.otui +++ b/data/styles/10-progressbars.otui @@ -43,6 +43,10 @@ ProgressBarSD < UIProgressBarSD height: 22 tooltip-delayed: true +ProgressBarSD < UIProgressBar + height: 22 + tooltip-delayed: true + HealthBarSD < ProgressBarSD ProgressBarSDInv < UIProgressBarSDInverted @@ -57,4 +61,8 @@ InvVerticalBar < UIVerticalProgressBarSDInverted VerticalBar < UIVerticalProgressBarSD size: 10 30 - image-border: 1 \ No newline at end of file + image-border: 1 + +ProgressBarSD < UIProgressBarSD + height: 22 + tooltip-delayed: true \ No newline at end of file diff --git a/modules/corelib/ui/uiprogressbarsd.lua b/modules/corelib/ui/uiprogressbarsd.lua new file mode 100644 index 0000000000..573eb88e05 --- /dev/null +++ b/modules/corelib/ui/uiprogressbarsd.lua @@ -0,0 +1,109 @@ +-- @docclass +UIProgressBarSD = extends(UIWidget, "UIProgressBarSD") + +function UIProgressBarSD.create() + local progressbar = UIProgressBarSD.internalCreate() + progressbar:setFocusable(false) + progressbar:setOn(true) + progressbar.min = 0 + progressbar.max = 100 + progressbar.value = 0 + progressbar.bgBorderLeft = 0 + progressbar.bgBorderRight = 0 + progressbar.bgBorderTop = 0 + progressbar.bgBorderBottom = 0 + return progressbar +end + +function UIProgressBarSD:setMinimum(minimum) + self.minimum = minimum + if self.value < minimum then + self:setValue(minimum) + end +end + +function UIProgressBarSD:setMaximum(maximum) + self.maximum = maximum + if self.value > maximum then + self:setValue(maximum) + end +end + +function UIProgressBarSD:setValue(value, minimum, maximum) + if minimum then + self:setMinimum(minimum) + end + + if maximum then + self:setMaximum(maximum) + end + + self.value = math.max(math.min(value, self.maximum), self.minimum) + self:updateBackground() +end + +function UIProgressBarSD:setPercent(percent) + self:setValue(percent, 0, 100) +end + +function UIProgressBarSD:getPercent() + return self.value +end + +function UIProgressBarSD:getPercentPixels() + return (self.maximum - self.minimum) / self:getWidth() +end + +function UIProgressBarSD:getProgress() + if self.minimum == self.maximum then return 1 end + return (self.value - self.minimum) / (self.maximum - self.minimum) +end + +function UIProgressBarSD:updateBackground() + if self:isOn() then + local width = math.round(math.max((self:getProgress() * (self:getWidth() - self.bgBorderLeft - self.bgBorderRight)), 1)) + local height = self:getHeight() - self.bgBorderTop - self.bgBorderBottom + local rect = { x = self.bgBorderLeft, y = self.bgBorderTop, width = width, height = height } + self:setImageRect(rect) + + --[[if width == 1 then + self:setImageVisible(false) + else + self:setImageVisible(true) + end]] + end +end + +function UIProgressBarSD:onSetup() + self:updateBackground() +end + +function UIProgressBarSD:onStyleApply(name, node) + for name,value in pairs(node) do + if name == 'background-border-left' then + self.bgBorderLeft = tonumber(value) + elseif name == 'background-border-right' then + self.bgBorderRight = tonumber(value) + elseif name == 'background-border-top' then + self.bgBorderTop = tonumber(value) + elseif name == 'background-border-bottom' then + self.bgBorderBottom = tonumber(value) + elseif name == 'background-border' then + self.bgBorderLeft = tonumber(value) + self.bgBorderRight = tonumber(value) + self.bgBorderTop = tonumber(value) + self.bgBorderBottom = tonumber(value) + elseif name == 'percent' then + self.percent = self:setPercent(tonumber(value)) + elseif name == 'tooltip-delayed' then + self.tooltipDelayed = value + end + end +end + +function UIProgressBarSD:onGeometryChange(oldRect, newRect) + if not self:isOn() then + self:setHeight(0) + end + self:updateBackground() +end diff --git a/modules/corelib/uiprogressbarsd.lua b/modules/corelib/uiprogressbarsd.lua new file mode 100644 index 0000000000..ca894b624c --- /dev/null +++ b/modules/corelib/uiprogressbarsd.lua @@ -0,0 +1,111 @@ +-- @docclass +UIProgressBarSD = extends(UIWidget, "UIProgressBarSD") + +function UIProgressBarSD.create() + local progressbar = UIProgressBarSD.internalCreate() + progressbar:setFocusable(false) + progressbar:setOn(true) + progressbar.min = 0 + progressbar.max = 100 + progressbar.value = 0 + progressbar.bgBorderLeft = 0 + progressbar.bgBorderRight = 0 + progressbar.bgBorderTop = 0 + progressbar.bgBorderBottom = 0 + progressbar:insertLuaCall("onSetup") + progressbar:insertLuaCall("onGeometryChange") + return progressbar +end + +function UIProgressBarSD:setMinimum(minimum) + self.minimum = minimum + if self.value < minimum then + self:setValue(minimum) + end +end + +function UIProgressBarSD:setMaximum(maximum) + self.maximum = maximum + if self.value > maximum then + self:setValue(maximum) + end +end + +function UIProgressBarSD:setValue(value, minimum, maximum) + if minimum then + self:setMinimum(minimum) + end + + if maximum then + self:setMaximum(maximum) + end + + self.value = math.max(math.min(value, self.maximum), self.minimum) + self:updateBackground() +end + +function UIProgressBarSD:setPercent(percent) + self:setValue(percent, 0, 100) +end + +function UIProgressBarSD:getPercent() + return self.value +end + +function UIProgressBarSD:getPercentPixels() + return (self.maximum - self.minimum) / self:getWidth() +end + +function UIProgressBarSD:getProgress() + if self.minimum == self.maximum then return 1 end + return (self.value - self.minimum) / (self.maximum - self.minimum) +end + +function UIProgressBarSD:updateBackground() + if self:isOn() then + local width = math.round(math.max((self:getProgress() * (self:getWidth() - self.bgBorderLeft - self.bgBorderRight)), 1)) + local height = self:getHeight() - self.bgBorderTop - self.bgBorderBottom + local rect = { x = self.bgBorderLeft, y = self.bgBorderTop, width = width, height = height } + self:setImageRect(rect) + + if width == 1 then + self:setImageVisible(false) + else + self:setImageVisible(true) + end + end +end + +function UIProgressBarSD:onSetup() + self:updateBackground() +end + +function UIProgressBarSD:onStyleApply(name, node) + for name,value in pairs(node) do + if name == 'background-border-left' then + self.bgBorderLeft = tonumber(value) + elseif name == 'background-border-right' then + self.bgBorderRight = tonumber(value) + elseif name == 'background-border-top' then + self.bgBorderTop = tonumber(value) + elseif name == 'background-border-bottom' then + self.bgBorderBottom = tonumber(value) + elseif name == 'background-border' then + self.bgBorderLeft = tonumber(value) + self.bgBorderRight = tonumber(value) + self.bgBorderTop = tonumber(value) + self.bgBorderBottom = tonumber(value) + elseif name == 'percent' then + self.percent = self:setPercent(tonumber(value)) + elseif name == 'tooltip-delayed' then + self.tooltipDelayed = value + end + end +end + +function UIProgressBarSD:onGeometryChange(oldRect, newRect) + if not self:isOn() then + self:setHeight(0) + end + self:updateBackground() +end diff --git a/modules/corelib/uiprogressbarsdinverted.lua b/modules/corelib/uiprogressbarsdinverted.lua new file mode 100644 index 0000000000..e501e8bc63 --- /dev/null +++ b/modules/corelib/uiprogressbarsdinverted.lua @@ -0,0 +1,110 @@ +-- @docclass +UIProgressBarSDInverted = extends(UIWidget, "UIProgressBarSDInverted") + +function UIProgressBarSDInverted.create() + local progressbar = UIProgressBarSDInverted.internalCreate() + progressbar:setFocusable(false) + progressbar:setOn(true) + progressbar.min = 0 + progressbar.max = 100 + progressbar.value = 0 + progressbar.bgBorderLeft = 0 + progressbar.bgBorderRight = 0 + progressbar.bgBorderTop = 0 + progressbar.bgBorderBottom = 0 + progressbar:insertLuaCall("onSetup") + progressbar:insertLuaCall("onGeometryChange") + return progressbar +end + +function UIProgressBarSDInverted:setMinimum(minimum) + self.minimum = minimum + if self.value < minimum then + self:setValue(minimum) + end +end + +function UIProgressBarSDInverted:setMaximum(maximum) + self.maximum = maximum + if self.value > maximum then + self:setValue(maximum) + end +end + +function UIProgressBarSDInverted:setValue(value, minimum, maximum) + if minimum then + self:setMinimum(minimum) + end + + if maximum then + self:setMaximum(maximum) + end + + self.value = math.max(math.min(value, self.maximum), self.minimum) + self:updateBackground() +end + +function UIProgressBarSDInverted:setPercent(percent) + self:setValue(percent, 0, 100) +end + +function UIProgressBarSDInverted:getPercent() + return self.value +end + +function UIProgressBarSDInverted:getPercentPixels() + return (self.maximum - self.minimum) / self:getWidth() +end + +function UIProgressBarSDInverted:getProgress() + if self.minimum == self.maximum then return 1 end + return (self.value - self.minimum) / (self.maximum - self.minimum) +end + +function UIProgressBarSDInverted:updateBackground() + if self:isOn() then + local width = math.round(math.max((self:getProgress() * (self:getWidth() - self.bgBorderLeft - self.bgBorderRight)), 1)) + local height = self:getHeight() - self.bgBorderTop - self.bgBorderBottom + local rect = { x = self:getWidth() - (self:getProgress() * self:getWidth()), y = self.bgBorderTop, width = width, height = height } + if width == 1 then + rect.x = rect.x - 1 + end + self:setImageRect(rect) + + if width == 1 then + self:setImageVisible(false) + else + self:setImageVisible(true) + end + end +end + +function UIProgressBarSDInverted:onSetup() + self:updateBackground() +end + +function UIProgressBarSDInverted:onStyleApply(name, node) + for name,value in pairs(node) do + if name == 'background-border-left' then + self.bgBorderLeft = tonumber(value) + elseif name == 'background-border-right' then + self.bgBorderRight = tonumber(value) + elseif name == 'background-border-top' then + self.bgBorderTop = tonumber(value) + elseif name == 'background-border-bottom' then + self.bgBorderBottom = tonumber(value) + elseif name == 'background-border' then + self.bgBorderLeft = tonumber(value) + self.bgBorderRight = tonumber(value) + self.bgBorderTop = tonumber(value) + self.bgBorderBottom = tonumber(value) + end + end +end + +function UIProgressBarSDInverted:onGeometryChange(oldRect, newRect) + if not self:isOn() then + self:setHeight(0) + end + self:updateBackground() +end \ No newline at end of file From f0879069d24e17499125e85fe0c94e52f79ceaaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Sun, 25 Jan 2026 20:07:19 -0300 Subject: [PATCH 5/9] fix imbue client 14 --- .../game/imbuing/useprotection-disabled.png | Bin 0 -> 8884 bytes modules/game_imbuing/imbuing.lua | 173 ++++++++++++++++-- 2 files changed, 156 insertions(+), 17 deletions(-) create mode 100644 data/images/game/imbuing/useprotection-disabled.png diff --git a/data/images/game/imbuing/useprotection-disabled.png b/data/images/game/imbuing/useprotection-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..db485daffdd5da85c966f28ef48dd0b9464c35bc GIT binary patch literal 8884 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 z

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 source['item']:getCount() then - emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_green') - emptyImbue.imbue:setEnabled(true) emptyImbue.requiredItems:getChildByIndex(i).count:setColor('white') - end - if item:getCount() < source['item']:getCount() then - emptyImbue.imbue:setEnabled(false) - emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') + else + hasAllItems = false emptyImbue.requiredItems:getChildByIndex(i).count:setColor('red') end emptyImbue.requiredItems:getChildByIndex(i).count:setText(item:getCount() .. '/' .. source['item']:getCount()) end end + if not itemFound then + hasAllItems = false + emptyImbue.requiredItems:getChildByIndex(i).count:setText('0/' .. source['item']:getCount()) + emptyImbue.requiredItems:getChildByIndex(i).count:setColor('red') + end emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(source['item']:getId()) emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip('The imbuement requires ' .. source['description'] .. '.') end + for i = 3, widget.currentIndex + 1, -1 do emptyImbue.requiredItems:getChildByIndex(i).count:setText('') emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(0) @@ -94,21 +100,43 @@ function init() end emptyImbue.protectionCost:setText((comma_value(imbuement['protectionCost']))) emptyImbue.cost:setText(comma_value(imbuement['cost'])) - if not protection and (bankGold + inventoryGold) < imbuement['cost'] then - emptyImbue.imbue:setEnabled(false) - emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') - emptyImbue.cost:setColor('red') - end - if not protection and (bankGold + inventoryGold) >= imbuement['cost'] then - emptyImbue.cost:setColor('white') + + -- Verificar se tem todos os itens e gold suficiente + local hasEnoughGold = false + if not protection then + hasEnoughGold = (bankGold + inventoryGold) >= imbuement['cost'] + if not hasEnoughGold then + emptyImbue.cost:setColor('red') + else + emptyImbue.cost:setColor('white') + end + else + hasEnoughGold = (bankGold + inventoryGold) >= (imbuement['cost'] + imbuement['protectionCost']) + if not hasEnoughGold then + emptyImbue.cost:setColor('red') + else + emptyImbue.cost:setColor('white') + end end - if protection and (bankGold + inventoryGold) < (imbuement['cost'] + imbuement['protectionCost']) then + + -- Habilitar/desabilitar botão de imbue baseado em itens E gold + if hasAllItems and hasEnoughGold then + emptyImbue.imbue:setEnabled(true) + emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_green') + else emptyImbue.imbue:setEnabled(false) emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') - emptyImbue.cost:setColor('red') end - if protection and (bankGold + inventoryGold) >= (imbuement['cost'] + imbuement['protectionCost']) then - emptyImbue.cost:setColor('white') + + -- Verificar se o botão de proteção deve ser desabilitado + if (bankGold + inventoryGold) < imbuement['protectionCost'] then + protectionBtn:setEnabled(false) + emptyImbue.protection:setImageSource('/images/game/imbuing/useprotection-disabled') + emptyImbue.protectionCost:setColor('red') + else + protectionBtn:setEnabled(true) + emptyImbue.protection:setImageSource('/images/game/imbuing/100percent') + emptyImbue.protectionCost:setColor('white') end emptyImbue.successRate:setText(imbuement['successRate'] .. '%') if selectedImbue['successRate'] > 50 then @@ -137,6 +165,13 @@ function setProtection(value) emptyImbue.successRate:setText('100%') emptyImbue.successRate:setColor('green') protectionBtn:setImageClip(torect('66 0 66 66')) + + -- Verificar se há gold suficiente para o custo total com proteção + if (bankGold + inventoryGold) < (selectedImbue['cost'] + selectedImbue['protectionCost']) then + emptyImbue.cost:setColor('red') + else + emptyImbue.cost:setColor('white') + end else if selectedImbue then emptyImbue.cost:setText(comma_value(selectedImbue['cost'])) @@ -146,9 +181,53 @@ function setProtection(value) else emptyImbue.successRate:setColor('red') end + + -- Verificar se há gold suficiente para o custo sem proteção + if (bankGold + inventoryGold) < selectedImbue['cost'] then + emptyImbue.cost:setColor('red') + else + emptyImbue.cost:setColor('white') + end end protectionBtn:setImageClip(torect('0 0 66 66')) end + + -- Re-verificar o estado do botão de imbue quando a proteção mudar + if selectedImbue then + local hasAllItems = true + for i, source in ipairs(selectedImbue['sources']) do + local itemFound = false + for _, item in ipairs(imbueItems) do + if item:getId() == source['item']:getId() then + itemFound = true + if item:getCount() < source['item']:getCount() then + hasAllItems = false + break + end + end + end + if not itemFound then + hasAllItems = false + break + end + end + + local hasEnoughGold = false + if protection then + hasEnoughGold = (bankGold + inventoryGold) >= (selectedImbue['cost'] + selectedImbue['protectionCost']) + else + hasEnoughGold = (bankGold + inventoryGold) >= selectedImbue['cost'] + end + + -- Habilitar/desabilitar botão de imbue baseado em itens E gold + if hasAllItems and hasEnoughGold then + emptyImbue.imbue:setEnabled(true) + emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_green') + else + emptyImbue.imbue:setEnabled(false) + emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') + end + end end function terminate() @@ -370,6 +449,66 @@ function Imbuing.onResourcesBalanceChange(balance, oldBalance, type) if player then if type == ResourceTypes.BANK_BALANCE or type == ResourceTypes.GOLD_EQUIPPED then imbuingWindow.balance:setText(tr(comma_value (player:getTotalMoney()))) + + -- Re-verificar o estado dos botões quando o saldo mudar + if selectedImbue and emptyImbue:isVisible() then + -- Verificar botão de proteção + if (bankGold + inventoryGold) < selectedImbue['protectionCost'] then + protectionBtn:setEnabled(false) + emptyImbue.protection:setImageSource('/images/game/imbuing/useprotection-disabled') + emptyImbue.protectionCost:setColor('red') + else + protectionBtn:setEnabled(true) + emptyImbue.protection:setImageSource('/images/game/imbuing/100percent') + emptyImbue.protectionCost:setColor('white') + end + + -- Verificar se tem todos os itens + local hasAllItems = true + for i, source in ipairs(selectedImbue['sources']) do + local itemFound = false + for _, item in ipairs(imbueItems) do + if item:getId() == source['item']:getId() then + itemFound = true + if item:getCount() < source['item']:getCount() then + hasAllItems = false + break + end + end + end + if not itemFound then + hasAllItems = false + break + end + end + + -- Verificar gold suficiente + local hasEnoughGold = false + if protection then + hasEnoughGold = (bankGold + inventoryGold) >= (selectedImbue['cost'] + selectedImbue['protectionCost']) + if not hasEnoughGold then + emptyImbue.cost:setColor('red') + else + emptyImbue.cost:setColor('white') + end + else + hasEnoughGold = (bankGold + inventoryGold) >= selectedImbue['cost'] + if not hasEnoughGold then + emptyImbue.cost:setColor('red') + else + emptyImbue.cost:setColor('white') + end + end + + -- Habilitar/desabilitar botão de imbue baseado em itens E gold + if hasAllItems and hasEnoughGold then + emptyImbue.imbue:setEnabled(true) + emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_green') + else + emptyImbue.imbue:setEnabled(false) + emptyImbue.imbue:setImageSource('/images/game/imbuing/imbue_empty') + end + end end end end From aa3d6b793fd08fa765d7e8aa2ca957ac93f37f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Sun, 25 Jan 2026 22:00:06 -0300 Subject: [PATCH 6/9] fix --- modules/game_imbui/t_imbui.otui | 25 ++++++++++++------------- modules/game_imbuing/imbuing.lua | 2 +- modules/game_imbuing/imbuing.otui | 27 ++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/modules/game_imbui/t_imbui.otui b/modules/game_imbui/t_imbui.otui index 09019112ad..b5a909c0c3 100644 --- a/modules/game_imbui/t_imbui.otui +++ b/modules/game_imbui/t_imbui.otui @@ -337,8 +337,8 @@ SelectImbue < UIWidget anchors.bottom: parent.bottom anchors.left: parent.left !text: tr('') - font: verdana-11px-rounded - color: white + font: verdana-11px-rounded + color: white text-auto-resize: true visible: true @@ -454,8 +454,8 @@ ClearImbue < UIWidget anchors.top: prev.top anchors.right: prev.left !text: tr('Item Information') - font: verdana-11px-rounded - color: white + font: verdana-11px-rounded + color: white text-auto-resize: true margin-top: 24 margin-right: 22 @@ -502,8 +502,8 @@ ClearImbue < UIWidget anchors.bottom: parent.bottom anchors.left: parent.left !text: tr('Raises your walking speed by 30. Lasts for 20h 0min while equipped.') - font: verdana-11px-rounded - color: white + font: verdana-11px-rounded + color: white text-auto-resize: true Panel @@ -560,8 +560,8 @@ ClearImbue < UIWidget id: cleanImbuementsDetails anchors.bottom: parent.bottom anchors.left: parent.left - font: verdana-11px-rounded - color: white + font: verdana-11px-rounded + color: white text-auto-resize: true UIButton @@ -625,7 +625,6 @@ ScrollImbue < UIWidget PickItemButton ScrollItemButton - UIItem id: itemScroll size: 64 64 @@ -643,8 +642,8 @@ ScrollImbue < UIWidget anchors.top: prev.top anchors.right: prev.left !text: tr('Blank Imbuement Scroll') - font: verdana-11px-rounded - color: white + font: verdana-11px-rounded + color: white text-auto-resize: true margin-top: 24 margin-right: 22 @@ -792,8 +791,8 @@ ScrollImbue < UIWidget anchors.bottom: parent.bottom anchors.left: parent.left !text: tr('') - font: verdana-11px-rounded - color: white + font: verdana-11px-rounded + color: white text-auto-resize: true visible: true diff --git a/modules/game_imbuing/imbuing.lua b/modules/game_imbuing/imbuing.lua index 51edfd1664..f103e87b2b 100644 --- a/modules/game_imbuing/imbuing.lua +++ b/modules/game_imbuing/imbuing.lua @@ -250,7 +250,7 @@ function resetSlots() end for i = 1, 3 do local slot = imbuingWindow.itemInfo.slots:getChildByIndex(i) - slot:setText('Slot ' .. i) + -- slot:setText('Slot ' .. i) slot:getChildById('icon'):setVisible(false) slot:setEnabled(false) slot:setTooltip( diff --git a/modules/game_imbuing/imbuing.otui b/modules/game_imbuing/imbuing.otui index 204735342c..0015bef71c 100644 --- a/modules/game_imbuing/imbuing.otui +++ b/modules/game_imbuing/imbuing.otui @@ -70,23 +70,40 @@ ItemInformation < Panel Slot id: slot0 - !text: tr("Slot 1") text-align: center anchors.left: parent.left + image-source: /images/game/imbuing/slot_inactive + image-clip: 0 0 66 66 + $hover !pressed: + image-clip: 0 0 66 66 + $pressed: + image-source: /images/game/imbuing/slot + image-clip: 0 0 66 66 Slot id: slot1 - !text: tr("Slot 2") - text-align: center - margin-left: 10 anchors.left: prev.right + margin-left: 10 + image-source: /images/game/imbuing/slot_inactive + image-clip: 0 0 66 66 + $hover !pressed: + image-clip: 0 0 66 66 + $pressed: + image-source: /images/game/imbuing/slot + image-clip: 0 0 66 66 Slot id: slot2 - !text: tr("Slot 3") text-align: center margin-left: 10 anchors.left: prev.right + image-source: /images/game/imbuing/slot_inactive + image-clip: 0 0 66 66 + $hover !pressed: + image-clip: 0 0 66 66 + $pressed: + image-source: /images/game/imbuing/slot + image-clip: 0 0 66 66 Label id: selectSlot From 876df5c860f7dddf0b44fa5c38aef1ee58df2dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Mon, 26 Jan 2026 01:38:26 -0300 Subject: [PATCH 7/9] finish --- .../game_imbui/classes/imbuementscroll.lua | 12 +-- modules/game_imbui/t_imbui.lua | 2 - modules/game_imbuing/imbuing.lua | 2 +- modules/game_imbuing/imbuing.otui | 3 + src/client/protocolgameparse.cpp | 87 +++++++++++++++++++ 5 files changed, 92 insertions(+), 14 deletions(-) diff --git a/modules/game_imbui/classes/imbuementscroll.lua b/modules/game_imbui/classes/imbuementscroll.lua index e828430c42..f2c6bf92de 100644 --- a/modules/game_imbui/classes/imbuementscroll.lua +++ b/modules/game_imbui/classes/imbuementscroll.lua @@ -12,12 +12,8 @@ ImbuementScroll.__index = ImbuementScroll local self = ImbuementScroll function ImbuementScroll.setup(availableImbuements, needItems) - print("DEBUG: ImbuementScroll.setup chamado") - print("DEBUG: availableImbuements count:", availableImbuements and #availableImbuements or 0) - self.availableImbuements = availableImbuements or {} self.needItems = needItems or {} - self.window = Imbuement.scrollImbue local itemWidget = self.window:recursiveGetChildById("itemScroll") @@ -59,9 +55,6 @@ function ImbuementScroll.selectBaseType(selectedButtonId) end end - print("DEBUG: selectBaseType chamado com baseImbuement =", baseImbuement) - print("DEBUG: total availableImbuements =", #self.availableImbuements) - local imbuementsList = self.window:recursiveGetChildById("imbuementsList") imbuementsList:destroyChildren() @@ -79,9 +72,7 @@ function ImbuementScroll.selectBaseType(selectedButtonId) elseif imbuement.group == 'Powerful' then imbuementType = 2 end end - - print("DEBUG: imbuement", id, "type =", imbuement.type, "group =", imbuement.group, "imbuementType =", imbuementType, "baseImbuement =", baseImbuement) - + if imbuementType == baseImbuement then matchedCount = matchedCount + 1 local widget = g_ui.createWidget("SlotImbuing", imbuementsList) @@ -100,7 +91,6 @@ function ImbuementScroll.selectBaseType(selectedButtonId) end end - print("DEBUG: matchedCount =", matchedCount) end function ImbuementScroll.selectImbuementWidget(widget, imbuement) diff --git a/modules/game_imbui/t_imbui.lua b/modules/game_imbui/t_imbui.lua index d862cf8bfd..0d47d85b4d 100644 --- a/modules/game_imbui/t_imbui.lua +++ b/modules/game_imbui/t_imbui.lua @@ -182,8 +182,6 @@ function Imbuement.close() self.window:hide() end --- testOpen removed (temporary debug button deleted) - function Imbuement:toggleMenu(menu) for key, value in pairs(self) do if type(value) ~= 'userdata' or key == 'window' then diff --git a/modules/game_imbuing/imbuing.lua b/modules/game_imbuing/imbuing.lua index f103e87b2b..51edfd1664 100644 --- a/modules/game_imbuing/imbuing.lua +++ b/modules/game_imbuing/imbuing.lua @@ -250,7 +250,7 @@ function resetSlots() end for i = 1, 3 do local slot = imbuingWindow.itemInfo.slots:getChildByIndex(i) - -- slot:setText('Slot ' .. i) + slot:setText('Slot ' .. i) slot:getChildById('icon'):setVisible(false) slot:setEnabled(false) slot:setTooltip( diff --git a/modules/game_imbuing/imbuing.otui b/modules/game_imbuing/imbuing.otui index 0015bef71c..2ebb620acc 100644 --- a/modules/game_imbuing/imbuing.otui +++ b/modules/game_imbuing/imbuing.otui @@ -70,6 +70,7 @@ ItemInformation < Panel Slot id: slot0 + !text: tr("Slot 1") text-align: center anchors.left: parent.left image-source: /images/game/imbuing/slot_inactive @@ -82,6 +83,7 @@ ItemInformation < Panel Slot id: slot1 + !text: tr("Slot 2") anchors.left: prev.right margin-left: 10 image-source: /images/game/imbuing/slot_inactive @@ -94,6 +96,7 @@ ItemInformation < Panel Slot id: slot2 + !text: tr("Slot 3") text-align: center margin-left: 10 anchors.left: prev.right diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 972baa827e..0e34f5ee6e 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -5743,6 +5743,93 @@ Imbuement ProtocolGame::getImbuementInfo(const InputMessagePtr& msg) void ProtocolGame::parseImbuementWindow(const InputMessagePtr& msg) { + if (g_game.getClientVersion() >= 1510) { + const uint8_t windowType = msg->getU8(); + + // 0 = CHOICE (select item or scroll) + if (windowType == 0) { + msg->getU8(); // unknown + msg->getU16(); // padding + msg->getU32(); // padding + g_lua.callGlobalField("g_game", "onOpenImbuementWindow"); + return; + } + + // 1 = SELECT_ITEM + if (windowType == 1) { + msg->getU8(); // unknown + + const uint16_t itemId = msg->getU16(); + const auto& item = Item::create(itemId); + if (!item || item->getId() == 0) { + throw Exception("ProtocolGame::parseImbuementWindow: unable to create item with invalid id {}", itemId); + } + + uint8_t tier = 0; + if (item->getClassification() > 0) { + tier = msg->getU8(); + } + + const uint8_t slots = msg->getU8(); + std::unordered_map> activeSlots; + for (auto i = 0; i < slots; i++) { + const uint8_t firstByte = msg->getU8(); + if (firstByte == 0x01) { + Imbuement imbuement = getImbuementInfo(msg); + const uint32_t duration = msg->getU32(); + const uint32_t removalCost = msg->getU32(); + activeSlots[i] = std::make_tuple(imbuement, duration, removalCost); + } + } + + const uint16_t imbuementsSize = msg->getU16(); + std::vector imbuements; + imbuements.reserve(imbuementsSize); + for (auto i = 0; i < imbuementsSize; ++i) { + imbuements.push_back(getImbuementInfo(msg)); + } + + const uint32_t neededItemsListCount = msg->getU32(); + std::vector neededItemsList; + neededItemsList.reserve(neededItemsListCount); + for (uint32_t i = 0; i < neededItemsListCount; ++i) { + const uint16_t needItemId = msg->getU16(); + const uint16_t count = msg->getU16(); + const auto& needItem = Item::create(needItemId); + needItem->setCount(count); + neededItemsList.push_back(needItem); + } + g_lua.callGlobalField("g_game", "onImbuementItem", itemId, tier, slots, activeSlots, imbuements, neededItemsList); + return; + } + + // 2 = SCROLL + if (windowType == 2) { + msg->getU8(); // unknown + msg->getU8(); // unknown + msg->getU8(); // unknown + + const uint16_t imbuementsSize = msg->getU16(); + std::vector imbuements; + imbuements.reserve(imbuementsSize); + for (auto i = 0; i < imbuementsSize; ++i) { + imbuements.push_back(getImbuementInfo(msg)); + } + + const uint32_t neededItemsListCount = msg->getU32(); + std::vector neededItemsList; + neededItemsList.reserve(neededItemsListCount); + for (uint32_t i = 0; i < neededItemsListCount; ++i) { + const uint16_t needItemId = msg->getU16(); + const uint16_t count = msg->getU16(); + const auto& needItem = Item::create(needItemId); + needItem->setCount(count); + neededItemsList.push_back(needItem); + } + g_lua.callGlobalField("g_game", "onImbuementScroll", imbuements, neededItemsList); + return; + } + } uint8_t windowType = Otc::IMBUEMENT_WINDOW_SELECT_ITEM; if (g_game.getClientVersion() >= 1510) { windowType = static_cast(msg->getU8()); // window type From 531d35c974110be10ca324c0aeca841a7111bbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Sat, 31 Jan 2026 02:52:00 -0300 Subject: [PATCH 8/9] Update 10-progressbars.otui --- data/styles/10-progressbars.otui | 4 ---- 1 file changed, 4 deletions(-) diff --git a/data/styles/10-progressbars.otui b/data/styles/10-progressbars.otui index 07b648e0b1..5ddc83a60a 100644 --- a/data/styles/10-progressbars.otui +++ b/data/styles/10-progressbars.otui @@ -39,10 +39,6 @@ ManaBar < ProgressBar image-border: 4 background-color: #4444ff -ProgressBarSD < UIProgressBarSD - height: 22 - tooltip-delayed: true - ProgressBarSD < UIProgressBar height: 22 tooltip-delayed: true From 381e8f699a2e13707f9234d5868834f87397f6fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Morais?= Date: Tue, 10 Feb 2026 23:53:40 -0300 Subject: [PATCH 9/9] fix suggested by coderabbitai --- data/styles/10-buttons.otui | 4 +-- modules/corelib/ui/uiprogressbarsd.lua | 4 +-- .../corelib/ui/uiprogressbarsdinverted.lua | 4 +-- modules/corelib/uiprogressbarsd.lua | 4 +-- modules/corelib/uiprogressbarsdinverted.lua | 4 +-- modules/game_imbui/classes/imbuementitem.lua | 2 +- .../game_imbui/classes/imbuementselection.lua | 2 +- modules/game_imbui/t_imbui.lua | 34 ++++++++----------- modules/game_imbuing/imbuing.lua | 6 +++- src/client/protocolgameparse.cpp | 5 +++ 10 files changed, 37 insertions(+), 32 deletions(-) diff --git a/data/styles/10-buttons.otui b/data/styles/10-buttons.otui index 462311669c..9734efaafa 100644 --- a/data/styles/10-buttons.otui +++ b/data/styles/10-buttons.otui @@ -1,5 +1,5 @@ Button < UIButton - font: cipsoftFont + font: verdana-11px-antialised color: #dfdfdfff size: 43 20 text-offset: 0 2 @@ -211,7 +211,7 @@ NextQtButton < UIButton image-clip: 48 16 16 16 QtButton < UIButton - font: cipsoftFont + font: verdana-11px-antialised size: 106 23 text-offset: 0 0 image-source: /images/ui/button diff --git a/modules/corelib/ui/uiprogressbarsd.lua b/modules/corelib/ui/uiprogressbarsd.lua index bae376a1a6..b4bbf8c1aa 100644 --- a/modules/corelib/ui/uiprogressbarsd.lua +++ b/modules/corelib/ui/uiprogressbarsd.lua @@ -5,8 +5,8 @@ function UIProgressBarSD.create() local progressbar = UIProgressBarSD.internalCreate() progressbar:setFocusable(false) progressbar:setOn(true) - progressbar.min = 0 - progressbar.max = 100 + progressbar.minimum = 0 + progressbar.maximum = 100 progressbar.value = 0 progressbar.bgBorderLeft = 0 progressbar.bgBorderRight = 0 diff --git a/modules/corelib/ui/uiprogressbarsdinverted.lua b/modules/corelib/ui/uiprogressbarsdinverted.lua index df78ad0c43..d095f90934 100644 --- a/modules/corelib/ui/uiprogressbarsdinverted.lua +++ b/modules/corelib/ui/uiprogressbarsdinverted.lua @@ -5,8 +5,8 @@ function UIProgressBarSDInverted.create() local progressbar = UIProgressBarSDInverted.internalCreate() progressbar:setFocusable(false) progressbar:setOn(true) - progressbar.min = 0 - progressbar.max = 100 + progressbar.minimum = 0 + progressbar.maximum = 100 progressbar.value = 0 progressbar.bgBorderLeft = 0 progressbar.bgBorderRight = 0 diff --git a/modules/corelib/uiprogressbarsd.lua b/modules/corelib/uiprogressbarsd.lua index ca894b624c..c582c48f66 100644 --- a/modules/corelib/uiprogressbarsd.lua +++ b/modules/corelib/uiprogressbarsd.lua @@ -5,8 +5,8 @@ function UIProgressBarSD.create() local progressbar = UIProgressBarSD.internalCreate() progressbar:setFocusable(false) progressbar:setOn(true) - progressbar.min = 0 - progressbar.max = 100 + progressbar.minimum = 0 + progressbar.maximum = 100 progressbar.value = 0 progressbar.bgBorderLeft = 0 progressbar.bgBorderRight = 0 diff --git a/modules/corelib/uiprogressbarsdinverted.lua b/modules/corelib/uiprogressbarsdinverted.lua index e501e8bc63..654f431b30 100644 --- a/modules/corelib/uiprogressbarsdinverted.lua +++ b/modules/corelib/uiprogressbarsdinverted.lua @@ -5,8 +5,8 @@ function UIProgressBarSDInverted.create() local progressbar = UIProgressBarSDInverted.internalCreate() progressbar:setFocusable(false) progressbar:setOn(true) - progressbar.min = 0 - progressbar.max = 100 + progressbar.minimum = 0 + progressbar.maximum = 100 progressbar.value = 0 progressbar.bgBorderLeft = 0 progressbar.bgBorderRight = 0 diff --git a/modules/game_imbui/classes/imbuementitem.lua b/modules/game_imbui/classes/imbuementitem.lua index f61ab217cd..22c6051931 100644 --- a/modules/game_imbui/classes/imbuementitem.lua +++ b/modules/game_imbui/classes/imbuementitem.lua @@ -22,7 +22,7 @@ function ImbuementItem.setup(itemId, tier, slots, activeSlots, availableImbuemen self.slots = slots self.activeSlots = {} - for i = 0, #activeSlots do + for i = 0, slots - 1 do self.activeSlots["slot"..i] = activeSlots[i] or {} end self.availableImbuements = availableImbuements or {} diff --git a/modules/game_imbui/classes/imbuementselection.lua b/modules/game_imbui/classes/imbuementselection.lua index cb985ba467..c7d9d980ec 100644 --- a/modules/game_imbui/classes/imbuementselection.lua +++ b/modules/game_imbui/classes/imbuementselection.lua @@ -74,7 +74,7 @@ function ImbuementSelection.onChooseItemMouseRelease(widget, mousePosition, mous local stackPos = item:getStackPos() if self.isSelectingScroll then - g_game.selectImbuementItem(itemId, pos, stackPos) + g_game.selectImbuementScroll() else g_game.selectImbuementItem(itemId, pos, stackPos) end diff --git a/modules/game_imbui/t_imbui.lua b/modules/game_imbui/t_imbui.lua index 0d47d85b4d..03e4996d63 100644 --- a/modules/game_imbui/t_imbui.lua +++ b/modules/game_imbui/t_imbui.lua @@ -184,27 +184,23 @@ end function Imbuement:toggleMenu(menu) for key, value in pairs(self) do - if type(value) ~= 'userdata' or key == 'window' then - goto continue - end - - if key == menu then - value:show() - -- Ajustar tamanho da janela baseado no menu - if menu == 'selectItemOrScroll' then - self.window:setHeight(388) - elseif menu == 'scrollImbue' then - self.window:setHeight(655) - elseif menu == 'selectImbue' then - self.window:setHeight(528) - elseif menu == 'clearImbue' then - self.window:setHeight(502) + if type(value) == 'userdata' and key ~= 'window' then + if key == menu then + value:show() + -- Ajustar tamanho da janela baseado no menu + if menu == 'selectItemOrScroll' then + self.window:setHeight(388) + elseif menu == 'scrollImbue' then + self.window:setHeight(655) + elseif menu == 'selectImbue' then + self.window:setHeight(528) + elseif menu == 'clearImbue' then + self.window:setHeight(502) + end + else + value:hide() end - else - value:hide() end - - ::continue:: end end diff --git a/modules/game_imbuing/imbuing.lua b/modules/game_imbuing/imbuing.lua index 51edfd1664..ca97e9570c 100644 --- a/modules/game_imbuing/imbuing.lua +++ b/modules/game_imbuing/imbuing.lua @@ -161,6 +161,10 @@ end function setProtection(value) protection = value if protection then + if not selectedImbue then + protection = false + return + end emptyImbue.cost:setText(comma_value(selectedImbue['cost'] + selectedImbue['protectionCost'])) emptyImbue.successRate:setText('100%') emptyImbue.successRate:setColor('green') @@ -188,8 +192,8 @@ function setProtection(value) else emptyImbue.cost:setColor('white') end + protectionBtn:setImageClip(torect('0 0 66 66')) end - protectionBtn:setImageClip(torect('0 0 66 66')) end -- Re-verificar o estado do botão de imbue quando a proteção mudar diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index b69bf8ca67..62ad8447f7 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -5760,6 +5760,11 @@ void ProtocolGame::parseImbuementWindow(const InputMessagePtr& msg) if (g_game.getClientVersion() >= 1510) { const uint8_t windowType = msg->getU8(); + if (windowType > 2) { + g_logger.warning(fmt::format("ProtocolGame::parseImbuementWindow: unexpected windowType {}", windowType)); + return; + } + // 0 = CHOICE (select item or scroll) if (windowType == 0) { msg->getU8(); // unknown