From fdcdb8968494432f4a041e9180eae4ff4172bc5b Mon Sep 17 00:00:00 2001 From: Luxferre Date: Fri, 23 Oct 2026 20:17:15 +0300 Subject: [PATCH] games: progressive difficulty + Tetris controls panel Snake: speed derived from pixels/second; +1 px/sec per 5 food eaten (pps = 70 + food/5, step = cell*1000/pps, floored at 40ms). Tetris: speed derived from pixels/second; +1 px/sec per 10 lines cleared (pps = 23 + lines/10, step = CELL*1000/pps, floored at 40ms), replacing the old level-driven formula. Level still drives the score multiplier. Tetris: list all controls concisely in the free space of the right panel (KEYS, 4/6 MOVE, 2 ROTATE, 8 SOFT, 0 DROP, # PAUSE, 5 OK). --- overlay/rootfs/usr/bin/snake | Bin 13672 -> 13672 bytes overlay/rootfs/usr/bin/tetris | Bin 13668 -> 13668 bytes prebuilt/games/usr/bin/snake | Bin 13672 -> 13672 bytes prebuilt/games/usr/bin/tetris | Bin 13668 -> 13668 bytes src/games/snake.cpp | 20 +++++++++++++++----- src/games/tetris.cpp | 30 +++++++++++++++++++++++++----- 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/overlay/rootfs/usr/bin/snake b/overlay/rootfs/usr/bin/snake index 6b11ff99886c7c986e16bed83bbd53a097c43bcd..a77184b9e589e03cb2a892d794acbff208d473c3 100755 GIT binary patch delta 3471 zcmchaeN>cH9>;&ryuk1>FvE)s3^H%1=opO*xRt0QJ|Zv{lpZCcLdA9lIYnhIf;N=4 zbyhdAYa61wxo+($S=gc-G8Kh#mj$oPEyu&gXaE ze)sKpe)mpqWp8DJPAJ@(Y=|s16W!9*yyY{uA;qO6JQ^YaP-Q~1ZYfbl)R06JHdc-# zX;7{~xn}FPOSE@Zme5*ag@Qie-0bqXFLyjS)bf_|1B=!Dx3Ed4Qdo_Us?9-r-p6Qv z>GVPldt0ywE_OC?%|9e%H@nCa&SfwiJa)KfKyGh0Q8KDAu8b+u|$hFu_>jTaYSXD@kHgE z2}Bi~i9{|=OreTXM^w$3OthLag{X#8PqdCRm8hO`Jkdr@1JNs-nAqmo^RRb zby3mt=EazvEj_Bh(Tm$q z-nuLD3t{;uTQ11|z4=1f&xbG4n7!x@d%+#Hc!!;Phn>xBJU*#$G8yrEZ>@NjKTv#S z|Cv&sw3%&*wiv1=*NWa{ltF==8@Se|1r1%;XdUcBYa}qYhyjBbatJzxhcwrBFLw&D$wT{fZ zgy+v<=hZC}`iCj7H$;KL5zF&rE%Tz(HorOQHSyY+$9A}U($4u1dp~A-tm1bbaR%x* z0!v@;NyF^nSc|25BBnCERyL?D7+!2_$fsCv6AL$Kj@kxi-o3V3*diHH> zqEN+xu{qP$-}FiMOs^C5@a4I>pk>o#pEPwkpFzgBI&rOd)*T8e`ls(`%%gxDJ?Yq^ z8dI|Lk|dt=Qx*jVhZ-fFjjZo2rF2#qaWDE&TN z7%ipI((YeMwJj$u`LZN$dT}6R^7ENbrc^WjZ-*E?VBr#he1y_HNp z=`2f1oZ(q~<0~n_CKpdiCANx-6mSf$;2uWTe&)MBejmGod;3@Cgxv$ifTzKu&>E-`x`DtKfV!b45&UANQa*i&L<3X?#Wkn=q|kz}~zv)C_~RoMHKYRwU9k4Ehg z9B|$6`ZZd83NDUBdJ;?1=~8$4kMyb>&6laY8I^iaxDS>1$wtH;(7mc&isWNZE@WhW z-DKf3i%)(!d{?iqJrsP8ZAzZGaF(CiyKt27E!_<_>8QI6T#me4FrkP{2~K=s2Y-*y z>&n-=l#EBMP;j`H8u1!E4Lw5^VTi7t_sfJ(Fox+<#;e2N_Zu8l-0wa%FXiQURqrA9 zBl-XFhYO$ig(v9sP%xGGQYI_^fSx{KYW*Z<*WfCbj9Fc~-2x*^7itn430@l9UD@Ri z(~JZ=2EXu=ZMWN0shA-!#XYhHnT1#n;$KFu#ZA`4a~H;HzQ;UzlW>^*Rc{quVV~(I z>l+3?a=nw+-TlOZhnpw{Hd7g^F12~kw9Gm5zzyzoXazFzptCi#Rf%d^J zhnk=w9O!A_aol^Fp$2FX^cdvp&$Rmb@1BwERG6x<;&mcccTLv)f_d(B-<0*Dt-#km zCCb-t)z^r7J>{7TG7Hy>uE;*W z7Gr*KNG|K}$7xeU9s_pAXISyoTUIR#1sB~UlPlj;F%mpGKs)$`@~xB)gi9W}jskf&w#l=|MQA&-FKlfjT@{~l$%Q36{c>w7rgiL2i>1U4({>xWUVRco$` znzvF%q=tC27AzF!M`Jt%;`&Bzy!mP{!a#&u*XV^3w=GgYxP9Sb`Cw*JVY>3xE&2dl z@K5CuT1SBz2zR*AM~+_|t~@9r7wX}TN4SWNUQY=(NNzW>_cJFY*Qkg>q0m!&JOMBg z=^J1e)0(XwemlSYtVU=5XD#{F9q#4piia=h?Z+L7xy82%wkVlU&D2?j2)?9Tmsk!` zdkkw=ZZ|6%%=na;-)>Qk{%2y^YzvFdPGu$8(aO<( VNo-lRC4%p&4u?xG`(yUG{{dd>7196z delta 3414 zcmchaeN>cH9>;%oh8c#JfdK}2nUQ%zc^NfiM%UIiqzB~1f?cbnWD65pFxsegTi$Z; zt!2wHy4fM5R$cR$n&3e@)xiUsnb=`>hqSYr)|fBJVBq8-=OK*Q?*;Anf9LFT&WF!^ z?)}|+pL_2!_qhzL8CdgbJX19%m_komh$d;yer%!MN+eJbE*%kr!e@a+lSCdrUUJSK3xTF!P}I(MvCW_!F;T#waK1 zi#{g$OQv;B{tmM-iJxHexn5yrPx3j6BDRTdQkd8u`8$fI*n>P)`6zp~^Uumi#y0a! zK}9@Bq2rf=lB0Gc5s3$iCN1qnt2vzss)rQZ72M31XiPjqlV=ybF*<-K3~u6jV0vws zsMarP;u0gp07=JpXq+w-4J;;#MYKU=E*4> zOf*keL$p9RgeXfmlt>arKY7C8M9YM=M8&XcN(9mUA|sNhL^z75R5+TbOgM(9Tv$(3 zAv}esN*F_^7LF(SlW+o2jc_7SgRp_9QP@bdQ5XYi5;kFdh0R2-E+!XEu@Jp3GOR=` z!ZxBd;bfxi!qbU%38xV45l$uAFPuiyA)HQhNElQ9f$$8XF5#I(J;Hc-J`ui)s8=|H zs84t{k$W+wV@f8`DUspekB25@b%{6T(=8X2pKZR-HPUtYcKXmA>HT-4cioY0L%Opm z^b3YbAdlRXMrQoIyH1+v^%Y(1I9cM68+doP%~YCJC%IQrD*3iIUi8etoGLM&Pjlt(WAgf0{&0X5Kn6)VEi4V#>D`SqW zwNk+U9Di3km9_BW+Pk&o@njVxB46U#i1umU+$7&y0rD*zx2+|6sT-vkOZSGoCfzvs z$hHcPym=|$-$c9_Ir5xKnva+)-^1%X@^}1ikv3c3bPQ!~opiD!v7&O@!&yZ>QfB$) zZXoj$9Y+RyTRif9{-4MtteQvZVp%Cq(ao9t^iLi+b#A?6KwGYnW$iCr@yN!xVg&J1 z>ZMxgbY;LFIy84%OE&qG=t;w0)>#q;Hpx=2momwBajZp-&mjB0{<16NTfmR&4!g{A z&|a0oPQIY^9$7E$CR)#Kzws?v*g7hmk+V=I%l8Mgc+<(OC*&;i?WnujFCyx@WHQ%D zx|Pfvv(_V@PsU=DizhU6;nlc?7l|wxyL;6{mI3mmDPi&v&>1>dMWX_I;5pe9{m)v zzh5|+)phw$zPqYc>h~&VpUJ+@{hL8j6!mu$9L%eeYNXF)&8zKvrhZP?KMED1iE`zY z9sEhXgKgzI^d{vigwI zP%qU`KBP4fr=QM!?&VL_6U|FpNEB z7jT2MpbE5s`)=LOf*%1oum~u?F!rb2pcSNJ&oYB>@HSWk)Sw4@+GbE?ry|;o#C@O* ze2Yy_YGz>&2^J}GwT(d7S{Bkb&6tW_PKNjbVQ4gv* z=*V~2S>3461wP^L#+kGS#2yQFp`?$05tpLfh`aTm8ad~ANW97QnK$6?4ulq7EHNAm z$*aLGQ|4t>4OTy~T6cuHixHiR=+kI53F%%qF%;uOT5~wKFc_=9t;Bv%ogbW6i#Ivo z-|amzpvl^Mg}Sd}&p(HFAL@UJVOR?aZtR=!@r}JRvajBVTzHEZ|S{h7@QD>m>8Uo~OFC=dpfuhwezgAB}d?(S~SO<}WAyHAX-1 zQRRx<|9XSjzr5^m+8Xeu@)Sdw>T^WB!XGfCSk7O2qC&y#6+0^#C)+7R5+C6W6xf=mHQDtZm_Uk?lsui>pa$&#@hH|V*<!azOG5Pp8jj3 zOTh)u1m=QlC0-;jg0Jx&Z~?r5FZAQ^i#W(U14@7qOb4E!>2}Xh%6!jIYM5sz&5&Nm ztks8K=%|;1EUC+A`aPqb^rJ&TVMmA5h6b0k-j;mtw7gHeiso2mh+2L5iQEksP8pp1Wk2nmxS@loX8o|S{u%)E|AIpcUS?k4`(;VYfC Q5V5L8d|@u}mz`(-2YOudt^fc4 diff --git a/overlay/rootfs/usr/bin/tetris b/overlay/rootfs/usr/bin/tetris index b703e0bd846567d03c564e5cdf270dfd2ea3662a..76d4023b62875460624486b1e88cf4ba0072d25b 100755 GIT binary patch delta 3867 zcmcgvZBSI#8Gg@xz%JQE5CY4G?8gPgfQsyDDcC^pvQ@x96cfxO4M9v6$41AhC5SE> zV;Ex_%)v&Z<6vu2ZFNG5No|@0nixwm#(@b#wKYOg8?=C3h{@i%&TgNxO1$=OXL@Iz zeV+54bI-?n&imf8msek2-D+Wb_9WSi*+ku8>?vNkU>1=H&=Z~*A_g+d2JXLwSPfA- zDkE;!qewBRk3oIRo-ZDWRX0}fw!#;)l=#aNb7p_t151sa zhxf%8;qlUG+dTdnlUN=9m=*BTx)`q0*w_Z1p{ZcI`9_VEZRC43Pq4@NH=4Dqv2&Gn z3S*pa)K#!0{3D$+wmySMOlc~a=_LAH)oIi()9C8!>NoLak+13*2Gj8I$dy@QSVnK5 zF;*FVmQR279`W{h(E%Q@6lB2|Z;@a#Q90O~5KUAm3{!}z1Y_FO zf~OKaCOD3$MsPe)o!|r_k6AXq8w4j4H3&{2Y7(4E)GT-!(GI~@q87ne z*zQ8|Qi7eRRTvyZZGt7DeS*`84hn|r+Xc@cIwCle=&0bCM8^f+N7Nx0u0JUlNA8qh zoVIrb;}mrZoAA|Ux*q7M)pXMp2C17g4hzL`y>bOq7V3p@st15*JJQ5xVKL|7@Jtroe;1WpFd zA`0IHb^;#YAaEM<`j)RqOkwN!#>4{iV~E^-*t&rp{$8ThoQ4=q1>#ZD%daNRFkgq7 z0EUp~F7s)Y!lctEy^YdEy!A5lS@2FwwT*AINYS;Z8G@w_HST!+y5&(;$yw4P#sQ=Y z;lU&P$)rC=Y)7-LWFjlMD$nK;-N1}JU=CwS@`mlLVY)k>-heZ zSFBG#l_PPcAtfn*==T$(sTUXRUfdw><`t6aAQc}^)>d8oK2q3fI?uWXWo{`hN|nWwrkZ8bG- z4^QJu(h^rj{nxZ~x2E;dlkTm@&h?=DCGZKb%Stq;#AnR9 z>RY(KV^E3NTj4Vp8s%uX*f0+$;qO~5k*#BY_Y5kd{Bvt!Z2Q;+rAoSRwI}A-xXu{# zH*&qr$}aK@o84PIHlWy~h3oGY%@UTyed1Q(OJ*deOnJ3PcBtyCe;dlZYRZ z;GZ#tkK4AeZobx@E0|i$_G3_f7N#_eiUx;yFfn<3}u-=e;YmB z>ZN$J--{ubgZ4fhZqy#=C})n2vY*(Su(r+LEv+qZyo@=T(B_V9SKugY&);Qh4jh5) z=XcpQ1=?YIBYdynVh=Lo7$-@zCm!@GBfP_rU|C<5 zmiJJM20Iw}eX)Jj&S#c{{Gl8ClEYyiyRmP0Kyf)EP7Em73&jChQ7lr$6N{Kn%LbJu zZkK+@w(@#uj&a9`!F9Oga$hDtEX7IrW%KhE$846PZ+9B<@47KRyl+Lf_brwGMY3ww z-^k+smh9e|8}}dv2S%tXA2IPTVnf7>xNfBbhhW15fFtmK4+XgMINj$x*P#hqR7hhTggXcf|y87%Jp_{@gy?N}JWLxf8%?(YxH zPFyS;2_J_472pLL!rS;{gm3@&(1stlge--({y}&!1ioT~Z)o^mz)d7Fq1*VIvu7l2 zKq(Xotrhd|fpsX~07vlH>@2VNGc@_E!(jhsJn}yecv$!qk8tVavnq-oPLDGd5eYX{ zYdWKHf{d->#$2mWI9FhZ&qYZ%L*N;{BG;-HuG+x26!7pqw6BAU z1fuw!xpCa&G#Muymc#8%tFaxk5$NHIoz@5s=H$uX&o~{%W=Me|zTaunXXEr|^Y@*S y0hc5JUAVuSPLn?T@0FWf5;wR~dAZA^5C31~kGmwJ*l-K3URQXmD~=y@_5248xb@Ef delta 3706 zcmcgve^6A{6+U-&fnBl-i;Mgagk2tj22pTV$3`Ms^F)4ZfEbdHOwtl#l_aK;NK-|^ zt_ev~Ln6*alNj>bq+)QiVyw*&unD!;nhq42k&GFL!H5G(7sc+YIBdVWqJ95orf=q( z@4NS$d*8ih&%N*L@DsyNG{&(I?+IbSACwT!&h(4TFur(~pxHs2T_KPi@F@K&{lk_p)$`Yd- z7%$!td|xWg-wd|TLVo~@VoBE7tT;cW-tgRKRh`_i`E zCIBoJ6DuPA0l8cplMwaEy*ub7mN+PEI65{L9msmF_+vFV(kSf$HU+NIL+ zjCPCNt5DAFfdKuh= zBwPYy0UbD69|I%kuLsuv>!BUsCS-3u(1C0o1NI@i9|nH|K7gb868Io8zX_-Xild4C zjT3PV7y?=?IL_d#Oe&;A2p!OfqvHYcfI?syFpgtYha`hCLGru^tA(Bd?Gg4v=#@q6mY?EhR=;lH_b;Y4TwX}5WgobH(r4n z$ALeKQKz80!JlEN-Ml4Eir5FsIrO{%OO1tp6Za6S=S$-sFhsy0B6yDPiT_LJakP#a z`MNpdN#}8i(2Q{>uF&JS1|z`vKy)hqWx^a5!+)EQ8!`#U{rszh*OT`_dBTbA$33(V zTFk3~el34j!B%+}e<3j)--J&R;}bjun$f!~`h(l#KJVI$K5yBIKJWdv^?Az^w)4Tn zgau!C)++jh1#;LFv#(n%D^kVf-l}3sA5>26DDhd0gG&2%u6cvX2`JYQo>dV&n|+Ak zl=ez`f%a<6mThv|)xGW$oh3Pwd$;VYD5^*)j47&-`^x83M!ofrv&2W*xxJPnpO5%T zCN3lvX{_7jzDqr}FO?ka&Q;x=U*e^4g$DjgQv8}I$f}BfKANl3_}K@ z9gg;8@bP4#LB*4rdC7Ozn@0wf+NKhpUSA_eAlTIoK>iPQQ!5WBrP9EqZgWCqEEl_) z_V4t5Upc6huh($t@d3puF;4I}&4|~@)Bb(lfe586IHYAlXPEX^^Gs_pj_=)88(Yga zTW7mBc#mCebYJY%PekYq6Qza|6HSo=y%WWC^4Cg^oifO`YDefH)5LOv*Htpv_-w7* zuaryuSj4pdc5gpkxeu+=?5j&`nLds7PWzX6zc0$p`@Wc^Y?t4&*2%>Cl`?z4Uwj=r zGt%g_KQ6|87_&kQX51lZxJ4rVjx_DB^8Sw_{+9i|p#4u%%|%vQbK(5F?Q)I$ zR^_yR?JbX=1wD>T^&`nB!}Kl3OgCn6j`gSD6)c7JYz#WRGxe%VL?Fk`R)qWM$S1Cxr$NRgSA*iY{fcgw5RGGGfQ!rb=gVF1ODUJQu(K;HuwH(x8bbJ z8Kce($lf|+vB>O|V3FzF=sN;5=}^Fd^FnZ;YtaToE#(1k0A@jVp=g{2T2X5~3qGpB zeGSCGehhuzFrw#y4}e=04qL;cGSj$cURPUvT2AOsTZaPf!@0{nO``!f{K(-AxQ`qN z@iYiN9PTL{7j2WL>|X(Qi~jeXRkW_Bq@yLRa%ci_+uE&_n#9udx)&z<4imToaPiA0D-v~A&8(~MPc!;)l!2&_OK&qhlGLSPer za7l8A2vZq59)WPaJKMsIcBA2Duu{3ro^05J)d-~W z0()|3Bi7W253W7Ma1v60_?vcX2+E6-8N9#-TwvLAj3%j diff --git a/prebuilt/games/usr/bin/snake b/prebuilt/games/usr/bin/snake index 6b11ff99886c7c986e16bed83bbd53a097c43bcd..a77184b9e589e03cb2a892d794acbff208d473c3 100755 GIT binary patch delta 3471 zcmchaeN>cH9>;&ryuk1>FvE)s3^H%1=opO*xRt0QJ|Zv{lpZCcLdA9lIYnhIf;N=4 zbyhdAYa61wxo+($S=gc-G8Kh#mj$oPEyu&gXaE ze)sKpe)mpqWp8DJPAJ@(Y=|s16W!9*yyY{uA;qO6JQ^YaP-Q~1ZYfbl)R06JHdc-# zX;7{~xn}FPOSE@Zme5*ag@Qie-0bqXFLyjS)bf_|1B=!Dx3Ed4Qdo_Us?9-r-p6Qv z>GVPldt0ywE_OC?%|9e%H@nCa&SfwiJa)KfKyGh0Q8KDAu8b+u|$hFu_>jTaYSXD@kHgE z2}Bi~i9{|=OreTXM^w$3OthLag{X#8PqdCRm8hO`Jkdr@1JNs-nAqmo^RRb zby3mt=EazvEj_Bh(Tm$q z-nuLD3t{;uTQ11|z4=1f&xbG4n7!x@d%+#Hc!!;Phn>xBJU*#$G8yrEZ>@NjKTv#S z|Cv&sw3%&*wiv1=*NWa{ltF==8@Se|1r1%;XdUcBYa}qYhyjBbatJzxhcwrBFLw&D$wT{fZ zgy+v<=hZC}`iCj7H$;KL5zF&rE%Tz(HorOQHSyY+$9A}U($4u1dp~A-tm1bbaR%x* z0!v@;NyF^nSc|25BBnCERyL?D7+!2_$fsCv6AL$Kj@kxi-o3V3*diHH> zqEN+xu{qP$-}FiMOs^C5@a4I>pk>o#pEPwkpFzgBI&rOd)*T8e`ls(`%%gxDJ?Yq^ z8dI|Lk|dt=Qx*jVhZ-fFjjZo2rF2#qaWDE&TN z7%ipI((YeMwJj$u`LZN$dT}6R^7ENbrc^WjZ-*E?VBr#he1y_HNp z=`2f1oZ(q~<0~n_CKpdiCANx-6mSf$;2uWTe&)MBejmGod;3@Cgxv$ifTzKu&>E-`x`DtKfV!b45&UANQa*i&L<3X?#Wkn=q|kz}~zv)C_~RoMHKYRwU9k4Ehg z9B|$6`ZZd83NDUBdJ;?1=~8$4kMyb>&6laY8I^iaxDS>1$wtH;(7mc&isWNZE@WhW z-DKf3i%)(!d{?iqJrsP8ZAzZGaF(CiyKt27E!_<_>8QI6T#me4FrkP{2~K=s2Y-*y z>&n-=l#EBMP;j`H8u1!E4Lw5^VTi7t_sfJ(Fox+<#;e2N_Zu8l-0wa%FXiQURqrA9 zBl-XFhYO$ig(v9sP%xGGQYI_^fSx{KYW*Z<*WfCbj9Fc~-2x*^7itn430@l9UD@Ri z(~JZ=2EXu=ZMWN0shA-!#XYhHnT1#n;$KFu#ZA`4a~H;HzQ;UzlW>^*Rc{quVV~(I z>l+3?a=nw+-TlOZhnpw{Hd7g^F12~kw9Gm5zzyzoXazFzptCi#Rf%d^J zhnk=w9O!A_aol^Fp$2FX^cdvp&$Rmb@1BwERG6x<;&mcccTLv)f_d(B-<0*Dt-#km zCCb-t)z^r7J>{7TG7Hy>uE;*W z7Gr*KNG|K}$7xeU9s_pAXISyoTUIR#1sB~UlPlj;F%mpGKs)$`@~xB)gi9W}jskf&w#l=|MQA&-FKlfjT@{~l$%Q36{c>w7rgiL2i>1U4({>xWUVRco$` znzvF%q=tC27AzF!M`Jt%;`&Bzy!mP{!a#&u*XV^3w=GgYxP9Sb`Cw*JVY>3xE&2dl z@K5CuT1SBz2zR*AM~+_|t~@9r7wX}TN4SWNUQY=(NNzW>_cJFY*Qkg>q0m!&JOMBg z=^J1e)0(XwemlSYtVU=5XD#{F9q#4piia=h?Z+L7xy82%wkVlU&D2?j2)?9Tmsk!` zdkkw=ZZ|6%%=na;-)>Qk{%2y^YzvFdPGu$8(aO<( VNo-lRC4%p&4u?xG`(yUG{{dd>7196z delta 3414 zcmchaeN>cH9>;%oh8c#JfdK}2nUQ%zc^NfiM%UIiqzB~1f?cbnWD65pFxsegTi$Z; zt!2wHy4fM5R$cR$n&3e@)xiUsnb=`>hqSYr)|fBJVBq8-=OK*Q?*;Anf9LFT&WF!^ z?)}|+pL_2!_qhzL8CdgbJX19%m_komh$d;yer%!MN+eJbE*%kr!e@a+lSCdrUUJSK3xTF!P}I(MvCW_!F;T#waK1 zi#{g$OQv;B{tmM-iJxHexn5yrPx3j6BDRTdQkd8u`8$fI*n>P)`6zp~^Uumi#y0a! zK}9@Bq2rf=lB0Gc5s3$iCN1qnt2vzss)rQZ72M31XiPjqlV=ybF*<-K3~u6jV0vws zsMarP;u0gp07=JpXq+w-4J;;#MYKU=E*4> zOf*keL$p9RgeXfmlt>arKY7C8M9YM=M8&XcN(9mUA|sNhL^z75R5+TbOgM(9Tv$(3 zAv}esN*F_^7LF(SlW+o2jc_7SgRp_9QP@bdQ5XYi5;kFdh0R2-E+!XEu@Jp3GOR=` z!ZxBd;bfxi!qbU%38xV45l$uAFPuiyA)HQhNElQ9f$$8XF5#I(J;Hc-J`ui)s8=|H zs84t{k$W+wV@f8`DUspekB25@b%{6T(=8X2pKZR-HPUtYcKXmA>HT-4cioY0L%Opm z^b3YbAdlRXMrQoIyH1+v^%Y(1I9cM68+doP%~YCJC%IQrD*3iIUi8etoGLM&Pjlt(WAgf0{&0X5Kn6)VEi4V#>D`SqW zwNk+U9Di3km9_BW+Pk&o@njVxB46U#i1umU+$7&y0rD*zx2+|6sT-vkOZSGoCfzvs z$hHcPym=|$-$c9_Ir5xKnva+)-^1%X@^}1ikv3c3bPQ!~opiD!v7&O@!&yZ>QfB$) zZXoj$9Y+RyTRif9{-4MtteQvZVp%Cq(ao9t^iLi+b#A?6KwGYnW$iCr@yN!xVg&J1 z>ZMxgbY;LFIy84%OE&qG=t;w0)>#q;Hpx=2momwBajZp-&mjB0{<16NTfmR&4!g{A z&|a0oPQIY^9$7E$CR)#Kzws?v*g7hmk+V=I%l8Mgc+<(OC*&;i?WnujFCyx@WHQ%D zx|Pfvv(_V@PsU=DizhU6;nlc?7l|wxyL;6{mI3mmDPi&v&>1>dMWX_I;5pe9{m)v zzh5|+)phw$zPqYc>h~&VpUJ+@{hL8j6!mu$9L%eeYNXF)&8zKvrhZP?KMED1iE`zY z9sEhXgKgzI^d{vigwI zP%qU`KBP4fr=QM!?&VL_6U|FpNEB z7jT2MpbE5s`)=LOf*%1oum~u?F!rb2pcSNJ&oYB>@HSWk)Sw4@+GbE?ry|;o#C@O* ze2Yy_YGz>&2^J}GwT(d7S{Bkb&6tW_PKNjbVQ4gv* z=*V~2S>3461wP^L#+kGS#2yQFp`?$05tpLfh`aTm8ad~ANW97QnK$6?4ulq7EHNAm z$*aLGQ|4t>4OTy~T6cuHixHiR=+kI53F%%qF%;uOT5~wKFc_=9t;Bv%ogbW6i#Ivo z-|amzpvl^Mg}Sd}&p(HFAL@UJVOR?aZtR=!@r}JRvajBVTzHEZ|S{h7@QD>m>8Uo~OFC=dpfuhwezgAB}d?(S~SO<}WAyHAX-1 zQRRx<|9XSjzr5^m+8Xeu@)Sdw>T^WB!XGfCSk7O2qC&y#6+0^#C)+7R5+C6W6xf=mHQDtZm_Uk?lsui>pa$&#@hH|V*<!azOG5Pp8jj3 zOTh)u1m=QlC0-;jg0Jx&Z~?r5FZAQ^i#W(U14@7qOb4E!>2}Xh%6!jIYM5sz&5&Nm ztks8K=%|;1EUC+A`aPqb^rJ&TVMmA5h6b0k-j;mtw7gHeiso2mh+2L5iQEksP8pp1Wk2nmxS@loX8o|S{u%)E|AIpcUS?k4`(;VYfC Q5V5L8d|@u}mz`(-2YOudt^fc4 diff --git a/prebuilt/games/usr/bin/tetris b/prebuilt/games/usr/bin/tetris index b703e0bd846567d03c564e5cdf270dfd2ea3662a..76d4023b62875460624486b1e88cf4ba0072d25b 100755 GIT binary patch delta 3867 zcmcgvZBSI#8Gg@xz%JQE5CY4G?8gPgfQsyDDcC^pvQ@x96cfxO4M9v6$41AhC5SE> zV;Ex_%)v&Z<6vu2ZFNG5No|@0nixwm#(@b#wKYOg8?=C3h{@i%&TgNxO1$=OXL@Iz zeV+54bI-?n&imf8msek2-D+Wb_9WSi*+ku8>?vNkU>1=H&=Z~*A_g+d2JXLwSPfA- zDkE;!qewBRk3oIRo-ZDWRX0}fw!#;)l=#aNb7p_t151sa zhxf%8;qlUG+dTdnlUN=9m=*BTx)`q0*w_Z1p{ZcI`9_VEZRC43Pq4@NH=4Dqv2&Gn z3S*pa)K#!0{3D$+wmySMOlc~a=_LAH)oIi()9C8!>NoLak+13*2Gj8I$dy@QSVnK5 zF;*FVmQR279`W{h(E%Q@6lB2|Z;@a#Q90O~5KUAm3{!}z1Y_FO zf~OKaCOD3$MsPe)o!|r_k6AXq8w4j4H3&{2Y7(4E)GT-!(GI~@q87ne z*zQ8|Qi7eRRTvyZZGt7DeS*`84hn|r+Xc@cIwCle=&0bCM8^f+N7Nx0u0JUlNA8qh zoVIrb;}mrZoAA|Ux*q7M)pXMp2C17g4hzL`y>bOq7V3p@st15*JJQ5xVKL|7@Jtroe;1WpFd zA`0IHb^;#YAaEM<`j)RqOkwN!#>4{iV~E^-*t&rp{$8ThoQ4=q1>#ZD%daNRFkgq7 z0EUp~F7s)Y!lctEy^YdEy!A5lS@2FwwT*AINYS;Z8G@w_HST!+y5&(;$yw4P#sQ=Y z;lU&P$)rC=Y)7-LWFjlMD$nK;-N1}JU=CwS@`mlLVY)k>-heZ zSFBG#l_PPcAtfn*==T$(sTUXRUfdw><`t6aAQc}^)>d8oK2q3fI?uWXWo{`hN|nWwrkZ8bG- z4^QJu(h^rj{nxZ~x2E;dlkTm@&h?=DCGZKb%Stq;#AnR9 z>RY(KV^E3NTj4Vp8s%uX*f0+$;qO~5k*#BY_Y5kd{Bvt!Z2Q;+rAoSRwI}A-xXu{# zH*&qr$}aK@o84PIHlWy~h3oGY%@UTyed1Q(OJ*deOnJ3PcBtyCe;dlZYRZ z;GZ#tkK4AeZobx@E0|i$_G3_f7N#_eiUx;yFfn<3}u-=e;YmB z>ZN$J--{ubgZ4fhZqy#=C})n2vY*(Su(r+LEv+qZyo@=T(B_V9SKugY&);Qh4jh5) z=XcpQ1=?YIBYdynVh=Lo7$-@zCm!@GBfP_rU|C<5 zmiJJM20Iw}eX)Jj&S#c{{Gl8ClEYyiyRmP0Kyf)EP7Em73&jChQ7lr$6N{Kn%LbJu zZkK+@w(@#uj&a9`!F9Oga$hDtEX7IrW%KhE$846PZ+9B<@47KRyl+Lf_brwGMY3ww z-^k+smh9e|8}}dv2S%tXA2IPTVnf7>xNfBbhhW15fFtmK4+XgMINj$x*P#hqR7hhTggXcf|y87%Jp_{@gy?N}JWLxf8%?(YxH zPFyS;2_J_472pLL!rS;{gm3@&(1stlge--({y}&!1ioT~Z)o^mz)d7Fq1*VIvu7l2 zKq(Xotrhd|fpsX~07vlH>@2VNGc@_E!(jhsJn}yecv$!qk8tVavnq-oPLDGd5eYX{ zYdWKHf{d->#$2mWI9FhZ&qYZ%L*N;{BG;-HuG+x26!7pqw6BAU z1fuw!xpCa&G#Muymc#8%tFaxk5$NHIoz@5s=H$uX&o~{%W=Me|zTaunXXEr|^Y@*S y0hc5JUAVuSPLn?T@0FWf5;wR~dAZA^5C31~kGmwJ*l-K3URQXmD~=y@_5248xb@Ef delta 3706 zcmcgve^6A{6+U-&fnBl-i;Mgagk2tj22pTV$3`Ms^F)4ZfEbdHOwtl#l_aK;NK-|^ zt_ev~Ln6*alNj>bq+)QiVyw*&unD!;nhq42k&GFL!H5G(7sc+YIBdVWqJ95orf=q( z@4NS$d*8ih&%N*L@DsyNG{&(I?+IbSACwT!&h(4TFur(~pxHs2T_KPi@F@K&{lk_p)$`Yd- z7%$!td|xWg-wd|TLVo~@VoBE7tT;cW-tgRKRh`_i`E zCIBoJ6DuPA0l8cplMwaEy*ub7mN+PEI65{L9msmF_+vFV(kSf$HU+NIL+ zjCPCNt5DAFfdKuh= zBwPYy0UbD69|I%kuLsuv>!BUsCS-3u(1C0o1NI@i9|nH|K7gb868Io8zX_-Xild4C zjT3PV7y?=?IL_d#Oe&;A2p!OfqvHYcfI?syFpgtYha`hCLGru^tA(Bd?Gg4v=#@q6mY?EhR=;lH_b;Y4TwX}5WgobH(r4n z$ALeKQKz80!JlEN-Ml4Eir5FsIrO{%OO1tp6Za6S=S$-sFhsy0B6yDPiT_LJakP#a z`MNpdN#}8i(2Q{>uF&JS1|z`vKy)hqWx^a5!+)EQ8!`#U{rszh*OT`_dBTbA$33(V zTFk3~el34j!B%+}e<3j)--J&R;}bjun$f!~`h(l#KJVI$K5yBIKJWdv^?Az^w)4Tn zgau!C)++jh1#;LFv#(n%D^kVf-l}3sA5>26DDhd0gG&2%u6cvX2`JYQo>dV&n|+Ak zl=ez`f%a<6mThv|)xGW$oh3Pwd$;VYD5^*)j47&-`^x83M!ofrv&2W*xxJPnpO5%T zCN3lvX{_7jzDqr}FO?ka&Q;x=U*e^4g$DjgQv8}I$f}BfKANl3_}K@ z9gg;8@bP4#LB*4rdC7Ozn@0wf+NKhpUSA_eAlTIoK>iPQQ!5WBrP9EqZgWCqEEl_) z_V4t5Upc6huh($t@d3puF;4I}&4|~@)Bb(lfe586IHYAlXPEX^^Gs_pj_=)88(Yga zTW7mBc#mCebYJY%PekYq6Qza|6HSo=y%WWC^4Cg^oifO`YDefH)5LOv*Htpv_-w7* zuaryuSj4pdc5gpkxeu+=?5j&`nLds7PWzX6zc0$p`@Wc^Y?t4&*2%>Cl`?z4Uwj=r zGt%g_KQ6|87_&kQX51lZxJ4rVjx_DB^8Sw_{+9i|p#4u%%|%vQbK(5F?Q)I$ zR^_yR?JbX=1wD>T^&`nB!}Kl3OgCn6j`gSD6)c7JYz#WRGxe%VL?Fk`R)qWM$S1Cxr$NRgSA*iY{fcgw5RGGGfQ!rb=gVF1ODUJQu(K;HuwH(x8bbJ z8Kce($lf|+vB>O|V3FzF=sN;5=}^Fd^FnZ;YtaToE#(1k0A@jVp=g{2T2X5~3qGpB zeGSCGehhuzFrw#y4}e=04qL;cGSj$cURPUvT2AOsTZaPf!@0{nO``!f{K(-AxQ`qN z@iYiN9PTL{7j2WL>|X(Qi~jeXRkW_Bq@yLRa%ci_+uE&_n#9udx)&z<4imToaPiA0D-v~A&8(~MPc!;)l!2&_OK&qhlGLSPer za7l8A2vZq59)WPaJKMsIcBA2Duu{3ro^05J)d-~W z0()|3Bi7W253W7Ma1v60_?vcX2+E6-8N9#-TwvLAj3%j diff --git a/src/games/snake.cpp b/src/games/snake.cpp index e4fa960..0fe1128 100644 --- a/src/games/snake.cpp +++ b/src/games/snake.cpp @@ -101,7 +101,8 @@ static int ndirx = 1, ndiry = 0; // buffered next direction static int foodx, foody; static int score = 0; static int best = 0; -static int speed = 130; // ms per step (speeds up with score) +static int speed = 130; // ms per step (derived from pps below) +static int pps = 70; // base speed px/sec; +1 px/sec per 5 food eaten static unsigned long nextTick = 0; static bool running = true; static unsigned long now_ms() { @@ -110,6 +111,14 @@ static unsigned long now_ms() { return (unsigned long)(tv.tv_sec * 1000 + tv.tv_usec / 1000); } +// Derive the per-step delay (ms) from the target pixels/second. The snake +// advances one cell (cell pixels) per step, so step time = cell / pps. +static void update_speed() { + int ms = (cell * 1000) / pps; + if (ms < 40) ms = 40; // cap so the snake never becomes uncontrollable + speed = ms; +} + static void compute_grid() { int m = 2; int topH = 14; // reserved status strip for SCORE/BEST @@ -151,7 +160,8 @@ static void reset_game() { dirx = 1; diry = 0; ndirx = 1; ndiry = 0; score = 0; - speed = 130; + pps = 70; + update_speed(); place_food(); state = PLAYING; nextTick = now_ms() + speed; @@ -184,9 +194,9 @@ static void step() { if (ate) { score += 10; if (score > best) best = score; - int ns = 130 - (score / 50) * 8; - if (ns < 60) ns = 60; - speed = ns; + int food = score / 10; // food items eaten so far + pps = 70 + food / 5; // +1 px/sec per 5 food eaten (progressive difficulty) + update_speed(); place_food(); } nextTick = now_ms() + speed; diff --git a/src/games/tetris.cpp b/src/games/tetris.cpp index 9648231..bc6be0c 100644 --- a/src/games/tetris.cpp +++ b/src/games/tetris.cpp @@ -109,7 +109,8 @@ static int board[PCOLS][PROWS]; // 0 empty, else type+1 static int curType = 0, curRot = 0, curX = 3, curY = 0; static int nextType = 0; static int score = 0, best = 0, lines = 0, level = 1; -static int speed = 1000; // ms per gravity step +static int speed = 600; // ms per gravity step (derived from pps below) +static int pps = 23; // base speed px/sec; +1 px/sec per 10 lines cleared static unsigned long nextTick = 0; static bool running = true; @@ -137,6 +138,15 @@ static unsigned long now_ms() { return (unsigned long)(tv.tv_sec * 1000 + tv.tv_usec / 1000); } +// Derive the gravity delay (ms) from the target pixels/second. A piece drops +// one cell (CELL pixels) per gravity step, so step time = CELL / pps. +static void update_speed() { + pps = 23 + lines / 10; // +1 px/sec per 10 cleared lines (progressive difficulty) + int ms = (CELL * 1000) / pps; + if (ms < 40) ms = 40; // floor on gravity so it stays playable + speed = ms; +} + static void spawn() { curType = nextType; nextType = rand() % 7; @@ -176,11 +186,11 @@ static void lock_piece() { } if (cleared > 0) { lines += cleared; + level = 1 + lines / 10; int pts[5] = {0, 100, 300, 500, 800}; score += pts[cleared] * level; if (score > best) best = score; - int nl = 1 + lines / 10; - if (nl != level) { level = nl; speed = 1000 - (level - 1) * 40; if (speed < 300) speed = 300; } + update_speed(); // +1 px/sec per 10 cleared lines } spawn(); } @@ -227,7 +237,7 @@ static void try_rotate() { static void reset_game() { for (int x = 0; x < PCOLS; x++) for (int y = 0; y < PROWS; y++) board[x][y] = 0; - score = 0; lines = 0; level = 1; speed = 600; + score = 0; lines = 0; level = 1; update_speed(); nextType = rand() % 7; spawn(); state = PLAYING; @@ -319,6 +329,16 @@ static void render() { snprintf(buf, sizeof(buf), "LEVEL %d", level); draw_text(sx, ty + 18, 1, C_DIM, buf); if (best > 0) { snprintf(buf, sizeof(buf), "BEST %d", best); draw_text(sx, ty + 27, 1, C_DIM, buf); } + // concise controls in the free space below the stats + int ky = ty + 27 + 12; + draw_text(sx, ky, 1, C_DIM, "KEYS"); + draw_text(sx, ky + 9, 1, C_DIM, "4/6 MOVE"); + draw_text(sx, ky + 18, 1, C_DIM, "2 ROTATE"); + draw_text(sx, ky + 27, 1, C_DIM, "8 SOFT"); + draw_text(sx, ky + 36, 1, C_DIM, "0 DROP"); + draw_text(sx, ky + 45, 1, C_DIM, "# PAUSE"); + draw_text(sx, ky + 54, 1, C_DIM, "5 OK"); + if (state == PAUSED || state == GAMEOVER) { XSetForeground(dpy, gc, C_BG); XFillRectangle(dpy, back, gc, 0, 0, winW, winH); @@ -352,7 +372,7 @@ static void setup_window() { if (winW < 96) winW = 96; if (winH < 96) winH = 96; win = XCreateWindow(dpy, RootWindow(dpy, screen), bw, TOPBAR + bw, winW, winH, 0, - CopyFromParent, InputOutput, CopyFromParent, 0, nullptr); + CopyFromParent, InputOutput, CopyFromParent, 0, nullptr); XStoreName(dpy, win, "Tetris"); XClassHint* ch = XAllocClassHint(); if (ch) { ch->res_name = (char*)"tetris"; ch->res_class = (char*)"tetris"; XSetClassHint(dpy, win, ch); XFree(ch); }