From cda39125f4ca930eb1b0c176f8d44581b2a92320 Mon Sep 17 00:00:00 2001 From: adtpdn Date: Wed, 25 Mar 2026 02:38:09 +0800 Subject: [PATCH] feat: update leaderboard GUI, and HUD for gauge --- .../enhanced_gridmap/meshlibrary/default.tres | 2 +- assets/graphics/gui/gauge/PowerLabel.png | Bin 0 -> 6656 bytes .../graphics/gui/gauge/PowerLabel.png.import | 40 +++ assets/graphics/gui/gauge/Segment0_empty.png | Bin 0 -> 3013 bytes .../gui/gauge/Segment0_empty.png.import | 40 +++ assets/graphics/gui/gauge/Segment0_filled.png | Bin 0 -> 3634 bytes .../gui/gauge/Segment0_filled.png.import | 40 +++ assets/graphics/gui/gauge/Segment1_empty.png | Bin 0 -> 3005 bytes .../gui/gauge/Segment1_empty.png.import | 40 +++ assets/graphics/gui/gauge/Segment1_filled.png | Bin 0 -> 3753 bytes .../gui/gauge/Segment1_filled.png.import | 40 +++ assets/graphics/gui/gauge/Segment2_empty.png | Bin 0 -> 3965 bytes .../gui/gauge/Segment2_empty.png.import | 40 +++ assets/graphics/gui/gauge/Segment2_filled.png | Bin 0 -> 4584 bytes .../gui/gauge/Segment2_filled.png.import | 40 +++ scenes/main.gd | 13 + scenes/main.tscn | 235 ++++++++++++++---- scripts/managers/ui_manager.gd | 233 +++++++++++++++-- 18 files changed, 699 insertions(+), 64 deletions(-) create mode 100644 assets/graphics/gui/gauge/PowerLabel.png create mode 100644 assets/graphics/gui/gauge/PowerLabel.png.import create mode 100644 assets/graphics/gui/gauge/Segment0_empty.png create mode 100644 assets/graphics/gui/gauge/Segment0_empty.png.import create mode 100644 assets/graphics/gui/gauge/Segment0_filled.png create mode 100644 assets/graphics/gui/gauge/Segment0_filled.png.import create mode 100644 assets/graphics/gui/gauge/Segment1_empty.png create mode 100644 assets/graphics/gui/gauge/Segment1_empty.png.import create mode 100644 assets/graphics/gui/gauge/Segment1_filled.png create mode 100644 assets/graphics/gui/gauge/Segment1_filled.png.import create mode 100644 assets/graphics/gui/gauge/Segment2_empty.png create mode 100644 assets/graphics/gui/gauge/Segment2_empty.png.import create mode 100644 assets/graphics/gui/gauge/Segment2_filled.png create mode 100644 assets/graphics/gui/gauge/Segment2_filled.png.import diff --git a/addons/enhanced_gridmap/meshlibrary/default.tres b/addons/enhanced_gridmap/meshlibrary/default.tres index 1e0a22d..b97e6cf 100644 --- a/addons/enhanced_gridmap/meshlibrary/default.tres +++ b/addons/enhanced_gridmap/meshlibrary/default.tres @@ -14,7 +14,7 @@ [ext_resource type="Texture2D" uid="uid://dpkx1a780pvwv" path="res://assets/textures/tile_diamond.png" id="10_sx8rm"] [ext_resource type="BoxMesh" uid="uid://fy4bhoeii40c" path="res://addons/enhanced_gridmap/meshlibrary/tile_safe_zone.tres" id="10_uwjsj"] [ext_resource type="BoxMesh" uid="uid://b5cc3prem52r6" path="res://addons/enhanced_gridmap/meshlibrary/tile_freeze.tres" id="11_pgnbl"] -[ext_resource type="BoxMesh" uid="uid://dcjdwbffgtutt" path="res://addons/enhanced_gridmap/meshlibrary/tile_non_walkable.tres" id="11_uwjsj"] +[ext_resource type="BoxMesh" path="res://addons/enhanced_gridmap/meshlibrary/tile_non_walkable.tres" id="11_uwjsj"] [sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5d0gc"] load_path = "res://.godot/imported/tile_heart.png-deeef50755ca225f028608dfd16900e6.s3tc.ctex" diff --git a/assets/graphics/gui/gauge/PowerLabel.png b/assets/graphics/gui/gauge/PowerLabel.png new file mode 100644 index 0000000000000000000000000000000000000000..f2519fa817eb022099cfa83af0fc446dfc8677c1 GIT binary patch literal 6656 zcmV+b8vo^qP)0004jX+uL$b5ch_ zAW20-HZeIiHZ3wPF#rH4k#&*JD@0Kg$3HVe#E7t%g~g;{WyGk7jm1n1g~iM$zcw>( zeyREKdT%7zD%&YaZ2VgA7qC^svY;QH7Am~0=7osQAO2? z!V|(%t3}o1ZQ)KO6H5r63ioMpLE&3dk6Zj~a@yiAleK6#2=+E%ce;w>Rjg#RoUptc zPcFNnl<#A{#F@;`Mr7@l*@aG+5CPmwGDZ+TgN%sx*|@>$iL0jPg6jJF+)4su)7Dn65qP?17##<<*_=9SpWb432;bRa{vG?BLDy{BLR4&KXw2B7$r$WK~#90 z<(zrAT~&SeKWk5C?=##v_ueEoa|kgZAYm$^G!g;=MkW!YAc7PHihZ&6@#XP#szt3* z@l_#8kz!w!4%YG%S_T;eDa3#g3<;0~LPC-|<_>4N=j>^{f9!jPeb0C^ShU~gInUX9 zuW|qOTEF$1))M?T!SkgKv;b{@XplVxxCh&os)z#zTecBAUq+`c-SkA6EIkKa_dS5*be zG_fp`mX;U-LDVvt%;yk7L046BwvCjMsAUp~7}&Oh5J8tx=?qcJL4k=}WG9YD;R=6%N1E45{yupk6#kORzY@v)I#8f(= zv|`_ahXm_SxW9#`<^5I^<&b#h{7Wyp^6K-}U-)^Y&O9!E;llNFA~aW~bYH8u?-%m= zb?XA~tJGW3x8ilU!D`L>zJE}})Pd99b=v7)xcb`b*BnIoBC?qbnM}H2KGU*Lm4j#R z(OB%D%R)e4*L6`81tCPuHDIRGyc;-w$g z9LJeq^S^tjs!GJPux%gDm-O^>ao64VA`}%VCFyjwIGSfNGM584clY#O^Nnxbp*2g$ z;o(7^edZ}1dhmWysamq{+ZUeakxFIAy9&N9@CV13H@BCT)&xj+b^9*HCsIIj#1sVb z;;q2h7hZHJ(P(qi=ILKN#t;Ag`{X7ktEQ`Z1Vu9&*5i9Nl<~ot!1p|)f6$sJQi9_N zJU^Jk`Mkr+TeoudS!d{?bgrJzkhG>nVFbH_tEbrK5Jpa z@`nRXKFjXkK2HDkO?C50-y=D+r!FxSRmJn1aG6vvt)-N>PKlWH7~fpr7T{cfHD|1& zyQjBq=O!n!eC@A47b0ZG!qqH(_Z7c0LhgO#zu5dA->o2|uE9snx48GKZK3BA!*ABD z&-Z=Wdlwb&g-~coB!GYgXj*A@)f$;PupT%YAQCaT7yGu z5NLVja%nYU3g8srDxd@4*moY!>^XDmHu{Sv9_9I8JzKo*TfLr^o~3om91aY<@gn&`p6P;&z2|I{o5xho@*+sJWA)5>tbAZriq~kBgXUK%Xg-E_?Nj*{`srk z%iQJfYTTgoF|2r*k)&iS@ufui)p=$?6gsiIu47gmSGTQSKJ^5i7kqK6t(Ry=ecpPo z*#Fvd^lyKjY;w3Ft*2Arstclg>gpIhonZmxpC6v&o}XoL$_8bktB(c8p3zjhLQ!yX znUEo5<%+=Lq6mTKl}2qjF{1?Tg?Z(bHJaj^Ha=6lj&;ndlk?!L#k*SkG<-1F!!&SYWEij9u*t7p*h-47J6+<9L%^la9GRV;kxx(0o$ z0U=7$96@hy4-oK7$1RQg0x@R+D+vMuiipMP6KJx`8l-BKJZoBy>Zb00Z6p0VHj$mE zTwoT@Q@QGbDA!zM(brqwII?x8%jdtH;=p)`Pexm2vGn8*H0WP-NGX|2juuCzP!y8M zGE-ui*}Xu_4&W#PHF73R6|XYMakf1D^H6HUin92)6VZ$?q5I$1&dA=~0N9y9>~ue_ zU1{sIOu+}wGP&+UQQmz*qmKp2wB$>7q}aMM%qM%7orGqX4DES?!8c!TSkIzkR}*jR zn4+H~5^X7tOwV;t)qrfi?_)%Cm{O`VAVM%QyBfAKLpb?7ndCSvo!uoTnD3FEVh?s^ zknHGdRm+}ytj>*>2Qp)|1*RG{{9}fHeY6UnT=qvu>64ilZ>pZ;ff3?u9l?zh7}0oX zWD2Ed+)!1OTrOWMrxEbUUIL;XR`|Xbj06dhSRCJV7=G(ba+x%~n`3fpXGNLLHieI0 z8s(}BES4>7&Jo~waR1{uzJ7NGzf20UTDs|7b}G3{iUa%i7C&Mm9N4!9Aq4F`v+*69 z!8f)R)1>sV?UFsS+&85WjLHsXJjI(sKAU0BE5F4sEnLUO_X5L!o1Z|+l951F;r(k& zZoVqUA04L?F`9Qzjg0$z=SLYvC&KdNWO9h#{O1PD);_ez%qHH*-rYuun}$)JPq}V6Z>sgFx&wQGfMaTMa0`Wss28IvL&l52Omz-^J{~hi8pX=ka zw^V)*&rXva-Ol)1Pm>;c5jS^$w(efqx_fEqoK>^W0+3$mJ%u95_@p3TMuWo^1QdzJ zm^FVf3sxLQyuH4B3ZO+=L-#-UX_hlSdVtT|mSWdluSTibP*qqkN9A+Z$NBj^9bEAN z3o}xkKyE%sdUz{_;WBsG3g#_eMQc}2)w~i3Wu92+OEQ^Y`F33w!zgjb!x~W~02D#A zwZ8QlK-FUy(Gu@*T<9P6`P+NbtiAdGU-^ETy#rooL1_ktE;wPO&JX^&l?OJobHQ4Z zs9Bw;13O+Q&d1KV^U(B4wk8mvQ7ffn$&$qYQ}IWoyoZmN1-qa0!LJrTQi*8Wf{JIJ z2fOxqeD+%@&boG#yZ$-L$e3R|ruJ zhLjRTRiVaIFJCBi!{C)y0zy@dj49INAB+6&M&lb`ibGummGc*JC|i>&n{d$ zUr}C8TS^?;X8H0UZdVA%I_}(5kv6d^Gx!#PdzNjh;4h{i<2Ba#rE$s&l*UmFq=9z37Qj!`S0W{*Xjzdb1eDW>w>3t!Q#P#6r zpJqvBeD3~oThm%m0Wa@x`Oc3r{Ospp4as%YnuIKN(RV2rX{0ZUfm^w}jcG>6WCOA9 zu!mvSf)#JUwet-}tq>|^>q3lJFWJ#oaq}gey}dWhhbU>AfGPznxynuzC3VWM+}2pKCDh2QK-7kthoz`cXZ(9ZASL*COtOV zu$-M42oX{U`1Ca~uJ}NG^IHL)2M_%+&xZRl{O8lvKcLyVuxhN6qNsGt=_Aq6h4dVx z%rd_JwW)q6OiTp*(lixC9D!+G6++NCr;kKuCm_%x5xVCsB9}?ymI=Glkx%a@m)sM2 zcEMVc8!vAzVC>}`F8BOvmLEMZ$?#~UY^CZ^jM!`g5W3)B%MrXmy!!^AHLi!%7KilPD4i79;-I~}&LzhjBU7ym3yYoh-29#8rF zPJ|gtu6yj3=g8HD!OSQU5Di8 z2(D9oROTk$#Lk9g)Eh33a{k)dHiCf>pAGkAxcA>C+0$RCh8odU+UKl5w|YpAH|Es< z>Cq7c5Nqwg_Z_myupM;HoWNKTY*wfp(GfyH2dxFmik96~C%o@_9N7O>k>}JxH9ooi zy(XW&CRPk6D2M04PamD+_IopI-sXh-;srz!eMH-rU^{|*zBxidFxrv_hDnZ&fb{X) z@{mHG#8ecV5a4>v#b+`+G*GwEuC7vCqwpKVr`I8*of)h!6t7&W@r4`XRZVhRw!3`& z2WcL9Iv?`&6i{w%lR6NZN1$Tp}Ts zRStoom1J8fVSGGLd4r8vrH(Yz$6wy^Qr+}-o%YAY>wK~wP1ms!Ep|p+>-Ouk_pB*0WH*;&a(rLW&r=Ul z`s60U3(m5I8eh3NL2E*gOiO$6=X!Pcsz6aoGfgN8eSLwj@5`{zt^k9;Fg2v;m$$sg&|tlVNb<2i{dn;%Gw?FG zOym7NUVZ}4DfxxE+7-TXbAlC1bvC}_aLs4O`N(I++4g$nGOZd3q8-ac#wU8bg#m?vOd>_}zGg)VklJAz(QO|YorUr|qs`y@bn(qeo0aZD$<2ZGv zx|Hy~bJx?|-5oUSWRd9|4PR!uL+z$3VyrpY;MVV@c>gCxEBxOOSm&+wr6hWe$B6Y} zPi9Gtj*yucBRzHi&uxCckLNn1#}1GlJ3z9I*|5R{r>I5UToyO0PNf0kzyQHH7*+A) z6OY#Hl#~)PV)5l$Z!LAe%c9tWHOl}YEeBx55{<9@U7BzFAX7!$5tuFWN%WpTBt9pU z;``o|7jfp|kMw<Eo^?_rklNv$k!OCjKuBfy)rDtvy^bL@JfGGL&9 zv56#So_QAExb3#$GvN%Q*tOZibko-*|7(of?#YmyrV8p-7m3~zFk2Vatm{Z4w8Kq+ zT{en6zj8Gn0)9*FgFX1i`~IP3W0R9P28TxZ@Sj}4x^-uj+I2=yCf`6+B!(45HzGy# ztDYUP0IPioiSAXH@s3d0W}zr5x@n?EOvDUNV^9sJhX^`s;VfOHY52}C<=PSL{&9ZO|J+ZYgE>-EHuqPGmNPSztV>+56&nZ z5D-42Ljg_$s=pzyXZJ47K4*Q^G}rTRJ(sq&1Q%U&F|%jS;gLrkE~ZO2gP+|GZWigg z2z)dnhGBJ~>QNL$BNFSzZ0W;H^r7k&ijXKm27Jr+06(xe$wJIT?O(7HLIe>RFm+T! za|@KBsHmDYbx?qh=j4ipY9Rz4yXHz3FIpIcXyuQEvU}?W|b2s%D;eEXvZQ^Jr~pLD$q7 zi#NYdsK(DHfid8CrtQ9%4%cyb$Jp0D6ztDd)u}BXe|Utg z^)@CgW%bY?|0SeA*Z2%=Go?pf^^xK-<8cD5XT#wW)KBf~X5k(@+$F>v?FZitBp8E?iYX*VN!# zBPq$-4u-Dd%V1AW;nXif*NZL*RaI~u7j3GXrmFaUAhPB24j?fMqi(owEAUz1Q#2`& z%$v7>3qN=n=bm?dGueT#Q>yUal8BMXPNM4?5hFrwO853Wk3=F)I-SAyC6;O6I4+Ls zVdz>>p42rB+i{3mCh1HTO;s_?2)SGy*Yi+S6+_o>To>DRiic~NkqEiGjb%lcoD2*t z1>UHt!SQH?eicsqa$OfyQ7|I)i3!1|{9E9|O;ZP0v2qn_&wL+etUVhmTFZi6AJdO8 z3#A1aipGs{UtN&3eDhZ6=&}OJ>nvT%vO1=3{*s~k!^fQk?MW${IwWcd@EzcsCh1T_ zcXtoRz4HW4d(RqH9&;>-CN1#4uV{7!SW0lN(T5JDu>}hkvFh04Ip&z-n73ddiFg9j zvOvl}g)5UuRaM3H+^JA!BM3z~2s4|as908W@kxh@nJlMsfg6CEsiAKEA;O46Fe9}$ z*a{&~RJAEr&2%Jy>w&#AvNZe;{LS>pD;szjcxkGFcW{_bhy8uV!4Sd)UI#V-TL^qd z^Ed+A1%KagD5EMxK+NZXUje%aw5K^7p{;{&cN|WAt_4^~AWHQSY`K2N)ctIxES7)B zIFib7C&BdZA=v0@QJ)nQ( zeyREKdT%7zD%&YaZ2VgA7qC^svY;QH7Am~0=7osQAO2? z!V|(%t3}o1ZQ)KO6H5r63ioMpLE&3dk6Zj~a@yiAleK6#2=+E%ce;w>Rjg#RoUptc zPcFNnl<#A{#F@;`Mr7@l*@aG+5CPmwGDZ+TgN%sx*|@>$iL0jPg6jJF+)4su)7Dn65qP?17##<<*_=9SpWb432;bRa{vG?BLDy{BLR4&KXw2B3F=8iK~#90 z?VHPv+{P7#zf)Dbbobn3X(U6o1V#4Bb~XXB3zBC@HiiRa6(FyXS1^#r@Fwdlva}Pg zj95{E*aj>MvK)D2NpoYf$*Pk@vDqYhWM^8)WYm~{(`1uXEdH!Ib*}iJ2^YWzwLWMf zKBxlwfOf9WfWsH)zW~Y?Xnz3IFVOzUDepJHF9GI+T%dvZe-Gfi;ewC>+}95u;hdwc zYl@;IO%seUgy1p8lIJN!QDUv3n3h;;Nt~swJfm@rh)`8Es4}Z+L?F*Hre%q-1|tSz z3`t@s%L;1^L6s~^nNDNBM~4MzmQc+q@;oO^9n)flqEvN_wT3iFP*qfw>2yYx#c|fP zXEe%Cg{rQptC}QnhzLbdvbi~-n3iY=RJCVobIjpUfwdM50TE$59x?t=$kw}Md>svv7a27nKS+6$`i?cNjq`j?N% z^OW%@$C^k*Z-(sc?NQYsie#Xi)sM>Kqx-7iRBE({7!g@n#}N@bAHymzA}88sD#-*h zz6pq`QWR6X4?Q{ABjo1I8;FRissN~}_ufy@P^~(+^91AMvPmmaEt#mtk}U%!s`0Yw?*889GZvM~YL`6FW7=9vxl3?RmiXg;v2 z^7!$0hzLf6>2wAR2$>es?w+iwq2zm2p_dG*tt=D~CX)%ON(hSg@lubFpaBulMH`a~ zvbsWW-XJ!kBdjl9zJxK+7RXLoGR`{Y0u?|t%oM^I4flTz4YOyU9^#Vu@S~4Wg%FhB z<7@VI8C^EbUc_s4{valSRvpk^{QPHPt!WKT7|f94;{p-<{9HB6&Th14fT%twL>Y4D z&Ru*nGwM3Nc8`$DuUvx88Z$P%A}^pIoi~Ws(R`CoRmrln6{^-nQQ6l+zPgVtOcz!4 zg|3qxBF1*q3a(z=B`%qT`QO(=#$)IxE@w5)v%^9$6A^CTz7>5eK%PYvwok}p+}(Bo zR9M|6Id9O83{h46;DbL#uN{pWlmQ{eS{fDsR4|Dy&R=?nn3T>6c;}tB2q83n+89Ra z6CwsxT18AlwZBd?B}(+-SZf%Ka$rEn{rmUnsp?|fI;rkTsJgb= z)t(EWN63vEH+rf&8vHsfnSr&d55M^a=Pbq;+)3N6b+)gridi2!1`y*$-5H;ySrd|g zaT83+PWd;e>%UGG`DYX{Y;qj+-V%9S==oTdpOggznP?(OxOH!@^> zX2`%!Jw7^)PG*Izt>{kd5wg3xOUHpCtdX}2098-NC7S11YwbRLdVn!zsJaVXAu349 z+L`|gY;SM1X8$~vyu4(z=Qa%M#t(1Y4g^WmdvAnKSEjfLxhu~=r1coY}TFepWeCKo*5I9-g<;=Y;GXv ztkZ+APC_*rckxh!OFKJlJSK#&ykugsUTe^)u1Oli0->h!fzvc;{UDRcXxWw-k4Mm( z5$ai^U8ehLsw#Vrzas=~B6o_00U>2sLXUv;5vUDX5g;P^<{P&$rk{n_BP7p9y~ZLY zKZ{YG8B{%uIU*wL>})j`7RkIlLY_T)7OytVV=Q!i^bm~6XeNQG%7X_F8wYb#%#fwH zjOm6l=TdonmW^sXH~)uO)kjCizzO*wos2vg*flRdw7*H*yLZ3ccJus%xQy*b?ojo| zXEDw*gGe%;@ghQ+r7=@m;tW}G5LID6<0*p*SuEWg-JY_P*WgC*7H3Yprt3`n#s??p|rvLz+gj%|KivB6AnwqCwB{ zT?537N@=%U=UkgoB?uw-m~=O%V1IwV*Iv~ZXFB4uL7U5eczA>{232^p7n686L>saAsbo`Zvf6R*u{WFGB3=JKT--uv}??Y3Ljp1SrIrS3zlrPB2x za78htt^-Nx@U;gaR$v<;X#&7B1;;@HiF0jzuJ;}zCRR}pe>DWsG;M`*RaKZK%5KCo zS$|RQNfJj@#|=e9n&-zPIPc@L%GoTYJXzbS*`Wy?7%`279;+?0G@+Q5(JiRadatTj z86Kal@jbn#u4=M8V^+>E*2Y>xRovh1e1`WvmX%jEB0}OEwfBS&7>`D6CAPH|Yb{k( zQB2FGBt8&AEM3l5kW(soXyynj5$7@HiHgm zQ1U!&6XTLJA^1R5*90F38nDLToMT#+q-jc;I8;82lccK$?Z)E?#;nfu#>VQkkH(nimb(8?JC`J#MSTI_V#zGwf{+0&2pQmlkO2hv zeRG@uy+YqpK#An$#M0MQ1hqC}7_+(`SDGN!mQ1aIP}00000NkvXX Hu0mjf?K{y6 literal 0 HcmV?d00001 diff --git a/assets/graphics/gui/gauge/Segment0_empty.png.import b/assets/graphics/gui/gauge/Segment0_empty.png.import new file mode 100644 index 0000000..0b4f879 --- /dev/null +++ b/assets/graphics/gui/gauge/Segment0_empty.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcoaeof23pt3c" +path="res://.godot/imported/Segment0_empty.png-b7c030026c468d14e0ee5f5a6e914f12.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/gui/gauge/Segment0_empty.png" +dest_files=["res://.godot/imported/Segment0_empty.png-b7c030026c468d14e0ee5f5a6e914f12.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/graphics/gui/gauge/Segment0_filled.png b/assets/graphics/gui/gauge/Segment0_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf4055a754b4b9b2e6d69dbca688f1d8476ffa4 GIT binary patch literal 3634 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 Ef>G}InE(I) literal 0 HcmV?d00001 diff --git a/assets/graphics/gui/gauge/Segment0_filled.png.import b/assets/graphics/gui/gauge/Segment0_filled.png.import new file mode 100644 index 0000000..32ecc4e --- /dev/null +++ b/assets/graphics/gui/gauge/Segment0_filled.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxe5hwhfel0kn" +path="res://.godot/imported/Segment0_filled.png-61b15ebc4e2e332c9338e13d48b3b894.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/gui/gauge/Segment0_filled.png" +dest_files=["res://.godot/imported/Segment0_filled.png-61b15ebc4e2e332c9338e13d48b3b894.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/graphics/gui/gauge/Segment1_empty.png b/assets/graphics/gui/gauge/Segment1_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..2e07131dd8b43d2733651f761c983e65c8e1bf04 GIT binary patch literal 3005 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 literal 0 HcmV?d00001 diff --git a/assets/graphics/gui/gauge/Segment1_empty.png.import b/assets/graphics/gui/gauge/Segment1_empty.png.import new file mode 100644 index 0000000..61babed --- /dev/null +++ b/assets/graphics/gui/gauge/Segment1_empty.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctgxeo2i3vcfq" +path="res://.godot/imported/Segment1_empty.png-f2e3b66b72717376abc6fc2f9f21a148.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/gui/gauge/Segment1_empty.png" +dest_files=["res://.godot/imported/Segment1_empty.png-f2e3b66b72717376abc6fc2f9f21a148.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/graphics/gui/gauge/Segment1_filled.png b/assets/graphics/gui/gauge/Segment1_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c85256f0715f5ee0887999e4c7b781f847680d GIT binary patch literal 3753 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 TC%1b<00000NkvXXu0mjfwBHFd literal 0 HcmV?d00001 diff --git a/assets/graphics/gui/gauge/Segment1_filled.png.import b/assets/graphics/gui/gauge/Segment1_filled.png.import new file mode 100644 index 0000000..1e6895b --- /dev/null +++ b/assets/graphics/gui/gauge/Segment1_filled.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d138cwvw3146l" +path="res://.godot/imported/Segment1_filled.png-3afd269de98a90c438d901eb3cfd6858.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/gui/gauge/Segment1_filled.png" +dest_files=["res://.godot/imported/Segment1_filled.png-3afd269de98a90c438d901eb3cfd6858.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/graphics/gui/gauge/Segment2_empty.png b/assets/graphics/gui/gauge/Segment2_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..0c020f2df1e46bdfc61933b2ed6c85941d1e165e GIT binary patch literal 3965 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 S9fke?0000 0: + ui_manager.update_live_leaderboard(all_players) + if multiplayer.is_server() and GameStateManager.is_game_started(): if TurnManager.turn_based_mode: rpc("sync_turn_index", TurnManager.current_turn_index) @@ -2268,6 +2274,12 @@ func request_leaderboard_sync(): @rpc("authority", "call_local", "reliable") func sync_leaderboard_data(player_data: Array): """Receive leaderboard data from server and update UI.""" + # Update local player node scores first so live UI tick stays synced + for data in player_data: + var p_node = get_node_or_null(str(data.peer_id)) + if p_node: + p_node.score = data.score + var leaderboard_panel = get_node_or_null("LeaderboardPanel") if not leaderboard_panel: return @@ -2309,6 +2321,7 @@ func _update_leaderboard_display(): for p in all_players: var peer_id = p.name.to_int() var score = goals_cycle_manager.get_player_score(peer_id) if goals_cycle_manager else 0 + p.score = score # Assign locally so ui_manager.gd reads correct score player_data.append({"peer_id": peer_id, "name": p.display_name if not p.display_name.is_empty() else str(p.name), "score": score}) # Sort by score descending (with Stop n Go winner priority) diff --git a/scenes/main.tscn b/scenes/main.tscn index 185ef88..b554210 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -14,6 +14,10 @@ [ext_resource type="Texture2D" uid="uid://68x88jj25yxg" path="res://assets/textures/Adjacent.png" id="9_6gcb6"] [ext_resource type="Texture2D" uid="uid://dasaeaytvhll0" path="res://assets/models/pboard/AdjacentRect.tres" id="9_aspsw"] [ext_resource type="FontFile" uid="uid://xnjx058n4tsw" path="res://assets/fonts/Nougat-ExtraBlack.ttf" id="13_j8jky"] +[ext_resource type="Texture2D" uid="uid://73ayhl1lqdpt" path="res://assets/graphics/gui/gauge/PowerLabel.png" id="14_vxglm"] +[ext_resource type="Texture2D" uid="uid://dcoaeof23pt3c" path="res://assets/graphics/gui/gauge/Segment0_empty.png" id="15_2f3dj"] +[ext_resource type="Texture2D" uid="uid://ctgxeo2i3vcfq" path="res://assets/graphics/gui/gauge/Segment1_empty.png" id="16_yq6so"] +[ext_resource type="Texture2D" uid="uid://djbin5556lwsx" path="res://assets/graphics/gui/gauge/Segment2_empty.png" id="17_fv21b"] [ext_resource type="Theme" uid="uid://0dhxl4ohyxh8" path="res://assets/graphics/game_setting/setting_theme.tres" id="18_pm3ni"] [ext_resource type="Texture2D" uid="uid://ba80xnybpixw2" path="res://assets/graphics/touch_control/take_tile.png" id="25_qkpxi"] [ext_resource type="Texture2D" uid="uid://bsgqrjx2ity4c" path="res://assets/graphics/touch_control/speed.png" id="26_2f3dj"] @@ -47,6 +51,20 @@ corner_radius_top_right = 8 corner_radius_bottom_right = 8 corner_radius_bottom_left = 8 +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_tel4y"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_qkpxi"] +texture = ExtResource("14_vxglm") + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_5q0nq"] +texture = ExtResource("15_2f3dj") + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_dgi5k"] +texture = ExtResource("16_yq6so") + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_j8jky"] +texture = ExtResource("17_fv21b") + [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1cewu"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kmb1v"] @@ -1079,37 +1097,38 @@ layout_mode = 2 anchors_preset = 4 anchor_top = 0.5 anchor_bottom = 0.5 -offset_left = 40.0 -offset_top = -1.7106018 -offset_right = 224.0 -offset_bottom = 31.28952 +offset_left = 84.0 +offset_top = -7.0 +offset_right = 229.0 +offset_bottom = 29.0 grow_vertical = 2 rotation = -0.10297442 +theme_override_styles/panel = SubResource("StyleBoxTexture_tel4y") [node name="HBox" type="HBoxContainer" parent="PowerUpBar" unique_id=334600330] layout_mode = 2 -theme_override_constants/separation = 4 +theme_override_constants/separation = 0 +alignment = 1 -[node name="PowerLabel" type="Label" parent="PowerUpBar/HBox" unique_id=1945535407] +[node name="PowerLabel" type="Panel" parent="PowerUpBar/HBox" unique_id=1662719884] +custom_minimum_size = Vector2(39, 36) layout_mode = 2 -theme_override_font_sizes/font_size = 18 -text = "⚡" +theme_override_styles/panel = SubResource("StyleBoxTexture_qkpxi") [node name="Segment0" type="Panel" parent="PowerUpBar/HBox" unique_id=500774723] -custom_minimum_size = Vector2(36, 20) +custom_minimum_size = Vector2(33, 36) layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxTexture_5q0nq") [node name="Segment1" type="Panel" parent="PowerUpBar/HBox" unique_id=1042222722] -custom_minimum_size = Vector2(36, 20) +custom_minimum_size = Vector2(33, 36) layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxTexture_dgi5k") [node name="Segment2" type="Panel" parent="PowerUpBar/HBox" unique_id=272336972] -custom_minimum_size = Vector2(36, 20) -layout_mode = 2 - -[node name="Segment3" type="Panel" parent="PowerUpBar/HBox" unique_id=293120308] -custom_minimum_size = Vector2(36, 20) +custom_minimum_size = Vector2(40, 36) layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxTexture_j8jky") [node name="GoalsTimer" type="PanelContainer" parent="." unique_id=2106663301] offset_left = 235.8717 @@ -1229,17 +1248,26 @@ horizontal_alignment = 1 [node name="Separator" type="HSeparator" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=1615297005] layout_mode = 2 -[node name="Entry1" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=1372346601] +[node name="Entry1" type="PanelContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=1372346601] layout_mode = 2 -[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry1" unique_id=828754165] +[node name="HBox" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry1" unique_id=617135879] +layout_mode = 2 + +[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox" unique_id=828754165] custom_minimum_size = Vector2(50, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") theme_override_font_sizes/font_size = 22 text = "1st" -[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry1" unique_id=777741978] +[node name="PortraitRect" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox" unique_id=1512406425] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox" unique_id=777741978] custom_minimum_size = Vector2(100, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1247,7 +1275,14 @@ theme_override_font_sizes/font_size = 22 text = "Player 1" clip_text = true -[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry1" unique_id=163441394] +[node name="GhostIcon" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox" unique_id=143108099] +modulate = Color(1, 1, 1, 0) +custom_minimum_size = Vector2(16, 16) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox" unique_id=163441394] layout_mode = 2 size_flags_horizontal = 3 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1255,17 +1290,43 @@ theme_override_font_sizes/font_size = 22 text = "0" horizontal_alignment = 2 -[node name="Entry2" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=1213770719] +[node name="MiniPowerUpBar" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox" unique_id=1277323584] +layout_mode = 2 +theme_override_constants/separation = 2 +alignment = 1 + +[node name="Segment0" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox/MiniPowerUpBar" unique_id=797392101] +custom_minimum_size = Vector2(12, 12) layout_mode = 2 -[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry2" unique_id=276085006] +[node name="Segment1" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox/MiniPowerUpBar" unique_id=789099266] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Segment2" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry1/HBox/MiniPowerUpBar" unique_id=1018238656] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Entry2" type="PanelContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=1213770719] +layout_mode = 2 + +[node name="HBox" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry2" unique_id=649896203] +layout_mode = 2 + +[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox" unique_id=276085006] custom_minimum_size = Vector2(50, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") theme_override_font_sizes/font_size = 22 text = "2nd" -[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry2" unique_id=980063105] +[node name="PortraitRect" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox" unique_id=1005069505] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox" unique_id=980063105] custom_minimum_size = Vector2(100, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1273,7 +1334,14 @@ theme_override_font_sizes/font_size = 22 text = "Player 2" clip_text = true -[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry2" unique_id=630589738] +[node name="GhostIcon" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox" unique_id=1898054695] +modulate = Color(1, 1, 1, 0) +custom_minimum_size = Vector2(16, 16) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox" unique_id=630589738] layout_mode = 2 size_flags_horizontal = 3 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1281,17 +1349,43 @@ theme_override_font_sizes/font_size = 22 text = "0" horizontal_alignment = 2 -[node name="Entry3" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=988674004] +[node name="MiniPowerUpBar" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox" unique_id=719453508] +layout_mode = 2 +theme_override_constants/separation = 2 +alignment = 1 + +[node name="Segment0" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox/MiniPowerUpBar" unique_id=1487042283] +custom_minimum_size = Vector2(12, 12) layout_mode = 2 -[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry3" unique_id=940102589] +[node name="Segment1" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox/MiniPowerUpBar" unique_id=1303981736] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Segment2" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry2/HBox/MiniPowerUpBar" unique_id=564492200] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Entry3" type="PanelContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=988674004] +layout_mode = 2 + +[node name="HBox" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry3" unique_id=2098193159] +layout_mode = 2 + +[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox" unique_id=940102589] custom_minimum_size = Vector2(50, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") theme_override_font_sizes/font_size = 22 text = "3rd" -[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry3" unique_id=872999463] +[node name="PortraitRect" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox" unique_id=77999167] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox" unique_id=872999463] custom_minimum_size = Vector2(100, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1299,7 +1393,14 @@ theme_override_font_sizes/font_size = 22 text = "Player 3" clip_text = true -[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry3" unique_id=508325054] +[node name="GhostIcon" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox" unique_id=1209672815] +modulate = Color(1, 1, 1, 0) +custom_minimum_size = Vector2(16, 16) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox" unique_id=508325054] layout_mode = 2 size_flags_horizontal = 3 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1307,17 +1408,43 @@ theme_override_font_sizes/font_size = 22 text = "0" horizontal_alignment = 2 -[node name="Entry4" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=394023021] +[node name="MiniPowerUpBar" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox" unique_id=1235595014] +layout_mode = 2 +theme_override_constants/separation = 2 +alignment = 1 + +[node name="Segment0" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox/MiniPowerUpBar" unique_id=1321277357] +custom_minimum_size = Vector2(12, 12) layout_mode = 2 -[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry4" unique_id=539805932] +[node name="Segment1" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox/MiniPowerUpBar" unique_id=847275899] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Segment2" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry3/HBox/MiniPowerUpBar" unique_id=701782565] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Entry4" type="PanelContainer" parent="LeaderboardPanel/MarginContainer/VBox" unique_id=394023021] +layout_mode = 2 + +[node name="HBox" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry4" unique_id=1481335373] +layout_mode = 2 + +[node name="RankLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox" unique_id=539805932] custom_minimum_size = Vector2(50, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") theme_override_font_sizes/font_size = 22 text = "4th" -[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry4" unique_id=379355680] +[node name="PortraitRect" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox" unique_id=736863972] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="NameLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox" unique_id=379355680] custom_minimum_size = Vector2(100, 0) layout_mode = 2 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1325,7 +1452,14 @@ theme_override_font_sizes/font_size = 22 text = "Player 4" clip_text = true -[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry4" unique_id=560418594] +[node name="GhostIcon" type="TextureRect" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox" unique_id=1812577580] +modulate = Color(1, 1, 1, 0) +custom_minimum_size = Vector2(16, 16) +layout_mode = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="ScoreLabel" type="Label" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox" unique_id=560418594] layout_mode = 2 size_flags_horizontal = 3 theme_override_fonts/font = ExtResource("13_j8jky") @@ -1333,6 +1467,23 @@ theme_override_font_sizes/font_size = 22 text = "0" horizontal_alignment = 2 +[node name="MiniPowerUpBar" type="HBoxContainer" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox" unique_id=2059921947] +layout_mode = 2 +theme_override_constants/separation = 2 +alignment = 1 + +[node name="Segment0" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox/MiniPowerUpBar" unique_id=1695101926] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Segment1" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox/MiniPowerUpBar" unique_id=1697515395] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + +[node name="Segment2" type="Panel" parent="LeaderboardPanel/MarginContainer/VBox/Entry4/HBox/MiniPowerUpBar" unique_id=500915161] +custom_minimum_size = Vector2(12, 12) +layout_mode = 2 + [node name="GlobalMatchTimer" type="PanelContainer" parent="." unique_id=1714357974] anchors_preset = 5 anchor_left = 0.5 @@ -1355,17 +1506,6 @@ theme_override_font_sizes/font_size = 28 text = "3:00" horizontal_alignment = 1 -[node name="SettingsBtn" type="Button" parent="." unique_id=1964422444] -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -78.0 -offset_top = 8.0 -offset_right = -30.0 -offset_bottom = 56.0 -grow_horizontal = 0 -text = "⚙" - [node name="TouchControls" type="CanvasLayer" parent="." unique_id=1390485948] script = ExtResource("touch_manager") @@ -1730,6 +1870,17 @@ custom_minimum_size = Vector2(0, 40) layout_mode = 2 text = "Back" +[node name="SettingsBtn" type="Button" parent="." unique_id=1964422444] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -78.0 +offset_top = 8.0 +offset_right = -30.0 +offset_bottom = 56.0 +grow_horizontal = 0 +text = "⚙" + [connection signal="text_submitted" from="MessageInput" to="." method="_on_message_input_text_submitted"] [connection signal="pressed" from="PauseMenu/Panel/VBox/ResumeBtn" to="." method="_on_resume_pressed"] [connection signal="pressed" from="PauseMenu/Panel/VBox/HowToPlayBtn" to="." method="_on_how_to_play_pressed"] diff --git a/scripts/managers/ui_manager.gd b/scripts/managers/ui_manager.gd index 9ab8267..75b83dc 100644 --- a/scripts/managers/ui_manager.gd +++ b/scripts/managers/ui_manager.gd @@ -238,38 +238,37 @@ func setup_powerup_bar_ui(main_node): powerup_segments.clear() var hbox = powerup_bar.get_node_or_null("HBox") if hbox: - for i in range(4): + for i in range(3): var segment = hbox.get_node_or_null("Segment" + str(i)) if segment: # Apply initial empty style - var style = StyleBoxFlat.new() - style.bg_color = Color(0.15, 0.15, 0.15, 1.0) - style.border_color = Color(0.3, 0.7, 0.3, 1.0) - style.set_border_width_all(2) - style.corner_radius_top_left = 4 if i == 0 else 0 - style.corner_radius_bottom_left = 4 if i == 0 else 0 - style.corner_radius_top_right = 4 if i == 3 else 0 - style.corner_radius_bottom_right = 4 if i == 3 else 0 + var style = StyleBoxTexture.new() + var tex_path = "res://assets/graphics/gui/gauge/Segment%d_empty.png" % i + if ResourceLoader.exists(tex_path): + style.texture = load(tex_path) segment.add_theme_stylebox_override("panel", style) powerup_segments.append(segment) func update_powerup_bar(current_points: int, _max_points: int): """Update battery segments based on current power-up points.""" - # 4 Segments total. Max Boost is 100. So each segment represents 25 points. - # Was previously dividing by 4, causing it to fill at 16 points! - var points_per_segment = _max_points / 4.0 + # 3 Segments total. Max Boost is 100. So each segment represents 33.33 points. + var points_per_segment = _max_points / 3.0 var bars_filled = int(current_points / points_per_segment) for i in range(powerup_segments.size()): var segment = powerup_segments[i] - var style = segment.get_theme_stylebox("panel").duplicate() + var style = StyleBoxTexture.new() + var tex_path = "" if i < bars_filled: - # Filled segment - bright green - style.bg_color = Color(0.3, 0.9, 0.3, 1.0) + # Filled segment + tex_path = "res://assets/graphics/gui/gauge/Segment%d_filled.png" % i else: - # Empty segment - dark - style.bg_color = Color(0.2, 0.2, 0.2, 0.8) + # Empty segment + tex_path = "res://assets/graphics/gui/gauge/Segment%d_empty.png" % i + + if ResourceLoader.exists(tex_path): + style.texture = load(tex_path) segment.add_theme_stylebox_override("panel", style) @@ -277,8 +276,8 @@ var _previous_bars: int = 0 func _on_powerup_points_changed(current: int, max_points: int): if current % 10 == 0: print("[UIManager] Points changed: ", current) - # Calculate based on max points (100) / 4 segments = 25 points per segment - var new_bars = int(current / 25.0) + # Calculate based on max points (100) / 3 segments = 33.33 points per segment + var new_bars = int(current / (max_points / 3.0)) # Detect if a new bar was filled if new_bars > _previous_bars and powerup_bar: @@ -407,14 +406,21 @@ func initialize_leaderboard_with_players(players: Array): return for i in range(4): - var entry = vbox.get_node_or_null("Entry" + str(i + 1)) - if not entry: + var entry_root = vbox.get_node_or_null("Entry" + str(i + 1)) + if not entry_root: continue + + var entry = entry_root.get_node_or_null("HBox") + if not entry: + entry = entry_root if i < players.size(): var player = players[i] var name_label = entry.get_node_or_null("NameLabel") var score_label = entry.get_node_or_null("ScoreLabel") + var portrait_rect = entry.get_node_or_null("PortraitRect") + var ghost_icon = entry.get_node_or_null("GhostIcon") + var mini_powerup_bar = entry.get_node_or_null("MiniPowerUpBar") if name_label: # Use display_name if available, otherwise fallback to node name @@ -422,9 +428,194 @@ func initialize_leaderboard_with_players(players: Array): if player_display_name.is_empty(): player_display_name = str(player.name) if player else "Player " + str(i + 1) name_label.text = player_display_name + if score_label: score_label.text = str(player.score) if player and player.get("score") else "0" + if portrait_rect: + var character_name = "Pip" # Default fallback + var peer_id = player.name.to_int() if player else 0 + + var lobby_manager = get_node_or_null("/root/LobbyManager") + if lobby_manager: + var lobby_players = lobby_manager.get_players() + for p in lobby_players: + if p.get("id") == peer_id: + character_name = p.get("character", "Pip") + break + + var avatar_url = "res://assets/graphics/character_selection/sc_characters/sc_%s.png" % character_name.to_lower() + if ResourceLoader.exists(avatar_url): + portrait_rect.texture = load(avatar_url) + + if ghost_icon: + # Hidden by default. The live update loop will populate the correct texture. + ghost_icon.modulate = Color(1, 1, 1, 0) + + if mini_powerup_bar: + # Initialize to empty segments + for j in range(3): + var seg = mini_powerup_bar.get_node_or_null("Segment" + str(j)) + if seg: + var style = StyleBoxFlat.new() + style.bg_color = Color(0.2, 0.2, 0.2, 0.8) + style.border_color = Color(0.3, 0.7, 0.3, 1.0) + style.set_border_width_all(2) + seg.add_theme_stylebox_override("panel", style) + entry.visible = true else: entry.visible = false + +func update_live_leaderboard(players: Array): + """Update the leaderboard during gameplay (scores, ghosts, powerups).""" + if not leaderboard_panel: return + var vbox = leaderboard_panel.get_node_or_null("MarginContainer/VBox") + if not vbox: vbox = leaderboard_panel.get_node_or_null("VBox") + if not vbox: return + + var sorted_players = players.duplicate() + sorted_players.sort_custom(func(a, b): + var score_a = a.score if "score" in a else 0 + var score_b = b.score if "score" in b else 0 + return score_a > score_b + ) + + var my_id = -1 + if leaderboard_panel.is_inside_tree() and leaderboard_panel.get_tree().get_multiplayer(): + my_id = leaderboard_panel.get_tree().get_multiplayer().get_unique_id() + + var my_index = -1 + for i in range(sorted_players.size()): + if sorted_players[i] and sorted_players[i].name == str(my_id): + my_index = i + break + + var items_to_display = [] + for i in range(min(3, sorted_players.size())): + items_to_display.append({"player": sorted_players[i], "rank": i + 1}) + + if sorted_players.size() >= 4: + if my_index > 3: + items_to_display.append({"player": sorted_players[my_index], "rank": my_index + 1}) + else: + items_to_display.append({"player": sorted_players[3], "rank": 4}) + + for i in range(4): + var entry_root = vbox.get_node_or_null("Entry" + str(i + 1)) + if not entry_root or i >= items_to_display.size(): + if entry_root: entry_root.visible = false + continue + + entry_root.visible = true + var entry = entry_root.get_node_or_null("HBox") + if not entry: entry = entry_root + + var item = items_to_display[i] + var player = item.player + var rank = item.rank + + var rank_label = entry.get_node_or_null("RankLabel") + if rank_label: + match rank: + 1: rank_label.text = "1st" + 2: rank_label.text = "2nd" + 3: rank_label.text = "3rd" + _: rank_label.text = str(rank) + "th" + + if player and player.name == str(my_id): + entry_root.modulate = Color(1.0, 1.0, 0.0) # Yellow + else: + entry_root.modulate = Color.WHITE + + var score_label = entry.get_node_or_null("ScoreLabel") + var ghost_icon = entry.get_node_or_null("GhostIcon") + var mini_powerup_bar = entry.get_node_or_null("MiniPowerUpBar") + var portrait_rect = entry.get_node_or_null("PortraitRect") + var name_label = entry.get_node_or_null("NameLabel") + + if name_label: + var default_name = player.name if player else "Unknown" + name_label.text = player.get("display_name") if (player and player.get("display_name")) else default_name + + if portrait_rect: + var character_name = "Pip" # Default fallback + if player and player.get("selected_character"): + var sc = player.selected_character + match sc: + "Bob": character_name = "Pip" + "Masbro": character_name = "Dabro" + "Gatot": character_name = "Gatot" + "Oldpop": character_name = "Copper" + _: character_name = sc + + var avatar_url = "res://assets/graphics/character_selection/sc_characters/sc_%s.png" % character_name.to_lower() + if ResourceLoader.exists(avatar_url): + portrait_rect.texture = load(avatar_url) + + if score_label: + score_label.text = str(player.score) if player and player.get("score") else "0" + + if ghost_icon: + var active_skill_id = -1 + var is_blinking = false + + if player.get("special_tiles_manager"): + var stm = player.special_tiles_manager + # Check if any skill is CURRENTLY active (User requesting blinking state) + if stm.get("active_buffs") and stm.active_buffs.has(0): # FASTER_SPEED + active_skill_id = 0 + is_blinking = true + elif stm.get("active_freeze_zones") and stm.active_freeze_zones.size() > 0: + active_skill_id = 1 # AREA_FREEZE + is_blinking = true + elif stm.get("blocked_tiles") != null and stm.get("blocked_tiles").size() > 0: + active_skill_id = 2 # BLOCK_FLOOR + is_blinking = true + elif typeof(stm.get("invisible_timer")) in [TYPE_FLOAT, TYPE_INT] and float(stm.get("invisible_timer")) > 0.0: + active_skill_id = 3 # INVISIBLE_MODE + is_blinking = true + else: + var inv = stm.get("inventory") + if inv: + for effect_idx in inv: + if inv[effect_idx]: + active_skill_id = effect_idx + break + + if active_skill_id != -1: + var tex_path = "res://assets/textures/player_board_and_blue_print/tile_null.tres" + match int(active_skill_id): + 0: tex_path = "res://assets/graphics/touch_control/speed.png" + 1: tex_path = "res://assets/graphics/touch_control/freeze_area.png" + 2: tex_path = "res://assets/graphics/touch_control/wall.png" + 3: tex_path = "res://assets/graphics/touch_control/ghost.png" + + if ResourceLoader.exists(tex_path): + ghost_icon.texture = load(tex_path) + + if is_blinking: + var alpha = 1.0 if (Time.get_ticks_msec() % 500) > 250 else 0.3 + ghost_icon.modulate = Color(1, 1, 1, alpha) + else: + ghost_icon.modulate = Color(1, 1, 1, 1) + else: + ghost_icon.modulate = Color(1, 1, 1, 0) + + if mini_powerup_bar and player.get("powerup_manager"): + var p_mgr = player.powerup_manager + if p_mgr: + var max_pts = p_mgr.get_max_points() + var current_pts = p_mgr.get_points() + var points_per_segment = max_pts / 3.0 + var bars_filled = int(current_pts / points_per_segment) + + for j in range(3): + var seg = mini_powerup_bar.get_node_or_null("Segment" + str(j)) + if seg: + var style = seg.get_theme_stylebox("panel").duplicate() + if j < bars_filled: + style.bg_color = Color(0.3, 0.9, 0.3, 1.0) + else: + style.bg_color = Color(0.2, 0.2, 0.2, 0.8) + seg.add_theme_stylebox_override("panel", style)