From 8269eb6dada871cb63254881b1a2c0ce312c8ed0 Mon Sep 17 00:00:00 2001 From: Pedro Nazareth Date: Fri, 29 May 2026 05:51:26 +0100 Subject: [PATCH] feat(counter): new class Counter Created new object to manage a visual representation of a timer. Used to draw a counter for invincibility star but made to implement new types of counter. Added new images and sprite representing one counter. Co-authored-by: Tiago Nazareth Costa --- data/images/powerups/counter/counter-0.png | Bin 0 -> 5671 bytes data/images/powerups/counter/counter-1.png | Bin 0 -> 6203 bytes data/images/powerups/counter/counter-10.png | Bin 0 -> 3067 bytes data/images/powerups/counter/counter-11.png | Bin 0 -> 2587 bytes data/images/powerups/counter/counter-12.png | Bin 0 -> 2297 bytes data/images/powerups/counter/counter-13.png | Bin 0 -> 1976 bytes data/images/powerups/counter/counter-14.png | Bin 0 -> 1584 bytes data/images/powerups/counter/counter-15.png | Bin 0 -> 1168 bytes data/images/powerups/counter/counter-2.png | Bin 0 -> 5778 bytes data/images/powerups/counter/counter-3.png | Bin 0 -> 5331 bytes data/images/powerups/counter/counter-4.png | Bin 0 -> 5106 bytes data/images/powerups/counter/counter-5.png | Bin 0 -> 4832 bytes data/images/powerups/counter/counter-6.png | Bin 0 -> 4482 bytes data/images/powerups/counter/counter-7.png | Bin 0 -> 4051 bytes data/images/powerups/counter/counter-8.png | Bin 0 -> 3823 bytes data/images/powerups/counter/counter-9.png | Bin 0 -> 3496 bytes data/images/powerups/counter/counter.sprite | 20 +++++ src/object/player.cpp | 39 +++++++++- src/object/player.hpp | 4 + src/supertux/counter.cpp | 78 ++++++++++++++++++++ src/supertux/counter.hpp | 48 ++++++++++++ src/supertux/player_status_hud.cpp | 73 ++++++++++++++++++ src/supertux/player_status_hud.hpp | 8 ++ 23 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 data/images/powerups/counter/counter-0.png create mode 100644 data/images/powerups/counter/counter-1.png create mode 100644 data/images/powerups/counter/counter-10.png create mode 100644 data/images/powerups/counter/counter-11.png create mode 100644 data/images/powerups/counter/counter-12.png create mode 100644 data/images/powerups/counter/counter-13.png create mode 100644 data/images/powerups/counter/counter-14.png create mode 100644 data/images/powerups/counter/counter-15.png create mode 100644 data/images/powerups/counter/counter-2.png create mode 100644 data/images/powerups/counter/counter-3.png create mode 100644 data/images/powerups/counter/counter-4.png create mode 100644 data/images/powerups/counter/counter-5.png create mode 100644 data/images/powerups/counter/counter-6.png create mode 100644 data/images/powerups/counter/counter-7.png create mode 100644 data/images/powerups/counter/counter-8.png create mode 100644 data/images/powerups/counter/counter-9.png create mode 100644 data/images/powerups/counter/counter.sprite create mode 100644 src/supertux/counter.cpp create mode 100644 src/supertux/counter.hpp diff --git a/data/images/powerups/counter/counter-0.png b/data/images/powerups/counter/counter-0.png new file mode 100644 index 0000000000000000000000000000000000000000..88e59f84d3e68b5670ddf1ed0f9681e0a5d2e20d GIT binary patch literal 5671 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 N002ovPDHLkV1kP%#x(!{ literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-1.png b/data/images/powerups/counter/counter-1.png new file mode 100644 index 0000000000000000000000000000000000000000..536e2796d5489e205b86c72103d869c0ff238936 GIT binary patch literal 6203 zcmZ`-by!qiw?0D*LnG4V&?PZ+4UG&a4T{n*AVW*d08&FL-5{w*he%1cw1TwKC?yR7 z0s}Q{~&b#(n@7nKk_8;fG(A8EaC1M}~0Dx2jp{jpl5q~EHd~-M2 zsZqZ%P#c8476ABi0YFeF0G!`IK^p+zB@6&REdf9#9RO(EvYPbdZUTgEh{qlPK-T?t zg8E#GkvAaN`o6jUp=o>tCo|2IcW{NE%_S(M@c0E$2v8haXRJ&>_+br!Tjx?0-`Vs6s@UUCW;H!B-Q zTTiI9?NgKsoO`diog0cm!nq%bYYA()so2`15WeoV2EN*cHolHF(nxLvc~T-djLc01 zXIoDzD8|{z#X|-IXZu%SnH&EvEW{=+=Z>_K(O13q&x)HTIGeqvr<;tB5E_jZM2iZ# zx<3_yNlQx$35y7chzQ)Q5b*GE@wCDSxOlMtQ$W?$!^R!u=81B3f&MLMW$o(a31{>2 zLLp`Btn9?Ckw|d?Yb#OYjl@VR0V|{^OaLh=ij)+GNr~9Otl9pd_e9zKH@}O=KQi11 zBJ?*R1QQhg+wxyuM#mjxd(*{VN_m*vzvBN3lN0*e$p2_e{@=*WUT?hrDDzjQ|EO#0 zaw94FM!UPo>BIm)?V+KnWQZ}}$?{7!Rm<*cZ!f*r*v-g!YL_@5%Sy;<1@Qq`p?IqJ zVpy1}-smyLG*3)dARd{P#plr5XG{msS?=m6 z;<=8jeScEOzS=<5Tfg%{vyoPGToQo2qO_gtEm_y7)(n32Uiax;ti%ccqH<6LZgpNh zywpqK&3K@_wYmBA7W_&{y0nV~`+$S8E~BkY2-IN6G5A@8YlQW#F^P7vN_H*4#19JT zz!Qf2xX{%l0Y?V$tFstoaJ&vil*61aPB%So4l;F}G(&8uu%6RwPPwTUtK*)7X0jG_ zl6KuH_M@)oNZ2FzH(Iqjc0TP-(1y0vPqRKboN}obHKQSv*SuOsB~B8}q7LY{Oh#6R z!q)F+p7%WqP_lEX_gbL`e`=;%K;?$h-p3YXM8SL#?CfKep$D^E5@Yl6jMLcbCYsOn zq%1AlCaJdONdrg*0P{sGV(1nv7e@kO!nWpXX5Iw8`}0fW_c7P*OfklV$Y-PFaf%5L zbykX9XS*OMUboXcLE{A}Chn48Vpppf!EkM2t`}fnVlsR21sTzuKnqs9OT)O=_*J&J zc1`5_kFd8RmuxLbG(q&1Q%m_nQ|k!)rVkkj7Pr_SIOQLvL0c@LrzbLnIrS-BVwIne zB7Q_;EMWDAbbyhOkxf%`Q-BgD_5GduX{^or?wD}W&wG^-J>>m8BwW{i#*p4G#8hD& z!t-~xy~v?84)_g4I|2OiD}Mg|6&LySDy;bg;cP5%aT-PX=oiRiN}B`ne)wsWTa59t z@mf4yy(*NFLK%w)QiOu`OIIb;4M+xCKar66wu2~Y#a{Pmg*?^=wfc=em_)mkGe=2c za;9(Bu|!)-({kPv^%lvHEva=VY5Yy#Mr#h@e6Vi?X2j{hgRBN8cQX4GLb z7no;1CyyZna~l-zLNnELu`Jhw{W4u&-SXzAU&QSOf;Adeny8r5tZgFASYvB*U(zg( zb`odfQ5Dqf=;+JC+vPbDbS6_O?T2((6{MrB%q+pz${q5E3>xJ>z1};g^mp|Ub*eS| z;b&!^wo@LSpdnU1;9HR(x*XiCj~7c7ZAo6}EtPO*Az8yE77;Kf)x!ZcXo`o1^c}Ao~|i4 zR**}%otrk4*n58zURfomNIhKvr>lNMRG~l|=d%+~d)ChHPrDu@C;FboWVnsl4D$0a zjBWnPgQ0kWNh*%r6UrOeP8#=;{66brA{-u)#6#2PE2`?>5h%D3&mHrh`pR1PVe{I| ztdr+zw!;u7;aqXFi3sTl>-c^F>9a*h%IsBV40 zrl?zxH)7#>W~lw%*gZIN^D?Av=_sk?olt}$OX&w|3Xu0B;-10T z`1#+VcHDI_wO5rm=D?Dw!E?pCCf2X}R?@2O7d}1`r1ae+bsKa9Re&IF32WfrpGG|| zEdQK}AT4}gmWgLi*>WPx9Db+jYE;VKNMIUhIK8R`~{NSxW@s{EQKIh;Xj@fu9 z^{#x=lKV&$)jum&!5BLkV}n;fx5p6v-u!8epVyJBM|9;>L)LRX!xpLsYz=vr-7j%M zLHTc)-k{V|X6xD)#6Hm`>+gi!`-qDbox3;dD~zeyF&@c*t1#fr3xhmm1YCY zEkx%rMe2!LJNo4oQN0ui*Z5bMqR&SYlT*LW!e2=_7DwU&Q0p1yPZV);WJOj++(Cia z;*L}Bz5z#Yx9nDVO#tbXg13b~$;z^kCd#7bE7=TVwq3%D9ad*1$nHG@$6bsJm-h!#wQkpQH4efHP^} z_UmIdX;f;#=ielTU+7qB9YN`>&hc?`p!Jl#=8kjjn}gkc4mBX|!=63$-*%}wwJEaF z;)c7+4lj@?;vLv4a;sQ!H56Hpz~(Vm0nwI2Xz43n&@z2w3CYOS==ku8MMUns{=w)iWwJgB4v`}xAlxsM*evGr}uu(@Szcs4zY|RNjiLHXiqz^DYrZCj#AlG31&j+8W5N z5$8XXb6bf%^`K$!m(xj33xQo}H*NUgPl^txy_K>~20``xJTWeiX!-tg?YwMRw6-CG zh4{}AP?}N5n}u|OTb*;?fL1hr-myyMRvUBOS=BS9r%|Klp!wgDbS4&93LL7J2GGR7 z=AG2Zu3`mp&4UyT$Mw*CCv9j&wv47>%Es4RtcgB8^D)cs92M0nedeXJPP5Y4|FMx8@^f7d_Z=+r&O}iMFxuIJL$0^#qnAUNH z%9vc4`g|Ty%zu|~0gu5iTa8B<*SjC&{d}KiTs>S}{vLww9?V(otqjlgA^g>mni2w` zcmm=`hC0x1lVQ?d6WVi83i?zEX$l&vlPE3WrzuZq7f;7}&?^T+5WZ=)EjHh}BOQXrGY*dI2%&9}TlLyjY4aSP?ZQ>ooc%;~E>*j$X_ zF>n7&nlKZRboeY^@d}RtypVPlK^#Z?Tcb-NSynI0lzd;$$vQxs{2A)SA8=vFYN9Um zC#?XRen9wTt^(1#UvkS!=5ThrKzF5YXp%tA4?%xg&S&>u2Uw*iEljr^G&oGyN|thr-ynO~+= zJJYuNJpk4(J&uFn$*IM*HJt7|F2bbahKXER&a#w)02EK@zU|p>tYOBM06CQ*_ggvm zZO=|~hr2filG=Iloh`PbQQ;~Eu}?-3&kBrryyPPJ5>6_E<}H4^qP*Ia`y%H~rTs`V z1*cJNPuI|E5?Lu3U5-wME-iL@3;Ix;jH)|R0?m>J-42l;9Q=e_dJ-%pjj`jvaK1dz z_t%WBEqWA32s=b-=O;|%9FuaVLXeyh?zHZC)+Y zRPtBdC)XkPj+zStRs+r-=B2+*{t@@khc~<(Zl^yEaZ?PugaF@8Kp6{$G&6B>vZ ziI}N5Vm_lwX-j79ZIZbc_w<#W=7H0gby>vVDxlvV$J$l>s_`8=r@mP*2mZk22g~G5 z&N9U!|A%?yCv20Mm+rxv!pgSuLVDHb*2ArlbBUS?zsMK@=_aNLwb5@23>&p*rGpC} zWK_>W=Y~k*y0)Fj*8QKmGn+$`r}hhT38h`YwS@(RsGKoZIXPi1k3z2JO3@1RyT8sZ z7gQkKur3`aD8H5d&ln$_{-1!B5Hl-zY3h2XuPeaJ>W=Si_aPbGg&JxSJnXSwBCU?H zX+6nF?YOpefjntPKj-g#Sn`%&b>Zhs-n0ckNRMSWI-Iqr${(@Q@%%!q7;QliWF{Nz zgsIHST%)TPFR28-vm(W74iOV4;u^uLPFlyVS+E(?O@DO0_(?B%p5~-*ckOewBZIQ3 z+E`1hwgpFZk`C`2*ua?eI{swI3B%O%uB=n+lh@fgk%SPBdfjbd%~Yen;dGzW3C>k~ z2Fk-Gb!&SZ)m0ukGXdC#&Fq?H*>Aq^0`m)sy-DO&@KhNz+NAs}&2U5KIkkDYm=raS zNT~Oiz#@W^-rc^)j%C{sQj6h z7Iz|r!CL2r^M`D>>xg6+B3H`)e5<0OB5;J%FkKd1`PFx+WAatcr>U>^`Hsi#bXAmZ zwR;^(imgs|-2pP4FBDG~Nzf+UG_&=oYUpKhivFV(b3(g4%kiS}5|6OTOa^*`Rjqa~ zfsq^`Y?CV8tO8c&+V_~*nV>mk>fJRne8Aq-`4XJe^6^!mMuE9IeD0;*XnE%YrN_M0 z-$~+oB3m!nvbgt75Yh@Brl)7vU_DqcP=$KT{LO<#cfAvq?hmTX-cXob1mP_bT9PvB zC}#;1+v!B?NH|+4T6POZSAK8R`6Bko*Z$IrrdOw2l=e|^fkNn`q}JHQwW^XEQbSvt#lj;|p+P+Vjp=etKE$Zn#;4UlJxWMm_$B z=tE_4~FNnhF6wYA_%TU0zp#TrmRWz$-Lo!xcr)i?hNnd~N2&OO zaXrmCnnEUqaj`AVUmsijOZbylOw=aRMTbR&c)Q;ODy_Z6*L|A<$o6-dEu4x|G9`aP6clk};uevB;!T z@{z%k?Ul;FPf^5^sx>n_|8GUF3x~tFW2*2}47n*HAP-#`qbG+F0(RqC!OQ&GZ%yJv zjAPGw1iG8<5uUMc*`#q|4n&Yi;+;fD<6<|ivD})qs!e>^F-4qvrMKUdQNOX3{N)h{ z$kOMPQJ11jh-+MS_8i=W6N*#6YnQ4#7O;F0zit6Ck|i{i$0>bFS)L-KZJc^#lm?2Y zsPcURWx0}++Pb58f9JBrd!kr2^VO>{z1in4*J-S}LJ8md`<)8fpv<0TpRQ7R4T$e2 zvV$L&l6iNnEed#0^lJpwVm&XJY3?00FKLa0Gzte8q^lwE)hpvgJLty zUc>1yw3viM_=ROSaujNY=lW~o3*&g}eB}r9)~20bjWag*8)4AhRILSF=v}#WN!-PY z^sg3mB<9QLMOpSzs>oYCats^dRDWP{1SgC-!8upVS!s_7IOa^$W0~r#_ZC_sILTsl zp`K{8pF`Gy{jbOmE%TYq3*Ut2`2^VEb}}0~-xdc> z>?FO>=sO2?r|h&mc_Uta;``P6B3dmrHZe0-gZ4GvOu8^4;o)FfiE`yOsYU~}9+|gN zJ`~t5&%h`3X`SuOEDOEd=F=HDtD0NX=HD1SvpjfW^Qb~>=z8TUCISauy{K7@#?K>e z!+B?ysGwI6<*ZTEQuU`3suW+Moh}fww0;HD*}@Hnc0V}rUi0qwFuplaAB5e41S7V6 zt`Xs9kNL`&d3BoUT*EKq>?neAq zH?RGJ!ZN|kkDk-d+SJ3vbtbg=!mO01vH_pYM|q^grcX#+e{gKfb?I+BzG?<6Suo@i z%T$ z;cC8muUEB_hAYF>m(9^|C07=RU!V)M1~SdvJjZG9p+jHWB9^2t=qT>?XjdFF0DY#( z&#zc;)HF1gOc8XWwThx`&L`!*ISN0u}5-@F#|ts4uj%se_4l6LmMF1I!`Jk`O?&yFezKzJPJ@y+HCc!mA%Q z6&Ev(M)4~I6R0?FbZ}4z1r=?g{If8M?{C9UWm97^-Vfz$W%FwXe`TT^K&6JEpwOtO zD4i&TPAJ(Q3O6z`g2Hs6y1Eel4hSVCgo=xXgiwzBDquyR_>zfXRAOidc)K9ZCp3a; zq8t%H#H0Lhen=lY9trWmA@F>O@i+($kAOq)2n5~$2{+XBgZn7|qNfu5{>>jk`6UBi z5a@OU3fF;cx4iA6PLYWOeiz%6rf}n*@&Ce%q1%o8M`NacA^fxQy}y;&mg#SG2_bw* zqxjk#y`Hm+|AisYR^~3z-gEh$K?nb-(7iQgL>aCf!hBYF63#jxAuM8`k|exaiFjFT z!ufWFkVdIh;JTS>gOyf!;0fzHXS60a0Vt?pkE^RjYId64rIlM=d10by0rmmR%uMat z52VPUce#|lp_Di0V!Kx|lkU9E+CY<@_r>|gf4aZ5))&?H8(mBG)^}!o(k_mD*`T+6 z{-|9SSBG_YZM|QL)FoI-$)eS3y`VlPiLxsXpJ`gqU6KRr$Rr&p#8k}Dqrh(1RXs2R zRkL2X!gDdwE(kvtMSnH1%>8!AjH}dE-QWE2L?+7v`^jtihC#c#CJoREv;w4*{`BrX z%Nyj8)s7vBA1gw#{)j)sK}`&uBSJhd(_VX4W^X}fgkq6c$s9nKuDnOKxgC%Sn~L$T zJ5`j67*H6BkmEU?@3t9rNEr30U6gi?jw(P{8Vs53avXty1ZgSdf);5H?xVUVb2VTFNvG}j<*DI zfLpS5B4FtZkyTn$n{bV0D{cH~%Bkj4TYE6~5aQzE6p?jdMf16DS5}hOH68}auqO+? zjab1XI~WIzCD!_fU)(nl$pNT;!a6Ju3vdzuBLGiR{jyS|UZnN&uo;O-0|@=svyEW) zc#-r;j?2JZM}-o{L&wxFVB;5sxt>s^*Y$_g2FpNyitR{In#_=VuV6sE3UkL_n@dX^ znL=CB8z**qTevYWCRFC7W2CemHZ+JckL4LWLbwhOL*H)^(A#1H_Fy;@7<*F2^x87^LvAcIG za}G^2qUUe+v@O+5fY+52C|89yCBUfUY)J!`3sO_0PN&RT+c_xvODQXQ-J{oYr( zm<6X7^=)Pe-IwEySsTpjUn9j^QLazhg#^$6kFtY8n;PatK*MgX<>|Xf;png*ElS?s zWjhWf?pJwr90}WV3HLpr^{I<*x><$GJ+x;01Iol?ws#HN86^xz!bcvLNJ5QMvFn#N zfP_XWZ=h@k>*LpWGQy@f&NNYdEuxCb^C<6Xg2`~Fo&eWqgR7#`tH*7>U!4*u<(w&H zs7K9@D0F=&(;^6z4)XNnDOp|*U-oN=Q9WbUBa4@q7K`e)z~rkdr{}|nXU%Nd-?hlJw?Gg0EEPM?RHzu0*`bS9Rw8X_ z9=|(uvf2*X^wjReg{vK5AoW1Yy$D!mZer%0o0*?j%Bu90`Oy}$10#e8FY#)U(3SA# zASfQ)_i*$rl?=GK%$hjT?@a@Uv>*F^-u&Z1Wk%MVU|Y+xa(Z=e zK9-HgV9@5|RZ zGC&qPIR~CI$d3|nxZumSYEtw8{U6c9CKx+shkS+vR^l^#zaq+5Pmijim}iwHv0t6H zSJMy#*fG#xZ@PN!Z8IT&`yt-eX;JnxZrInWNHyCDlNyr1oja{`%vRdwsiSqb>Mr_p z$Yo!RNFxl7UPd9MhO=9>BxQ(fH=EyNjz5yqROR)^8%NH@u)SS+&5QgRo;V)VDs|GI zD3DXH*T8nv+;Q5Qnl_(W_%PL}&Q(*Sz|(R!Av^VIt$bWxfM7aiz)AW&)1VhbyPiRT zCVdOciyMQQ&awj1&=+z5J6RWMMy=P28HeIL;t&tk3QsU$f`FO{)6nM4mi)#oDW7z+ zz0bV4SV?vmr_0W-Fka`Sr2z1?=kVkN7u>wZqGrbprXGrfaP-_$7NNj~=N~exD$!BP zye+s}(8MvuG2`;3^mLR@^1Y&+abMIp6}cft5fH^ZJ^aLjI@*!u`|E!FWT#$kQ}Jiq zrE&mvDNUNgUcyE#P}Vqw`&#-&Z!I<7-^+s88(A6lIrS|QtRul%mwP+J77Q<-TuTp_ z-HdlA4teEK@cWq4zC2i(goUT)Fq8i79Z|l|3zA*QSQ#j-Mb=>s&}aNDHrIp8eGfmc z3tAWV<<>@@l-3Y^IXYSe(UhBRFU+4as(SHEj$x~9Ia%#9OdlN)i}_fh&^)!M)Y*E3 zDI19f0~yFOHvVMo;*Nclty0OAUmF6y&`K)C^z=K$$af;!9(UAN$;h!A=4R&SF;9G< z*1bXl^m$cmV{DJv(q%}-*%m{WLMK}@FG%H<~;IM!eNDG_7&+u^{9kt z5C1Qv9eNN&%>xyS7h!>Dix(AoFF)jWqbE-n!3C_>hIk0A={uVrp1DVgr_WyXx{`L= zX+iWM38TFIS2HJ#YBOhIrk}VK{IFU4Q+2#9=^Ryx_Usu`RzyZr2&kTl4@%aBTo_xQ zD?D#|w^Y18QAFd}aiTi{WDp{%nkq_)-{QU~d;irDMp1z27n}ERI0{goX+iZ zQOr3cvrPf2efAJBq4fMog3Hq4>sTz3>9RJ)OJBt72Fvl)#L^>O-IYJv?KA= zovWy$%O8;F@c5V}>zkz6o-fyahzaQ%ZTd90Ucj9fgVeO~kJa}lgK!V&)%4rmv#?^g za$oWbpV1l(e>HS=mr@~Q#A7^$weNxU``{|k&x~fulEOVr=#sUYN)>g$4IL*VgI}+pS zOz9z1GjD=A94H_T16mDW*^4H9 z0*~C)+dlf@d_!F7UcCmnxl{+a!QPX_0gq7C=A_^W0}tbDMz!gTBY!L->foT}&G~SS z?cFy2M%8oA^8?jMcO2(Mr#{^p1ids(QUl1X(T|rlXRq%PGA>^7dx&u}3tyg2 zgaj@h*L2kV?5g(kE4Md%Kpad86P;?~-gq1dE~u{BN&Z!)disAR~{u-mNK-#mvomxrhD6+nQEig_U(q$jR-fETqYJCzjl}F%t=} zYC2r$nYdin$db^2rh{|Cii4qL=+Rfxcam}x6RFT8ldes-k+`ySpu$s(^(ZK}?O8IpkR0-+t28D$|(=3%Gl-j65*oZB>+h z9VaS1^+gwV^8>r|X;-T|gA9$dSJSYS{W8^lA$#ZrKHLi2KyS-ZYcANxe&*&(emvDG`g#c#{Vz&hekyFz@kq?{%hIwH{q>-D?&b1{#$IYF3Q%S%xwIPpdzEa^249l*6e~)iYnF zJH7+Asqd;H|Co=^h4@r;dgK?hk6cx$z;Ou|#kE^P1LUk6_THV@CW_vEH`&D(g#-=C z3>6c*D?FEfU!p{lmXINETY#gzEg%%Fg8JeM5F*8KaJG}0k(80&j=G*kXn>$S z96N6gnaH8wNh}H^04xS;g2EW13=KUEP4I?Bc-#Sf3qB*!!&lhf1fgIYfHsf5#XZ|5=2Vt7r@WU=r2So8#^5geNiS21GJ5fMURd!bFdm zB`=gn3ZZb20hAyr!(4a1wow;JC7bIWGj_%}hyINcOeI9HC`Te(JV_BDBvZ1kr3GBt zjE9FZ&?y`ul1Ha8*m$0~)*p%SkS>DJS{7z3avTAu)g%#xd6l3!{?p zfy6-L05aJa6+pz1A&SXF6p@TGM3Heg@_u8(1K2>r0Ijd(In=;^*JrT5(f|>H7Fp1S z1{hJxA|3C_qEetPL?tZ@&Hk|e1v5j78u^dLEdE5GyF%JGW<)f7W0%5!DCI)j{g`=K z1{x+q2U}}Tp6}eCA5G0(U20*T8MqS8oMY#(J!Xs?#;Qts%TFs>QDvJ!O=}siawC@$ z1vBCcZt(@_!3nLq`V{)hbCRjGpZ>na=lAj>jviq-PgVok^Qc zFSxY_ah4j4mk#||EmYd6{K?%{$rV8_*nV5#UuHpYgXyN%!4rvJrK$J{u-<|Xk5i068Oa!MvQj;{;GNmS0@6co z87$)6>cGwmZy!0m16mJDAH?@0OO*HQ#OQD9Z!E;&Dw97?|g+LJmS!9^^&^TeNYWPEs%p z^A)&r>ta4patZ3YRE9rB4K~6j6TuHJE>^phJq-_;{q;8ghn~m>z0D;^7$aqDO<^$> z{@|m@zKu0hSN@t7#|>~~2A($!Dx%)@5|eHb=%-wh@_#-xo;?zFYT-@Suxde8MIz;l z!Z~u4jg_^0S+_$~&d@R0Qq_AI>i5MrHli`&&s9Eu8L0^@mGb;ir6ODJqDEm&2X`%Q zRdXmpw`#F@%3#2`Plp_^?a18f1`_cT8kt_-i02?ly< zfB--^NoawZ+JyF{DZ7jCP($U+ms7`{^vzuF^?f@^-!#Z5_e)UF;GMq!2mQt3yOBz9 z1gks*xXT4!3V$Wx*`0*O4V#FB#b=HcehN;AvKpUks0Myl_*ug$!=C3hv-kI(i9Sy@$rBo{- zBK+~iXQXRgrZ*UkyFOjI+VzU*Yf7`8R;|X7wM>)Sj1|whNn{M&y#oWQ+A*dY z?{?ff4%)eMb|k0|ylP`4{(4gK%-Q8!1X8ixxlVkeGc~<#t#;o&Oj+3Hwe;Qg8MMt` zX6j<36CQ;LR*nu1XW?=hBzhM5-w!zgBUgIT&V=udo|fAq*dj8S^J4&~rp+VV*Q)On zzcRQnvhwX+^`ZG-!SLu65_lZWT!OtnmS5evVqLzhRPJdSh69(Emc}JMoLH0*4AA10 zSu2Txh71L3uc87uGf5xw-?$l76@7Ze44s1R?(XU*?-_lY)KGif;G@gAcD4(Lwl_lq zTDC>c&=$7WP?d4uaaFFnH?30DBK1Z&ET>$fS1&0!P2V-fZWhvx>gLI7)l)jZc(k~Gul}+|tHvmoCfSz< z+g0by-)$-h|PGPYjf%4kqj6QQh literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-13.png b/data/images/powerups/counter/counter-13.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee3d8238685818d5999ad75f5582f9a7cee9af6 GIT binary patch literal 1976 zcmah~3s6&68otm3!Xp@PRJ2+Gm4^!<2?>%!5&{GWD1l;l7tNC-LIN8uB(Pc{@)ATN zut*Ccf>sd=@@Oq!k)pDUJVhxAv_(M>kcR?7QDARc$8Kk5XYaY^{Qvp>_cwRup7dvV zA@z6Y0|0>ZW-0X82hfD)-N4&+K>|2u~0_(zfGViQLI(8`doL%s1{-njHO_)3WdU6 zL9maJi?DbynT*9bU>zJVkOw9%Q3i6A7+Kt>?-MYDaeTQX7L>%u(3*r?UQ9elwTO?G z2q=-0T;s+5bziQfgo^l#FHE%@jQ$7&N?`ePt!D=j6 zygg3SvPP%)$t6Ol3r$HH-uZX?UodB^rjh?>jP?ft%?fEBn9R&-$^~Thz&Z5d` zoXkPSBL-2e%!cRdV)e`)+|@m<_B5oibBrBTFkh6-$xXY1E>+N3M@*=!4{Mk}+m)y?{!KK;1?d9|b4l3f;j_U9nCwWS|7 zM~ZKa9$2t68`|>qg@LeNk*Yjuq$${e60a$IZIh zhP`J7=-t;CA~gSSajJV2?@aGA*ljPwMzj zY2@+TFRgArFi}r8T9!;mRr#A1`p5*vk^!P)+`Jfv^r_U^oy#Y}#z-uQsS?S?)dY1` zSp+s{KkX#d>(mGJ1}lb6o&Ch$ZfjBQf!*Kr7XCdxVTqy)v^CcMc(w02rMffqK$!c% z@nee3JMLi71^d)~#2x2zqhmJITkan5=+d~N3~hD-{s56^oM~!0if*f`&IsJwLcf4! z)t}Jk#RqkDAg-092)2SQ)*ow^>Tw)k-ewHLTbH-5zM#=7U&2>%igX@5^q&qU)PzJI zsioFzhmTHO7go0>ml_3-)(#aR^iS!{k8PiKNlqKSx!IrgqH_-{`2wKI1Ns1_R-Jsh z`iiZNX2KVVMHS*!hswrJCNoNOKBYhJuxcWBCMb6PHfMMD)rE^jv&VnEWp=Hc3IjKP z#5%sfYI~fp@5aW1Ub{4Q`0Py8m0Ma3RpHMR2{K{Yy>EGww)5LCUhOmQ{7wgzzBG0N ztvI_j;H1TzH(zY57aIjkkjkZBUG1;EKG!$7I63_Ksnub6O58f$ws8LX!3e)Y&*dkc$Q)JsZ^=I<+&(kX671b4{~_fFB4varyT^QJTPh}onWW2o$GX$pSlAw?T^|9N z#A1f+<0{3-T#WOkk*?RTUrT}2#G_`vB*DiLfBBm{TUMTR50QPvEh3U?jYQ!YgW;}+ zo6|<<{DAcJ72Ki=<>*SR`t91;Yr%A%3PoaQBEw#3Sle^Ep!;*f8 zMJTET4Agn=RNtYCjg)mX>mQzc()T?2&q3!F5m}iW$GMCn5}o|PEwCSJO5jeUw|V@* z92axF$5BHGp|ca71*m7u!}vR<>h&&eI@k37zE0^ITCZI1SHMDp)S91;w+D++<;F?* EH%eqMaR2}S literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-14.png b/data/images/powerups/counter/counter-14.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5df98aab850ab391fc856037484131387fea99 GIT binary patch literal 1584 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!3dtTpz6=aiY77hwEes65fIyxmw5WRvcF>G7U0ueJi%ihP)N1JHKHUXu_VKYn`7@Aob znphcIXd4(<85k%Yd)$wrAvZrIGp!Q0hJe}8#y|}ka2rZ8b5n~;5_1bM^_ZAKEXkQ8 zWXiz6*q#{@Q4-6v-9>hE{&S69eP zu~iQ@^)>JLw)` zrvQUEB~dpq#n@0c#n?E-+|wW*Wl&ykclD00TrHB%^PrX8>|Ch;8Lx zl$i>21;|P}LmRL>ikOW)$RS7$vxA5L{R(8kLk1K~@X$@o0|se1Fzj@u%;08VV9xM# zaSW-5dwbnKLnc+?_{aC3&sopBd3JtQ(v@XqHyS)v>aGmb3e05T4-#}zh;se-v z_vZ8Otbac~{^6X?3|7y&4Q@&Ywr|^Z>}gSD#HKgzj@A78p5AW~+7~l>Epv9%g|~%! zwoYT4y-sZ^^Qv9k94cAwO6T6)XvMFw;+(#K;?J*VW~D`~GUXI@y|_0s>i%-A^$o8l zB}KQtuT`3`Ozg#;_LB3)Df<|hjIK{?=m@CKeLgECYTZ>HVUg~m*6YKx^ckAh-T1cR zePzH4d8h8#9^1b!E;R01z|^I%`FenITNB5glIvM%Q5!>n76kf7`Om+kQyJQo`+aBb z-oOj?F1wQTJ>9S8XhzP8|Moua-X5))VW+(g|FGzjUwJjlUA3p&{OUgG)w*ux%$bGvZ!LUyA^Hk?oJy(Ut`le77(@#)o0gcm$Q=Ax z{90LTl??FmMr^!XwxB<9Pi#|&MA4Wvgze%7W;bts#h#2rcXY(z7lt1 zJl4RaAo=FR`u#Jfg$gjp$L%V#?p05g@;~ldA9ry6-&t>V`>&Y$d)k}z_Ck*STrnyf zX>*E?FRn6Kw?aF3-ii6|(xU1d?<`O`JK4*BY+e`YGkXlUmWA zx;%%^YfnA3^v|cSX{oFewLKkWT9$JDxzWEw-Ckj@K~>!Hy8m8#>eow%te3H=Dac7l zQTct`^4i9!;zwdUyEt5ya^C6OzH;6_lgm++A)DTu71_s<^)q$5$j^+J#mV*=4>uT#-&HwWCYwORQGoOEEPVO;0CV`*W byznnClbNc}$|oydf(koNS3j3^P6XU~{ literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-15.png b/data/images/powerups/counter/counter-15.png new file mode 100644 index 0000000000000000000000000000000000000000..745173a2888c2467b184345fbe9318f30007532a GIT binary patch literal 1168 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!3dtTpz6=aiY77hwEes65fIyxmw5WRvcF>G7U0ueJi%ihP)N1JHKHUXu_VKYn`7@Aob znphcIXd4(<85k%Yd)$wrAvZrIGp!Q0hJe}8#y|}ka2rZ8b5n~;5_1bM^_ZAKEXkQ8 zWXiz6*q#{@Q4-6v-9>hE{&S69eP zu~iQ@^)>JLw)` zrvQUEB~dpq#n@0c#n?E-+|wW*Wl&ykclD00TrHB%^PrX8>|Ch;8Lx zl$i>21;|P}LmRL>ikOW)$RS7$vxA5L{R(8kLk1K~@X$@o0|se1Fzj@u%-{w_$q7#v z$B>G+w^#RPi#SRg`}p2^bNTkTBDSdu)U)*eDa@VV^`AldpwSZX=+~e5H*DQ<@!YX{ zMoW8rT@ETOa0_IS)<1Rk?H;l6S$C9PHSXRy;W;z+VQZe>A2yt6`ZIAVyJ#k3;3Xd%D&(KKAz%!{%-wEnH5_WBv;mz1sqxWe(~JscXg5-*PmwfPG zU-f~Wi?h#q8J}Hs$-wZ~a{<5T-!D3IozKgyxaHiPxi?ddv+ zp8s$8rFVdQ I&MBb@04L741ONa4 literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-2.png b/data/images/powerups/counter/counter-2.png new file mode 100644 index 0000000000000000000000000000000000000000..043bfd54290e9daa6cdc54f78fda94e3f40569ce GIT binary patch literal 5778 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 GMgIqa)OaKS literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-3.png b/data/images/powerups/counter/counter-3.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2aa029b94dd55c913e9ea008330be0c02e0d9b GIT binary patch literal 5331 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 VPo9^*k#-;fz);srr%oG={Vxc&wOjxI literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-4.png b/data/images/powerups/counter/counter-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5739448afe7a4a71dbe6810af1797bb3711d1c GIT binary patch literal 5106 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 H=@j)}o$V*F literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-5.png b/data/images/powerups/counter/counter-5.png new file mode 100644 index 0000000000000000000000000000000000000000..e94820fdd861adcc99d1705fa5420a0710d7c979 GIT binary patch literal 4832 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 DyypQ| literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-7.png b/data/images/powerups/counter/counter-7.png new file mode 100644 index 0000000000000000000000000000000000000000..bfce84f778463358d484aa387478ccced9fdc820 GIT binary patch literal 4051 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 XI^2=IOikXsTLPvhEpbl`+++U%$NIn0 literal 0 HcmV?d00001 diff --git a/data/images/powerups/counter/counter-9.png b/data/images/powerups/counter/counter-9.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2abf995f898212fe81dcc3eaac9602e76f4807 GIT binary patch literal 3496 zcmZ`+c{r5q+kR#+c7{;4m$5HlW-Kw*qL3v!$s1!9CXB(1HH@-mi4dVed3j}ti0nj` z>}#_2;k7m-iX`9o{odpKzTfd3-}4;zb6wAQ-RE^)_jx@3JPB5o#++(C3V zB$Mj_0KoP3bb-2kOR#hh;%;Va1e~1S`OU@YbcC5~YH^u)gNYr=rSvS-q=gPilP^1w zv1l?5h4IJH1Av4hHI(4$N(h7@59QJPM{(lgBe6a+4$p25U%DtgV zC&>MyKqmO$0?23|(*NbCssCHVJC9c#06=jBJ14S}g*gi2>!Xau`nuzkgXy%>OGiJL zgvNN`$l~re4+2qFcDu1vR-AyiayV^tAKSXEW*1$Bfb5|40~_*HQm_pOv2die#p=@HBW}1M}d4Yhj^}W#1 zP-oh~&I0%ABxGWZ24B(Zrw3-5x#+&$4Ym=kooMTjka~p*QO>zhMTx$^>lsQG+ zp&9dsjl;wn3ZA{3saXpw>+js^?RyZC$brs`M1v8}8d&at9#B-VqKZ=H^@`w_u7>(w zRjnB*E-;DrhxSnB1V@MTE@e_SyMAUqcbtWUn93%Bl1AXJG#`emzvt)VU zUxWk(K!_Rz1M@IoL^^|sM|q-cb-J3SQHR?d#nvr+iNj+K0$}db0b$ zXxPo1DjU|WA1-`rM!+B}e_nEjJCXx90&#%FIs4gNPbj-F;5QZ8hWJD4O{oYO%1SLDzH52_|r6^kxt-EwmhTBq&I zgg-Wyvr-fC*+D*%bt(&Nu3w1=e(xKzJlHvi5X#8C6mJfmH1-9wU6Ip4Cv(0($@(69 z888&_`eZAFnfZQ~+OFg8%p%R57hX_LfSnG<3^0c4Ys!+#R>*qyVgI2LzNO1}dz1(Gv+~<1{ ztzJ{g`Xa8Se5`zlT_5xJ2byqE)$vov_C%0FDfiDe#*5ASLySqk?2V1Pw?RES z{6*$z28M>~xHA7yWXo;Q=eFus-eB0qz@xmAEx+%~hgheNaGS|LJukbuEYG4AM03fF za_&vI=-R}R^JRny9U&!or$-9r8X^=bw-53QEtt(qFBTte2|vQiCpQ{(tHbSU^Q~!u zvGHycpE$j7CePyw3*YrQx-;0BqH4Yg$=TQzoW051S_naH{l+*5llZW%*{`i~>(N?7 zuYX=^^xM9KCWDFx^;6D!1HGX{*_u&|z;t_07wnt&-MY<*beDLGY45;D&5FDp_D*12 z@O@06g8zR-i}IBL_c~eEL{-`j?j9#qr5EH^--R8x1Pi^%v{x(ADmHV<<6%WTrk+fP zy<|LkwitZsd_K3l4Iqe?z_F~)5s3i_JR8i;eEJOgO2=jIm3P{ zOopVoLp?r}=pQ?6V}}!6=J4h|9$vz8$Jn~}5y3;YCZkb^{y@eGvfh5L`9u)SWrkSElF5!R1Ai-@~ z2YZ2}xj19(x#)Aw5rZMNPN{B4hna+bg0^zCGQ!kuj6QohF99W7jscV4B|F|sX2_KizgCkbCE|O#Z@SdV8|g@PVbBWM*x~CeS*-eD#bXNCNkP=h`M=RW>cJOj zYq^!Gy%t?*MeX%q5Ow=Ve&%)2AlJNHoA<5jz*0T@3PWdHx^+do2#o@H=ULKg81pKOtpMcOLm;=(n;qJ>Nx zSMIgI$*N{wb?5zow&w)uOSi$Q?bgV07T800;haNwqMzeDT7tVpM}hM6I~^n~a$j&>|j=b7FJYLAa8Gh&uZ!)itYYokWl<7eg5<(!}PMHQN<;(TIME_UNTIL_IDLE) / 1000.0f); @@ -293,6 +295,7 @@ Player::set_winning() if (!is_winning()) { m_winning = true; m_invincible_timer.start(10000.0f); + set_invincible(false, COUNTER_STAR); } } @@ -380,6 +383,29 @@ Player::trigger_sequence(Sequence seq, const SequenceData* data) GameSession::current()->start_sequence(this, seq, data); } +void +Player::set_invincible(bool invincible, CounterType type, float time_left) +{ + for (int i = 0; i < m_counters.size(); i++) + { + if (m_counters[i].get_type() == type) + { + if (!invincible) + { + std::swap(m_counters[i], m_counters.back()); + m_counters.pop_back(); + } + else + m_counters[i].update_counter(invincible, time_left); + + return; + } + } + + if (invincible) + m_counters.push_back(Counter(type)); +} + void Player::update(float dt_sec) { @@ -782,6 +808,11 @@ Player::update(float dt_sec) // when invincible, spawn particles if (m_invincible_timer.started()) { + if (m_invincible_timer.get_timeleft() <= TUX_INVINCIBLE_TIME) + { + set_invincible(true, COUNTER_STAR, m_invincible_timer.get_timeleft()); + } + if (graphicsRandom.rand(0, 2) == 0) { float px = graphicsRandom.randf(m_col.m_bbox.get_left() + 0, m_col.m_bbox.get_right() - 0); @@ -800,6 +831,10 @@ Player::update(float dt_sec) "dark", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS + 1 + 5); } } + else + { + set_invincible(false, COUNTER_STAR); + } if (m_growing) { if (m_sprite->animation_done()) @@ -2576,6 +2611,7 @@ Player::kill(bool completely) m_post_damage_safety_timer.stop(); m_temp_safety_timer.stop(); m_invincible_timer.stop(); + set_invincible(false, COUNTER_STAR); m_physic.set_acceleration(0, 0); m_physic.set_velocity(0, -700); set_bonus(BONUS_NONE, true); @@ -3084,6 +3120,7 @@ Player::multiplayer_prepare_spawn() m_post_damage_safety_timer.stop(); m_temp_safety_timer.stop(); m_invincible_timer.stop(); + set_invincible(false, COUNTER_STAR); m_physic.set_acceleration(0, -9999); m_physic.set_velocity(0, -9999); m_dying = true; diff --git a/src/object/player.hpp b/src/object/player.hpp index ca64c01eb14..bbbd579da9a 100644 --- a/src/object/player.hpp +++ b/src/object/player.hpp @@ -27,6 +27,7 @@ #include "supertux/timer.hpp" #include "video/layer.hpp" #include "video/surface_ptr.hpp" +#include "supertux/counter.hpp" #include #include @@ -515,6 +516,8 @@ class Player final : public MovingSprite void stop_rolling(bool violent = true); + void set_invincible(bool invincible, CounterType type, float time_left = 0.f); + private: int m_id; std::unique_ptr m_target; /**< (Multiplayer) If not null, then the player does not exist in game and is offering the player to spawn at that player's position */ @@ -580,6 +583,7 @@ class Player final : public MovingSprite public: bool m_does_buttjump; Timer m_invincible_timer; + std::vector m_counters; private: Timer m_skidding_timer; diff --git a/src/supertux/counter.cpp b/src/supertux/counter.cpp new file mode 100644 index 00000000000..96f5cc9de86 --- /dev/null +++ b/src/supertux/counter.cpp @@ -0,0 +1,78 @@ +#include "supertux/counter.hpp" + +#include "sprite/sprite_manager.hpp" +#include +#include "math/util.hpp" + +static const CounterDef COUNTER_DEFS[COUNTER_COUNT] = +{ + /* COUNTER_STAR */ + { + 14.f, + 16, + "images/powerups/star/star.sprite", + "images/powerups/counter/counter.sprite", + "images/particles/sparkle.sprite" + } +}; + +const CounterDef& Counter::get_def(CounterType type) +{ + return COUNTER_DEFS[type]; +} + +Counter::Counter(CounterType type) : + m_type(type), + m_counter_on(false), + m_total_time(get_def(type).total_time), + m_remaining_time(m_total_time), + m_num_parts(get_def(type).num_parts), + m_counter_idx(0), + m_effect_angle(-math::PI_2) +{ + +} + +void +Counter::update_counter(bool counter, float remaining_time) +{ + m_counter_on = counter; + m_remaining_time = remaining_time; + + if (!m_counter_on) + { + m_remaining_time = 0.f; + return; + } + + m_counter_idx = std::clamp(static_cast(m_num_parts - m_remaining_time * m_num_parts / m_total_time), + 0, + static_cast(m_num_parts - 1)); + + float step_deg = 360.f / static_cast(m_num_parts); + m_effect_angle = -math::PI_2 + math::radians(step_deg * static_cast(m_counter_idx)); +} + +CounterType +Counter::get_type() const +{ + return m_type; +} + +bool +Counter::is_counter_on() const +{ + return m_counter_on; +} + +int +Counter::counter_stage() const +{ + return m_counter_idx; +} + +float +Counter::effect_angle() const +{ + return m_effect_angle; +} diff --git a/src/supertux/counter.hpp b/src/supertux/counter.hpp new file mode 100644 index 00000000000..efd3fd6c7f7 --- /dev/null +++ b/src/supertux/counter.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include +#include "sprite/sprite.hpp" + +enum CounterType { + COUNTER_STAR = 0, /*!< @description Invencible Star counter. */ + /* Space for future clock types */ + + COUNTER_COUNT +}; + +struct CounterDef { + float total_time; + int num_parts; // number of segments in counter sprite + std::string center_sprite_path; + std::string counter_sprite_path; + std::string effect_sprite_path; +}; + +class Counter +{ +public: + Counter(CounterType type); + void update_counter(bool counter, float remaining_time = 0.f); + + CounterType get_type() const; + bool is_counter_on() const; + int counter_stage() const; + float effect_angle() const; + + static const CounterDef& get_def(CounterType type); + +public: + bool m_counter_on; + + float m_total_time; + float m_remaining_time; + +private: + CounterType m_type; + + size_t m_num_parts; + int m_counter_idx; + float m_effect_angle; +}; diff --git a/src/supertux/player_status_hud.cpp b/src/supertux/player_status_hud.cpp index 638f911bb4b..f097cb921f3 100644 --- a/src/supertux/player_status_hud.cpp +++ b/src/supertux/player_status_hud.cpp @@ -17,10 +17,12 @@ #include "supertux/player_status_hud.hpp" #include +#include #include "gui/menu_manager.hpp" #include "object/display_effect.hpp" #include "sprite/sprite_manager.hpp" +#include "object/player.hpp" #include "supertux/debug.hpp" #include "supertux/game_object.hpp" #include "supertux/level.hpp" @@ -30,10 +32,14 @@ #include "supertux/screen_manager.hpp" #include "supertux/game_session.hpp" #include "supertux/sector.hpp" +#include "supertux/counter.hpp" +#include "supertux/globals.hpp" #include "video/drawing_context.hpp" #include "video/surface.hpp" #include "editor/editor.hpp" #include "worldmap/worldmap_sector.hpp" +#include "math/util.hpp" +#include "math/anchor_point.hpp" static const int DISPLAYED_STAT_UNSET = -1; static constexpr float ITEM_POCKET_TIME = 6.f; @@ -47,6 +53,7 @@ PlayerStatusHUD::PlayerStatusHUD(PlayerStatus& player_status, bool show_tuxdolls m_stat_value(show_tuxdolls ? m_player_status.tuxdolls : m_player_status.coins), m_bonus_sprites(), m_item_pocket_border(Surface::from_file("images/engine/hud/item_pocket.png")), + m_counters(), m_item_pocket_fade() { m_player_status.set_hud_hint(this); @@ -56,6 +63,17 @@ PlayerStatusHUD::PlayerStatusHUD(PlayerStatus& player_status, bool show_tuxdolls m_bonus_sprites[BONUS_ICE] = SpriteManager::current()->create("images/powerups/iceflower/iceflower.sprite"); m_bonus_sprites[BONUS_AIR] = SpriteManager::current()->create("images/powerups/airflower/airflower.sprite"); m_bonus_sprites[BONUS_EARTH] = SpriteManager::current()->create("images/powerups/earthflower/earthflower.sprite"); + + m_counters.resize(COUNTER_COUNT); + + for (int type = 0; type < COUNTER_COUNT; type++) + { + const CounterDef& def = Counter::get_def(static_cast(type)); + m_counters[type].center_sprite = SpriteManager::current()->create(def.center_sprite_path); + m_counters[type].counter_sprite = SpriteManager::current()->create(def.counter_sprite_path); + m_counters[type].counter_parts = m_counters[type].counter_sprite->get_action_surfaces("default").value_or(std::vector()); + m_counters[type].effect_sprite = SpriteManager::current()->create(def.effect_sprite_path); + } } void @@ -157,5 +175,60 @@ PlayerStatusHUD::draw(DrawingContext& context) } } + if (Sector::current()) // draw only if in level + { + for (auto& player : Sector::current()->get_players()) + { + const std::vector& counters = player->m_counters; + + for (int i = 0; i < counters.size(); i++) + { + const Counter& counter = counters[i]; + int type = counter.get_type(); + + if (!counter.is_counter_on() || !m_counters[type].counter_sprite) + continue; + + float xpos = static_cast((m_counters[type].counter_sprite->get_width() + 10) * (i + 1)); + float ypos = static_cast(m_counters[type].counter_sprite->get_height() * player->get_id()); + Vector pos(BORDER_X + xpos, BORDER_Y + ypos); + + context.color().draw_surface(m_counters[type].counter_parts[counter.counter_stage()], pos, LAYER_HUD); + + if (!m_counters[type].center_sprite) + continue; + + Vector center_sprite_pos = pos + Vector(21.f, 20.f); + m_counters[type].center_sprite->draw(context.color(), center_sprite_pos, LAYER_HUD); + + if (!m_counters[type].effect_sprite) + continue; + + Vector center_sprite_center = center_sprite_pos + Vector( + m_counters[type].center_sprite->get_width() * 0.5f, + m_counters[type].center_sprite->get_height() * 0.5f + ); + + float angle = counter.effect_angle(); + Vector dir(std::cos(angle), std::sin(angle)); + const float radius = 29.f; + Vector anchor_off = get_anchor_pos(m_counters[type].effect_sprite->get_current_hitbox(), ANCHOR_MIDDLE); + + float pulse = 0.55f + 0.45f * std::sin(g_game_time * 3.0f); + context.set_alpha(pulse); + + Vector base_pos = center_sprite_center + (dir * radius) - anchor_off; + + for (int k = -2; k <= 2; ++k) + { + Vector draw_pos = base_pos + (dir * (k * 2.0f)); + m_counters[type].effect_sprite->draw(context.color(), draw_pos, LAYER_HUD + 1); + } + context.set_alpha(1.0f); + } + } + } + + context.pop_transform(); } diff --git a/src/supertux/player_status_hud.hpp b/src/supertux/player_status_hud.hpp index 47ba6e12e51..6bdf63634b7 100644 --- a/src/supertux/player_status_hud.hpp +++ b/src/supertux/player_status_hud.hpp @@ -29,6 +29,13 @@ class DrawingContext; +struct CounterDraw { + SpritePtr center_sprite; + SpritePtr counter_sprite; + std::vector counter_parts; + SpritePtr effect_sprite; +}; + class PlayerStatusHUD : public GameObject { private: @@ -60,6 +67,7 @@ class PlayerStatusHUD : public GameObject std::unordered_map m_bonus_sprites; SurfacePtr m_item_pocket_border; Timer m_item_pocket_fade; + std::vector m_counters; private: PlayerStatusHUD(const PlayerStatusHUD&) = delete;