From 7afc487f272a52e513b66b4b3431257b0f42bf99 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 10 Mar 2022 17:00:57 +0100 Subject: [PATCH 01/69] Add second screenshot --- apps/smclock/metadata.json | 2 +- apps/smclock/{screenshot.png => screenshot0.png} | Bin apps/smclock/screenshot1.png | Bin 0 -> 2031 bytes 3 files changed, 1 insertion(+), 1 deletion(-) rename apps/smclock/{screenshot.png => screenshot0.png} (100%) create mode 100644 apps/smclock/screenshot1.png diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index cc995d587..dec97b70c 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -3,7 +3,7 @@ "name": "Monogram Watch Face", "shortName": "MonoClock", "icon": "app.png", - "screenshots": [{ "url": "screenshot.png" }], + "screenshots": [{ "url": "screenshot0.png" }, {"url": "screenshot1.png" }], "version": "0.04", "description": "A simple watchface based on my stylised monogram.", "type": "clock", diff --git a/apps/smclock/screenshot.png b/apps/smclock/screenshot0.png similarity index 100% rename from apps/smclock/screenshot.png rename to apps/smclock/screenshot0.png diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed9ef9ee4cd26c51b7d45dcdc7ccfaee680d8e6 GIT binary patch literal 2031 zcmcgt`BPJe77p=-<%%p46s!W;0Tl{FBg-o#0SzEqpnxG&2&vX0_#lC>nE-mRF8Gv8 z%PJB|C4dk@;9(#I0#{^tOjs1CxDl>>R1)(rP!d7bm;Mp;U(GC=_Z(;7L-1t~UP_hWffJYM-U)iXJN>;5e#jbgvSHGN=zE`9@{Y<}2Q?tKG4f zku_r4YWl@4lOxZ}FSt;?Toc^sFSgn-xO*q(q;Z7y2jG#yGGb92J`lfBW~&D zBk`G7D)b7-y$ZiFb#;}sj9v1MP$G*-FSqVcAD?9ub3}~G@`j~kZz{U(xR~6HX>|)@ zY{(adT5a}&NN8L6z5QU9-k(Nj(NJgTcnQLZBc>c1T24!}zo614O>=_~A&TRzq@~sl zip)-@w=JoE3oBgr;qF_8Ilal(ax2zq{lbw=U@L{>NDuB3GlR=0JZp^HLKBcW-LnvX zuUTj#(XxZDQhM8HGw{jKpQ6nr2R;X2v z*+>blh@SAT)U=#v!-@~Eka9Ln-C0^8>`RhXs#aOEIOt4X8;$5_WzW1Q-S?!^f(o%Z zz`g%Y6z{ckCaFVT(nOp#12X4%+{Ru>dg~O2)mB=@afTIr(a3IwdfB!nEVtnGaBL-9 zPv_>UH*J*@`44lQzC9!2nt5j9na?etZ_#zpVX792sHQl7paeZw~v` zB>O_I==ajmDtLXM9JV`$(SK78f2Grn^}W9Zkr4dP|H~n?X~kckaj70KeJg~oLWI&t zx>=JmU>Xfw8gRh<$I3j5A?3{bs>e7g?w-p`TkMLRWEO|%jzkmP8{zzXgTX`1Xxpec zyvbwC`<#Y_iXY+&q>`kpN;#k(8?De*-zPo4(55X zJ>&t{%)cmy!A4iSc{p-6Lnhv|tAc}$xanak*=sRfXcauEQ_Z`1)*{%rEz%+!sc#?a zcWO2X3H5>MTK_)FZU8IE&U5U5QWS9VotytX?%OZ9Kpd^I|}cWnQ%Su!zp3 z$rS8*yXwI^1XGNS^u#iI(%;)PGY#c)sJpmEV!UxZ!(t_)+C2#BiTmCGhxGz0h@t;j zBHxEWWAic+ax7syG;Sm^ z+L?sO-4MKtdK}h64@J@r&ct}~?7Mf^@=k8GZ>K2p916C470_h9;%@ny&Fj9Sp8B z&kyVhfh?&|p~QA$*E#9pSn&j4GeTI5XWTY2wqH<$Zt~gHQ}^LabVA-r(d=vdX$(d3 z{)x5o$X#}P!8~DcK(EcL&1~8ur6&k^+B2S${-{Ry=&qR0;u}S@3`O%8{l98cZC2-s zl(R}nRFlB{;r%-DoYlxNp2u``T8>gO;oN7PFz#2&9Bs7ceICp53yMweww!w=djZf& zioQA4bhglPMLmJVP!L7$dS-Zk|6P~2Y1@A!&w3h}0obyt#F3+DFy{Kpd_y!C5-$GU zS`XuLVx9!(VH_TuZoPd4UHVJLfxIhdizwkY{yvZ_+{@h82Qq4S_QmH_@c9S4n>ytJ zr!JQ0gnV?8O#187HMq$P4>7G14<0Z)g!BEa{5*h_7>g~;KLs5XvuQ9yoL+YSa9Q`j OQK&#aGO6h}J@5Zrimdto literal 0 HcmV?d00001 From b24fbb0b2dcc3d6bfb29fd31604afbdb2b0bb7b0 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Sun, 13 Mar 2022 21:27:36 +0100 Subject: [PATCH 02/69] smclock - Replace background with purple and dark green one. --- apps/smclock/app.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 350c0dd07..0ef886b04 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -1,14 +1,8 @@ const SETTINGSFILE = "smclock.json"; const background = { - width: 176, - height: 176, - bpp: 3, - transparent: 1, - buffer: require("heatshrink").decompress( - atob( - "/4A/AH4ACUb8H9MkyVJAThB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INP/AH4A/AAX8Yz4Afn5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INI=" - ) - ), + width : 176, height : 176, bpp : 4, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4A/AH4Au1QAp1/2swApK/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K+//AH4A/AF8AAH4AUK/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/AA==")) }; const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; From 65a4a79d08714750e8ac852daa16960b33217f29 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Tue, 15 Mar 2022 16:39:00 +0100 Subject: [PATCH 03/69] Update screenshots with new background --- apps/smclock/screenshot0.png | Bin 2845 -> 2971 bytes apps/smclock/screenshot1.png | Bin 2031 -> 2399 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/smclock/screenshot0.png b/apps/smclock/screenshot0.png index c0e0bd0eed06e2c77e0ad737b1ecd4814a8e4f65..de4dc4e43da2403b684284b6805809343793d524 100644 GIT binary patch literal 2971 zcmb`Jc|25mAIBNnm@XOn80*+3%Wx}On541HOx7!Vj1nqBiLslKJq!k2;X%6D$0)=w zlU&s;JhW@ocQI|!9mE?lvkrm zTK3V4kAx@acN1g8TJ?47XA71$qq`?iyXt~jhzJ={c97%MlM zkG|eL`S)(#qolN_d-iWOqn}JH^G%^TvXcg8Ry{?wY9o4Vn?wiO-pC$_sMf%dPG1cS zmur$XWe=$f^DrIOhiEoC3- zF+FmG`}~Q`)Lq(ANBhjsw|$$(D=G?GT|D2VmbP2NGp&^Tfy~DSD($ecR0Z8<*Rg0q>cc>7}>xew|g&U#W~2ohTg8|KtLNMQi0c z95qK}jqjNYbp7_P1#t!!LU$Q|a9qE}T{HLWv>a|Q??KV9t^tn6+vB0>wadT7!gngy zb17TTulCmkx_|G@r63VRq}#A_!&c+4+j#~k@7~61cORq$Rc;vF4oh0@7Gph^V0o4{_uJRK*<&K>^sxUn4HOAO zj&OlPkYw~+OuQMxVb?)&j4_k4vaYTMu_J$fv^mDQO^|V(HI9+)sj|Ey&Qb7$oJn3l zVMyhF1t$FN&%rN!Lt#F-;<$dxE@Pq#)*1b$KVeByD@a#DPxgc4J~eotkila|JGsts z)<0_Ni`RD98JcnO6tg(-C!E-2qNy|~P@P7@LVRsVUXt*FN}M<6hRb5-Dc^e1Z?tWU z`5Dp(bf*TpV0ly}LWB(Ra3O36S6tQ*k5kVF_HwV|qO;iIUX$IVcJN3gK2b9L1sGoqHz=O~S#O<|gv_~;&ZSh-}0 z2SK~enBlx)CV=RnEV@n`J-(5tAir4x-TAlA(J>olZXqbS6;!juiF=u4pYx3ZYH@M9 zQZnN#)QPPi=B$NF2765jdi z1#IR3Imw=+t7GWeXV8TbYOZJcV@6{Xe(-P>y_6}J{ey&3u-X!UUs1aN9|-{5H1&i~ z<>;T3^ouk8KDMl-M`)#yd&P0xLHJu|f6%r zk9_?-fkn(S$Z66`CNCZ9FZ?Qyr4)d6n7+%*zmDvj+=L~|$HUN!w)kQqZGUxg{{h$n z?j{TiO0?D(TJ;iCR!>=thMHz+yfDK&*xy7l@+U$VcAO#UVIBWblSncNBSm71jpdXI z=<{*nQVpQjsl2!WwS$idBjJBwgjY@-uL;q+HUt9G9&a8Rgqz9HjB0xIl7cgyOKD40 zK1sDAgx>KUh?5$OR+cwxM>lRvw85HWhrf%C3q;9?(iQ^;vt_RoPc+85SSYX2VqQxK zDc3#KVNQ;<>QGEzGUyH+6+KyKY#G83@mzB`PDxf0UuAu)L05LA?9t1FXdeoGI(W1=bAKYCVMc;9 z709nSQg**FR$tKO0y%GPUDr*1XKrxV0~sM`8vIZVhTsgSt|g{FYJH8(MwZdWR~$G;R(9X-~kmGy!%r3R71j|mZMERG9xBV zyFYL1tH5OlbiuC*J0?X4Redy`e_h@hd|DHeuGk=je(AK$rm!1nnnLI*P_i|)Nah*( zoQe}6JUfJPlNi@g!CILoVhF_3TuarXr$SIG)zs9~1Zuwgpp4RCS}YbE)}S@h;v80jp9Z5oD`X zu-3iJDhNrR{kp*9$_in!|DvRZ^$w>)R+t!+V>C8`lfKh!q%2%BSE_G(vRZgq$fArG zUfos@>t>O0=7oVlZsSCrCe?!+%s-4+bzxI6^LNVrTq|G7(^s=S)#92J3Tnd)X$;HG zo@FnuU)D18&g?=7x+7FUEf}BnK7c{b)ZV4)0_st%@ADa)!Tg+mxsL*Ol}HTQM^ve7l0jI zGHeWDXC)|}?k3fYu@dylY!AJyt_n&&T`%hKU-2P=JdxcyFI8ioJZu5}w)wC&j+ka^ H!p;8xDEo2- literal 2845 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 YUdx_>rDxQ4@7%ip9M&0AYD0|sC!%XI-v9sr diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png index 6ed9ef9ee4cd26c51b7d45dcdc7ccfaee680d8e6..70e28bac9a37874a76a86e903f557c7c7b8f6ce2 100644 GIT binary patch literal 2399 zcmdUv`#aNrAII0W7_GjJC6N%5a}K2(R?eC^6I){>YB@HC^=0%SqGGqmsaq=&Yc~2i zMp(GfopLcl7WS1SEaX(?aDTe4`(L-~JcUf26|J+4=#n~TGKNkvHr z1hU`B(bfaBHNQ7P3_PnFr~N^*hwR~C4Pk#!`UZhW9Corj??v$!mfX8hW{9-w+)Xwy zf16%cu0Z%`5(=&<;!YQEX(XDZZA-q$c{pig=o1AJMgR8_b0(Z7BL zJb)-Sr1F0(%(G0;ozv9vYkn&8n{pIt)gMXSb4$hI{fru2cXCQnTo}NS%|QS*2ZAed z4?OCREQnA1r;iKxCre&F?8ue}UJQ0BeFs^}!OJ}K|*hVnu3FdTB`Te$ORW6+q zx7pBB5Omb*We@p23{b7H7d+F8e!3lm4uJ>i~eWWh{V>rH~mAg7B=hAQD47a2})ulD}`Pc?QHm< zg`pA^6IsL8*{zwnE34V$oXm0fMDHsU!)|t%k1BNvlO7stLy@$h%$Zu}(4sj0#9Ytj zc2bKxt==+^Q;q5>==n<3675F532UFs_!tvqlBt)1<8Rnv?TOA?sV5_#$y?WkI4s=A z3xFl`*&il7Jl3{`ww_?k9AE+onZtN8&bDsK9UWOOn=Q9O68NyL^EktCwPFp3>*14# zPp-d}EI^ODkUMTvO;Ti*$kR4&GD`x3P6Ir}Cc8QJjt`nq@SB|ypNuNbRd!y9cxN&p z%r9b@v6dqk01HP6P=6HcJ*gBdJ={W2-iU8;gI=DpiF+jxmJ^#iO=20X4)-1eQ?0vJ z!SEQr*4&P>Ijb_iJfQgC?Jt6EZJWp}-Q2Mkfq1^2^}KD{Lr(q)9G}%MEEpY1s!C!B zv)*dS`f8{M+t_aD)z%c(KAf;MxM2)$8&TB8t(!D}%rm8oe#KbF65i^_IcNcTE4bsU z#eHX&=S<7vJ?vQ4=X`csRRZBY?}zyMw{FWu&V3f<#phV%aaw1*&=-fghB&eV?&+Kt zZ)F?G#2)*47N|v8leIxO?_N;eutfJCKDM-Vkq;tuX>&^nWa+W^^})iUpkorU5GVov z?vAa>WB?2Rlbo!~lp^$RH)kV2=saPQvE@3VCeZCSCo~@ z%e-?!YP2jr<#yyY!5@YYr|K#og%b3m8SmBOL`kn&6GD2SCuF?_34F`|_y788^ zU=F_SUsT(-NR@rvNR29bqkX$^_C_7uMc}`ZUF_TXrdJWg=>r?Mo2b@_@ro2dxE`>J z)j%pXDo3fcLMG9ndse=FqCeoT16w`so%b(PUTZ}Z`M`Fgxj!tU`$u+NtEd%;c+2O? zBKGuPzyGAy^m)OrLmqxl)iG0b(_O6m2t@1 zmFIBGp4LGXnqoE)M`53VK}n)u@S8dXd0+g3&Mg2_K@*%bJgUWli0PMDrSxzpPyUzU zg2O*&$AOEl_c~HT|CWDgYi>8*SQgFORz7Sq9$=bZwqv-2e<&@@v$bnHa?O5=Y~xMCLg%Nm==TltipXT`fQaX^KRwy zRkqWOxT~VJ@ZjXK4Xn^LykbVHc|0%I47s&7fkP^Vf23~*3Y<3WbLZJRr9D~sM_>** zXBjiJQxC@IV-XMThcqgT=2cdokC|GWGx+n9l_{UDc&es3m1G_(&O3`2Moz=$@8+7t zqP+-1+ukD2&z?QrqE1d^d5FZ3SedWbN}m6C05UNUdsRai)>7;idw*8_LvND<-FxE@ z?6QEC?8U7N@x~lNCYDxSP^>R0eytt+GvxdwyPTBEo?q5Z=b_S2b90E4R)({Cwn?E_>=MeW=uv- zN#?ekSK@4yG%$wyvSKyrP)urkpS&sak(+v{~+&?hdJ^-Fpfe? z`4;1=?bVO>RgzBwv2U+tLYF0xBb;T`0d>h)Ng|P;gVXeaz);STs^9*fL!$8#x^f0M T#+MxJf`H4(&c&8(O-%U@oPSX3 literal 2031 zcmcgt`BPJe77p=-<%%p46s!W;0Tl{FBg-o#0SzEqpnxG&2&vX0_#lC>nE-mRF8Gv8 z%PJB|C4dk@;9(#I0#{^tOjs1CxDl>>R1)(rP!d7bm;Mp;U(GC=_Z(;7L-1t~UP_hWffJYM-U)iXJN>;5e#jbgvSHGN=zE`9@{Y<}2Q?tKG4f zku_r4YWl@4lOxZ}FSt;?Toc^sFSgn-xO*q(q;Z7y2jG#yGGb92J`lfBW~&D zBk`G7D)b7-y$ZiFb#;}sj9v1MP$G*-FSqVcAD?9ub3}~G@`j~kZz{U(xR~6HX>|)@ zY{(adT5a}&NN8L6z5QU9-k(Nj(NJgTcnQLZBc>c1T24!}zo614O>=_~A&TRzq@~sl zip)-@w=JoE3oBgr;qF_8Ilal(ax2zq{lbw=U@L{>NDuB3GlR=0JZp^HLKBcW-LnvX zuUTj#(XxZDQhM8HGw{jKpQ6nr2R;X2v z*+>blh@SAT)U=#v!-@~Eka9Ln-C0^8>`RhXs#aOEIOt4X8;$5_WzW1Q-S?!^f(o%Z zz`g%Y6z{ckCaFVT(nOp#12X4%+{Ru>dg~O2)mB=@afTIr(a3IwdfB!nEVtnGaBL-9 zPv_>UH*J*@`44lQzC9!2nt5j9na?etZ_#zpVX792sHQl7paeZw~v` zB>O_I==ajmDtLXM9JV`$(SK78f2Grn^}W9Zkr4dP|H~n?X~kckaj70KeJg~oLWI&t zx>=JmU>Xfw8gRh<$I3j5A?3{bs>e7g?w-p`TkMLRWEO|%jzkmP8{zzXgTX`1Xxpec zyvbwC`<#Y_iXY+&q>`kpN;#k(8?De*-zPo4(55X zJ>&t{%)cmy!A4iSc{p-6Lnhv|tAc}$xanak*=sRfXcauEQ_Z`1)*{%rEz%+!sc#?a zcWO2X3H5>MTK_)FZU8IE&U5U5QWS9VotytX?%OZ9Kpd^I|}cWnQ%Su!zp3 z$rS8*yXwI^1XGNS^u#iI(%;)PGY#c)sJpmEV!UxZ!(t_)+C2#BiTmCGhxGz0h@t;j zBHxEWWAic+ax7syG;Sm^ z+L?sO-4MKtdK}h64@J@r&ct}~?7Mf^@=k8GZ>K2p916C470_h9;%@ny&Fj9Sp8B z&kyVhfh?&|p~QA$*E#9pSn&j4GeTI5XWTY2wqH<$Zt~gHQ}^LabVA-r(d=vdX$(d3 z{)x5o$X#}P!8~DcK(EcL&1~8ur6&k^+B2S${-{Ry=&qR0;u}S@3`O%8{l98cZC2-s zl(R}nRFlB{;r%-DoYlxNp2u``T8>gO;oN7PFz#2&9Bs7ceICp53yMweww!w=djZf& zioQA4bhglPMLmJVP!L7$dS-Zk|6P~2Y1@A!&w3h}0obyt#F3+DFy{Kpd_y!C5-$GU zS`XuLVx9!(VH_TuZoPd4UHVJLfxIhdizwkY{yvZ_+{@h82Qq4S_QmH_@c9S4n>ytJ zr!JQ0gnV?8O#187HMq$P4>7G14<0Z)g!BEa{5*h_7>g~;KLs5XvuQ9yoL+YSa9Q`j OQK&#aGO6h}J@5Zrimdto From ff13a755802c1dd6a67478b022e28a8928207dfa Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Tue, 15 Mar 2022 17:09:14 +0100 Subject: [PATCH 04/69] Add 3bit/4bit background choice --- apps/smclock/ChangeLog | 1 + apps/smclock/README.md | 4 +++- apps/smclock/app.js | 15 ++++++++++++++- apps/smclock/screenshot1.png | Bin 2399 -> 2134 bytes apps/smclock/settings.js | 1 + 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index 0300d5ceb..f0b5c5bde 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -2,3 +2,4 @@ 0.02: Add battery level 0.03: Fix battery display when full 0.04: Add support for settings +0.05: Add ability to change background (3bit or 4bit) diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 635292d0c..7a099f268 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -10,7 +10,9 @@ It shows battery level in the upper left corner, date information in the upper r **Analog Clock:** -**Human Readable Date:** When the setting is on, the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off. +**Background:** When the setting is set as "3bit", a background with more accurate colors is chosen for the watchface. Otherwise, it uses a background following the 16-bit Mac Color Palette. + +**Date Format:** When the setting is set as "Long", the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off. **Show Week Info:** When the setting is on, the weekday and week number are shown in the upper right box. When the setting is off, the full year is shown instead. Default is off. diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 0ef886b04..297ddb894 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -1,5 +1,10 @@ const SETTINGSFILE = "smclock.json"; -const background = { +const image3bit = { + width : 176, height : 176, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4A/AH4AC23btoCct/pkmSpICcIP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5Bp/4A/AH4AC/kAAH0/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5BpA=")) +}; +const image4bit = { width : 176, height : 176, bpp : 4, transparent : 1, buffer : require("heatshrink").decompress(atob("/4A/AH4Au1QAp1/2swApK/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K+//AH4A/AF8AAH4AUK/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/AA==")) @@ -12,6 +17,7 @@ var batLevel = -1; var batColor = [0, 0, 0]; // settings variables +var backgroundImage; var dateFormat; var drawInterval; var pollInterval; @@ -25,6 +31,7 @@ function loadSettings() { function def(value, def) {return value !== undefined ? value : def;} var settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; + backgroundImage = def(settings.backgroundImage, "3bit"); dateFormat = def(settings.dateFormat, "Short"); drawInterval = def(settings.drawInterval, 10); pollInterval = def(settings.pollInterval, 60); @@ -75,6 +82,12 @@ function getBatteryColor(level) { } function draw() { + var background; + if (backgroundImage == "3bit") { + background = image3bit; + } else { + background = image4bit; + } g.drawImage(background); const color = getBatteryColor(batLevel); diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png index 70e28bac9a37874a76a86e903f557c7c7b8f6ce2..1a020c9ca825f3f0772854801037aa37d3e036bf 100644 GIT binary patch literal 2134 zcmd5;c~FxF77rhvZGtc)A|Qw1hzMFt1gfY($`vA~+@MIvq7sW*&H#cyKNspnbP?D9 z3RqYLVF*|aU`pTX@j3x#5s>T6Ujqas57ju zys7uMuhN7QQ&GYwMGi*rH3A^c*h2CojNncYO6Hae`*OUg#0anv7Yz_GxQ2YZj=)zR zlHVwXeLIn|fAGM@J`$A}wYNdX=6{FMFl!4r_jEGT@1bPRcR{5|Mwas%wR6*hEm)~B zH`09vgTa-~ZDH${%*>duzvq78g$nF2Eq0jOQsLleI$(Ja;1Nn`rodKovIfLgQZ~OcsB}{loX+8{?>Ox8-0fpMx9#aI$`pxFJv9D}3=_a=Vy>>Hj#=~{D-41G8!s;x{E zAIO>hj>z}dVbPK%w6)->+n_sh7N?l8?$#K=n0tm~R9WwQy6Nlu$cT|Y2}&&El00L4 zo(8|Zuw~tDRsI(BuH;e@J|@THXELghqHX_9yZV@m8^C_N3)Po)+{JK0Umm(Y?#omB zCBYlJ1WAg`*MnB}sVNb8f1 zKsi_ghKvy0%6X1EYS$f-3H28?Q%Ibv8W2+sqSx%7g^X<*U#~*9M`gEQs&@#q4lf{6 zs`Tpa!kF*7>0s~c{81|G zhEhBr#MnWlH!uPZChAhvZ8*8pn`#*aCcixo2xrV2cH8I(Zho9_F`UdnULtpc$>#1< z%ZR=I9W)vFKp8zJh6%68)kI6orvl@D%LJ%e{y@SgvlQ zSR^oDq^zmC`LC|jvm6}0$3XDgAytPa0+D~(#{Ju#ucEGU4ciiEzm{w1S;oCEpC8xA zjrb5a$|ET=mjyrF+jIc2iTcpg%uGO`>3o2^tUe4ZtFQ73&W63%>8(+i)YdY5Fa{v- zXO*`|qslZ+5DD25^yAbQdeD?~CP3HhPX-CT0b)0&+1+=aN){^L*(w!&79CD?2cBK; za_TvM@i_Rw>8N_hWy)SWj(IvfTAO|NkUki4QzW*f8Z{l;S(fMZG4^yp$#$UDO?3@4 zpgF4}>h`T^+4H$)B>g;@S;4%$ThAjQ7;?LJ53Ai@oYn%{Dxw#8%eZItU5+}mD>_WI zzwg_d7)!70eNK67!l$20>r|z!=lIi3YePnnhYhHV@WPyOkLHv4lZukGJ^x&;Eb%(k zArgfbez*l`Hb?-zqQ;2+SYf+a&2p7rH)J}h*KVtcj~Op+#=Z!e`<^w3!*@_JVye?k z=SvH=%ks#XlSl|=v_;n%7Oi*jI-eXZ|62Rd6gJ)f&vK4m(>$YPtxo2K_MD0!*xB%p z_diHig~a}37WbVO8`PsetBLtv?ghm zB=o=U&%lIPC?<}u7x?k~^R>z+8@?8Chm3Wj?mk-$xg5SxGq)HV67!&|i!It2J64Wi#If{$%HJ`q}3v8M=TZ0$P=tT$7JUtt4n-biWfoudIhF^o| j)ajKxhyNQF3v7K3qF${E{g&-jj{?GjYB@HC^=0%SqGGqmsaq=&Yc~2i zMp(GfopLcl7WS1SEaX(?aDTe4`(L-~JcUf26|J+4=#n~TGKNkvHr z1hU`B(bfaBHNQ7P3_PnFr~N^*hwR~C4Pk#!`UZhW9Corj??v$!mfX8hW{9-w+)Xwy zf16%cu0Z%`5(=&<;!YQEX(XDZZA-q$c{pig=o1AJMgR8_b0(Z7BL zJb)-Sr1F0(%(G0;ozv9vYkn&8n{pIt)gMXSb4$hI{fru2cXCQnTo}NS%|QS*2ZAed z4?OCREQnA1r;iKxCre&F?8ue}UJQ0BeFs^}!OJ}K|*hVnu3FdTB`Te$ORW6+q zx7pBB5Omb*We@p23{b7H7d+F8e!3lm4uJ>i~eWWh{V>rH~mAg7B=hAQD47a2})ulD}`Pc?QHm< zg`pA^6IsL8*{zwnE34V$oXm0fMDHsU!)|t%k1BNvlO7stLy@$h%$Zu}(4sj0#9Ytj zc2bKxt==+^Q;q5>==n<3675F532UFs_!tvqlBt)1<8Rnv?TOA?sV5_#$y?WkI4s=A z3xFl`*&il7Jl3{`ww_?k9AE+onZtN8&bDsK9UWOOn=Q9O68NyL^EktCwPFp3>*14# zPp-d}EI^ODkUMTvO;Ti*$kR4&GD`x3P6Ir}Cc8QJjt`nq@SB|ypNuNbRd!y9cxN&p z%r9b@v6dqk01HP6P=6HcJ*gBdJ={W2-iU8;gI=DpiF+jxmJ^#iO=20X4)-1eQ?0vJ z!SEQr*4&P>Ijb_iJfQgC?Jt6EZJWp}-Q2Mkfq1^2^}KD{Lr(q)9G}%MEEpY1s!C!B zv)*dS`f8{M+t_aD)z%c(KAf;MxM2)$8&TB8t(!D}%rm8oe#KbF65i^_IcNcTE4bsU z#eHX&=S<7vJ?vQ4=X`csRRZBY?}zyMw{FWu&V3f<#phV%aaw1*&=-fghB&eV?&+Kt zZ)F?G#2)*47N|v8leIxO?_N;eutfJCKDM-Vkq;tuX>&^nWa+W^^})iUpkorU5GVov z?vAa>WB?2Rlbo!~lp^$RH)kV2=saPQvE@3VCeZCSCo~@ z%e-?!YP2jr<#yyY!5@YYr|K#og%b3m8SmBOL`kn&6GD2SCuF?_34F`|_y788^ zU=F_SUsT(-NR@rvNR29bqkX$^_C_7uMc}`ZUF_TXrdJWg=>r?Mo2b@_@ro2dxE`>J z)j%pXDo3fcLMG9ndse=FqCeoT16w`so%b(PUTZ}Z`M`Fgxj!tU`$u+NtEd%;c+2O? zBKGuPzyGAy^m)OrLmqxl)iG0b(_O6m2t@1 zmFIBGp4LGXnqoE)M`53VK}n)u@S8dXd0+g3&Mg2_K@*%bJgUWli0PMDrSxzpPyUzU zg2O*&$AOEl_c~HT|CWDgYi>8*SQgFORz7Sq9$=bZwqv-2e<&@@v$bnHa?O5=Y~xMCLg%Nm==TltipXT`fQaX^KRwy zRkqWOxT~VJ@ZjXK4Xn^LykbVHc|0%I47s&7fkP^Vf23~*3Y<3WbLZJRr9D~sM_>** zXBjiJQxC@IV-XMThcqgT=2cdokC|GWGx+n9l_{UDc&es3m1G_(&O3`2Moz=$@8+7t zqP+-1+ukD2&z?QrqE1d^d5FZ3SedWbN}m6C05UNUdsRai)>7;idw*8_LvND<-FxE@ z?6QEC?8U7N@x~lNCYDxSP^>R0eytt+GvxdwyPTBEo?q5Z=b_S2b90E4R)({Cwn?E_>=MeW=uv- zN#?ekSK@4yG%$wyvSKyrP)urkpS&sak(+v{~+&?hdJ^-Fpfe? z`4;1=?bVO>RgzBwv2U+tLYF0xBb;T`0d>h)Ng|P;gVXeaz);STs^9*fL!$8#x^f0M T#+MxJf`H4(&c&8(O-%U@oPSX3 diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index a6c7d1b98..ee4a35a26 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -52,6 +52,7 @@ writeSettings(); }, }, + "Background": stringInSettings("backgroundImage", ["3bit", "4bit"]), Date: stringInSettings("dateFormat", ["Long", "Short"]), "Draw Interval": { value: settings.drawInterval, From de6b3d97ad2b1f02edf44e192ce6f44925eb1080 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Tue, 15 Mar 2022 17:26:42 +0100 Subject: [PATCH 05/69] Fix screenshot links in README file --- apps/smclock/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 7a099f268..518d77d4e 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -4,7 +4,8 @@ Just a simple watch face for the Banglejs2. It shows battery level in the upper left corner, date information in the upper right, and time information in the bottom. -![](screenshot.png) +![](screenshot0.png) +![](screenshot1.png) ## Settings From f4387fca64d9a99465522305c716442d63f9ac93 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 21:24:45 +0100 Subject: [PATCH 06/69] First entry of my 1024 Game (v0.5) --- apps/game1024/Changelog | 2 + apps/game1024/app-icon.js | 1 + apps/game1024/app.js | 682 ++++++++++++++++++++++++++++++++ apps/game1024/game1024.app.info | 6 + apps/game1024/game1024.json | 1 + apps/game1024/game1024.png | Bin 0 -> 1768 bytes apps/game1024/metadata.json | 13 + 7 files changed, 705 insertions(+) create mode 100644 apps/game1024/Changelog create mode 100644 apps/game1024/app-icon.js create mode 100644 apps/game1024/app.js create mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/game1024.json create mode 100644 apps/game1024/game1024.png create mode 100644 apps/game1024/metadata.json diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog new file mode 100644 index 000000000..310242d11 --- /dev/null +++ b/apps/game1024/Changelog @@ -0,0 +1,2 @@ +0.01: New App! +0.5: First version in Github \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js new file mode 100644 index 000000000..2a9df2fa3 --- /dev/null +++ b/apps/game1024/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js new file mode 100644 index 000000000..52f82cdeb --- /dev/null +++ b/apps/game1024/app.js @@ -0,0 +1,682 @@ +const debugMode = 'development'; // valid values are: off, test, production, development +const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; +const rows = 4, cols = 4; +const borderWidth = 6; +const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; +const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, + {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, + {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, + {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; +const cellFgColor = '#000000'; +const cellShadowColor = '#f2f2f2'; +const cellFonts = ["12x20", "12x20", "Vector:14"]; +const cellChars = [ + [0,1,2,3,4,5,6,7,8,9,10], + ['0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], + ['0','I', 'II', 'III', 'IV', 'V', 'VI', 'VII','VIII', 'IX', 'X'] +]; +// const numInitialCells = 2; +const maxUndoLevels = 4; +const noExceptions = true; +let charIndex = 0; // plain numbers on the grid + + + +const scores = { + currentScore: 0, + highScore: 0, + lastScores: [0], + add: function(val) { + this.currentScore = this.currentScore + Math.pow(2, val); + debug(console.log("new score=",this.currentScore)); + }, + addToUndo: function () { + this.lastScores.push(this.currentScore); + if (this.lastScores.length > maxUndoLevels) this.lastScores.shift(); + }, + undo: function () { + this.currentScore = this.lastScores.pop(); + debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + }, + reset: function () { + this.currentScore = 0; + this.lastScores = [0]; + }, + draw: function () { + g.setColor(btnAtribs.fg); + let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; + let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); + g.setFont12x20(1); + g.setFontAlign(0,0,0); + let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); + let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; + g.setColor('#000000'); + g.drawString(this.currentScore, scrX+1, scrY+1); + g.setColor(btnAtribs.bg); + g.drawString(this.currentScore, scrX, scrY); + scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); + g.setFont("6x8:1x2"); + g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + }, + hsContents: function () { + return {"highScore": this.highScore, "lastScore": this.currentScore}; + }, + check: function () { + this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; + debug(console.log('highScore =', this.highScore)); + } +}; + +// snapshot interval is the number of moves after wich a snapshot is wriiten to file +const snInterval = 1; + +const snReadOnInit = true; +// a snapshot contains a json file dump of the last positions of the tiles on the board, including the scores +const snapshot = { + interval: snInterval, + snFileName: 'game1024.json', + counter: 0, + updCounter: function() { + this.counter = ++this.counter > this.interval ? 0 : this.counter; + }, + dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0, charIndex: charIndex}, + write: function() { + require("Storage").writeJSON(this.snFileName, this.dump); + }, + read: function () { + let sn = require("Storage").readJSON(this.snFileName, noExceptions); + if ((typeof sn == "undefined") || (sn.gridsize !== rows * cols)) { + require("Storage").writeJSON(this.snFileName, this.dump); + return false; + } else { + if ((typeof sn !== "undefined") && (sn.gridsize == rows * cols)){ + this.dump = sn; + return true; + } + } + }, + setDump: function () { + this.dump.expVals = []; + allSquares.forEach(sq => { + this.dump.expVals.push(sq.expVal); + }); + this.dump.score = scores.currentScore; + this.dump.highScore = scores.highScore; + this.dump.charIndex = charIndex; + }, + make: function () { + this.updCounter(); + if (this.counter == this.interval) { + this.setDump(); + this.write(); + debug(console.log("D U M P E D!", this.dump)); + } + }, + recover: function () { + if (this.read()) { + this.dump.expVals.forEach((val, idx) => { + allSquares[idx].setExpVal(val); + }); + scores.currentScore = this.dump.score ? this.dump.score : 0; + scores.highScore = this.dump.highScore ? this.dump.highScore : 0 ; + charIndex = this.dump.charIndex ? this.dump.charIndex : 0 ; + } + }, + reset: function () { + this.dump.gridsize = rows * cols; + this.dump.expVals = []; + for (let i = 0; i< this.dump.gridsize; i++) { + this.dump.expVals[i] = 0; + } + this.dump.score = scores.currentScore; + this.dump.charIndex = charIndex; + this.write(); + debug(console.log("reset D U M P E D!", this.dump)); + } +}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const buttons = { + all: [], + draw: function () { + this.all.forEach(btn => { + btn.draw(); + }); + }, + add: function(btn) { + this.all.push(btn); + } +}; +/** + * to the right = -1 + all tiles move to the left, begin with the outer righthand side tiles + moving 0 to max 3 places to the right + + find first tile beginning with bottom row, righthand side + */ + +const mover = { + direction: { + up: {name: 'up', step: 1, innerBegin: 0, innerEnd: rows-1, outerBegin: 0, outerEnd: cols-1, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m < rows -1 ? (m+1)*(cols) + n : -1;} + }, + down: {name: 'down', step:-1, innerBegin: rows-1, innerEnd: 0, outerBegin: cols-1, outerEnd: 0, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m > 0 ? (m-1)*(cols) + n : -1;} + }, + left: {name: 'left', step: 1, innerBegin: 0, innerEnd: cols-1, outerBegin: 0, outerEnd: rows-1, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m < cols -1 ? n*(rows) + m +1 : -1;} + }, + right: {name: 'right', step:-1, innerBegin: cols-1, innerEnd: 0, outerBegin: rows-1, outerEnd: 0, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m > 0 ? n*(rows) + m -1: -1;} + } + }, + anyLeft: function() { + let canContinue = false; + [this.direction.up,this.direction.left].forEach (dir => { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + if (allSquares[idx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + if (nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + canContinue = true; // equal adjacent cells > 0 found + break; + } + if (allSquares[nextIdx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + } + if (canContinue) break; + } + if (canContinue) break; + } + }); + return canContinue; + }, + nonEmptyCells: function (dir) { + debug(console.log("Move: ", dir.name)); + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // let rowStr = '| '; + + // Move a number of iteration with the squares to move them all to one side + for (let iter = 0; iter < dir.iter; iter++) { + + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + // get the array of squares index for current cell + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if (allSquares[idx].expVal == 0 && nextIdx >= 0) { + allSquares[idx].setExpVal(allSquares[nextIdx].expVal); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + }, + // add up the conjacent squares with identical values en set next square to empty in the process + mergeEqlCells: function(dir) { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if ((allSquares[idx].expVal > 0) && nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + let expVal = allSquares[idx].expVal; + allSquares[idx].setExpVal(++expVal); + allSquares[idx].addToScore(); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + } +}; +// Minimum number of pixels to interpret it as drag gesture +const dragThreshold = 10; + +// Maximum number of pixels to interpret a click from a drag event series +const clickThreshold = 3; + +let allSquares = []; +// let buttons = []; + +class Button { + constructor(name, x0, y0, width, height, text, bg, fg, cb, enabled) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + height; + this.name = name; + this.cb = cb; + this.text = text; + this.bg = bg; + this.fg = fg; + this.font = "6x8:3"; + this.enabled = enabled; + } + disable() { + this.enabled = false; + } + enable() { + this.enabled = true; + } + draw() { + g.setColor(this.bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setFont(this.font); + g.setFontAlign(0,0,0); + let strX = Math.floor((this.x0+this.x1)/2); + let strY = Math.floor((this.y0+this.y1)/2); + g.setColor("#000000"); + g.drawString(this.text, strX+2, strY+2); + g.setColor(this.fg); + g.drawString(this.text, strX, strY); + // buttons.push(this); + } + onClick() {if (typeof this.cb === 'function' && this.enabled) { + this.cb(this); + } + } +} + +class Cell { + constructor(x0, y0, width, idx, cb) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + width; + this.expVal = 0; + this.previousExpVals=[]; + this.idx = idx; + this.cb = cb; + } + getColor(i) { + return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; + } + drawBg() { + g.setColor(this.getColor(this.expVal).bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + } + drawNumber() { + if (this.expVal !== 0) { + g.setFont(cellFonts[charIndex]); + g.setFontAlign(0,0,0); + let char = cellChars[charIndex][this.expVal]; + let strX = Math.floor((this.x0 + this.x1)/2); + let strY = Math.floor((this.y0 + this.y1)/2); + // g.setColor(cellShadowColor); + // g.drawString(this.expVal, strX+1, strY+1); + g.setColor(this.getColor(this.expVal).fg); + g.drawString(char, strX, strY); + } + } + setExpVal(val) { + this.expVal = val; + } + getIdx() {return this.idx;} + pushToUndo() { + // remember this new step + this.previousExpVals.push(this.expVal); + // keep the undo list not longer than max undo levels + if (this.previousExpVals.length > maxUndoLevels) this.previousExpVals.shift(); + } + popFromUndo() { + // take one step back + if (this.previousExpVals.length > 0) { + this.expVal = this.previousExpVals.pop(); + } + } + removeUndo() { + this.previousExpVals=[0]; + } + addToScore() {if (typeof this.cb === 'function') { + this.cb(this.expVal); + } + } +} + +function undoGame() { + g.clear(); + if (scores.lastScores.length > 0) { + allSquares.forEach(sq => { + sq.popFromUndo(); + sq.drawBg(); + sq.drawNumber(); + }); + scores.undo(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + snapshot.make(); + } + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function addToUndo() { + allSquares.forEach(sq => { + sq.pushToUndo(); + }); + scores.addToUndo(); +} +function addToScore (val) { + scores.add(val); + if (val == 10) messageYouWin(); +} +function createGrid () { + let cn =0; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + let x0 = borderWidth + c*(borderWidth + sqWidth) - (rows/2)*(2*borderWidth + sqWidth) + middle.x + Math.floor(sqWidth/3); + let y0 = borderWidth + r*(borderWidth + sqWidth) - (cols/2)*(2*borderWidth + sqWidth) + middle.y + Math.floor(sqWidth/3); + let cell = new Cell(x0, y0, sqWidth, c + r*cols, addToScore); + allSquares.push(cell); + } + } +} +function messageGameOver () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("G A M E", middle.x+13, middle.y-24); + g.drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff"); + g.drawString("G A M E", middle.x+12, middle.y-25); + g.drawString("O V E R !", middle.x+12, middle.y+25); +} +function messageYouWin () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("YOU HAVE", middle.x+18, middle.y-24); + g.drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808"); + g.drawString("YOU HAVE", middle.x+17, middle.y-25); + g.drawString("W O N ! !", middle.x+17, middle.y+25); + Bangle.buzz(200, 1); +} +function makeRandomNumber () { + return Math.ceil(2*Math.random()); +} +function addRandomNumber() { + let emptySquaresIdxs = []; + allSquares.forEach(sq => { + if (sq.expVal == 0) emptySquaresIdxs.push(sq.getIdx()); + }); + if (emptySquaresIdxs.length > 0) { + let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); + allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + } +} +function drawGrid() { + allSquares.forEach(sq => { + sq.drawBg(); + sq.drawNumber(); + }); +} +function initGame() { + g.clear(); + // scores.read(); + createGrid(); + if (snReadOnInit) { + snapshot.recover(); + debug(console.log("R E C O V E R E D !", snapshot.dump)); + let sum = allSquares.reduce((t,v) => { return t + v ;}); + if (!sum) { + addRandomNumber(); + } + } else { + addRandomNumber(); + // addToUndo(); + } + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + // Clock mode allows short-press on button to exit + Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function drawPopUp(message,cb) { + g.setColor('#FFFFFF'); + let rDims = Bangle.appRect; + g.fillPoly([rDims.x+10, rDims.y+20, + rDims.x+20, rDims.y+10, + rDims.x2-30, rDims.y+10, + rDims.x2-20, rDims.y+20, + rDims.x2-20, rDims.y2-40, + rDims.x2-30, rDims.y2-30, + rDims.x+20, rDims.y2-30, + rDims.x+10, rDims.y2-40 + ]); + buttons.all.forEach(btn => {btn.disable();}); + const btnYes = new Button('yes', rDims.x+16, rDims.y2-80, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnNo = new Button('no', rDims.x2-80, rDims.y2-80, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); + btnYes.draw(); + btnNo.draw(); + g.setColor('#000000'); + g.setFont12x20(1); + g.setFontAlign(-1,-1,0); + g.drawString(message, rDims.x+20, rDims.y+20); + buttons.add(btnYes); + buttons.add(btnNo); +} +function handlePopUpClicks(btn) { + const name = btn.name; + buttons.all.pop(); // remove the no button + buttons.all.pop(); // remove the yes button + buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again + debug(console.log("Button name =", name)); + switch (name) { + case 'yes': + resetGame(); + break; + default: + g.clear(); + drawGrid(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} +function resetGame() { + g.clear(); + scores.reset(); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + addRandomNumber(); + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} + +/** + * Function that can be used in test or development environment, or production. + * Depends on global constant EFTriggerDebugMode + * @param {function} func function to call like console.log() + */ + const debug = (func) => { + switch (debugMode) { + case "development": + // console.log("Development"); + if (typeof func === 'function') { + func(); + } + break; + case "test" : + console.log("--- test ---"); + if (typeof func === 'function') { + func(); + } + break; + case "off": + case "production": // ignore func + default: break; + } +}; +const test = { + drawAllColors: function(i) { + charIndex = i>2 ? 0 : i<0 ? 0 : i; + allSquares.forEach((sq,i) => { + let c = i<11 ? i : i-10; + sq.setExpVal(c); + debug(console.log("c=",c)); + }); + drawGrid(); + }, + youWin: function() { + messageYouWin(); + }, + gameOver: function() { + messageGameOver(); + } +}; + +// Handle a "click" event (only needed for menu button) +function handleclick(e) { + buttons.all.forEach(btn => { + if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { + btn.onClick(); + debug(console.log(btn.name)); + } + }); +} + +// Handle a drag event (moving the stones around) +function handledrag(e) { + /*debug(Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? e => console.log('To the right') : e => console.log('To the left') ) : + (e.dy > 0 ? e => console.log('Move down') : e => console.log('Move up') )); + */ + // [move.right, move.left, move.up, move.down] + runGame((Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? mover.direction.right : mover.direction.left ) : + (e.dy > 0 ? mover.direction.down : mover.direction.up ))); +} +// Evaluate "drag" events from the UI and call handlers for drags or clicks +// The UI sends a drag as a series of events indicating partial movements +// of the finger. +// This class combines such parts to a long drag from start to end +// If the drag is short, it is interpreted as click, +// otherwise as drag. +// The approprate method is called with the data of the drag. +class Dragger { + + constructor(clickHandler, dragHandler, clickThreshold, dragThreshold) { + this.clickHandler = clickHandler; + this.dragHandler = dragHandler; + this.clickThreshold = (clickThreshold === undefined ? 3 : clickThreshold); + this.dragThreshold = (dragThreshold === undefined ? 10 : dragThreshold); + this.dx = 0; + this.dy = 0; + this.enabled = true; + } + + // Enable or disable the Dragger + setEnabled(b) { + this.enabled = b; + } + + // Handle a raw drag event from the UI + handleRawDrag(e) { + if (!this.enabled) + return; + this.dx += e.dx; // Always accumulate + this.dy += e.dy; + if (e.b === 0) { // Drag event ended: Evaluate full drag + if (Math.abs(this.dx) < this.clickThreshold && Math.abs(this.dy) < this.clickThreshold) + this.clickHandler({ + x: e.x - this.dx, + y: e.y - this.dy + }); // take x and y from the drag start + else if (Math.abs(this.dx) > this.dragThreshold || Math.abs(this.dy) > this.dragThreshold) + this.dragHandler({ + x: e.x - this.dx, + y: e.y - this.dy, + dx: this.dx, + dy: this.dy + }); + this.dx = 0; // Clear the drag accumulator + this.dy = 0; + } + } + + // Attach the drag evaluator to the UI + attach() { + Bangle.on("drag", e => this.handleRawDrag(e)); + } +} + +// Dragger is needed for interaction during the game +var dragger = new Dragger(handleclick, handledrag, clickThreshold, dragThreshold); + +// Disable dragger as board is not yet initialized +dragger.setEnabled(false); + +// Nevertheless attach it so that it is ready once the game starts +dragger.attach(); + +function runGame(dir){ + addToUndo(); + updUndoLvlIndex(); + mover.nonEmptyCells(dir); + mover.mergeEqlCells(dir); + mover.nonEmptyCells(dir); + addRandomNumber(); + drawGrid(); + scores.check(); + scores.draw(); + // scores.write(); + snapshot.make(); + dragger.setEnabled(true); + if (!(mover.anyLeft())) { + debug(console.log("G A M E O V E R !!")); + snapshot.reset(); + messageGameOver(); + } +} + +function updUndoLvlIndex() { + let x = 170; + let y = 60; + g.setColor(btnAtribs.fg); + g.fillRect(x-6,y-6, 176, 67); + if (scores.lastScores.length > 0) { + g.setColor("#000000"); + g.setFont("4x6:2"); + g.drawString(scores.lastScores.length, x, y); + } +} +function incrCharIndex() { + charIndex++; + if (charIndex >= cellChars.length) charIndex = 0; + drawGrid(); +} +buttons.add(new Button('undo', btnAtribs.x, 25, btnAtribs.w, btnAtribs.h, 'U', btnAtribs.fg, btnAtribs.bg, undoGame, true)); +buttons.add(new Button('chars', btnAtribs.x, 71, btnAtribs.w, 31, '*', btnAtribs.fg, btnAtribs.bg, function(){incrCharIndex();}, true)); +buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R', btnAtribs.fg, btnAtribs.bg, function(){drawPopUp('Do you want\nto restart?',handlePopUpClicks);}, true)); + +initGame(); + +dragger.setEnabled(true); diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info new file mode 100644 index 000000000..b1c9d84ce --- /dev/null +++ b/apps/game1024/game1024.app.info @@ -0,0 +1,6 @@ +require("Storage").write("timer.info",{ + "id":"game1024", + "name":"1024 Game", + "src":"game1024.app.js", + "icon":"game1024.img" +}); \ No newline at end of file diff --git a/apps/game1024/game1024.json b/apps/game1024/game1024.json new file mode 100644 index 000000000..3749649ee --- /dev/null +++ b/apps/game1024/game1024.json @@ -0,0 +1 @@ +{"gridsize": 16, "expVals": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "score": 0, "highScore": 0, "charIndex": 1} \ No newline at end of file diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4118dd3ca0de7e48b2944f9bbaae606cf9647d8f GIT binary patch literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ literal 0 HcmV?d00001 diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json new file mode 100644 index 000000000..e4b7c9e6f --- /dev/null +++ b/apps/game1024/metadata.json @@ -0,0 +1,13 @@ +{ "id": "game1024", + "name": "1024 Game", + "shortName" : "1024 Game", + "icon": "game1024.img", + "description": "Join the numbers and get to the 1024 tile!", + "tags": "game puzzle 1024", + "allow_emulator": true, + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"game1024.app.js","url":"app.js"}, + {"name":"game1024.img","url":"app-icon.js","evaluate":true} + ] + } \ No newline at end of file From 299e754d22a93b6c388b63bfad65f502736efc06 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Tue, 15 Mar 2022 21:53:20 +0100 Subject: [PATCH 07/69] hidjoystick: Make BangleJS2 compatible --- apps/hidjoystick/ChangeLog | 1 + apps/hidjoystick/metadata.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/hidjoystick/ChangeLog b/apps/hidjoystick/ChangeLog index 5560f00bc..625daf4bb 100644 --- a/apps/hidjoystick/ChangeLog +++ b/apps/hidjoystick/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Make Bangle.js 2 compatible diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index e2b78a97b..35be134dc 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -2,11 +2,11 @@ "id": "hidjoystick", "name": "Bluetooth Joystick", "shortName": "Joystick", - "version": "0.01", + "version": "0.02", "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", "icon": "app.png", "tags": "bluetooth", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"hidjoystick.app.js","url":"app.js"}, {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} From 8bca10c3c56eafea345de2ba2e600f140b2a55e2 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 23:52:08 +0100 Subject: [PATCH 08/69] Added app iocon game1024.png --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index e4b7c9e6f..80dc59c47 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "icon": "game1024.img", + "icon": "game1024.png", "description": "Join the numbers and get to the 1024 tile!", "tags": "game puzzle 1024", "allow_emulator": true, From 87451c8ed143e65f683c932add04e6f8579e68c1 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 21:24:45 +0100 Subject: [PATCH 09/69] First entry of my 1024 Game (v0.5) --- apps/game1024/Changelog | 2 + apps/game1024/app-icon.js | 1 + apps/game1024/app.js | 682 ++++++++++++++++++++++++++++++++ apps/game1024/game1024.app.info | 6 + apps/game1024/game1024.json | 1 + apps/game1024/game1024.png | Bin 0 -> 1768 bytes apps/game1024/metadata.json | 13 + 7 files changed, 705 insertions(+) create mode 100644 apps/game1024/Changelog create mode 100644 apps/game1024/app-icon.js create mode 100644 apps/game1024/app.js create mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/game1024.json create mode 100644 apps/game1024/game1024.png create mode 100644 apps/game1024/metadata.json diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog new file mode 100644 index 000000000..310242d11 --- /dev/null +++ b/apps/game1024/Changelog @@ -0,0 +1,2 @@ +0.01: New App! +0.5: First version in Github \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js new file mode 100644 index 000000000..2a9df2fa3 --- /dev/null +++ b/apps/game1024/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js new file mode 100644 index 000000000..52f82cdeb --- /dev/null +++ b/apps/game1024/app.js @@ -0,0 +1,682 @@ +const debugMode = 'development'; // valid values are: off, test, production, development +const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; +const rows = 4, cols = 4; +const borderWidth = 6; +const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; +const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, + {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, + {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, + {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; +const cellFgColor = '#000000'; +const cellShadowColor = '#f2f2f2'; +const cellFonts = ["12x20", "12x20", "Vector:14"]; +const cellChars = [ + [0,1,2,3,4,5,6,7,8,9,10], + ['0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], + ['0','I', 'II', 'III', 'IV', 'V', 'VI', 'VII','VIII', 'IX', 'X'] +]; +// const numInitialCells = 2; +const maxUndoLevels = 4; +const noExceptions = true; +let charIndex = 0; // plain numbers on the grid + + + +const scores = { + currentScore: 0, + highScore: 0, + lastScores: [0], + add: function(val) { + this.currentScore = this.currentScore + Math.pow(2, val); + debug(console.log("new score=",this.currentScore)); + }, + addToUndo: function () { + this.lastScores.push(this.currentScore); + if (this.lastScores.length > maxUndoLevels) this.lastScores.shift(); + }, + undo: function () { + this.currentScore = this.lastScores.pop(); + debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + }, + reset: function () { + this.currentScore = 0; + this.lastScores = [0]; + }, + draw: function () { + g.setColor(btnAtribs.fg); + let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; + let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); + g.setFont12x20(1); + g.setFontAlign(0,0,0); + let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); + let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; + g.setColor('#000000'); + g.drawString(this.currentScore, scrX+1, scrY+1); + g.setColor(btnAtribs.bg); + g.drawString(this.currentScore, scrX, scrY); + scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); + g.setFont("6x8:1x2"); + g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + }, + hsContents: function () { + return {"highScore": this.highScore, "lastScore": this.currentScore}; + }, + check: function () { + this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; + debug(console.log('highScore =', this.highScore)); + } +}; + +// snapshot interval is the number of moves after wich a snapshot is wriiten to file +const snInterval = 1; + +const snReadOnInit = true; +// a snapshot contains a json file dump of the last positions of the tiles on the board, including the scores +const snapshot = { + interval: snInterval, + snFileName: 'game1024.json', + counter: 0, + updCounter: function() { + this.counter = ++this.counter > this.interval ? 0 : this.counter; + }, + dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0, charIndex: charIndex}, + write: function() { + require("Storage").writeJSON(this.snFileName, this.dump); + }, + read: function () { + let sn = require("Storage").readJSON(this.snFileName, noExceptions); + if ((typeof sn == "undefined") || (sn.gridsize !== rows * cols)) { + require("Storage").writeJSON(this.snFileName, this.dump); + return false; + } else { + if ((typeof sn !== "undefined") && (sn.gridsize == rows * cols)){ + this.dump = sn; + return true; + } + } + }, + setDump: function () { + this.dump.expVals = []; + allSquares.forEach(sq => { + this.dump.expVals.push(sq.expVal); + }); + this.dump.score = scores.currentScore; + this.dump.highScore = scores.highScore; + this.dump.charIndex = charIndex; + }, + make: function () { + this.updCounter(); + if (this.counter == this.interval) { + this.setDump(); + this.write(); + debug(console.log("D U M P E D!", this.dump)); + } + }, + recover: function () { + if (this.read()) { + this.dump.expVals.forEach((val, idx) => { + allSquares[idx].setExpVal(val); + }); + scores.currentScore = this.dump.score ? this.dump.score : 0; + scores.highScore = this.dump.highScore ? this.dump.highScore : 0 ; + charIndex = this.dump.charIndex ? this.dump.charIndex : 0 ; + } + }, + reset: function () { + this.dump.gridsize = rows * cols; + this.dump.expVals = []; + for (let i = 0; i< this.dump.gridsize; i++) { + this.dump.expVals[i] = 0; + } + this.dump.score = scores.currentScore; + this.dump.charIndex = charIndex; + this.write(); + debug(console.log("reset D U M P E D!", this.dump)); + } +}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const buttons = { + all: [], + draw: function () { + this.all.forEach(btn => { + btn.draw(); + }); + }, + add: function(btn) { + this.all.push(btn); + } +}; +/** + * to the right = -1 + all tiles move to the left, begin with the outer righthand side tiles + moving 0 to max 3 places to the right + + find first tile beginning with bottom row, righthand side + */ + +const mover = { + direction: { + up: {name: 'up', step: 1, innerBegin: 0, innerEnd: rows-1, outerBegin: 0, outerEnd: cols-1, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m < rows -1 ? (m+1)*(cols) + n : -1;} + }, + down: {name: 'down', step:-1, innerBegin: rows-1, innerEnd: 0, outerBegin: cols-1, outerEnd: 0, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m > 0 ? (m-1)*(cols) + n : -1;} + }, + left: {name: 'left', step: 1, innerBegin: 0, innerEnd: cols-1, outerBegin: 0, outerEnd: rows-1, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m < cols -1 ? n*(rows) + m +1 : -1;} + }, + right: {name: 'right', step:-1, innerBegin: cols-1, innerEnd: 0, outerBegin: rows-1, outerEnd: 0, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m > 0 ? n*(rows) + m -1: -1;} + } + }, + anyLeft: function() { + let canContinue = false; + [this.direction.up,this.direction.left].forEach (dir => { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + if (allSquares[idx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + if (nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + canContinue = true; // equal adjacent cells > 0 found + break; + } + if (allSquares[nextIdx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + } + if (canContinue) break; + } + if (canContinue) break; + } + }); + return canContinue; + }, + nonEmptyCells: function (dir) { + debug(console.log("Move: ", dir.name)); + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // let rowStr = '| '; + + // Move a number of iteration with the squares to move them all to one side + for (let iter = 0; iter < dir.iter; iter++) { + + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + // get the array of squares index for current cell + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if (allSquares[idx].expVal == 0 && nextIdx >= 0) { + allSquares[idx].setExpVal(allSquares[nextIdx].expVal); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + }, + // add up the conjacent squares with identical values en set next square to empty in the process + mergeEqlCells: function(dir) { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if ((allSquares[idx].expVal > 0) && nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + let expVal = allSquares[idx].expVal; + allSquares[idx].setExpVal(++expVal); + allSquares[idx].addToScore(); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + } +}; +// Minimum number of pixels to interpret it as drag gesture +const dragThreshold = 10; + +// Maximum number of pixels to interpret a click from a drag event series +const clickThreshold = 3; + +let allSquares = []; +// let buttons = []; + +class Button { + constructor(name, x0, y0, width, height, text, bg, fg, cb, enabled) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + height; + this.name = name; + this.cb = cb; + this.text = text; + this.bg = bg; + this.fg = fg; + this.font = "6x8:3"; + this.enabled = enabled; + } + disable() { + this.enabled = false; + } + enable() { + this.enabled = true; + } + draw() { + g.setColor(this.bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setFont(this.font); + g.setFontAlign(0,0,0); + let strX = Math.floor((this.x0+this.x1)/2); + let strY = Math.floor((this.y0+this.y1)/2); + g.setColor("#000000"); + g.drawString(this.text, strX+2, strY+2); + g.setColor(this.fg); + g.drawString(this.text, strX, strY); + // buttons.push(this); + } + onClick() {if (typeof this.cb === 'function' && this.enabled) { + this.cb(this); + } + } +} + +class Cell { + constructor(x0, y0, width, idx, cb) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + width; + this.expVal = 0; + this.previousExpVals=[]; + this.idx = idx; + this.cb = cb; + } + getColor(i) { + return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; + } + drawBg() { + g.setColor(this.getColor(this.expVal).bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + } + drawNumber() { + if (this.expVal !== 0) { + g.setFont(cellFonts[charIndex]); + g.setFontAlign(0,0,0); + let char = cellChars[charIndex][this.expVal]; + let strX = Math.floor((this.x0 + this.x1)/2); + let strY = Math.floor((this.y0 + this.y1)/2); + // g.setColor(cellShadowColor); + // g.drawString(this.expVal, strX+1, strY+1); + g.setColor(this.getColor(this.expVal).fg); + g.drawString(char, strX, strY); + } + } + setExpVal(val) { + this.expVal = val; + } + getIdx() {return this.idx;} + pushToUndo() { + // remember this new step + this.previousExpVals.push(this.expVal); + // keep the undo list not longer than max undo levels + if (this.previousExpVals.length > maxUndoLevels) this.previousExpVals.shift(); + } + popFromUndo() { + // take one step back + if (this.previousExpVals.length > 0) { + this.expVal = this.previousExpVals.pop(); + } + } + removeUndo() { + this.previousExpVals=[0]; + } + addToScore() {if (typeof this.cb === 'function') { + this.cb(this.expVal); + } + } +} + +function undoGame() { + g.clear(); + if (scores.lastScores.length > 0) { + allSquares.forEach(sq => { + sq.popFromUndo(); + sq.drawBg(); + sq.drawNumber(); + }); + scores.undo(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + snapshot.make(); + } + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function addToUndo() { + allSquares.forEach(sq => { + sq.pushToUndo(); + }); + scores.addToUndo(); +} +function addToScore (val) { + scores.add(val); + if (val == 10) messageYouWin(); +} +function createGrid () { + let cn =0; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + let x0 = borderWidth + c*(borderWidth + sqWidth) - (rows/2)*(2*borderWidth + sqWidth) + middle.x + Math.floor(sqWidth/3); + let y0 = borderWidth + r*(borderWidth + sqWidth) - (cols/2)*(2*borderWidth + sqWidth) + middle.y + Math.floor(sqWidth/3); + let cell = new Cell(x0, y0, sqWidth, c + r*cols, addToScore); + allSquares.push(cell); + } + } +} +function messageGameOver () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("G A M E", middle.x+13, middle.y-24); + g.drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff"); + g.drawString("G A M E", middle.x+12, middle.y-25); + g.drawString("O V E R !", middle.x+12, middle.y+25); +} +function messageYouWin () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("YOU HAVE", middle.x+18, middle.y-24); + g.drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808"); + g.drawString("YOU HAVE", middle.x+17, middle.y-25); + g.drawString("W O N ! !", middle.x+17, middle.y+25); + Bangle.buzz(200, 1); +} +function makeRandomNumber () { + return Math.ceil(2*Math.random()); +} +function addRandomNumber() { + let emptySquaresIdxs = []; + allSquares.forEach(sq => { + if (sq.expVal == 0) emptySquaresIdxs.push(sq.getIdx()); + }); + if (emptySquaresIdxs.length > 0) { + let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); + allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + } +} +function drawGrid() { + allSquares.forEach(sq => { + sq.drawBg(); + sq.drawNumber(); + }); +} +function initGame() { + g.clear(); + // scores.read(); + createGrid(); + if (snReadOnInit) { + snapshot.recover(); + debug(console.log("R E C O V E R E D !", snapshot.dump)); + let sum = allSquares.reduce((t,v) => { return t + v ;}); + if (!sum) { + addRandomNumber(); + } + } else { + addRandomNumber(); + // addToUndo(); + } + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + // Clock mode allows short-press on button to exit + Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function drawPopUp(message,cb) { + g.setColor('#FFFFFF'); + let rDims = Bangle.appRect; + g.fillPoly([rDims.x+10, rDims.y+20, + rDims.x+20, rDims.y+10, + rDims.x2-30, rDims.y+10, + rDims.x2-20, rDims.y+20, + rDims.x2-20, rDims.y2-40, + rDims.x2-30, rDims.y2-30, + rDims.x+20, rDims.y2-30, + rDims.x+10, rDims.y2-40 + ]); + buttons.all.forEach(btn => {btn.disable();}); + const btnYes = new Button('yes', rDims.x+16, rDims.y2-80, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnNo = new Button('no', rDims.x2-80, rDims.y2-80, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); + btnYes.draw(); + btnNo.draw(); + g.setColor('#000000'); + g.setFont12x20(1); + g.setFontAlign(-1,-1,0); + g.drawString(message, rDims.x+20, rDims.y+20); + buttons.add(btnYes); + buttons.add(btnNo); +} +function handlePopUpClicks(btn) { + const name = btn.name; + buttons.all.pop(); // remove the no button + buttons.all.pop(); // remove the yes button + buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again + debug(console.log("Button name =", name)); + switch (name) { + case 'yes': + resetGame(); + break; + default: + g.clear(); + drawGrid(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} +function resetGame() { + g.clear(); + scores.reset(); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + addRandomNumber(); + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} + +/** + * Function that can be used in test or development environment, or production. + * Depends on global constant EFTriggerDebugMode + * @param {function} func function to call like console.log() + */ + const debug = (func) => { + switch (debugMode) { + case "development": + // console.log("Development"); + if (typeof func === 'function') { + func(); + } + break; + case "test" : + console.log("--- test ---"); + if (typeof func === 'function') { + func(); + } + break; + case "off": + case "production": // ignore func + default: break; + } +}; +const test = { + drawAllColors: function(i) { + charIndex = i>2 ? 0 : i<0 ? 0 : i; + allSquares.forEach((sq,i) => { + let c = i<11 ? i : i-10; + sq.setExpVal(c); + debug(console.log("c=",c)); + }); + drawGrid(); + }, + youWin: function() { + messageYouWin(); + }, + gameOver: function() { + messageGameOver(); + } +}; + +// Handle a "click" event (only needed for menu button) +function handleclick(e) { + buttons.all.forEach(btn => { + if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { + btn.onClick(); + debug(console.log(btn.name)); + } + }); +} + +// Handle a drag event (moving the stones around) +function handledrag(e) { + /*debug(Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? e => console.log('To the right') : e => console.log('To the left') ) : + (e.dy > 0 ? e => console.log('Move down') : e => console.log('Move up') )); + */ + // [move.right, move.left, move.up, move.down] + runGame((Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? mover.direction.right : mover.direction.left ) : + (e.dy > 0 ? mover.direction.down : mover.direction.up ))); +} +// Evaluate "drag" events from the UI and call handlers for drags or clicks +// The UI sends a drag as a series of events indicating partial movements +// of the finger. +// This class combines such parts to a long drag from start to end +// If the drag is short, it is interpreted as click, +// otherwise as drag. +// The approprate method is called with the data of the drag. +class Dragger { + + constructor(clickHandler, dragHandler, clickThreshold, dragThreshold) { + this.clickHandler = clickHandler; + this.dragHandler = dragHandler; + this.clickThreshold = (clickThreshold === undefined ? 3 : clickThreshold); + this.dragThreshold = (dragThreshold === undefined ? 10 : dragThreshold); + this.dx = 0; + this.dy = 0; + this.enabled = true; + } + + // Enable or disable the Dragger + setEnabled(b) { + this.enabled = b; + } + + // Handle a raw drag event from the UI + handleRawDrag(e) { + if (!this.enabled) + return; + this.dx += e.dx; // Always accumulate + this.dy += e.dy; + if (e.b === 0) { // Drag event ended: Evaluate full drag + if (Math.abs(this.dx) < this.clickThreshold && Math.abs(this.dy) < this.clickThreshold) + this.clickHandler({ + x: e.x - this.dx, + y: e.y - this.dy + }); // take x and y from the drag start + else if (Math.abs(this.dx) > this.dragThreshold || Math.abs(this.dy) > this.dragThreshold) + this.dragHandler({ + x: e.x - this.dx, + y: e.y - this.dy, + dx: this.dx, + dy: this.dy + }); + this.dx = 0; // Clear the drag accumulator + this.dy = 0; + } + } + + // Attach the drag evaluator to the UI + attach() { + Bangle.on("drag", e => this.handleRawDrag(e)); + } +} + +// Dragger is needed for interaction during the game +var dragger = new Dragger(handleclick, handledrag, clickThreshold, dragThreshold); + +// Disable dragger as board is not yet initialized +dragger.setEnabled(false); + +// Nevertheless attach it so that it is ready once the game starts +dragger.attach(); + +function runGame(dir){ + addToUndo(); + updUndoLvlIndex(); + mover.nonEmptyCells(dir); + mover.mergeEqlCells(dir); + mover.nonEmptyCells(dir); + addRandomNumber(); + drawGrid(); + scores.check(); + scores.draw(); + // scores.write(); + snapshot.make(); + dragger.setEnabled(true); + if (!(mover.anyLeft())) { + debug(console.log("G A M E O V E R !!")); + snapshot.reset(); + messageGameOver(); + } +} + +function updUndoLvlIndex() { + let x = 170; + let y = 60; + g.setColor(btnAtribs.fg); + g.fillRect(x-6,y-6, 176, 67); + if (scores.lastScores.length > 0) { + g.setColor("#000000"); + g.setFont("4x6:2"); + g.drawString(scores.lastScores.length, x, y); + } +} +function incrCharIndex() { + charIndex++; + if (charIndex >= cellChars.length) charIndex = 0; + drawGrid(); +} +buttons.add(new Button('undo', btnAtribs.x, 25, btnAtribs.w, btnAtribs.h, 'U', btnAtribs.fg, btnAtribs.bg, undoGame, true)); +buttons.add(new Button('chars', btnAtribs.x, 71, btnAtribs.w, 31, '*', btnAtribs.fg, btnAtribs.bg, function(){incrCharIndex();}, true)); +buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R', btnAtribs.fg, btnAtribs.bg, function(){drawPopUp('Do you want\nto restart?',handlePopUpClicks);}, true)); + +initGame(); + +dragger.setEnabled(true); diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info new file mode 100644 index 000000000..b1c9d84ce --- /dev/null +++ b/apps/game1024/game1024.app.info @@ -0,0 +1,6 @@ +require("Storage").write("timer.info",{ + "id":"game1024", + "name":"1024 Game", + "src":"game1024.app.js", + "icon":"game1024.img" +}); \ No newline at end of file diff --git a/apps/game1024/game1024.json b/apps/game1024/game1024.json new file mode 100644 index 000000000..3749649ee --- /dev/null +++ b/apps/game1024/game1024.json @@ -0,0 +1 @@ +{"gridsize": 16, "expVals": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "score": 0, "highScore": 0, "charIndex": 1} \ No newline at end of file diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4118dd3ca0de7e48b2944f9bbaae606cf9647d8f GIT binary patch literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ literal 0 HcmV?d00001 diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json new file mode 100644 index 000000000..e4b7c9e6f --- /dev/null +++ b/apps/game1024/metadata.json @@ -0,0 +1,13 @@ +{ "id": "game1024", + "name": "1024 Game", + "shortName" : "1024 Game", + "icon": "game1024.img", + "description": "Join the numbers and get to the 1024 tile!", + "tags": "game puzzle 1024", + "allow_emulator": true, + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"game1024.app.js","url":"app.js"}, + {"name":"game1024.img","url":"app-icon.js","evaluate":true} + ] + } \ No newline at end of file From f67313e7ffbd9c4e07cf279b4268d20d0ddc5c2b Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 23:52:08 +0100 Subject: [PATCH 10/69] Added app iocon game1024.png --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index e4b7c9e6f..80dc59c47 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "icon": "game1024.img", + "icon": "game1024.png", "description": "Join the numbers and get to the 1024 tile!", "tags": "game puzzle 1024", "allow_emulator": true, From 305d9eb5b7ca3c6e36902998e57b4154c2cbfdff Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 00:25:33 +0100 Subject: [PATCH 11/69] Altered app icon for the correct image --- apps/gbdebug/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gbdebug/app-icon.js b/apps/gbdebug/app-icon.js index a701ef3a9..0bd1418fc 100644 --- a/apps/gbdebug/app-icon.js +++ b/apps/gbdebug/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4cBzsE/4AClMywH680rlOW9N9kmSpICnyBBBgQRMkBUDgIRKoBoGGRYAFHBGARpARHT5MJKxQAFLgzELCIlIBQkSCIsEPRKBHCIYbGoIRFiQRJhJgFCISeEBwMQOQykCCIqlBpMEBIgRHOQYRIYQbPDhAbBNwgRJVwOCTIgRFMAJKDgQRGOQprBCIMSGogHBJwwbBkC2FCJNbUgMNwHYBYPJCIhODju0yFNCIUGCJGCoE2NwO24EAmw1FHgWCpMGgQOBBIMwCJGSpMmyAjDCI6eBCIWAhu2I4IRCUIYREk+Ah3brEB2CzFAAIRCl3b23btsNCJckjoRC1h2CyAREtoNC9oDC2isCCIgHBjdt5MtCJj2CowjD2uyCIOSCI83lu123tAQIRI4EB28/++39/0mwRCoARCgbfByU51/3rev+mWCIQwCPok0EYIRB/gRDpJ+EcYQRJkARQdgq/Bl5HE7IRDZAltwAREyXbCIbIFgEfCIXsBwQCDQAYRNLgvfCIXtCI44Dm3JCIUlYoYCGkrjBk9bxMkyy9CChICFA=")) +var img = E.toArrayBuffer(atob("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R0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4ca//8Ph4eHAABHR0dHCo9HR0dHAABkZGRkZGRkZGRkAAAJCThQUDgJCQkAAAAAh4caHYeHh4eHAABHR0dHCo5HR0dHAABkZGRkZGRkZGRkAAAJCQk4HjgJCQkAAAAAh4caDw8eh4eHAABHR0ekR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJHgkJCQkAAAAAh4eHh58eB4eHAABHR0dIR45HR0dHAABkZGRkZGRkZGRkAAAJCQlQUAkJCQkAAAAAh4eHh58eB4eHAABHR6UAAAClR0dHAABkZGRkZGRkZGRkAAAJCQkeCQkJCQkAAAAAh4cc/w8eoIeHAABHR0dHR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) \ No newline at end of file From 4370d2ef8cc04d3b889d5df25bb1e1abb424c723 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 00:32:14 +0100 Subject: [PATCH 12/69] wrong edited --- apps/gbdebug/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gbdebug/app-icon.js b/apps/gbdebug/app-icon.js index 0bd1418fc..0cecad73b 100644 --- a/apps/gbdebug/app-icon.js +++ b/apps/gbdebug/app-icon.js @@ -1 +1 @@ -var img = E.toArrayBuffer(atob("MDCI/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFhYWFhYWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFggdDx4aFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUEAAEFBQUFBAAAWFhocFxweFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhYWFhoeFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhYWFx4ZFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhYXHhoWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhceGhYWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUEAAABAQUFBAAAWFgf///8eFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFhYWFhYWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFhYWFhYWFhYWAABkZGRkZGRkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkAAAJCQkJCQkJCQkJAAAWFhYWFhYWFhYWAAAKCgoKCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCQkJCQkJAAAWFggdDx4aFhYWAAAKCgqT2AAKCgoAAAAAZGRkZGRkZGRkAAAJCTn/D1IJCQkJAAAWFhscFxweFhYWAAAKCgrYCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCR45CQkJAAAWFhYWFhoeFhYWAAAKCpOSCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCR45CQkJAAAWFhYWFx4ZFhYWAAAKCpORwtoKCgoAAAAAZGRkZGRkZGRkAAAJCQlQ/x4JCQkJAAAWFhYXHhoWFhYWAAAKCgqRCpKSCgoAAAAAZGRkZGRkZGRkAAAJCQkJCVJQCQkJAAAWFhceGhYWFhYWAAAKCgqSwdoKCgoAAAAAZGRkZGRkZGRkAAAJCVD/Dw85CQkJAAAWFgf///8eFhYWAAAKCgoKCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCQkJCQkJAAAWFhYWFhYWFhYWAAAKCgoKCgoKCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAZGRkZGRkZGRkAAAKCkgeDx4KCgoKAAAODg6MvYwODg4OAAAAAAwMDAS3BAwAAAAAZGRkZGRkZGRkAAAKCmBfCh5HCgoKAAAODi2MDowtDg4OAAAMbwwMDIgMBAwAAAAAZGRkZGRkZGRkAAAKCkgPDx5fCgoKAAAODi2MDowtDg4OAAAMbwwMBgwMDAYAAAAAZGRkZGRkZGRkAAAKCgoKCl9gCgoKAAAODg6MAHQODg4OAAAMbwwMBgwMDAYAAAAAZGRkZGRkZGRkAAAKCgoKSA9ICgoKAAAODi2MDi4uDg4OAAAMbwwMDIgMBAwAAAAAZGRkZGRkZGRkAAAKCkj/D18KCgoKAAAODi11vnUtDg4OAAAAAAAMDAS3BAwAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4ca//8Ph4eHAABHR0dHCo9HR0dHAABkZGRkZGRkZGRkAAAJCThQUDgJCQkAAAAAh4caHYeHh4eHAABHR0dHCo5HR0dHAABkZGRkZGRkZGRkAAAJCQk4HjgJCQkAAAAAh4caDw8eh4eHAABHR0ekR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJHgkJCQkAAAAAh4eHh58eB4eHAABHR0dIR45HR0dHAABkZGRkZGRkZGRkAAAJCQlQUAkJCQkAAAAAh4eHh58eB4eHAABHR6UAAAClR0dHAABkZGRkZGRkZGRkAAAJCQkeCQkJCQkAAAAAh4cc/w8eoIeHAABHR0dHR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4cBzsE/4AClMywH680rlOW9N9kmSpICnyBBBgQRMkBUDgIRKoBoGGRYAFHBGARpARHT5MJKxQAFLgzELCIlIBQkSCIsEPRKBHCIYbGoIRFiQRJhJgFCISeEBwMQOQykCCIqlBpMEBIgRHOQYRIYQbPDhAbBNwgRJVwOCTIgRFMAJKDgQRGOQprBCIMSGogHBJwwbBkC2FCJNbUgMNwHYBYPJCIhODju0yFNCIUGCJGCoE2NwO24EAmw1FHgWCpMGgQOBBIMwCJGSpMmyAjDCI6eBCIWAhu2I4IRCUIYREk+Ah3brEB2CzFAAIRCl3b23btsNCJckjoRC1h2CyAREtoNC9oDC2isCCIgHBjdt5MtCJj2CowjD2uyCIOSCI83lu123tAQIRI4EB28/++39/0mwRCoARCgbfByU51/3rev+mWCIQwCPok0EYIRB/gRDpJ+EcYQRJkARQdgq/Bl5HE7IRDZAltwAREyXbCIbIFgEfCIXsBwQCDQAYRNLgvfCIXtCI44Dm3JCIUlYoYCGkrjBk9bxMkyy9CChICFA=")) \ No newline at end of file From d9a92a5f6ebd9a1bfa311ff928ba08f9f0247570 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 01:14:26 +0100 Subject: [PATCH 13/69] Changed metadata: new screenshiot, tags and data --- apps/game1024/game1024.app.info | 6 ------ apps/game1024/metadata.json | 10 +++++++--- apps/game1024/screenshot.png | Bin 0 -> 5904 bytes 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info deleted file mode 100644 index b1c9d84ce..000000000 --- a/apps/game1024/game1024.app.info +++ /dev/null @@ -1,6 +0,0 @@ -require("Storage").write("timer.info",{ - "id":"game1024", - "name":"1024 Game", - "src":"game1024.app.js", - "icon":"game1024.img" -}); \ No newline at end of file diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 80dc59c47..83a3613f2 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,13 +1,17 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", + "version": "0.5", "icon": "game1024.png", - "description": "Join the numbers and get to the 1024 tile!", - "tags": "game puzzle 1024", + "screenshots": [ {"url":"screenshot.png" } ], + "description": "Join the numbers and get to the 1024(2^10) or J or X tile!", + "type": "app", + "tags": "game,puzzle", "allow_emulator": true, "supports" : ["BANGLEJS2"], "storage": [ {"name":"game1024.app.js","url":"app.js"}, {"name":"game1024.img","url":"app-icon.js","evaluate":true} - ] + ], + "data":[{"name": "game1024.json", "url": "game1024.json"}] } \ No newline at end of file diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..256ecb53bc679984c59b5847219ab9bb4a7097bb GIT binary patch literal 5904 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 literal 0 HcmV?d00001 From f2ef87295d1fe7ddde9c01f6e7c3b7f49c56b6d3 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Thu, 17 Mar 2022 00:52:10 +0100 Subject: [PATCH 14/69] 0.02: Added a readme, fixed a bug, added some descriptions --- apps/game1024/Changelog | 2 +- apps/game1024/README.md | 28 ++++++++++++++++++++++++++++ apps/game1024/app.js | 6 +++--- apps/game1024/game1024_sc_watch.png | Bin 0 -> 48769 bytes apps/game1024/metadata.json | 5 +++-- 5 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 apps/game1024/README.md create mode 100644 apps/game1024/game1024_sc_watch.png diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index 310242d11..b45a8d3ad 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,2 +1,2 @@ 0.01: New App! -0.5: First version in Github \ No newline at end of file +0.02: Temporary intermediate version \ No newline at end of file diff --git a/apps/game1024/README.md b/apps/game1024/README.md new file mode 100644 index 000000000..d1d427078 --- /dev/null +++ b/apps/game1024/README.md @@ -0,0 +1,28 @@ + +# Play the game of 1024 + +Move the tiles by swiping to the lefthand, righthand or up- and downward side of the watch. + +When two tiles with the same number are squashed together they will add up as exponentials: + +**1 + 1 = 2** or **A + A = D** which is a representation of **2¹ + 2¹ = 2² = 4** + +**2 + 2 = 3** or **B + B = C** which is a representation of **2² + 2² = 2³ = 8** + +**3 + 3 = 4** or **C + C = D** which is a representation of **2³ + 2³ = 2⁴ = 16** + +So you can continue till you reach **1024** which equals **2¹⁰**. So when you reach tile **10** you have won. + +The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.) + +## Buttons + + - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels + - Button **\***: Change the text on the tile to number, capitals or Roman numbers + - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. + +### Credits + +Game 1024 is based on Saming's 2048 and Misho M. Petković 1024game.org and conceptually similar to Threes by Asher Vollmer. + +![Screenshot from the Banglejs 2 watch with the game](./game1024_sc_watch.png) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 52f82cdeb..352426d57 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -436,9 +436,9 @@ function initGame() { if (snReadOnInit) { snapshot.recover(); debug(console.log("R E C O V E R E D !", snapshot.dump)); - let sum = allSquares.reduce((t,v) => { return t + v ;}); + let sum = allSquares.reduce(function (tv, sq) {return (sq.expVal + tv) ;}, 0); if (!sum) { - addRandomNumber(); + addRandomNumber(); } } else { addRandomNumber(); @@ -679,4 +679,4 @@ buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R initGame(); -dragger.setEnabled(true); +dragger.setEnabled(true); \ No newline at end of file diff --git a/apps/game1024/game1024_sc_watch.png b/apps/game1024/game1024_sc_watch.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8184b0be8935cac9afa5340793c342111d7fe1 GIT binary patch literal 48769 zcmV)|KzzT6P)EX>4Tx04R}tkv&MmKpe$iQ>7vm1q+HgWT;LSM2k3T6^c+H)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfbaGO3krMyc6k5c1aNLh~_a1le0HIc5n$v_DPKst zta9Gstd%OPc~AbrU{+sQ<~q$0#IcAaND!f*f+9+=5usHl#X^$yV;=sYhF>C=Larhh zITlcc2D#w}|AXJ%TDhr7Hz^ncI$s>;V-yJN0`;ond>=bb{RHqo16O*>U#bbuerT7_i_3Fq^PUJ4RCM> zjO8hN-Q(R|?Y;ebrrF;QolJ7LSnFe=00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru<^vEHEg%_Pu%Z9}02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{03ZNKL_t(|+U&h|kX`q6=lS`id+&R%b3i6?62Jt3rbJ1U zD2b#MC|mMa_Smw$Q)6koo~oJMsa=n^cGnxK?D9<6<*D77^4MPIsFE!ztR>qDR3t@G z%%n&#fB*p^b_1PWxZxM}kKb+Jp}RrSB)F#RK2@)}(RlBs-|wXF`JVFxZwwJjUb64! z(%;nzKNX-?_}Tw5FY)toufNa#_aF0eum0;(E8NRUum0!J|NE+3Imv-H15at-O)s;7 zF1LAJZnM19d-W^aL@R9|^)ef1rA;JOH_@uRj6qh^o9&@hE3_*A#6{M+fCjSF=dmiQ z9wI7)TzwX+vMQ?zu_~*wV#u_r5UcV}a{mjV`qN}V1b3oVtjenVQ<8P-*OMeE=cdon z>9iOBtXCCcRbI0+S_2FZ4Kp`CNAKe1dPB?X>_qSPCn0>=vbKdK&^yk%(X;ogkJo(fiy4@~QQ|IV*JKxW@vg#pL<+aOm&pgG+ z6UQlfJ)C#n&$qJbAy(zeNca0BcX%ZVu?oAc%Brj?#Hy^y$~nZULafTFta^x5S(R0V zSd~>-RftvjN4Rs76q6*Y3b87y0@R#5@wzC)Y8_%#UXkqHx&`MwhmRfq2fvo8C{{zJ zRr!aLHy^m34}9o{dH1ci|D(?#Rz1Y3ysVr(JH>O)AEC&LRfSlUReABm38v4VApAY4 zN{iu#UsZ@z`Nt-gwhp{9@!wy!xT+AZOa!n9@rAy>_5Tbjd`7&)zg_*ZD}46*QHJY# z`6o&L7F?WM_z8~ZDYCVJk27yNX5K3SQ zs9xeT*FkFtI!^)9Oa8A}FPg3wZ2o1A^-_y6(044=XN^OB%z0ovYJ3k;KsEgkU>M(U zEen;UoH|h}K$|$-FsWbtn<>0Pqp|eg{d3@aeLcSKy-^{qe*b&8=C+UGz2lK>yLtM~ zPXmwD?`hP^U|&WV7LAp!m3nd5VbSNEuB6P=dqTg0>*|+H^>sD-u4x3w5oQ>b7;I+- zc=(O15VGDht@?p$U>rCNz=3!EE3Q9qkRwN*oH}V8G?0E+_ z>^?~1J)PNuIN=$YSc8*_6LSk3otoyM#~uP+=<@_}i8pvHVb0>`Mc?MU=w($Sp)i6H z&9=AS46PPV|H)qh_tnqG0^>B-y^A%QW3xO#vT%NmQ%`*Z7-RFBZ)A9Eoaq-|kYTKS^L{353qIjH4F_8((ZI9Nk>$&gYr&+sZ0Btl?=~=&Kf}+UDdj+EtlgunE zFn#toQ_p|8PxPyhKFRUu5hn2Xl3TPs701Mm7-KJud zR@Oz&AYUS9`1>lvqK7DJZ*(#C_QBDanc`~?Jivi#u4DIsw=iT{Jn&~tLh-fwb352@ z^?SK$_b#N-Xl2N|3(V^gMutY%wC8$~G$ENdi^^KO_{g6uyNc0`w{!C?A7sti&G;bD zO5%gXBpJJ}If(ZjB_ts@(j+A@hO(?EeL!c1GiQ$RSHJTd@aU2w-^Aqme}u^$`|v_D zBm&){hiNv@2!!=0z=}X60z#;GZt3aS3K0ZGC1f(ec%auq3=MMP5raSSM{mR&Vlfo4 zm$-Tc-pQ@E-Ntp-9VBZSvdqwIHRGNvz4hK+CfNp8RW1B_0N zGdViKhV^ThI)9$ir_azD9OjyL{d*=S)-ru=o@bvuLhr;M*PF%F$CG`^8zGV{>&F>L zTKI(?ln$L}bf=&c9-(8dP*e_vQ#d!<=WQ0lE_IoZXsME1E~f~67S#d@!5$i9bh#&f zvR5H;OZoY~<-X^h;@v;;Q|!F%1{84b?;isW1M|$CJ%i39h0(0JYAcOqlh*iJRGKo^ zp5@$$S+;E1%$~R1vP>by*S(c@yypX~-ME$6nHk#iGbD+|`G5$P9lNi_NXZLF4>LP+ z9#`dLIsu`{hKJa^YZn6pjTQ388)&}w1B~q2PZ%5~?{(?*x>QO-S)!dI6B#zou?noP zNLSL#5`3_9i#FP1c&|wZhnZjKqP!wmyPolbH!&R?;pm^f5mBbaP()sE!5glcVD022 zW5Yu%bY^j`!j&aOw~en#WC)1hz`7MS(%EHJ_ttm*0C#-w14tndLQvU?EKzJ;zn1Iw z??Wn$Ed!@cp5e&u=lP4@`4(`bK9;GyPXDBNc;eV&9Ne&%ZQHLW1cxgeAP|W`BnhFa znCr~Jxg&k|xza`#ePNHkjADe#gi4DZXO66KkRQ0?pRsPo4h}!_Fc01NON7cIg$AC2 zCm*G}?StrzTWBYn<42z7p0EB1aPq=ux9tBY*}wov zYL~TLrw=_1c?D}m!1iD^hw=3=Jp)Y%#R5F=FiaTG4$ho`?N=eh z5beoH7S7KxxOE>R+qRQ!+`zDY8?#tA`YqtZ8^uHPBRK9t0(|nRBb+#Plyf__kQl|n z>^c7K3!i16ImFn=7^6eOWJ=R&G+)NL0%VMiPS8jUr7LjOf((od57zG8U{u0FyGv(& z0V!M^7A?xTdU4YwoB9aPpFPa(_1hT^DMCvMuPKF~*O}w_bEmoc@S}CS-megQ-6sbgoUa)*?%hFklWEk!pnq=e4N7vaGpG(PY)Yyv_L zQVtaiwkFV%W8ez%voF%)5KO;t@fe36A^;1|#eeoj{}%@2c3hI6)^1?vrgxK%j#EDT zsT$0AL!eAay~tI4oC^3hpZ(N&uode!t>@I~V|@CLehIjRp^c)0JjrM7|4)5avItl9=Mb+XsSZotC;JpB zEK$%YUii-M(lwSn@4B7sZ+j!RYWPfxr*{mW z^EEv7^=2Q6Qr76oqJk&u&o{q&!*Ab*S-5=)RU({1zQ*+WZ|ez-3Op)aYvTwUXG zp;dq0<@=!4MMIJ^_08X6YHpURKlowR?%a*ZGS+U{!SP2Q;ep@&&%l$*&eofo<@}3B zc<#X`E?D++hmSM0^-0pf0ovUz!aKtJ^s>(uMF-~!bfRHRvTR@XdJ9-zkYr}rXV0CT zrrVoma&WvhH2s>SDF|fVlQuH!U<1;OS-U{bSD+N#vWrGAEWx=F60w-#tte@hp@gIi zfl4U6(qsceh~Xw-jyHlr^e^~g;#vcwZ`#7nU3=KG?;6^@HaZ(5Ni(k6vW+y&IDY(i zofN)AK&E}%_@N|Ff()c-f)nwa-g|6oH;SU;NS>P9e$2$_w6M~ z2N8*9*R^}-l%GJM$V`jb^KGu$zKy|=5xRM|&e!^+nK{s~l2h z9C+7zdGPotnEvWzuJxiaG$(JSJN2zsX3j!^Hl9|i!LHr=*t~f!N@r}@d4Q~GXf#u@ zMn;fu{lRx3LxKz%JjjM*Xk>u%GiUoe-^JUKHXuD@sbrx&Pp_cGrJd8hO?pLiN=sTuqU9IVo#TGu&5+XUYBc8-@O_wp*$Yegz2D_0cDy zjP3j9T>GIPVQ|w%o_p>P>(^}HH{rF#8_KL@^`5|^4xP@mP zTF?0>zRRAseu&1%D6{9MIC}qYE_=Uq9#>hqodss5r7m2=)-~R_Ze*eXHKk>ky z^TY!$m7urkSTy>-bH_f*@BQDOeU0}f>y51XV)dm1Zm$AX>i*hShbj3I&!B20lPjP} zehHGqlA6O(xH`YMnXmgPZhYT|8C|!IN56Xyouf}N_P!tEt~)=&!VUX5c+)Ms>mxtG zqs?JnyzjRzsWK0}{YHky#u;C`mdULGMvL|DAnT?`LZ2EDwC;H!cN|hTqNPy3I5j$#MfT+r?K7A3SYq zAt+?!7!ZoGD#>kuk`1I&;2invESx&}(&pEL(we5y&~@aqb1WP^bfpvO*P2xOB^#pO zb?yhgx5DQ(E(w<=`jT_|I^3JBtHAO?rFv1WyXh0GUAKcTeddc7LoM|-e(1+O3JyO1 zsee}k1(SV{t6Wll5Ph3mT*f1WCD5&_|GlUX>zG)-1tm4lK5#GJ`?FtQ>(;l^at@9? z%!y;4Ve?hn*?-MJ+*@zDL?OoC`3^Sj+=DP8Ca_A9j<3gu0p`m#Gv`jQ?yBwVKJZqa z`tp*nbRnlIJVq&Ik1x+?&z?NV{{8!CB1csJmz$s;ADXNMjYfwFX ziql)a2U!L_hq?1qjbW%f?GWJji9U$CAN^bmZP&xZBvJ@eSyIf-aO$D&!ZWW+#ag{e z58;<2nyyX`Gp@VoU-Gt_-^16wc`t|V{q+k9^3y-}^9;0x`LDn6hrn0+Hp}8S^7f-Z zOXUMFI0*~=4`B@(_us*Z?@a;!@6rIGuev<9teSe`J3qmDZvQB)fgz5)@C1h*0@%UF zKK|cu;NZKNJ9mc9U&ytmYWl{~Z~9$Yg9w)?bj*EVpr@#Jf&OHAtv(H4u zEOU#id{oBu8%VPTWxLJ7nZCFpJ;0W2yJ>eiJoCUeXpD{U)?4ntF0^_6>PtvlKMbIv@hLyt`tEtBjy@#qy$L-bE=-qBOEK0N3n<7tg~` z6EY1io`W63(CNhUZd?P+{|=p{jE)R5H8V>xGDhVCQg~#RFgUT6Oe%UaQ=EJFZg}Rm zUQg=At5JxmkH_R|>$`z#4!n;$-v1$XzG)w)UOd5}d!y3*=+FEtH@)o^Y>~5d?^=!? z>Mx!(YkGw0i_tG`s2_OS&+^e9|2U^kPxGIC^;^L6z(#)V7k-&tyZ7_8FMowEe5zj| z`dPTuvIV>T#(%-JZ+;I00|O+9idZ~w`$v9;HETCv%N&y|NfepkBHv#wNwz(gGGUi0 z#Nsu$CB?mPF?Y(p!R#}At1`HjY+#7pANoNiw{K^3beuyE-oyQ$?Bi}p7kzRFtQ#F- zcx;>|hU)Ao{N4BAKD>c7lWTBRa`x1z6~kU>G}35D`lx%mrd)*V0oadzz5gEEq#v8C3}_HEGW5>#o^jt}xf zKk_dyNkUcj7#?o1XU|@C@BWV*IQTZKwIC|S#wXc-!zcLO1OLxuD$xB1Te(D$`;n-! z&ofvqF_|^?le*&e6vn;JbhR>s&&c?>)xD58un)YY(#hrXM6rQi63% zpF9Cn45Jtfftgb;^2DR}tc2ZQonvrhj1PX~c8%S$J$2F2t*U{mpwAU$>5po3^0U(#u~| z(5lWK`h3Sw!sOab%%r zp!*ci@>)9KX6KG`es-F4V36k?xtE7O^}nvX3XlC6PjqM5uxl4adQKiWL3Jq7u@61D zi{800jvPG-$Ny%9PoHLPZjN-`R#_XJmR=kMRiW#OS`e-roY!@yqPXz3OX z8Xe*IvEw}b#8dpiZ+_wxo$01q{w=rO`hK#c$^G}=&FB8=S7G!ovG-QCtlP}C&DS!}9Oe&y z>oQBwFEpha_!s>eNwMSpq?G z_RJ{;2FF?GmYh1%W_W0vxnnamIC2mF$mBF|^{cEyEao7KXwCrIBv@PV+_O(oE`%~9O43X-ytNcn4=pq*F=!=e8j0<7Nty~8 zO&UWJSQqeRg_I7B!)T3Cnj%z?NK9$~PeV3HoFX+ThCq-3QcWcJ!fTBZ1|w6dvS9k`N&dHA{2#7}9eR}>qCa$ceJ4gd z_TZncc-{Bi^~5XqbfexN$LhFL183R1c^Aiyody~VjHI+@&jOR|+C9#*&z$7iH*dp- zKrb)Yx_K+#d-^1&kA8MpCA=~AJ}PHeJ2A-A^gQFELkJ90Q$1)%Dg;aysErf26K$ZR zv3?Zm6obu-$`&ki+NeyEs6a38F+MTQ-1#|%P0G0wCxB01>NMAUfRDWQy$rVo3BuBz zZ?kU0dS+&4P>CT+8+5xlN=VW)qgUh%4-VmNj;}1kL&J2sZIWh#ASHRxBS})c6a*g_ z7#!gn-*_`${?adBa^9gq!|;g4TaWh^*UQmKMKAAQP{>f=Y>rlSZAJ*RP*lAFAw4dn zbUJNJmVwte>o6*StH4`~)_7;BgvTlgHsG^iLIu78>q~N95`0}8b()55B7#R;x&CnZ zDwFEP#CqxEh8uYIt#2h!fx(d>rcci>I5bFV5@u!>7#$v<(Q0t!%rx6}Y-YaQVPU?_ zy7ims_9}#TOpdfzn4QN~C1VrgoIO3o;MfSVl~5IyKm7b>sZLzV>$&~b|A`xKILNuF z83tN|=)}-%w`mOwk|c)t`8h^LhH);C_u7n)Pck!e9;Lw;L$BAx=-A!Y?#|O38bm56 z%8J3EarW+gk>B~ll4`Esa^A>+Yj451jKSey_Bu3C;(c^Mv4$I-*m(s-!VEh$}q7mox^S<;6qa11_>~Z-4tcxcP1GCRGX<9A%M{ zWGSV$I3EZiLa~W5D5WT^MIq2CV2c7F1tA2S6xiSiBH(e9-l27Zvx=SDcJk$=xT5G1 zXyd{{L<&WPL?c{|5QfqQ0u~|lh5Dlsf?xzFgLfY31IjrM&Nyct8B#IyhF)= z^A3dpAqZ09tc#uJ(i4P0I!ACG7bHeXM6g#~}4(%^u+s?d!Dr!-SD=lJX=`xRmr zANs)UjI;*H-n0)}IlT2KB~VJml9;OyK_cs(VIg4qRcmooi3<+z<4b9Y&=cggL??06 zO4XpuJ$tvU;qgZ<$w(O-9LKu`f&`r0sR~P3 zRRrfSTA>68rSL(J+X5#9Dp7b@0fEXptW%VBIRVnzE`=>{u0TpC%aSC~_~0lj7#bL& z+nJ>ZB~q(sFB64xo}wyIM&T=u_YNUdBx-6&6+B)9LJ)W-kU`)DSR{Gn@MVSaF{&3b z5(m92AxNar*uo*j8$ux}ma;Y1PmHr}d;|W;n3BloA zT4{8xBZUX?GS-+JOj^m1kmf9TVf@;4IEo1RoGaV|@={46YLNe4v}>%g~>q z+hH(Mw7VU=P#B$1*#O=mM4+rJXV0ABnZt)!Gdjui%oM{zgJfC4=;$O9<7-K>6z@D$ z8T-V2RYmtNEdoIzvnA&(afL%FkM|NO9o`pMD{-!5Vp4Jabyu-t*G^^@Ngt9p$x3TY)mE4*+B0wNJ$ zAcTPM0jV@bC`^!ODX2;hS|J4Z(xU5XxUZjs^$zJJl7I~kV#K2idxL8w4WfKR9%VQ#+jX2&rhavSkKA3k^ac5d`lj$_^n2#>O(P zJ+PCVJ2#Q%ImeD4Wg+(j>DjzxGut;^#bE0ivWDU5Cr?op3Y5b60Ky}sM|y!S1O2R6 zfZ#mdSBT*8Dz2fxqqSmop~C|YeV02w^XuI4o`1zH@3;liXt8bA9%kkj_}V>B@X5dX zH6|v1jjQ)xgEEG~c5zaogg{zPLpLZo-Aj}Kpejq8b@&i!T(X3qDa(pbua{0NS}L>@ z*rKGe0a+*6Nup_&B}FK4xrG2J0u_MZaK6Axi%1NvatIuWaFn6KqmV)(R8%l0WB%m< zwRA%0Kb(i~%c_TEWvQyFX88n^5YY|mK;Fwaa_k6y_cvdmr3bk22XCa&NH9iGI>%rB z$zOAB>I@&eG@>!;64wwpe$~clql5pXMF!eK!-%p_GVxQtt_s!}=Vr1c>G4AQ7@g`b12i zt;FaCh4mbM{&}8w{IB^pKmV(2*}N4aG(l*FnxkykxCwx%Cr^+Dg|`-^1KwGr2uLkJ zID!nQWxd4)=RhbKl{A1NP!>Ies9{7QneUXGKAqEDXpkzy3(qX@^p@udRx>?4OI1Rs zTVn-*fQz0=s<)&?4_gtDG@wdSguNE!{wszND6wl%?b3`ELVnXMAD}Y1X7Hx)1_N z8*~;~m0k)wf#7^pCMi%-;Jw4)P%C`lQ6R+mO436J5MnS_5GafIkW3o;qf1-j@ib`= z>SIYXQfibk(K8VdDlctBo`51>O2%8j1&=0PUr~Cb2V*o!Ym`aq*-C=3(I!nDVbHDD1mhs8MCDg6m~iBu_{Uk4kcm&T{=&aCD^JWgt%^JkIz$8 z1*$aw!DEsXi(sG`iI5BJE=5(LT)-1BiN^XEs|%rUu3{+-UrNwQ5u_pnkJ7TvpP-o~ zBwArzz(_-td)l*Ij1Dvh21$)ZCW>}Bi|`RDmCB=~A=tp|>;hBW8G_WT*{}|kYODvN z4V8`eB_#Mf5Gse15M2BlJ{rPivqjOFzY-ooO9;#_oX5G|YjQw&QN*z&_04$aan_=h zAxjr(+IPF|Hb=gEtb%6l4VjM0O42&D-Glu{_65EtC5rRXkiX6fYxLPSLpsJO9R z3@1!|-l{B7M&p7&DT72|Oq>sOhAu@NZaME!M&k*wXEy-BBc)juG6ff_yWV?*lqi!B zoQk~+9;6Zo;VFxXG*M)YM#Sz#lXhD&KWigWgVwOOG6eQZvFiFj!>hp$;3}X`T z(Q0Rnl;8shE+_=_$a^_+?KwKVF5UJ53+)9?PDdhMvo%1FV7-f8)mp6cASE`qxciw{ zagB{o7;O*;lvEfbS}IfkBQ%Y)MZ4YObD#VIzw=9f&auNMkuD{bO${59_R`onbQDzFlQz}gD$EY6qssz3yb2p$}WzQjQQX_{TBkZCc8cXzD@By79RAo-Xqy+D&oJW$- z$d>c-8;us8h+0S~DRWDx(U4wk*+qbMr%h%uy1foI2QkrE7f%gRGV&o{nx~PzuY0_vcj)ZxhL(d!{lm)GU7W3^MrA#>S)aN2#TvaHk z5Jr-hJ*bmn=Pg;Ig%EyO$Q0^t{q!~5E7{b&N;jjWVPjZ{Lqt3pPORM_&Ux` z&68#WeEIJCYVT2CT}7rF6oo?u2OdgWlF3%Y$(PkX76=4_3vmN`hx0`5BVyl!4}#z$ z0%VYQAGtkMl>-)IBua{y&?-S$H{rQJ><#eCX=X)X$@83MBO^5_MX*S%ks`vi{dE$h z1Ou%W#$@z_Aa?%E(8yAZl2~6Mlq3jn&LK@gRaug>0qmf^|H2r9RvIZh!B-fi!3B&q zC~Z($A)FvlhK9;$v6&9Xxa*NSx$BWT`S1Vj|ID^s8_|hJh6uJ8mC!I5>o;uR@cB5r z?o)UE9v}MQpWlS8NksIS*l!Mo57YA-ZxY5h7q+ zMOiN5>3i9?|4pn}GlA=M$r=sjIz3)E@gn!%dnZBEkZlO$MUPZygiv@K9*r`~C&^`v zCPM3)xEm|psgdX)a8U+WptpL^p+L3^6z`!d+kcFDwwT^Z*E{YIMt?O#Hnp za%S7@Wq^ba9vOUWo-vAGD_rGqUVv9fr||)FBpA^xx*$ug-@BDybuA&!A!vu73y|K;FqItBS;=C?)9TIcbtc6sTHM+M`rOfgVv5-5$Xt;8f%X z0W;^$Q`!2r9zG^#E){T!$+Ny_zfbJ=IlF5K4=; zv8&9vilSFwD~GwTk(&$*3^LdnVtitfEX`;n8JpH_jOk#nM-YO%ETdJ|aZ^VAJCw^R z)iB@bkmwlimqoqMuA(Xmk}SrS^YaVf9YtP5dWLs3#4I?&)3iIC814yykqW7}0Od+V z3}KeQt^tQIDpCg=1RrZ4);VnH2m%J0ErRsSEcB>ckFjyZzH4@{bLSRDMiN|zL)nTF zLWmRw>mpJn`=*vJN}47pRc}P+QA&Y`^cdZDiCV9P~<&S+CWOle4RKC547+u zR?NM(cxSP8@mqytM4()W645F-TkkIGQNl1hFtDsJnIsCGD2gI-b&QZSvy^jZ=Xw6< z5w`2??A?1kAvBpeH-||iJ9lhle0&Y3PQA!8&pb!B8!!!x5Am6K8)C9-14S8@6+caC zkW$B_Un@inMku97Ta7xz%5lzu4|wM>29!`tPE6K0lSN2@F&bOixH;?Owb{s!GA!$H zsmcm#JwiDGfwC&2-PV$#sE~=iFgrm>fnIXmAp~6Tl-?qVY*$-4tgV(&FUpF#J^?mF zXjuCYd1(QHlms7e0#qI98l$e5hqz)2AysY7gp3O!1!-Dygo^S)#4n{p)k-2o#Q9wj z-Mx1KEfi8lqM5gzPjYdtOb~q$uX~~OnSz)dyORCCV=p_%% zVT`6KONIu9`I(>oCAtfpSiEx;+9;G#*x)&M-HnVjewi(6H(->ev}GN$M~1613EsyJ zwpgjYh^sZSjMQj?4wTNJ(=_HhK$OcA+1 z&Y_i}ve6t|bIsKh#gC(vj);v5Xq{k8f~`tKh!1(Cv^p;#c%dY;2Or8^&o0MW7;h zkCF=OVm%^+$OoDW#*@CH<( zaNc4=K?o&Mxn=k0gow|g_B7TyM34k2slwtU6Vun#Bj1P~BHn}-nj|rlEJU z;g*|krQIvY(iB%&ytN1dt=0hh_g%~0-TP_inA{;1WmzDkA!#J_I1|A@YhXFt+e}eO z0^XyPMAbtu8A#J2ct?)#c*m;N2 zAhbXzk2ZE$Js{6}R8>X8WHcHLI=!4A0wzuH&LNFK34!w-p*6ue&@oS_ssf|4=$e(%?yqpy$iF8Y&4cL^oOrdcEZ{oI0H@T1UQ1QS@Sh z>l}HvOPa;PUJO|@m91iv3gCl{n^Oq#ya&pmg(P@SYSKC+jsy=Wmeb!CtLaH92`=_j z5ClRRq=?mDsTvq%@Rg&H2vTFHtiw5rQVJ0yt^#2cMoR)7De7hzxdQB}G+Iiu)Ra|@ zP9m~bSr-euWr3F}(ky%hN+O9dx70Dw7A{UxcUAmu3}Ip)h*X-gEF+nY$>j#G=277! zN~zd4Atb`c3uTkal~iSkZ!anAd55)@(if3-5@MxWX%*)+U6P&o`h2S1PcrsN__`V| zA_4MZDO1$X>J6q4cu!(9QVM)oA?nI;RTfk(#D}k<%hxJGsko@>&f4fwD~s|1ktn19 zAADTg%2VbR@0aHgCQa%dpO_#z=a9mnwZSk|ZV38dsG_ zp{Rnzm5#KL;zI1;YowB;6GghcoKBI`FbeA{%Bmy?k3i#!3a15?2P++3dwNS6n|x)_ zWxxT65V3GuIfNG|l`i9Jc^7LODnwLDNEvAxGGJt6As8XiDv8joPTzP6q0M5&R1>r# zMBPP-NQIEbAOZ*>NtB6}Km^c{%oVvyBDNGdACoB&7c>&?7Ez{@i}PAXB7aGzAO*%d zL{J!+qP3xNv1`uAgtGLMHYSZGNg^rGMbesc0c5Q9dICb#bqyuaiAJihtPUYXe5FR= zRXyTeMyRx`DjHgm1}IBMViM9MjlJ5|VqF{rprpbFj}ii{YfQZc6l7STQf*6mWkuFV zRohqD3UL3RHv4;MAK=@%a7g!1{yYQDGAa*}6?*a&g(weB+33KC6QeksJXk}3)k>Ehf4BFgPS&eg^#x-;@gO8Db zB-0jGRUj3{svT*>c0lx~YljF5qdGVlQOaX%mKK5sVn)+AqVA!T2O*Ir!-qidby`%? z5kunmf7m>^_MXtvYbK!{B{04oqOXJhReu-nJOxA>_@zy+UX9NrVO!ZkCb5=ace3Hl3t z-u~@xB!bn5yJkdpjRk+IGT%wuIiW;db0!2{;gwTW#nbuVbi0oddK6&GNNJUl0 zq&(rFsv3&2#^f1w?Qo4p3Pn{qga)Z1ahkq+RZT%Sq)<2)aUrq1Y~H~|5L-2C8zVM0 z_qtu4Wozr@_zU~T^iuGKKN0z7xcP4x^sOd^^CRYCf#1fY->bE8-$Q-j5e7c%+b^} zlkpadb91b&ui_DCm9x6KMZecY2*<1#GwgS$DuWHP%`pu(G_y*(aZ3vN>aMX_4E{+(~w@ixR1!k(sY)4IxPCb&8#>gr~po zG>48HV}4;sRZOqvuElhWv5GR(RCUFmvw)j5G)+u2#=5`*B1XouDcyb#*Es5#V}3Z# zbUGoL)FFQG;m_>|hO{u>``!=m@_U|PVQzu4oUt_-(I4cDrV~O4EG+D2eRYD?irUp| zY;AJ%*glG4%F608OZ&QPZH;h^V%Y7oH6C&J*g=}cvoWnHi;_n^`|tMLg9mx?$sB7I z8I22!2{g^+v_XhPh}Cr{b{cYRTL%1j(PE$B*FW?bzS>ueBEdhTMyrISa<#(+K@18Z z5{lV{in1zE(QxF{0lxd)-^T0S{8~QvE1%%;)fe-=dxU@czDEG~$^Y^HO8B#MY@K#GRwD~wU}hJ6m7*v~8OJI&*}_7p`@ z3>*LrZ~VqH^adGGR@6;Ji~^hWxN>QQpZlfX;q@mi zEQClD4r!BcSrN7%Q@rx^FXi6X{NG5Ir3o`0B`rc)f()pvBJW0mXoqehBCu?(j#z!> zA%?Ge8>dd+#hrIw<>7}uLQ@A^<54;$=}h@GpF?aLwp)^!NckVp<2?x6OS1jC@|SY? z-B1{>U*tr+z5Tngeckidfs;3TZ7guZ8erR@=?ED)6;pcj2}lZ{L!W}s-jm&SyUna1 zR5c-s)b)(US2$N=L`Llbjq}thC&mVC1i@GMP+@ceKk7WAJID}?11S@;GN#UC6C7Ta z6itP1e9Kr&)Lf&}GO;8Y*ZpC|bZ?7Y4SZEnLg z2HoppjUvlI$-wH>F$6_E>`?lE?rILs&oSr^@$Rk6relJO38Yq3^h{3P%c+B-*Ud3T zQI=ag_2{1fzqjKvUye}wiN0vRd%%hX>R7dTZm(UeReKM{?PbaW&Nic1l^oJ>0wR41FO9n=`c3gz8MnqmgVfrNrY9)HpKo8Uzg%Z*rEK4x>E*k=dk7sI|d{9AtVd#@K{U3km2Lqeuf<@3C5mIP#^LT&E}z^6X&I7&)>`+doF*xD|}WI$s78G8%o5K?M} za|=XZw7I&2oBL;GmF+`}*9#rgTX@$GeHZ&q9HVe0IyXou+1eb@>vz#gGuariZ{LAd zUBT1s_885^1nKGZ`%EWOtkf7~*jOJizc5cA(v%bCdOfZ_f1Y3e>3_ask!bFH>6Gk?ZX>iWry`ZTYf)6OGi3F5|PA{jf zrcB0TE+P)WHQ1x)tB-n4e>5aUae*nx;Yv6-dD(d%@{vK}GN$@3o0*JOQ5zt^R=v9<@! zFu*k$K?kY2R8_(qX=CugQC2d6^^_;?DwK)@<*-IjRTbX*WC9-q5k=z!A_O|!EDiCz zMyMRMXHubP z00&VAgpJSyd|jao$#yDq*fxO^+xXYI!BqtULCuT}*64ABSAFYi*?;6P))9Ip@Qsj;?glsMjjvjJ@tLO~D?NhC^x z&OjTG4QK+cn&F}&M30XiMZ`*tl?HD!jFhRjoM%Xra5F}B(OMBiWVcn;21Vs*yg-Xc z6iFVlY?6*^2o6lm{=*9#IJAJ0t(u3jj3*V(zp%>Xi(^DItrU$+K`J#;Xo|wo_!*OO z_a-qKO>xbHW?Ygf%T`=w>r&0OpY@OY$lH14tG^B@0$NM7X<;H#uzc+bzxScv<`4hi zSAZ+jyplThm`wze>69u?aK4Mp1cXg?IwESoL=e6qv>Q<%Fk{5+ulq*sd;2>%dFpmX z8yieFwopEzqJvn`G&2Z-@kWgh7DJaL+V8R2Q2BOFQ`NbtRMkW2ZIfR7S#yW#M zV`Ft0IJ^5{)eXW2qDr8+qAIA$29s-aui^GPmU#IqUO}%nM^()rc(P6hl;+T}WgdC- zDb78;j`NO8=0urb-7zLuhtUS3b{B2KZpPejj#^v#y&jW`C17zx4(;!9^5k*uxZ@-j zFJ9*1hdxX2ju<`1PaNm)k>kAc+rFEAf1VG#|9*0EhVz!mR>}Uu3ye3jq;aJqTjM=g zCef;?M~}f$F(D8ba|LgqKR?9uyPSLCAwK@W57Re>ObC>AIA75OSiQW-`n3@jm6*>` zB-Qi?UOB24IU&lXYN@3X=hNT2ra?+cjG+}pGc>M9itoA|+^LB766Zi#Npul(lD7}u zqqIr>4l!+@Atd&n#~}f0B6XN0R&8#%>z<>Wxo3fXFDFo=$%#=W=*`z|4ndn1?1q3U z+hFpDv0$3CpJmnpf^u5&{1=|#)4%y1{*(XqrV6?S`FCC7Jc7s^v>dJm%sBlf>`4^t%pZ#Coz2lwV!jJyg5Aw!0y@PLi=XbKX zewB~k|MQfacLR<~mpzV6wq`lKEC)7seePwq!BM|}QIU!f2E~kmRgz+fj{)aumakpn zgP*-&Gd0f;%^U&EfH@W!ppd8*39FPO)0$c+I>NHGXMI_1$&ICxXQ@i@ktRfx(rBF| zd6X6m2g8)UNP+htmBo5Z(|EL2xEA{qqbG{Q!w@P7x=8}Qtp=<#pajB(#?p}!yy|tY=Arle6F$|m-1nW|Lw{kBt&I^yQDTI`&1MXhVr_M0M=+#>p{`~q zlJ`RN8YwN+tfDvc96!3qp+gHSFR$>?k9-DKcR6%;z=h}5!9PyF)92v+1x_40##4`7 zL84JY;etmg4FW1(Q|!@pbs-^Zr=g-#cXwp>2h)5;g4SZUeh>hkV0rnQv0AgRxR1rf zC6XxEA)sde`~n-Bl3v%)>30}i+b!oM$DeiwKxPN z8GUj{Wy~`_N@Bz2gdUVZf}ZakU4hsY=IqTqe!{P?v!y6ip0B@5qc{Y2g3>m!7wi%~M+`E^X(?kLE#p_661R3xlbWOliHw2E145FU4o#DkJCKPlk+iKELWpRc z?q~X^Cb+lr1yM9frO`WLDA2;OwsMU}9(>?0CS?-aB2ZsiFaZbJ3V*`Um!4#4=>Xl% zfRI^qfLvv%IPFzjtQugzf&KgG`L9o*UvE+Fdt+V7e5F?qflrvblT96GrS~Yxj<7p5tfXlF5g9~Ni z3I|El2^JoG*h?T|G+Rf;EwUm}5u`7LP#zWm!`?hnJFL zCvN8_-u;glc6(%6Aw^)kwZR{K_~R_ETqgB)EWTA$6edGSgOxdhGO)RaLjKt2|2>a= z{@=IrmFZvQq5O>#!ge|=?cYxfo~xHGeUTYmE3U(~LHjyuS2meV$5eHV^9@B&;I*cl zlx(eDqiZ!VX6@=Fx`+BKm#bvM9vaQcdIG*Z_t3LkxpIYmXt;E31!K0D@6OX~jTuPI zXnlpf{>YPNLg5NzOB_KY@!q0r5_v{TOl}AgbVnnNOdbV!hO(LvObZDIL}Kd2sEI)) zCYhAjJvJJ{e31i(4?wTQ9pDNElN`y>3^5N|TF{XetsvAD>ncYPsM(~$JX1VUXr#)BzG?X?>bGoJfjL@?}Y)9)OO zWp2JhXD*|cNrY9{j>VdcAR>8gu$e*|jWrS_BcqLVKK_vp-})267{k)yBHeBmS2`|_zkD8n7kasiY^Lg_50V)XQ=TbN2 zrEh%=Cr;mn=;io4Bg=ba!JvopESe5$ItShcJ8S{-PKUal(eDpHLtO`Ku9?=7x^9rt zVoe8Y4I)4}t?3RVN?1hHXsPh7COSu!YsxxND`U%FB65>zVA<4^Ma86G$q<=R5e@f9D5z;~U<_cYoLSG9ImR|0n(-o8eo5DPK6hJ=bxJ zXA@%F&0O1}zzIRt?^AAUATa3Ghf@)WD&R%KxeI6cga6|zXhkzT72vK3SbB-*PINjt0MOee2Ek2GLZB2tMMkOJ0LR#;tI;fV(y zytM%_n@m{W*gyzDuh;(~0kPc`_iWP*b#I<-r$ep{j&@?%PAwY=RZAh)_3%>nABWLC@==niqq5kk)B+WM|w0MG#j-9amvnR?ojttm4TBBV|NUe|GE@g}v8+BZ~XLqnhmvAq}S zI;Ee+?2RMD=1PhA;CetwpiF2M9Kq*Pnc(Obxq{JXF)*@S0dJrOMK`Ee>pOk>F z>m+>|Q&F9y_iq?lhn8fHKi5vv)h~A{lN2CFv z5b{qEDEi6+B3$3zV%!l7e-_wp8;Q9?sF)M%Tinn5V39)9AT-@xkEjj%%7%+)6BBFS z;sJ)ec|eSgq-_68V|vl6PipYx71xlx2bQ9xX+ZQ*kvy zHT3(U{T(LV@K9kpmdplxC|OwQ^O~=_o1;fg@%bm7;konA6B~%Fa}a{0C+cgey4(YP zA5#=FN=B@2igshzV%xu4NsU#sa+y0%+ULlOMyq5^l^Ph=+5zX7sY_Z+&dmt1$6gmw zPa@5z*rpvw3Ot?;!6nLQtG|9@V9Eu?*Zm$Gcat-~V8{qQ(##xrmJD9J4`eF4sfi$B zZ1cw?Mka*73y)5S4XmI=QTetl9h1Y+_V*O+h^# z0T1tLgS{qKBo?}+6Vss$y1z!4!qntc_1PRpD46Aaa z>Jb%Gl!Ta446P+5+udTeqQ}C%1>x zR+@!gmt~oL-;sk$6dYI0zL%-jpZkEW6g;Fq- z14cRn?$`z2ICT7Qa`3Sl)ucX3ZZj&^aQ5s)_8)wbJMMf5-|!8uN#HP-*RKG}Jb!J(HsPvqp5S&5oF;LT zYF03p=eTMM31oEXFo&%L1}~Z=~qsG5YRSn z-90`1yvy32j9Dl}6e0;Xm=s)9F*Eity1ANn~-hv$rxqR^oa|h=L z(y_5|jXdiS>%eBQ$?V$3O<1O@7neDGhi>iV9M%e=7i6ZxcqF+0V~4G19WBx(WR~nAf+J$sBbc(tP=bHklLW@9*&AciLChS zr$38PU8d!frglgznM^n7Sj*OEgHL_(bBqfEyb4K&J5L?qne&RnO9QkOtgWqZ_}~G? z&u#44ax7Vb58zOjY#~_OtQNi&8`}u3fkJHV1 zL@TLcMV47Qb8`uh=8|+w-tD57ZvGa7!5m7oX5ms2y+dh3Y%*qBo_cEe#D6%4($6Id zWT=z$OAM5SBgQUDSc;;i)9WK#Y;)2K=LK3Qtm?eTowHbSy8RqeOI9Wo^9@-8eeHW9`&>tu3NYwo9p`m`n*2OtuW#2%0+5RPLst+A$(j4V}KF*=%TB zMNjr=LXE`n{L@df`t%5aCqv+ih;UuWFB#6oKbL#%mvKUTv1?D>W(N!w78uOWQ>&U_6^?`n zT5z8J(juAdLRFLXy4WVs9eceF({X_m8f^@N#bH|9LeS~;kd?#51|=-9@+6tX8?rD; zNP-hcrBNzJwKDhG10C9h>i7d9pANyZ42QMQ%u`*P&+zfhueB$8|u*jn-p#VT0=seTbd#yBgC7! zClQrtgfd_RQnUj{Z;4J|DL6om!ICA9R7x5m8M&0$pvk0xkYE!+2!x2_-HbX0T$zNH z_rziPO|83YBU`WN7-^(OY6GDLBau-OONWpWqjQ!oUE#yO_hCNy=?D0p@BKc${hi+q zmEi2>&+*TG_MZ@epZsrrk~{A{lT0ds;2MaswJ8<|LJKufs2EdP?jxa1PzAS=Qk_nS z@WooJLdabP6*myCI}_^}lgXH}D4`>1YR7o8NpCo0ZDXCxWKcTRudOh@Z=R}2k|hfZ z3yj7S%4x~rqer-U?HYwES(qQNva+1)TfJgBD~RKgy>?HN(d>Gj8oWTMG|3H(r`t=~ zu0Ez3qiH-@rf7VVgnlJ0ltNpLcMZZQR3Yg4Bxq^T=$4!#kvQQn9g9_(P*g~x z2sQZVlVqk!da=FCu(Gjna|>lUOEy>-nwS`Hb(1{2F-g`|C`k+ndn9Cr3!2fW;gL_j z0Kofx>q8u!JI1g#V6s(_ag36S-2c%}vbwRs>AP-Y-@zqZ5D6gI3XcX7(JVDtQ*eql zTv`|9uWmpHA<;UgX&QEqF!#Q#Av6t=R7hDZ8FadIY{ve<0=;gJnu3Lc`{)mP^kOp3 z%d!leWtfA8et(EIIdk(vl!R`UV@*bMip=K}YZKu0z^AW&>f+J>*VG^#T3M<(VWU)6 zP|hlPgDxQmrq0pnYKYJ^IZ=4LuM&7AYHIH=QYDEKDN_MQ@~H5Q-?LB8sH&P-Q9%_z z!pO~NmLru9zy`}3vYkCNoWB6D&huAoTX)r5TB&c`Pifegu2RlQvP`pCUZrw1jUVsn z?RlEUky(o?Ny5iAxq<3DCo7W2gK9wzn!;!=iB+I|K-2qmwx_Nc;NBR@WA7r;m3aBCpdEIIE?_L$F;`vf^CuGkbFBx z!LjYolKcR_swYI)Me)0Fb=!v~LZ*HQ5VYE3Vx`?rg$!IH4N>z_yRx!D@dD96oD`uEnp|zlLj=Ylrk)jyW?RTNA zD{LnjxoB-tE#VX20Rq7%h4K&@5HVS5$&^o5jiaphl4g3CEGJhzvYx``8GgeuTpHqi zKVv%WCv43$$SxuQuXUr|lQI2XB_b*~Q7I(g8 zY2Q4>r7^Xizs`%86APH$fMQl4tRYH4Q5N*Ny<|}615z29CV)2x15qnfrYWmBH8=!B zn*P=2jAUgzzG($W*)G!HD1AT>adqC?=BF0Ev7kgf2+km*ism4v2%u1@VPHr?!pqv(TZI@6+f{Dq(Rai6~ z5FQ@{CK$ZRi3&QZN7p#|wx4LH9Z%2p=%^kdYGm$Obm)yvQ$Ex(Ot0qc1~K8e=Qr9}%_iqB41f!)ZY*9OYA&z$+T!{$UpRXdC>dSd7IR)2z|QzqZPtGr;-4q%7!Sanx-25sPt=(bg7*q?A2! zoAk2*le#1dNv?9rrpC?`D9t8MyvQnvC@m6~JjztdDuW1ZCrPJz#ccDa>(sqcQDBti z*#6`E$anpheDDLm%~>w+-hcT)s!qdw-}NS5`*;3pqz&|jJ?h$HRE7%`5<`^90!<)O zM=OGtX-?)5sP=Ra`m1_Eyx8e5XraJ60)l0(Ja?XMFGJ*-$!yBj>NS>@4szx4GA6eu z+hx49Ms7PGHPi7%a=8hf&E=~cKXrzymsio+(d`ddU%o`I+hcxsh-$NB{qicXTN3f< zr~iaer3fx(`RW8cClaiAb%SjGBGt+`6|Vye<0<5wR7e*Sut_+JY7;wuka}|??K*=w z7*CN4bA*jC@X5Ul0hU*P<4bN(-?%RRDL;QPg3F~n_get#EXOUDw|ZQc#%$+kSBgJn zT2$?7Qzgu5b>oZA!gibB=03^wYB5x4w+^7|v~RlrAqpG{PZA&yK@y6Z-w|^h9g7TRfMa~jOc!n!bT;$>39diEEv#c(!bLZFJ$*aEZ<;?A$LuDCF2)O7V zCIxtdp@}srDuURqFcgI3fpIHOh%a-@m$whdwm~7MA|52`-|LBcpzT?+dD=#ufEcXoDxBs|#^J~M#Uly2tP4bH9 zxA$QEtNQ6>+K+tLu-@)ry@?Jltu`F3z6r~Uf`+G;|b<=_4){vBOKu{N9a;= zg+7mrFTi8x6R`7x=V;2ByI=DXZaZ@dC9`$_M{*N_grpWWA$+B8?F+!wx9p!PzkFd# zk)g7F+cxZw)Zvcoc)_!60Bnn0?G#>J`*VEPztY5%FLG6FB-iam)c>k}dcQx97C91) zGzy^v%8C}A?U5FO@&pa4YkAW<-okgi?XTUGW;RGRX?TGW$5U+kM{H*pzw?pz@Xvqd zJ&da&8SEsLYeZDZTO`OdxC z@nwDo(SCN;&PKLX24%Z(-Pk9qnWwG-brY#VgO45;1C95HMo_yNCp=O(RJ0sAc9?r# zdoO?Tkw>}I)+8ARm{PGq%}$yBlgD3)uWK$YKLrGiot#T`U}#(7F(GTEibUDkutnAS zR?`9*#-fVj=0|DP1jw#;VrMG+mnoEQ>^OJ?F{gt z?Kp)%QH|*j`w%=zfl-FCu8>kP=nN?9is5j9a#o=Ybo-LJo?){A_#U7A>{C4ON58!5 z8-4%Z`j;F&ehQr#nx;k=ONdFjQJX}L(Fg{EE_GdBxA2NVVX_VcLDe*vtnIKXFh&y{ zbUH&eHcCGDYroFpANvP8KJ^Hadk7RLx}<*3xZNz)DGXHp001BWNklLFF7B?&s3z1z^}d(3;y19c4T&s9a!fU!P*;2@o4@g2{Q&pf_geB!O;t_kWCN`2QqIa`LJ|U1UC`_05FA2!5Qeg>Au76g zm+@pox7(vEW(Wn{o@H9jFuD(6K;tzJ{L${aaM#Q3;nW>3L1;}?SIHYXMCz)7){zV6 z>2-2ymrUV(j6^RmCdW0R(;mo79|W0Z6K`!T`rAmn>yUq2Fi?LCaDU^B-EH$ zU@~!3zF~jfzp3OI_WR^{M#uVuJF*Q%6_jyACm#}#XdzId0PO&e5)G!4T7+4)Z5Tg= ztR}{YL|}A6TShc?5BwXzngk6;3XDnUOdldrMMO&$Y(k)MHTZ~^$q+Jng%CA9kgRw^ zBEv*NGN1GU8+@9=-h}f{pu*q+byZVV9+)v2C!vQUCl2wldvC+qB&TC-)|$KbS-yIe zkAC!XZIxRwb=#+V&BpqaAR#mb(}}q${R$yqq`+v4Ys!QxiUJV?_<)ugd?bpP(5o@h zM9q5?#CG~p0aK(*9%vyZ)MUS7>Cg4(3_vGe}=O1G(NDfG-Ns&6TM^q{5;P+dxXpD4c$y}ZMDOpllz%Xrj%vP!v00JrUi9V za^%=Su3g&gj*?l0Zr$#aWI{;@6^a@e9n(oc)l~GP#fKUnYNF1NQBzh0ldUamu0bXK zM~I%Lfu{CEUxKi>^5!(KscOnw1Z>EN zUQ$*`F~s?b5Cg;EfT}FevO`%!%4%=>WQC38Ehe$RZEh!x+k9@zJKy;&yzU#`i1UHb z=4LWxuLFbrJU-O)=Z5_D`yOa(JxhlU1%b?1YVT-Jbo-XAa(8228-+3kEd&}(LrhG! zkW74yHiVdR`w&H|=qH(9I=~P9_z&^<2S3jre(D1}@Q**nyWaHIdDjoTmA5pn=RN=G zef;u!egS~L{gXe*%NFiQ_e!P{D2QZpMvw?>A`68S6rq*wK}w_)U&|AM>!$+Ocm0~Y z)1})RBq?;8Bch^e9IlSQ25)`aeVn=LW%wBIu0|5j3i^46&8lYBO)AP}h6@e58ECMvu|-qY811O4N%Dv@mZEAvH2lgh{~8ysUFFAq^lvig zXH-ox>Z|IKCm%n{`+x0&y!(fLfV=L#J(-5b8et3}dO~!F*brVs-Vqsz!6g#Bh!9Cy zvNTDvR4Y{7>N`n=j|o04WpWtxZF3^{<&qb5f?G$t3k034m!mLg%8bJViSv>E+#D}``652RAAafs zX#<<(@mskIC1PY zPM$c!yT0Q)IDGU7|N3X&kE4bbh&3CT6iq6bd6XP2F(y$|mP7K214w_y&{`lueD1IZ6uz$qiGyNRBE(gY!N~ zFb0PY0v9~BYly;M_l8z2-9AJIBH|jKG^V1Wt}2`e?oTCA;N2Uv?+| z)BpPSan7@_u!!jhf{c9QeQ)5dSENmHasOPhMvjUQ8hi*Sl{O6@B2olGRH#U6lPr)j zsc0KxzSaS;oic5E$BkK7>~moMB3eim=jJ)QFhU5y{@n2F<@7oq;Of;E__<&Fb*`NM zcfb~}f9;R+=C|I*8{YIbdi^2KKYx}F|K2m~?{vX6Euzz-GEJw`Z6D%}fbc1&t|~`U z&G5dY*Bzvt*4+r6=n}prHXf`&1c|RjoA^nB3rLyr_~7eAjT9#7ioOVEH#kr9H9_h` za}1%?u1ULEf>x(uB8G&?ks@J-lt?U7n`u;LTmH5n;1Q|ejuZxU6BTSf`wlJOuSQBV zbJ>8kYO}2c`qWjzGbK&=ox{6NusQm6@;oEYJw|Waq2=jBi!#|`;i$J2^>$6WC)B>g zd4uyF;gb$);~kbj<0_O+c3Q3_07)gOTuB`SD%Tu4eE_8_byHC@rm1U&3ta|FM`>I| zq`~_FAJgg69sx!n63)IMOKP=pu%5r2%#v-5o_z6n+m>^ z_d5u_U5Lp~*#|*H14n^?$uf+!1YflvvLu!Z3FK#tgti!tAzAe*t%yQl?Tg%SNiu4e z$#4)EF+nEo@Ah{Sv=1~Uj<867=YuC9{w0J2Rtv%7>bm7>D1u9M$nNVJ4gy6WWt1ajU&gzFHT|NDhY-MTwHQ$TTHU zGA)UeZOMQgIToBCPJ9y}k+LYsOk(8@!lA5IDWbX7%+h-@v8`U+p{|qaPW=aFb7A{=8 z$dA4G=TOyBqUOv!XW2Tp#-~30VgBWBzndF3KG&Lx;t!}%I8_;|V(r9?;mYl|aA()? zc8#vzz}kVF3nf=f&RFBRhhTYT9{AO$WyIQm7+wAwpJ2yRGU3%!(P^l zLr{uzZqoL8oALv>g zDkT{fzx3cG{)=DwMN};q71-RIu(7qtCqD5Be&@IUfG>XOSAoCGbNMtdM?Ib}&Tx6L z!(cRbiuK3&f-npO8yJQ;W8P=BzQuB^gld_b@hq=?k*A-2n#4Xa?BiU=-frRXC!T5I zwZxd^6s!j#d`+!M9EgtVget*YR^7r4rKn2dTtOEEurRSWZz$PFDN$>@_h{oW+6(bo zRkW%oYtcsLF|<*r4Eo51SZAx7GNi&HXQq0>c3IZnC zPMkW;UwXr<`F|dJu2rX`ky`MKwE}}cjPJN1@@Sw=uxeVN!xYWVjRg=G+lI+GkxOM52CiIwfiMi@w9CEs zo~578ICc6IFMZ@8KK1b*1x|9B6O0IHPxp?=GI45agX_=VPHEFdi%Fl-XlrnG3dUi3 zi%u{-F=crb{`kEg;=Ttq*&lB(>o*wo4IljAZ?&*XVSR@&mCS%~8dWS5EoHysg2t2@ zZ>Y#1e31%K&Pese#1@Y?`kcxQrj{X9jH)b`0qqbxe2_vyElEnfSy6I4q6fM@?h%_E zS14ms#Xb&PLTmAoe)gGf@IU{L|I;Cr?$7b}{=v`krZ@ix)BXfkU%1Ts|M>UXQDw0h z44RP{>(dPu`?sICAN}ALIeY$I?m53j8Y7|6{f5O7V|sE*gl4F+Tn=;r^b=1vF?18pi8DRh&&;^z?38D&Y*A~a*2?88*ZAlE{C9cm zD_;ga$Paw~-{mcDdke3B!yEalZ#l`%jUC?o2cIR8(FoX9Sxu;s{rPa@v@SJ(sc2(x z#galqS0lyCT$oe|+1~OKZ|1^-r-*TvzMl~XjZ-Ih`@i~C#vzc#fa(i5K~{n|Q56&w zm5+u@HB@RA>3~8(X|s$)p;cqwHZn(*Z1C1IZ_H8|ypi0+doQ_4H5j8Q5zG;{f_pf( zd77ADcOK|%&yBR|M4up+b{pk8Z_2JXKknYl=7|l~*H>y~+6|!^i&ZlW`IsB= zOT7IzzVxE1#$Gt)&%XLy_&tBd9AedvSR=*E7z1MnEcW+V%oCBDJac6M+@zFocLgQRhev{G#zJhykW9MU4+*>JkfVrM}>v0%v} zt!#c@0KD`E6vBZzkY8K?M)v1HJ~bsCfRa?NNx_3=?ouPUM*e(#$9>E5W^FlcANsm) z&#`d!(mFXOrjr?)8*69^8|xjlBtG=scYg=s#=Ck$=tFsg1x`Yh7*A`B){fcw3~p|4 zc5T9y{TY>vb%wRI85b|Tgr^^W7MXy!pOgZ*MqJl1U7rCLdGyph#4x8@x2$h&psr~A z$>!1Xbidb{lobp-VwY=;l4^pdPxttS**b-_P@^U!*#4;=* zoh$5fd+xG!?v4D-pL+{u&TbJxAeD$Wo)9AaY$|G06xKRI3<5JV5JoXLp^D7Hdn+Dw zwpH6|#al~C1&YBKL(HRiUbpJ2HI5h()2XK-NFwJtYEDc$$1v>UCYATS^Y>otkm>Mk zp>SO@D0CLBji3urVlT^v^aZLk(st(C+!_aZiqof0(RDq0^CdTL-T&Y)9NP)aO>ZO;n=1PKCZ8?}s!J0|Lmvu z^d~>ZEraEVlHof~fRfkor`Gb(WZ;^id3y zR2qCtdNRhrSOO@S2QOs>9Lue&t0`qov|+g*912Omtu>$uwN{K)6fCppgmDS$8{LZ; zGO0tl`IY)LF$^QiVJ=1~!wzvFbns;mE|IG8;cm>f`0GFUlkD7l6D5g{^AEoMwJi3R zeBtw-=c`|S8kllYPe`TU)*L6#pC(ygV}oa&yd$aB8t)u-qN&wl0aZ19ZwY5o{*C+c~~=CzkZU77dA;>eVFC` z$Z~JV#_R+?`onJlrKveETN5wqPk-Vg{Na24gs*(@2GHZT6mhqb$mFV|Lz%-7wQDAj z>PSq6P)5dKK;gvrkH`%J5pNWTu;oQ z^;A4HCsJOL)iGy=5xN9MOUP9Op-&aLg0N;46tVZMRl2Ok7|2CJIx9Zhx+$2XtY~oB zQ%%J?f28bs%Ach39pnDUbT;Fed8Kj!nDMcH`ziKz=X4XtFz(~5Cx!u|H2eGeeBc8g zZo2AD68YCY%Uk`M-Ra>Q|;nj+d6p{^_4Oji^cN2r0MlGGFum})R> zkjOYqAj)W{QU?J>Y_`CrsMfPV#zSjv&?mV&OOadOpj!4?nr{Rz_J+`R+!jkx7)T|N zt6_DvnjKOz`habL|2OfA^lK~Wb zr_fmzx#<)!SMre1$7~3zdO=*a0hN?et1*aFgIFb0FcQ8MU8!0^tCbX_=1MFHV;n`R z*4PtBa8-cQN6N0-VZk&c<}4|5O+A>H+vQ^)`2ZjL$Ol^(`y66db)8$|zE^>lwnR44 zFklkrx4cBDd~|_TfebsPsm4*Nu`?WQNU&IZeT0_Si${{i_ClnQDG=a)= z)^pE=P1dG{mnp-i{^)U@eQbxlD+`|5-QnI7n>@39l{I=cPMqZF?FAQ3UcxxozI=^) z9-M)xgpfIL@}wXeQ)HY^$%o+pLlS!@?c}t!?PStWa-!=yIzJ`EAl#*zg&bW1N>`?{ zj+he5VIWuO87NgzO7s*+0nWb zMI4Njl9_`_!RQLMka9l0L*6KZpmDxq8rE45xHXDu56!DgxMhE~cBq;o(~al0PSZ^% zE( zbaqw#yVVh`xyT@tQPi5SUJS@pu240doj_kuc4ZMo8=TUJJ0w&smQ+SV)KZ+VO5>Cw zRgTdz3349oP$glkrAwYg$rx%|$gVB;wf6sX#{nkn+m1Chw>Ht*Fi(4wDCO2MTkbTO zi^~N$EGe-kg+$B+?P(xt2@6YwsvV|kRw8z#D%ygsP1J5H##ZTgsEV|AG!dyPX(LQu zr7D$(G13RBs-PQuscMB$ZERV!-=xfoeM1~hsvWS--fm%kcfqg>EVctCIflK!=EO7c zo{8?5O+CHa#`=uCy$v!lCi>L1%DT&Joal*pjrEf~rFfEA&`o>RjlqV%)oZmS zgimqWGQZYtcQ^zsT(@~3%Ofy-e z5v@OQ=lu|wvsW~Qz;YbOMc7!f8CE%#yH$#9;!00PU`o$Sc(o^{bbdmuFq_OU1#T?& zInmG99n$UMja*S#VbBtKic4~H*sf#)T4kvMDIx9|t;M;i%KKBuC@XH328~*g_mq<` zyMk^F-&&zoEyG5uB7`)0!~oN@1ErnE=Ec1s^eyeoAqlv5R)kp9k$S~sIwR-I`uc`A z)0`byTVJD47&Dx@XOpdS8!Uz;e%f&+EbzT%wq}_xR|`)1s2QkQi}KW2LcDb%C@sS_ zF;{f1jIlBngZI7-ns}7alr+jzoEB=IvOV2I?6yjQlp{`c66(Z=HX26VIVpXTz;AkCuKqYvB$|n6Y~hE@{Bi(Nm~ImY8;krS=)_Z6{{4g)F$780K6qY_ddYNh^`3n>?L3qwoWOfPa$T@P&zAw3KU7GWfX#Lj$<>pVpj#*)yr zvP>g&kXUhdf6kfvH!)VK7N%sfhGkBe6xbO?0wNaMk1#EnTw9giD~R#78kbPyEXqto zj*X@&Sqzy@&dyx0%8_yv6BFN2iW4Id1&gsz(HJMCKU)g5WJ0VgmqXJf9jd&{7wqoN z(O#2lVjKr@%_w6?S&>6&;1xiVHw=z(K)I_6_ znv`~HG|{CN|6WO=E2UIYj8dL`@%j+uj_|1hhB)r=rEfgJI8TsvdEv$jfaae0Cbbr> zTz}ypK8JzFUnuy_^TIQi+n-A~a^t!K_SrwUi6YPJUFFue>g}?E&wlP3oV)MyoY0goH1OV&(T>i4@<({ zl9O8#ZtM+E3d;BN#?cwi_LE;e=KcTjxA9pWXRW-;$~jilK)2^c$2~?esU}iQL}Uml zD-qwNoTOh<X=!FZx%W=fjd!7q@C@S^Z}SXXTm;n zpi{Yg?d5IHeet&MzH#-*)?vNM?QW*u%2U4ecn{1%UW;kWL} z&$@B*_Pcj^*OWQm%Hx|$r%!g9OxzkqbtnSu&;~2{l~q=(ed$QC^88mX^G|;7AGPm3 z+YYkjAsyN+e%IT6^6#>_vBk#LgnrgBGKyW70cvXGd5y}44&aq{xRONtE{>4i+7Q|} zu|-PXY+>cL!1JL~JGCTtm)pU;q1D6HZHcfvp65HG-W_+L{rPT&|GzzS0$nXuJB&7j z8f79*iIJkx8eI)qc@%{-n%nM|J1c{Sqx84G>(_bvyFS1#{K8xKzSqBo$(pCSBIVq? z>io-LZK^wv3YDT-2|YKrrMtW#rfVA*>)E+}nLnLOQx2(I^P!k^kK-xU*Zv$nvegH$ zs;cb%JH0?>vzIZSN2crREcRAYiNaahnkQ?hsQ>^V07*naR85&LE3=amW*ZZh`;~6P zlU>3(g?5^qn~|-_8f$$|su|rYjPEdg#}E}?dC$jykK78fmIFi1gjEkBw-QgiWx80a zU;yVq!>-fqiKg^v@ zq!M}^E(5QCXy4AmwRqYgv&QjI{eGJ}LCueR-{0i*Z~6(W?;34mNy>t(EY;%F1gkZ1 z7;)MjbaE$sPs+L3%|=p=^t}hAC{;1(r=(aZMf2IueufXf^MAPQ_x{Y!|3hB+eXk>w zgmpdh8vP7l>wZgSjVs&xp?3G{P91# zwIS+EqdJGOM)XmuU|yLvPp-%Yk}hcPu(OWahsa*S-+1d^=iWrq5ypV^nXcvIHP44T_f5UYAerHVXZpd zro=QUNI$^$J=)5GS}YUqKX)&G{LWulot41%0%x(<#&Xh!Lb4MrcD>oY-fz!&dPwc* z+Je7us9>-%Gg&c@uD1mA)|kqxU-t%n_|1P6;~X)K4C9YcwG1H;N@f{`W{NJF z9<4Mb%aA`tGiIs(C!|lHFq8g2C%dh3b~n8f)=oS^RVhR8XJ);+|wsLD5q<5yg!y@Le$;rlP} z$ff&9aUsr>wH~NCo$(@UQ?f8p4#XJg`d(0HF;KN8h9E?WlE}4UogpTVYY?yP5B@k=m%*hR|-so9# zJ(KmG%QtfSo?9Ejxhc-cshP1jq+%=am zfY*=$LkNs{JQBW+NgY76n^UGe~gzs`f|>mISs(2M}L6zjWt2bR583)jRua9@@v+m`Obk+LJGX= z8zRL(+Px_Y`I|msJ9+h?g!UWMG+=5JIj%~S+7h0saJr(aG|Q?2qlG@PT#WRSbxehn z6I1WWAu8dlzBx;U?Vc9~aEkJXb9WJM*4~3z(!q4CM7b7o!!}jli(I;7Z+tt5e|9TzK%O`02O3g-2fc2+ld?^CdB7yzMa7aP9gF zY;C=Rx4--2>~Q(O3_R>ks04WHM|z0c$NvBmR5G%wcF0-U!UNuAEY{Fi%sdSS_90S_Jn(YC57S z3|VCiHPQG{(o|H%P?V)s3)Kn;;m*&yHnvt4s$MA~FDWfdqZD!uSY^o?c3ThWoB2ZB z;1hiKE1%#s^)K^=6FHfwaQSCF&c~z6YFZoOMMrT>TmC{sxBS2 z>P?Jcpq79&5>uua07KC-;dS--D}3~$f5QIG6@K7#uVG_-lYX|w<4--s_Vy01e8nqx z$%7Ab^27<~K^28DB9mT(#F$2wVLXxyPbWRz^^B%MTC|sC=%EypIbH z-plE;XDQ3r29cnY1|(aVsHjFu)b_6W@_vVqfl2$;+ZU(N32!swFhEM^T8PL9<}+8W z@kj6ZAp4h}-_zH@E@{uVuKV5)+(&F zSm$vulVTJ+`WbH4c1&+w1__y6e7_q~e$=9hn&AN|p{ zQEKA%e)l6}o(8tK8rH~&^XhWBdY!l10q2rh7NFK5XV5|y*G4dm zwPqQ$bw+L*ZSkFva-y;gseeptT;)A+))C1E`W~YNSYX>Enntz7)K2j#cIQepkzA3m zqpC_NGGkDR=*Lh;H)2TbX2>GVrWq~foamG%7m;e`S{n5E*3Wq4;v0F>kGz2gAHGCZ zig7WgcNT);*(aXk!=L;tdwhmJeD80-d*MI+rT>z%=gx^ma&7Q7lz33&)SRkwTXXu> zX1p6c7rx^GA${!4VQNN`F*_`~;nh^;f8OP3y|>pUqXPHb&)>dZa# zXC0q=`aSII+-Rab;jKDt@wOwy#H8!k*}l_9dBL^iE-zfa&I{vCs~AaGmBXSj$13TF zGvDV}F86WP(DxJ8*H%`;mJND(CO9T+o?L4Q^~RAxn?f~Bl0eRk5d)7>Y9nL|X}pw7 zNr@06C09x=#1KeHbT}zXI1<7rvWS#PDYl<+NA}jVJ26XAOciyTlyUv$wnF(oCo028$TG@~s!%Fqu81nI&BScIFxym2*DSY?IPI;i8f$E`5U34+c8gY6TQBTxhf9Bk8{+tm@vt1p zNe0Gq$tc^JD7g}11fHg!zJkegN>y22TBeeiB1Wn1 ze_*Qc=WIk3acz)A1OEYV#D@wkl5+V1ZVZqVHTQD_)e07q!s* zAO$>#c$AF59%;vBnM%w_fY6mnRU*|+Z5U`A#i41jT;3)Dy8hfY<6@6txlJ~i7?vpG zNrPoR?z4A?x>jo~!&D?$_HB@;lB8{ZAmO+*jBvMeh|0IM*ZiSomOscNauyib7=uW+ zL#ALsPle3D$PfcrRlLznx~srC^yZ9m4dJrdj*^40o^-@22;+z`n(dwKBVx7Z_9r+r zkqTVl*%E-q*qdLZ){51RM;>_vYip+{NimtsID7UyzBBy6yMBvb`#=Bd)_{9GGQ6LN z?G!S`;IX2^rQ0k72gsIkaA8z(E|^luF;g|-Vw5u`8)B)#qG}i$tt5$;BTBEd zba(DUF-bQCqcpkHTZ2GIPGS{Ut*N!#c0=qh3RP*0)hG?cD6|3R4Ys#Ony4vcYUAN% zRoW&lw?hp%Os%Ry#@vsOZ(DzW5-3U$iNtz)Zn?*@@uuWv4WVFsMVEpytMcrjU)AgdViv6urjla}O z${kV7cPnI4?eh84>$$d@uyOKUZajayR!D1)F^(7wIaPY+NvjdRT!7DUbN>X_cemNT z@hod6ws_*nn+$=26Gfp(DG_r*H=TS;G8?@+%-g6YcL)d%Kl8%M*Ez)j-9EU-zV;>l z@&Eew4}IUO`NjYIKjUq0`#Y#=c*i?G&Pp!5%UTPXM&^5oMJ=t6usjqp$uPds8e=r6 zX==2Ru6)k*Hfgc}s<8)8)EJF623utw+&IIOi6r3GVvNIke@yl!SbAgR1~FNDqg9og zNy@RUHec?rKPy7}&?suwR4q42tx&C&(^yxI69>g4*qsytxk9c2MToiJwRm)7Dz%QB zK7WdzdCTA9_y6zQ)u!hBJ%XU#rrX4917Ujfk8^X3zRMpz5E*zjO zl~yub6hfQkYLj3^>LoQxj%19!4PBX1M%w~8qqSYZo9=jzWh3TP(6;pwqMZB`+9J=? zcEaYI(as(eDrhCrvVs-V(nd5@v#d%76`b1^iqkkJdMihzW{pw?uPjO{tQI#_V=50l ze1VJiJ;;@7+x**4ejGTB_Zn+8u?W9O8;4RO(~SwQd*k=B91_3#n;dM25Jw>*wjrTf zw9K|3-Ew2(pu4NezFQljmTx7uPGQM>v0z1wzB8Q(LneiU(MrHoDN$0!IK;6N%{^zg zIDP6AT5m8WNZE5LDBy>HKfzj$HI^7w?1#!Y23+4U#>&af6L&nT4KAEIiB*Ql+8Q^$ zah;BnjC>zX&E#UL6>B>L%W|zX73T=RTT!dV^^Vm5{y-v^L}9`HUeBT|kBIxEL@5=d z93yBsv2!jMoe3c^nYeaC=vF$+Ef}wqB+?XZG&QGIIZEghQOe1jusS}Nuhb?MR9Iz* zNmx5C4?d-67VB)#vxY4syIqD*iKGv zQze9PPVzrv3lF~RA{QRGkJ&_H?8q1vSl=;qJ*9|MSz@H*%K7_GbKm`Efq*qh299(` zR0)jCXIG>uS5!q+g|)3Lru1D8nZ6A%$l)A3-qABsq#`7WR4YRWbk;-3=o)~1zW(*+ zC0R^`VaPZ?A&&zqxVa>GTF@0uAeU2OGMzByj4|#=lkkL_QA**&sSR#iIm=njaRrOg zOS$5mdouGy}(T-c>0-TeW-Zf z!6d`}9pPcUwZLoR4NHkogEhnm)<7z4LugA30env>g%AVAiSL}&s?81?RP$X{=J+bp zsyTO1Zd9$bv|8f&)*4Y(i5G=w!aif9yS*yDt|oxBglq<4!QO8(9tV9ypX+hRhAVpG6C}W8!6KY1+O3o0; z0;E=@Rh9}>`@1gP$luGuq6&hM;u>-4#6p!9c%jH0f z(k#rml7&@Hjg_o2Ij3eb3@KGg4JcbtMr@c>EmD5ghGmWDQZWvqGL3B|&s~<4x#eD{ z#dg;?aK#+ly2ciiIdI>2F>i=fr`mAD05Mi_DL5mN+*mT+I5dhgr%&=<{nF1-p>AF0 zZQk>qf6XU9{ZWkd^piDemFrkz`TEzt$ooI^81Nv_bLsp&TzTFz>nwh)V}4Vhy>ep4 zJ5Ef&Db_0XyQ=DgQ`1z*D?)Sj6hqA-(i1Hlq7)KZSF}>360z12QpBVnO}3Z_Asy4H zPR;sDs&8t=Hff}$(h?SFEV})@u%)DuW2`Jpp_Je8i5n-?uWSV- zRvgt>aaGj?V?1N1Xwy+rM(bXr7ADZy3APl5b}JffpkyH~`VN#Kg-lQiQbv`G@t#`b zhA~wtQ`UGW(wwU`hy_FIk-W$^#Njd0+b<5Il(g?z(mN-JcCA>Oc`n*B)Ud(SIntQv zOovH@oFfliypOK)n9hmFtYn-ucr#&pv1GC~Mbko<+a6n-JH1JmOS$j*|B#y)AQ59lCrd1Wy&c_7(tIRr$)%E-Gg2*w zm_ki?>TAR4S7}(4hJ3GCy0KQJE9_+^mKhkKl*kn^{ARKMjCzw zgUOoGRh(NnU#R9FDt!Z^w8%nQg*BJbs)8D$4eA)_MkO`tVWAV&ngl>y5*Q_t6rhw= z0?tONT(#h>BbFfQUTsO^0+e*)QwtxxgZv48n2aOE~_k2cboHrAlDRG72^t1RAGNlvx&Se25#gJ_-<+L|U&P?)4C z)ij5tg0fj$IFG6JgcxPK3Kw`9n8M%PYmC~G2OU{^9)30r#R^8D51~4+8 ztgFT8{>bm`COxkA%{o|N3n*PE+K5H5wemBJh#if0V(ryNPOIv0)_`#+(}Ph=ykkfa zZ;hD9D2=xU)!=lo6e(CJDO?EET~=#tYtR^tb9Z-Qu6$=9)5;R|@O3^AVnBJRi>Hur z+K6v-7^!sxEwjbC8d8DIOOLtKLP`-6g+{Gf;%c;(CYUqSmY3XFcD?7+N#YndbM_Rw zH}=>#vx)Pby{C7%|J+HgUG7-aO*Xo9cE@cXbKki&o_XO6=TEN@VrFM&j`5Ngq$YhB zQp62oyBu!6mvana&8s>oqt@KIw-%)wH71G{C!G|sc(|2T|5wueR?6b7!|M)ZG$9Ru zMOCTXSanQ;tW-iwXd_5@?>r@n`qUVWu^p-^Oai41PAifr0=BdcZ4@EPXQz#Bz~L%4 z7z(03PVCwS{WVn^ir5>Wt0EPFj%gz&ey)jFGM$)ji*H5|lf;rWT32Ec5_nZw%wde7 z?o0eqmRcRqU zWJRuuzV|E^L1fIvQB#I$C`HPC!uFITY>0a#tK+*KNCF`xSRaC}Xhqbmf%`472n0T-PaOmtUmaA@uUC9}P#(UdJ z$yR_2jel#kGy_XkjDurb>brhJdxQdUaXV6?NO7;a+sr4rRzM}I#QVm=22Pf z#8M()Ek;dAOm-y{W3iaY6x&TP#o*nYCfz;RbRunT6v05jcNPW@S~D$E z7S&_%GHj2SBMw7PtzN1X1;%pgCRhlIgfT%r@L)LHC(y)Xu+c-RSmV&jP-KJ*Wk<9% zq#^`td{2%erPEH$^Zf-A-xHRi^6ZplG2df4If3gPJ3G4=Z-}+9yT8rm)=AKg6bm2y z<#w-PqO4P;@9;Y%l*wmlWD3g zL`%YQCsghCfBWCy)_b~X&#)M9Mn*4(F`&B2-u88jQ4B$Jvwk*XK3_0|h(R+CBi4w7 z^s864IlVR^=EA18O!^5L_|n@yedPDP`~Uhiws#j?+1cYpOyUQgEA$S=5hfNr=_tEP zSQPn$Z$>!Z!{uGrNsyXu?QADI-xoMBg`Ei7OUNHS@`?ZEum5krJ-}o9yZlg18u~fl z{%>y|oo^x2l|zcx3q1Vr57E1fqT};lzJdboyEx_Pr*{thy05h+*qjwCS-QYy+RuKf zE#d)q68N6>wc(r1=>EmyFCKr^4Y3A%7I^4e|2ES$gl;O;{l9o8|Kjm&KBi4mc9PWu z=K4m@Y&t>pA|SQ3;wL?mz5`?0sH>%vLhlXh8ycfCANat>sKeLpTF6wt{gA01)3v5` zdmn0>75$}&NyHNJDiWdIG`_3MNzTFkYiKr zu10B{X<3+{EsZu}vsI=hRFwKT9%p)#GW1+hwEzGd9Z5t%R3iT+;d+sQOnol~huTq#CWVnnH)YcGEayw6 z(@ti$w9MlwB`aeLBUFXAv(`>jOeP&;+9$_|Hx6eyj1j+ORV&trX}hB0oMV5nz;>39 z7lbrtGI1=2CEoSatO@hVWV(U(9gA^JKea5EH>7!04Png8CR0+(gft2;I7YP6Os5mJ zx3}@$;eAsOt4azH=RMR)h=EDhL#d2mU^<)00Fu?Dgh=F#A;d(XV4WyjSHn~(XSDTg z4qGFzj)1rB;5f6kBS!JyQ(F2)-NdsP21?Or)l<=E3@Jxc%}o1_`En`p>}Eqen@pQe zpC&b_y6-IGI1)o)HtXf{>@5*tL@5I~BAxP*8DnbfdxcU3+Z9r-7^7s2H8$3((yYyT zPMux<|3Z~%bt>PQPk8Ms&hSI8xx}>3)Dl|tU`eS7YcwHNw6$$gEU~sWWnAt9Nlu%F zYcakfrjeows%AnAtgmk{4uh2Ev>^zvx!#A>*5^)kD=+n@_Kw|6j|rt_M!XEr&1 zdW&J0qKxP2<(qu%$*)OwTU!>3IsMG?=*u4B)Twoxcg&Ydym!Q?7{?@K(ISi188CJt z%{r}Gb5E0di}zN9l38#(Iaf@m^wYw)j9BYXMgU>nDzt8RG7Do2DCN=0kkW`XGTLjL z+!`v6ZE!1-Q-#zKQ^8x?TzZCPygpE?X@6G9O3LfaTNUpjwFVTB@(4L$G3aWbhGyLE z=v2o0iq|7!9vO!8|F(CoL3UkLe*f*~IrrXvsJqpAv@BZ^mKkh}jbC7F>0YVtApFaZ+j~t%yyz9)pS) zYZ#ALQPdb~iR}pDEGevt_{&vd+2ku!t{9D0@XixcAjC*chIX_pn?hTe-&T=O0%6pW zt)e}<%)Wik^8LH-r8l#{yWjIR78hs9N%7Q^2l+2|e4R(1d>m-FXnH`3M{!dZGgB|I zd@%CncfOHZZg~sNYVN!5UOxZzzaSI2?viUccHnW|blWXle&yxN_ouPibM*N0?7Htq zeD?F7J9oFb%AJHl1hT+PO%^)zuv$}Kr%#^Vv%YLQW-OsOh{!xfwtx%g-_ z!Z=4tnL1UJk{OMLB5Sc)XdF#uxH`mGFLRDXiWnl8EEp_pXOnE5;4Fzs?2=W)s3L~x zh#jt0hLQq0cS_pMB`C*)DhgespslnB6-h!>DOusPNU}j;v$&OZuJcs7gH7auP9l!c zS)*bUC2W9ZIL3QPiL7@dl|{qV4RIE&FtK4gT&3>SMj3S0cr49o!()#;&YfSqllz_)bC#>GzMS>*>(E&T(V;m z&KYL<8#sAv#5eA^kFS2`&sjdP%-q~8U%u zIEM}&rfmWR&HVg4+jnfI_I;js>TwP~dypMFE@N(C0b@NUUO2|n2cE__!{((W=GLt{ zXXH*1Gy4#Os7<`acJS<1L4;U~66Z%xwf4kVKqpid`dW}?9)=bXj7oD=S?=u;d z6|p4Bcu4Y|(Rh_YBzLI=MKK&UP!bwNGY+HxgDJzAGiNyR+!6ltGoN|McelKhGxb?!G$B zKfKJhzIqoIZQo3N^MKm-nVK44RmPeg)+%CqmQ2A|BM12cvt7%t9wAKkC8Q5A9Je%0 zL(UCN2r>p46V8Z{MvjWMNoeCpot7y?@ldS2j09#S2dbz<>gaYc3DsL0MT&}|4b~~F z(`XHKuV!jymP=+gabWoENJI=(DMIgdve{#dBdkpXYbpdpkRJUWWIMrL9}|H=p_w`u#qKj~wQahaTe8 z$rsqa?^&+B`dZ#{!;PFiz08SYCwcDRAwp>Q#2XrURWS4)I=S$9GS%U`KN&OtXVkirT9*JiqpfDk*3JB@Km8L!&yi-!C54_{!TzBm?Jhc0#eCa!XiB}d|6rqUB zB^R;D&7}}iCbS9T4KXK%xy7f%xDE6x$F{8(b7nARe(PR12u*B=F`%qQ8PU!=Yl$&~ z_6%1tyLa#9@C%aqTzCB&dBf|kV190faXaSFGe>!R&yx&CLt>NJbKtf=fC%GujOmFk%UFZ)rrY>y{RoY=`n;_b$kgGQH=DC4Bk2#x zqK(HmnN-t8LL1wuO%qzVb3Lb&#kr>xIe;lePQLI0&!0HT=GV>P zd*Z;Fi;T(wtiEuHXP()|_U+qPzkZR0`8j^@KX-BGcm6xS|9ce5UU&V)kb5T!777B$O%Si zyp!P{YYY^F_dSs@BZKXxvzBzWN3WI{U+-%y38yNs29w8vfN}DK(8f|ZMT)W&H1^!w za0m%yELwM_>PhnG6cpoeVeb(7TT`5z#Mp=h*6x$(sy&f2ic81gqU?r1K!f*p^We&Xv4WzuNF_zcvdP+l1 zQY}*I940eo0TkyZ``<<%U|veGLQ3+QcKg0q`_!3 zZEVRz#&JYQhOD4X4MuC)(01%5M{EO18|tb@Y9rXvA?2ZXM=I$YJus#ueVmYll;`H(v4jz1#L2n?#Rx4-t+0TB;jW^uP;)adveR40$%ct41=TV%uTzB0K zWL?<5|7o6k?f_MNsqkw<7T3|(0o978b{6+*I1s-=glPZPSxPYxV#4JvAEiZUD}z5q z)5b`O5mO9g`Tr>-QZ6_nXG_K%4BpqECGG04x0ziI1W5LuSAqSp#iaY+}UopiL4|U$#w_JG(@4D^nY=6xqgr+4Y!@j-y`0KmB!s6DN zTi<>?8#b+nj>2JcK${9>&R4Fr(O9iXCUohi(D}5sk{l?5DS$SeX^NvDlY4CxMXfeQ z<}b9t*+N;HX6sl?gbeo;2-P%Ei{nQy)djnaWii zYc^9=eNsEbYmdXBqe54XwryBBa~7v-Hf`8~v!2+TVYn=5s8yQWW?~8q&yMI1YMd1# z%h&|0HdMaCSH5FcwdV}mDe^w`>gv@HAy&IC_4ymVvVt(t#-Y9IxSdd8s2>4RZP$Jq|p}|#9JGdHZ3tdGffFCx|LMVIm>`Q%(M#!5peNLrLqkSbF)q7yo3YvC0{eL<`X| z2?n{Og4KpzU3c|jg;9zMFGiSJQ?kGnbWv2k2dyTmj5eOi_Xw>RtIVvMXLfd;L2tln z-LSY}Bg65K)2CL5A!6%_O`A5;hB2p(pP~t4R?iMuSU)GF`X&g*ziS2y)Imzv&bwDb zgjh?L&ZkUmYKTQ(xG}Xjtx0s9Qfa@DQzDi?DWXqFB@j#7As(eH*-HZ~GJBnpOx?v8 zJN&uaIZ9EGG&&ia>0xz+(|uApOEZ>%ni6D_Ro0VBi&bE}BPWY<@_oPQZQIzeaUIqq zRED{^Y2J0i2l@8>Uqcs5Zlv+lj2ey{d!Bty90Xu1*Yk#}FXge_dr$#Vn}|)~?3p2l z51r=0pGoxS)snuffs5N#eirW~n)V0%j;|`e=%#5q;+~k3TWiod3Wv$)?j;R6T?`5- zJ!|J6gY{ah0gM*Px)+OFV+_t0Ow4%O6K}ch&V~}4Jso7gAa}f!BE~40YNVsPXGKIy zbjc87CZ)`=qtA2y4}ZjWzxz!9*0F(){mYNB^`eW2K|0}Qhb`LFSX=X3m%omOcR#{s z{_N9y;CKHa*WYkG+jnf^>HYiouV48J%fl6J{_UHYo1Yge;grZRfJUHhBq7I_B6N?x z{{!K>3R7WiqRVP2g{IhcoKV5hSm!zoji6h!l`%_gfNZJi3h$i^l$V53g~5G@BeKUx6X6u&~xnCwTq?+tehS4;Qf2}@!szOi~Q41 z{T@r3Ht~j=F5$7CJ;-HkOu_aMqGbrmia)(zh0+ z6P5P@d+#bY)@r=3JAqv6@cE+o!E|M3XHnMDs#Y+P9k5uQDn)onS}wh%i0_})(tl98 zb4Sf|Y*f)Gb%cI2l5%gOR5 zwC=DerQUNU-}~O3=f1-qK7KDh{CAJ@ zzW2S3n{K|I-lbEZEUI#B*?B1oT+c<@H&OL9+84Af)Y`IX$09e(T+N<6kMWIfe}~5& z9pML4w5um@mtM=K{^0%Wyle-xGuYl%M$IYi{q|4!$#W;!z!Jwe4s7C&KKWsG{?<;k zFO1tUP>3mFw2=*51aRE8Ep2G2tD2Ou*Z>%VQbp{NW5g(h)4pS`2DBAxTVg?JCnZ$X zU6Z@Ot&{>IDgdPw##yq}*vg~RT7g!96+7QdK^OUd*2+9~N?BM_Mk0~wp2~@cLQ1X$ z#l_nFg=6uhSl*|dec2_ zyyeZ5lCahiX-Prk;i_ZP3M)(aQ3AEouZBB>=H=E}O>9XqQ<4y#DVEZ;I!ZBU?NK^| zHXT1yypgr8shs4csS-26k^tw>wZ|vjnFK0y<#Dc}uKI)kn3}$>x!Api+ou+|>87_a z7|i0VCxnJv8k~>JEmXMLlai$r&$idThJX8KpJZmbFgqs~cr*lBl8!8Hp5rQi1zRt^ zh_=lXZE>|jo5I$mMfwB7`0NV4R=obI*K*0Wt^5;P(L}|ljo7IkGYiwq%uQ3`h;|%h zFyGc#YpLs6002rsC1p!F1VSCrT8pw5P~M=7#(7IIYnXjYDv_+adzltMfzsfuB_>74 z3F956E47L^sbfX0rAtK%w5;1yr4&+0gb;*Gu7r4@wah$()L@M3&^r)EftbYl%+{8k zm&lPz79vLxCn<~w{Hzi3hZ0yhJ*zNIDuLO6HJT~gCw0*%l#a)g&*O=5$*5w)5VMGm z>i>jZ|7(sAYlHXa^EYEeNv@5?>z;_#w1-L>JxLWT4r6t9IWicfFgc-&!FfZBfl`9- zeo97ngzci#`Fxp7jzQ$gM(~LJo@Mc}ONde7yl{oa%^2qZ9mr`_22ha8ST(4)X!{aV z1A{6JO&Ft1g|-2M!c~rqn-*11be7Q%m1NNnaxQgmYajRvENXlv0b`mg%sOT2qH0YFI5!sk)<)rz9J+ zl#IdPd%bgvC~}r0T8X~Mwgtm&h>VZmltMJBSikJ=Bl1bW9c_+DS z5eRRhU`>T{j_k#%L>o&f;GGjZiBduV98_5CKs&70^y(>MER<~M^#_Cy#SK%04;U+i z?hr)wpsgn(wo*|kigq|xQK(1-inf?aqrE&4(MD{|2q>e`NSYT(pe&{qzEZ}Jw7iNb zVj78bl9g3B=Q||5>0~Z4R6{|g$5QT^SR!xtzQSfPM?4?G4Msz3Gf69Qw5Vdq8e-eA zj|!A1DMi}?K`JwCN}U&7Ay~ou$o^C06y=Vf#bQ@m-AV4VSQCUs+$4ErK zu1Hl?gtnzn1h^0+m1*O%~Jz*jY+QRv)tYEmln>ONoyA=B#(2q_VZQ0bacgVmPG z7}|D-v_F*iN~0N%SLs(4YZUEh3ebSG9C`alc6X= zTd=mraNIC%Ta?PIHbZJ}Fe;PUfKo;fEIHGwd)1jYvCx3n$XQdxkWhf{QvWl-WOE5@%``J#pzS0n4X2< z@DwqxGTmQC92Zv42DE|Y)fcFICDvQxgfcaw;YgZP1`ZxP2BA5h51JWBXI?bFU6`y_ z;rjpJFkE;o6Js8HVAsq3?ZDsdOQthF2W~J~lXc;jzOV;kvLo@N}#K~JRS(7!15R)}olLIkXlQlUIlQmhBJH%v7)+9nq)?`g0#AHp@ zoqZ|196^u{YtO&3a|L0kFWF!ukbPaoWK8~*U$Uh_zHhsd!@AlktPx1|K3yR zf3tz|FS&tUY4gNia Date: Thu, 17 Mar 2022 23:18:17 +0100 Subject: [PATCH 15/69] smclock: Replace Bat text with battery image --- apps/smclock/app.js | 56 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 297ddb894..bf78b7bfd 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -14,7 +14,7 @@ const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // dynamic variables var batLevel = -1; -var batColor = [0, 0, 0]; +var batColor = ""; // settings variables var backgroundImage; @@ -68,15 +68,15 @@ function getBatteryColor(level) { level = batLevel; } if (level > 80) { - color = [0, 0, 1]; + color = "#00f"; } else if (level > 60) { - color = [0, 1, 1]; + color = "#0ff"; } else if (level > 40) { - color = [0, 1, 0]; + color = "#0f0"; } else if (level > 20) { - color = [1, 1, 0]; + color = "#f40"; } else { - color = [1, 0, 0]; + color = "f00"; } return color; } @@ -90,7 +90,7 @@ function draw() { } g.drawImage(background); - const color = getBatteryColor(batLevel); + batColor = getBatteryColor(batLevel); var bat = ""; const d = new Date(); const day = d.getDate(); @@ -102,32 +102,34 @@ function draw() { const m = d.getMinutes(); const time = d02(h) + ":" + d02(m); - if (E.getBattery() < 100) { - bat = d02(E.getBattery()) + "%"; - } else { - bat = E.getBattery() + "%"; - } - g.reset(); // draw battery info - g.setColor(1, 1, 1); - if (useVectorFont == true) { - g.setFont("Vector", 16); - g.drawString("Bat:", 12, 22, false); + var x = 12; + var y = 16; + if (Bangle.isCharging()) { + g.setColor("#ff0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y); } else { - g.setFont("4x6", 2); - g.drawString("Bat:", 10, 22, false); + g.clearRect(x,y,x+14,y+24); + g.setColor("#000").fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2); + g.setColor(batColor).fillRect(x+4,y+20-(batLevel*16/100),x+10,y+20); } - g.setColor(color[0], color[1], color[2]); - if (batLevel < 100) { - g.drawString(bat, 52, 22, false); + g.setFont("Vector", 16); + if (Bangle.isCharging()) { + g.setColor("#ff0"); } else { - g.drawString(bat, 46, 22, false); + g.setColor(batColor); + } + if (batLevel < 100) { + bat = d02(batLevel) + "%"; + g.drawString(bat, 50, 22, false); + } else { + bat = "100%"; + g.drawString(bat, 40, 22, false); } // draw date info - g.setColor(0, 0, 0); + g.setColor("#000"); if (useVectorFont == true) { g.setFont("Vector", 20); } else { @@ -143,7 +145,7 @@ function draw() { // draw week info if (showWeekInfo == true) { - date2 = weekday[d.getDay()] + " " + d02(week) + date2 = weekday[d.getDay()] + " " + d02(week); if (useVectorFont == true) { g.setFont("Vector", 18); } else { @@ -162,7 +164,7 @@ function draw() { } // draw time - g.setColor(1, 1, 1); + g.setColor("#fff"); if (useVectorFont == true) { g.setFont("Vector", 60); g.drawString(time, 10, 108, false); @@ -198,4 +200,4 @@ Bangle.on("lcdPower", (on) => { }); // Show launcher when middle button pressed -Bangle.setUI("clock"); +Bangle.setUI("clock"); \ No newline at end of file From 9d4cb9081fe7b10f7fe60c6e2cd20fa038b9780d Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 17 Mar 2022 23:36:16 +0100 Subject: [PATCH 16/69] smclock: Fix battery font, update Changelog and screenshots --- apps/smclock/ChangeLog | 3 ++- apps/smclock/app.js | 8 ++++++-- apps/smclock/screenshot0.png | Bin 2971 -> 2947 bytes apps/smclock/screenshot1.png | Bin 2134 -> 2059 bytes 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index f0b5c5bde..2a3874d34 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -1,5 +1,6 @@ 0.01: Initial version 0.02: Add battery level -0.03: Fix battery display when full +0.03: Fix battery display when full (incorporating code by Ronin0000) 0.04: Add support for settings 0.05: Add ability to change background (3bit or 4bit) +0.06: Replace battery text with image diff --git a/apps/smclock/app.js b/apps/smclock/app.js index bf78b7bfd..41bc2b5e4 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -114,12 +114,16 @@ function draw() { g.setColor("#000").fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2); g.setColor(batColor).fillRect(x+4,y+20-(batLevel*16/100),x+10,y+20); } - g.setFont("Vector", 16); if (Bangle.isCharging()) { g.setColor("#ff0"); } else { g.setColor(batColor); } + if (useVectorFont == true) { + g.setFont("Vector", 16); + } else { + g.setFont("4x6", 3); + } if (batLevel < 100) { bat = d02(batLevel) + "%"; g.drawString(bat, 50, 22, false); @@ -200,4 +204,4 @@ Bangle.on("lcdPower", (on) => { }); // Show launcher when middle button pressed -Bangle.setUI("clock"); \ No newline at end of file +Bangle.setUI("clock"); diff --git a/apps/smclock/screenshot0.png b/apps/smclock/screenshot0.png index de4dc4e43da2403b684284b6805809343793d524..07eff8ddf475761b2cc3e29f8789c0a407ff6eff 100644 GIT binary patch literal 2947 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 E0R26K7ytkO literal 2971 zcmb`Jc|25mAIBNnm@XOn80*+3%Wx}On541HOx7!Vj1nqBiLslKJq!k2;X%6D$0)=w zlU&s;JhW@ocQI|!9mE?lvkrm zTK3V4kAx@acN1g8TJ?47XA71$qq`?iyXt~jhzJ={c97%MlM zkG|eL`S)(#qolN_d-iWOqn}JH^G%^TvXcg8Ry{?wY9o4Vn?wiO-pC$_sMf%dPG1cS zmur$XWe=$f^DrIOhiEoC3- zF+FmG`}~Q`)Lq(ANBhjsw|$$(D=G?GT|D2VmbP2NGp&^Tfy~DSD($ecR0Z8<*Rg0q>cc>7}>xew|g&U#W~2ohTg8|KtLNMQi0c z95qK}jqjNYbp7_P1#t!!LU$Q|a9qE}T{HLWv>a|Q??KV9t^tn6+vB0>wadT7!gngy zb17TTulCmkx_|G@r63VRq}#A_!&c+4+j#~k@7~61cORq$Rc;vF4oh0@7Gph^V0o4{_uJRK*<&K>^sxUn4HOAO zj&OlPkYw~+OuQMxVb?)&j4_k4vaYTMu_J$fv^mDQO^|V(HI9+)sj|Ey&Qb7$oJn3l zVMyhF1t$FN&%rN!Lt#F-;<$dxE@Pq#)*1b$KVeByD@a#DPxgc4J~eotkila|JGsts z)<0_Ni`RD98JcnO6tg(-C!E-2qNy|~P@P7@LVRsVUXt*FN}M<6hRb5-Dc^e1Z?tWU z`5Dp(bf*TpV0ly}LWB(Ra3O36S6tQ*k5kVF_HwV|qO;iIUX$IVcJN3gK2b9L1sGoqHz=O~S#O<|gv_~;&ZSh-}0 z2SK~enBlx)CV=RnEV@n`J-(5tAir4x-TAlA(J>olZXqbS6;!juiF=u4pYx3ZYH@M9 zQZnN#)QPPi=B$NF2765jdi z1#IR3Imw=+t7GWeXV8TbYOZJcV@6{Xe(-P>y_6}J{ey&3u-X!UUs1aN9|-{5H1&i~ z<>;T3^ouk8KDMl-M`)#yd&P0xLHJu|f6%r zk9_?-fkn(S$Z66`CNCZ9FZ?Qyr4)d6n7+%*zmDvj+=L~|$HUN!w)kQqZGUxg{{h$n z?j{TiO0?D(TJ;iCR!>=thMHz+yfDK&*xy7l@+U$VcAO#UVIBWblSncNBSm71jpdXI z=<{*nQVpQjsl2!WwS$idBjJBwgjY@-uL;q+HUt9G9&a8Rgqz9HjB0xIl7cgyOKD40 zK1sDAgx>KUh?5$OR+cwxM>lRvw85HWhrf%C3q;9?(iQ^;vt_RoPc+85SSYX2VqQxK zDc3#KVNQ;<>QGEzGUyH+6+KyKY#G83@mzB`PDxf0UuAu)L05LA?9t1FXdeoGI(W1=bAKYCVMc;9 z709nSQg**FR$tKO0y%GPUDr*1XKrxV0~sM`8vIZVhTsgSt|g{FYJH8(MwZdWR~$G;R(9X-~kmGy!%r3R71j|mZMERG9xBV zyFYL1tH5OlbiuC*J0?X4Redy`e_h@hd|DHeuGk=je(AK$rm!1nnnLI*P_i|)Nah*( zoQe}6JUfJPlNi@g!CILoVhF_3TuarXr$SIG)zs9~1Zuwgpp4RCS}YbE)}S@h;v80jp9Z5oD`X zu-3iJDhNrR{kp*9$_in!|DvRZ^$w>)R+t!+V>C8`lfKh!q%2%BSE_G(vRZgq$fArG zUfos@>t>O0=7oVlZsSCrCe?!+%s-4+bzxI6^LNVrTq|G7(^s=S)#92J3Tnd)X$;HG zo@FnuU)D18&g?=7x+7FUEf}BnK7c{b)ZV4)0_st%@ADa)!Tg+mxsL*Ol}HTQM^ve7l0jI zGHeWDXC)|}?k3fYu@dylY!AJyt_n&&T`%hKU-2P=JdxcyFI8ioJZu5}w)wC&j+ka^ H!p;8xDEo2- diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png index 1a020c9ca825f3f0772854801037aa37d3e036bf..da25b2579fadc66df8095c50f76ee95e8ea03a23 100644 GIT binary patch literal 2059 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 j)ajKxhyNQF3v7K3qF${E{g&-jj{?Gj Date: Fri, 18 Mar 2022 00:43:18 +0100 Subject: [PATCH 17/69] smclock: Update README and metadata.json - remove support for BJs1 and not implemented features --- apps/smclock/README.md | 4 ++-- apps/smclock/metadata.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 518d77d4e..2fc239ab2 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -9,7 +9,7 @@ It shows battery level in the upper left corner, date information in the upper r ## Settings -**Analog Clock:** +**Analog Clock:** *Not yet implemented.* **Background:** When the setting is set as "3bit", a background with more accurate colors is chosen for the watchface. Otherwise, it uses a background following the 16-bit Mac Color Palette. @@ -23,4 +23,4 @@ It shows battery level in the upper left corner, date information in the upper r Monogram Watch Face can be selected as the default clock or it can be run manually from the launcher. Its settings can be accessed and changed via the relevant menu. -Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert. +*Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert.* - *Feature not implemented yet.* diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index dec97b70c..55668adcc 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -9,7 +9,7 @@ "type": "clock", "tags": "clock", "readme": "README.md", - "supports": ["BANGLEJS", "BANGLEJS2"], + "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ { "name": "smclock.app.js", "url": "app.js" }, From a6f92028e978cedc8683602c454e37d0ef65f803 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 01:09:45 +0100 Subject: [PATCH 18/69] Changed colors to basic colors --- apps/game1024/app.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 352426d57..829b29ba9 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -3,12 +3,10 @@ const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)} const rows = 4, cols = 4; const borderWidth = 6; const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; -const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, - {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, - {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, - {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; -const cellFgColor = '#000000'; -const cellShadowColor = '#f2f2f2'; +const cellColors = [{bg:'#00FFFF', fg: '#000000'}, + {bg:'#FF00FF', fg: '#000000'}, {bg:'#808000', fg: '#FFFFFF'}, {bg:'#0000FF', fg: '#FFFFFF'}, {bg:'#008000', fg: '#FFFFFF'}, + {bg:'#800000', fg: '#FFFFFF'}, {bg:'#00FF00', fg: '#000000'}, {bg:'#000080', fg: '#FFFFFF'}, {bg:'#FFFF00', fg: '#000000'}, + {bg:'#800080', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; const cellFonts = ["12x20", "12x20", "Vector:14"]; const cellChars = [ [0,1,2,3,4,5,6,7,8,9,10], @@ -135,7 +133,7 @@ const snapshot = { debug(console.log("reset D U M P E D!", this.dump)); } }; -const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#C0C0C0', bg:'#800000'}; const buttons = { all: [], draw: function () { @@ -679,4 +677,4 @@ buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R initGame(); -dragger.setEnabled(true); \ No newline at end of file +dragger.setEnabled(true); From 654ba447c1654093a6ebf6f86c1bb90900075978 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 01:10:38 +0100 Subject: [PATCH 19/69] incremented to version 0.03 --- apps/game1024/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 5b75212bc..510c93764 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.02", + "version": "0.03", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", @@ -15,4 +15,4 @@ {"name":"game1024.img","url":"app-icon.js","evaluate":true} ], "data":[{"name": "game1024.json", "url": "game1024.json"}] - } \ No newline at end of file + } From 762121e063a7cba858b7c01a001fa5fc339d17e3 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 01:11:29 +0100 Subject: [PATCH 20/69] Update to 0.03 --- apps/game1024/Changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index b45a8d3ad..15e6f25b9 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,2 +1,3 @@ 0.01: New App! -0.02: Temporary intermediate version \ No newline at end of file +0.02: Temporary intermediate version +0.03: Basic colors From 886b3a5fae4ea2b08095233c681243fa46f8666b Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 11:49:26 +0100 Subject: [PATCH 21/69] New app icon, less colors Old app icon did not show in the watch --- apps/game1024/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js index 2a9df2fa3..3af366bc9 100644 --- a/apps/game1024/app-icon.js +++ b/apps/game1024/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwkBkQAWkAyVgQXYhnMACXAC/4X/C/4XH5s9CAvTmfcC5nf/4GGAAM8C5YOBGogWC//zC5XDC4ouB/vdBIJJCC4wnDC4c/CYXP//8C5APBC4pDDHQIXICwPzAQI2EC4QEB/oXHQYQXGCQQ0EF4wOBC6nNJQYXSPIgXaRQIvtC7jEEC5oqEa5QXIAoZ8B/gXQ774BAYgXPFYP/BAIJDC5wGCAAJGCC5PfOISREPQYXKABHdAogXRAAoX/C/4X/C+UAACgXYkQAW")) From a3c2c05878eb72c161fc2ae23789eab040b56d25 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 11:59:39 +0100 Subject: [PATCH 22/69] Data file removed from the set up Data file game1024.json will be generated by the app --- apps/game1024/metadata.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 510c93764..92d34bed3 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -13,6 +13,5 @@ "storage": [ {"name":"game1024.app.js","url":"app.js"}, {"name":"game1024.img","url":"app-icon.js","evaluate":true} - ], - "data":[{"name": "game1024.json", "url": "game1024.json"}] + ] } From 296cd68f139ce3d61102084a24ecfd7b9eab035e Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:06:27 +0100 Subject: [PATCH 23/69] Delete screenshot.png will be changed with a new one --- apps/game1024/screenshot.png | Bin 5904 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png deleted file mode 100644 index 256ecb53bc679984c59b5847219ab9bb4a7097bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5904 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 From bcf658c84334324f3917d092e3a8d847874b3444 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:07:15 +0100 Subject: [PATCH 24/69] Add files via upload New screenshot --- apps/game1024/screenshot.png | Bin 0 -> 5313 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc244bdae62034fddade46d012902e0200b30d0 GIT binary patch literal 5313 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 CG8;Gm literal 0 HcmV?d00001 From 9999764b9f57a3802e0eae46a2f86e0292700a92 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:10:44 +0100 Subject: [PATCH 25/69] Delete screenshot.png --- apps/game1024/screenshot.png | Bin 5313 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png deleted file mode 100644 index 5cc244bdae62034fddade46d012902e0200b30d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5313 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 CG8;Gm From 139a7a9775cfe00376b5c2d62df8ad014daa5861 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:11:26 +0100 Subject: [PATCH 26/69] Add files via upload New screenshot, new colors --- apps/game1024/screenshot.png | Bin 0 -> 5313 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc244bdae62034fddade46d012902e0200b30d0 GIT binary patch literal 5313 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 CG8;Gm literal 0 HcmV?d00001 From 61af019839b309f92e256197715d49f0a5341282 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:25:40 +0100 Subject: [PATCH 27/69] Delete game1024.png will be replaced --- apps/game1024/game1024.png | Bin 1768 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png deleted file mode 100644 index 4118dd3ca0de7e48b2944f9bbaae606cf9647d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ From e86e5bb9fdaf9e99a9ce314de46fbead5bcf1cef Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:26:22 +0100 Subject: [PATCH 28/69] New icon image --- apps/game1024/game1024_10-2.png | Bin 0 -> 425 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/game1024_10-2.png diff --git a/apps/game1024/game1024_10-2.png b/apps/game1024/game1024_10-2.png new file mode 100644 index 0000000000000000000000000000000000000000..28b0079d8e0ed8691675d60a189be1c3c8869373 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sP60k4t_=+hKqe3X89)GJ{0E|# znE&h6{daKqFDdyyJNv(}@qZwws`}5v^S`_M|KY>`{rvvly7hm~od0TSr5=a1fZA9} zg8YKdpMU@Uoor++kk6Q3Ae+_G#WBR=_}go@g_;xu7y^78T*6$Q{;xL` z6Vcq7P_-iMj=1>K9Yq%>3Pg#tT<8*Yapg>9U6jNjah|WNF`l(IWAe0|7J<1nj3Nv< zYx$hMEO&6`y7rIZFy{p|)(BoJQ@?i?N*{j2N*Qn(~K@$6x{SgdKbC^EMeVHG6f+aa( zq0NS~`?_|&RGm=xtI3%!Ao`R{~r@#A7nq6_WyN(bHIiBoL;Xs-Jk!9Z?CWQ$vZR8o&tsr NgQu&X%Q~loCIDf;w_yMP literal 0 HcmV?d00001 From 03efd3af5cbd1d9df26d44281358bbfb39c2f813 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:28:56 +0100 Subject: [PATCH 29/69] Delete game1024_10-2.png --- apps/game1024/game1024_10-2.png | Bin 425 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/game1024_10-2.png diff --git a/apps/game1024/game1024_10-2.png b/apps/game1024/game1024_10-2.png deleted file mode 100644 index 28b0079d8e0ed8691675d60a189be1c3c8869373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sP60k4t_=+hKqe3X89)GJ{0E|# znE&h6{daKqFDdyyJNv(}@qZwws`}5v^S`_M|KY>`{rvvly7hm~od0TSr5=a1fZA9} zg8YKdpMU@Uoor++kk6Q3Ae+_G#WBR=_}go@g_;xu7y^78T*6$Q{;xL` z6Vcq7P_-iMj=1>K9Yq%>3Pg#tT<8*Yapg>9U6jNjah|WNF`l(IWAe0|7J<1nj3Nv< zYx$hMEO&6`y7rIZFy{p|)(BoJQ@?i?N*{j2N*Qn(~K@$6x{SgdKbC^EMeVHG6f+aa( zq0NS~`?_|&RGm=xtI3%!Ao`R{~r@#A7nq6_WyN(bHIiBoL;Xs-Jk!9Z?CWQ$vZR8o&tsr NgQu&X%Q~loCIDf;w_yMP From 49f2dae36dd66a567153baa1544cdc5d318b024e Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:29:54 +0100 Subject: [PATCH 30/69] Add files via upload New icon image --- apps/game1024/game1024.png | Bin 0 -> 425 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..28b0079d8e0ed8691675d60a189be1c3c8869373 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sP60k4t_=+hKqe3X89)GJ{0E|# znE&h6{daKqFDdyyJNv(}@qZwws`}5v^S`_M|KY>`{rvvly7hm~od0TSr5=a1fZA9} zg8YKdpMU@Uoor++kk6Q3Ae+_G#WBR=_}go@g_;xu7y^78T*6$Q{;xL` z6Vcq7P_-iMj=1>K9Yq%>3Pg#tT<8*Yapg>9U6jNjah|WNF`l(IWAe0|7J<1nj3Nv< zYx$hMEO&6`y7rIZFy{p|)(BoJQ@?i?N*{j2N*Qn(~K@$6x{SgdKbC^EMeVHG6f+aa( zq0NS~`?_|&RGm=xtI3%!Ao`R{~r@#A7nq6_WyN(bHIiBoL;Xs-Jk!9Z?CWQ$vZR8o&tsr NgQu&X%Q~loCIDf;w_yMP literal 0 HcmV?d00001 From ead78423363f9a794109d7f12c5ebcfe68280035 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 07:39:25 -0700 Subject: [PATCH 31/69] Update crow_clock.js --- apps/crowclk/crow_clock.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/crowclk/crow_clock.js b/apps/crowclk/crow_clock.js index d06369fa8..eee1653cb 100644 --- a/apps/crowclk/crow_clock.js +++ b/apps/crowclk/crow_clock.js @@ -76,7 +76,7 @@ function draw_clock(){ // g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y); // g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius); - g.setColor(g.theme.fg); + g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg); let ticks = [0, 90, 180, 270]; ticks.forEach((item)=>{ let agl = item+180; @@ -92,13 +92,13 @@ function draw_clock(){ let minute_agl = minute_angle(date); g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); // g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); // - g.setColor(g.theme.fg); + g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg); g.fillCircle(clock_center.x, clock_center.y, 6); - g.setColor(g.theme.bg); + g.setColor(g.theme.dark ? g.theme.fg : g.theme.bg); g.fillCircle(clock_center.x, clock_center.y, 3); // draw minute ticks. Takes long time to draw! - g.setColor(g.theme.fg); + g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg); for (var i=0; i<60; i++){ let agl = i*6+180; g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180}); From b6f533f542bf597afcba7e7410cdff46502b8682 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 07:39:38 -0700 Subject: [PATCH 32/69] Update metadata.json --- apps/crowclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/crowclk/metadata.json b/apps/crowclk/metadata.json index 752e30fb0..6985cf11a 100644 --- a/apps/crowclk/metadata.json +++ b/apps/crowclk/metadata.json @@ -1,7 +1,7 @@ { "id": "crowclk", "name": "Crow Clock", - "version": "0.02", + "version": "0.03", "description": "A simple clock based on Bold Clock that has MST3K's Crow T. Robot for a face", "icon": "crow_clock.png", "screenshots": [{"url":"screenshot_crow.png"}], From 439c841a05a58dd12acd082899a39d443d453e00 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 07:40:15 -0700 Subject: [PATCH 33/69] Update ChangeLog --- apps/crowclk/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/crowclk/ChangeLog b/apps/crowclk/ChangeLog index b7e18abe3..4f48bdd14 100644 --- a/apps/crowclk/ChangeLog +++ b/apps/crowclk/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Removed "wake LCD on face-up"-feature: A watch-face should not set things like "wake LCD on face-up". +0.03: Fix the clock for dark mode. From 215756d5b4b0a1f37730ddcb5aa721ce6188805a Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 08:02:14 -0700 Subject: [PATCH 34/69] Update app-b1.js --- apps/dtlaunch/app-b1.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dtlaunch/app-b1.js b/apps/dtlaunch/app-b1.js index ec0569127..ed9cc778e 100644 --- a/apps/dtlaunch/app-b1.js +++ b/apps/dtlaunch/app-b1.js @@ -48,6 +48,7 @@ function draw_icon(p,n,selected) { var x = (n%3)*80; var y = n>2?130:40; (selected?g.setColor(0.3,0.3,0.3):g.setColor(0,0,0)).fillRect(x,y,x+79,y+89); + g.setColor(g.theme.fg); g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25}); g.setColor(-1).setFontAlign(0,-1,0).setFont("6x8",1); var txt = apps[p*6+n].name.split(" "); From aaf46fe41048f6b13b3aec632efc63596d0bc724 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 08:02:54 -0700 Subject: [PATCH 35/69] Update ChangeLog --- apps/dtlaunch/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index 811784b39..da07af798 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -8,3 +8,4 @@ 0.08: Optimize line wrapping for Bangle 2 0.09: fix the trasparent widget bar if there are no widgets for Bangle 2 0.10: added "one click exit" setting for Bangle 2 +0.11: Fix bangle.js 1 white icons not displaying From 833cf465fa097a5a70c6316d15f8b3f344d050fa Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 08:03:07 -0700 Subject: [PATCH 36/69] Update metadata.json --- apps/dtlaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dtlaunch/metadata.json b/apps/dtlaunch/metadata.json index 7a4094e54..b3f94442f 100644 --- a/apps/dtlaunch/metadata.json +++ b/apps/dtlaunch/metadata.json @@ -1,7 +1,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.10", + "version": "0.11", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", From c9c5e3ed53961b9113a8fb67c6ff1b06f34566d9 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sat, 19 Mar 2022 15:20:42 +0100 Subject: [PATCH 37/69] Changed the superscript characters in readme --- apps/game1024/Changelog | 4 ++-- apps/game1024/README.md | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index b45a8d3ad..3d040bc08 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,2 +1,2 @@ -0.01: New App! -0.02: Temporary intermediate version \ No newline at end of file +0.01: Initial version +0.02: Temporary intermediate version, bug fix, added descriptions \ No newline at end of file diff --git a/apps/game1024/README.md b/apps/game1024/README.md index d1d427078..96ac8747b 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -5,17 +5,19 @@ Move the tiles by swiping to the lefthand, righthand or up- and downward side of When two tiles with the same number are squashed together they will add up as exponentials: -**1 + 1 = 2** or **A + A = D** which is a representation of **2¹ + 2¹ = 2² = 4** +**1 + 1 = 2** or **A + A = D** which is a representation of **2^1 + 2^1 = 2^1 = 4** -**2 + 2 = 3** or **B + B = C** which is a representation of **2² + 2² = 2³ = 8** +**2 + 2 = 3** or **B + B = C** which is a representation of **2^2 + 2^2 = 2^3 = 8** -**3 + 3 = 4** or **C + C = D** which is a representation of **2³ + 2³ = 2⁴ = 16** +**3 + 3 = 4** or **C + C = D** which is a representation of **2^3 + 2^3 = 2^4 = 16** -So you can continue till you reach **1024** which equals **2¹⁰**. So when you reach tile **10** you have won. +So you can continue till you reach **1024** which equals **2^(10)**. So when you reach tile **10** you have won. The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.) -## Buttons +Use the side **BTN** to exit the game, score and tile positions will be saved. + +## Buttons on the screen - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels - Button **\***: Change the text on the tile to number, capitals or Roman numbers @@ -23,6 +25,6 @@ The score is maintained by adding the outcome of the sum of all pairs of squashe ### Credits -Game 1024 is based on Saming's 2048 and Misho M. Petković 1024game.org and conceptually similar to Threes by Asher Vollmer. +Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. ![Screenshot from the Banglejs 2 watch with the game](./game1024_sc_watch.png) \ No newline at end of file From 802bd08173f1d391b0abe16e5f6a8343efbc9823 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 19 Mar 2022 16:05:50 +0100 Subject: [PATCH 38/69] hidjoystick Disable Button 2-5 on BangleJs2, use Layout library --- apps/hidjoystick/app.js | 67 ++++++++++++++++++++++------------ apps/hidjoystick/metadata.json | 2 +- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/apps/hidjoystick/app.js b/apps/hidjoystick/app.js index 134814cee..a571dcc0e 100644 --- a/apps/hidjoystick/app.js +++ b/apps/hidjoystick/app.js @@ -1,8 +1,43 @@ -var storage = require('Storage'); +const storage = require('Storage'); +const Layout = require("Layout"); const settings = storage.readJSON('setting.json',1) || { HID: false }; +const BANGLEJS2 = process.env.HWVERSION == 2; +const buttonWidth = Bangle.appRect.w/2; +const buttonHeight = (Bangle.appRect.h-16)/2*0.85; // subtract text row and add a safety margin var sendInProgress = false; // Only send one message at a time, do not flood + +function renderBtnArrows(l) { + const d = g.getWidth() - l.width; + + function c(a) { + return { + width: 8, + height: a.length, + bpp: 1, + buffer: (new Uint8Array(a)).buffer + }; + } + + g.drawImage(c([0,8,12,14,255,14,12,8]),d,g.getHeight()/2); + if (!BANGLEJS2) { + g.drawImage(c([16,56,124,254,16,16,16,16]),d,40); + g.drawImage(c([16,16,16,16,254,124,56,16]),d,194); + } +} + +const layout = new Layout( + {type:"h", c:[ + {type:"v", width:Bangle.appRect.w-18, c: [ + {type:"h", c:[ + {type:"txt", font:"6x8:2", label:"Joystick"}, + ]} + ]}, + {type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows} + ]} +); + const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) { try { const buttons = (btn5<<4) | (btn4<<3) | (btn3<<2) | (btn2<<1) | (btn1<<0); @@ -20,31 +55,17 @@ const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) { function drawApp() { g.clear(); - g.setFont("6x8",2); - g.setFontAlign(0,0); - g.drawString("Joystick", 120, 120); - const d = g.getWidth() - 18; - - function c(a) { - return { - width: 8, - height: a.length, - bpp: 1, - buffer: (new Uint8Array(a)).buffer - }; - } - - g.drawImage(c([16,56,124,254,16,16,16,16]),d,40); - g.drawImage(c([16,16,16,16,254,124,56,16]),d,194); - g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + layout.render(); } function update() { - const btn1 = BTN1.read(); - const btn2 = BTN2.read(); - const btn3 = BTN3.read(); - const btn4 = BTN4.read(); - const btn5 = BTN5.read(); + const btn1 = BTN1 ? BTN1.read() : 0; + const btn2 = !BANGLEJS2 ? BTN2.read() : 0; + const btn3 = !BANGLEJS2 ? BTN3.read() : 0; + const btn4 = !BANGLEJS2 ? BTN4.read() : 0; + const btn5 = !BANGLEJS2 ? BTN5.read() : 0; const acc = Bangle.getAccel(); var x = acc.x*-127; var y = acc.y*-127; diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index 35be134dc..3642e732c 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -3,7 +3,7 @@ "name": "Bluetooth Joystick", "shortName": "Joystick", "version": "0.02", - "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", + "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 only one button is supported at this moment)", "icon": "app.png", "tags": "bluetooth", "supports": ["BANGLEJS", "BANGLEJS2"], From f4a467fbe66258ae23a0b8d07bdb0fefb3f6eef8 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 19 Mar 2022 22:10:05 +0100 Subject: [PATCH 39/69] hidjoystick Emulate buttons 2-5 with touchscreen on BangleJs2 --- apps/hidjoystick/app.js | 68 ++++++++++++++++++++++++++++------ apps/hidjoystick/metadata.json | 2 +- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/apps/hidjoystick/app.js b/apps/hidjoystick/app.js index a571dcc0e..6198afffe 100644 --- a/apps/hidjoystick/app.js +++ b/apps/hidjoystick/app.js @@ -2,11 +2,15 @@ const storage = require('Storage'); const Layout = require("Layout"); const settings = storage.readJSON('setting.json',1) || { HID: false }; const BANGLEJS2 = process.env.HWVERSION == 2; -const buttonWidth = Bangle.appRect.w/2; +const sidebarWidth=18; +const buttonWidth = (Bangle.appRect.w-sidebarWidth)/2; const buttonHeight = (Bangle.appRect.h-16)/2*0.85; // subtract text row and add a safety margin var sendInProgress = false; // Only send one message at a time, do not flood - +var touchBtn2 = 0; +var touchBtn3 = 0; +var touchBtn4 = 0; +var touchBtn5 = 0; function renderBtnArrows(l) { const d = g.getWidth() - l.width; @@ -27,17 +31,57 @@ function renderBtnArrows(l) { } } +const layoutChilden = []; +if (BANGLEJS2) { // add virtual buttons in display + layoutChilden.push({type:"h", c:[ + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN2", id:"touchBtn2" }, + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN3", id:"touchBtn3" }, + ]}); +} +layoutChilden.push({type:"h", c:[ + {type:"txt", font:"6x8:2", label:"Joystick" }, +]}); +if (BANGLEJS2) { // add virtual buttons in display + layoutChilden.push({type:"h", c:[ + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN4", id:"touchBtn4" }, + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN5", id:"touchBtn5" }, + ]}); +} + const layout = new Layout( {type:"h", c:[ - {type:"v", width:Bangle.appRect.w-18, c: [ - {type:"h", c:[ - {type:"txt", font:"6x8:2", label:"Joystick"}, - ]} - ]}, - {type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows} + {type:"v", width:Bangle.appRect.w-sidebarWidth, c: layoutChilden}, + {type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows } ]} ); +function isInBox(box, x, y) { + return x >= box.x && x < box.x+box.w && y >= box.y && y < box.y+box.h; +} + +if (BANGLEJS2) { + Bangle.on('drag', function(event) { + if (event.b == 0) { // release + touchBtn2 = touchBtn3 = touchBtn4 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn2, event.x, event.y)) { + touchBtn2 = 1; + touchBtn3 = touchBtn4 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn3, event.x, event.y)) { + touchBtn3 = 1; + touchBtn2 = touchBtn4 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn4, event.x, event.y)) { + touchBtn4 = 1; + touchBtn2 = touchBtn3 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn5, event.x, event.y)) { + touchBtn5 = 1; + touchBtn2 = touchBtn3 = touchBtn4 = 0; + } else { + // outside any buttons, release all + touchBtn2 = touchBtn3 = touchBtn4 = touchBtn5 = 0; + } + }); +} + const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) { try { const buttons = (btn5<<4) | (btn4<<3) | (btn3<<2) | (btn2<<1) | (btn1<<0); @@ -62,10 +106,10 @@ function drawApp() { function update() { const btn1 = BTN1 ? BTN1.read() : 0; - const btn2 = !BANGLEJS2 ? BTN2.read() : 0; - const btn3 = !BANGLEJS2 ? BTN3.read() : 0; - const btn4 = !BANGLEJS2 ? BTN4.read() : 0; - const btn5 = !BANGLEJS2 ? BTN5.read() : 0; + const btn2 = !BANGLEJS2 ? BTN2.read() : touchBtn2; + const btn3 = !BANGLEJS2 ? BTN3.read() : touchBtn3; + const btn4 = !BANGLEJS2 ? BTN4.read() : touchBtn4; + const btn5 = !BANGLEJS2 ? BTN5.read() : touchBtn5; const acc = Bangle.getAccel(); var x = acc.x*-127; var y = acc.y*-127; diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index 3642e732c..c13ae2efa 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -3,7 +3,7 @@ "name": "Bluetooth Joystick", "shortName": "Joystick", "version": "0.02", - "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 only one button is supported at this moment)", + "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 buttons 2-5 are emulated with the touchscreen.", "icon": "app.png", "tags": "bluetooth", "supports": ["BANGLEJS", "BANGLEJS2"], From 9e82dec18131f4675f9cb7de1af13d793ad04629 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 19 Mar 2022 22:15:25 +0100 Subject: [PATCH 40/69] hidjoystick retab --- apps/hidjoystick/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hidjoystick/app.js b/apps/hidjoystick/app.js index 6198afffe..69f56463d 100644 --- a/apps/hidjoystick/app.js +++ b/apps/hidjoystick/app.js @@ -45,7 +45,7 @@ if (BANGLEJS2) { // add virtual buttons in display layoutChilden.push({type:"h", c:[ {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN4", id:"touchBtn4" }, {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN5", id:"touchBtn5" }, - ]}); + ]}); } const layout = new Layout( From fbe07de1c083c60bda10ecca9788e5c02f83c07d Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 00:26:42 +0100 Subject: [PATCH 41/69] Bug fix score reset after Game Over, new icon --- apps/game1024/Changelog | 6 +----- apps/game1024/app-icon.js | 2 +- apps/game1024/app.js | 3 ++- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index dd4ee3149..af0925b0f 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,8 +1,4 @@ -<<<<<<< HEAD 0.01: Initial version -0.02: Temporary intermediate version, bug fix, added descriptions -======= -0.01: New App! 0.02: Temporary intermediate version 0.03: Basic colors ->>>>>>> 49f2dae36dd66a567153baa1544cdc5d318b024e +0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js index 3af366bc9..8e8b56d9f 100644 --- a/apps/game1024/app-icon.js +++ b/apps/game1024/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkBkQAWkAyVgQXYhnMACXAC/4X/C/4XH5s9CAvTmfcC5nf/4GGAAM8C5YOBGogWC//zC5XDC4ouB/vdBIJJCC4wnDC4c/CYXP//8C5APBC4pDDHQIXICwPzAQI2EC4QEB/oXHQYQXGCQQ0EF4wOBC6nNJQYXSPIgXaRQIvtC7jEEC5oqEa5QXIAoZ8B/gXQ774BAYgXPFYP/BAIJDC5wGCAAJGCC5PfOISREPQYXKABHdAogXRAAoX/C/4X/C+UAACgXYkQAW")) +require("heatshrink").decompress(atob("mEwwkBkQAWkAyVgQXx5gAMCQOqAAeiC/4X/AAXdC6HP7gECn///oXH///+QXEn4XC4f/mf/AwQXEmczmQXD74QD7/8AQZHLFIPfC4QzC4ZICC5XPngXD/4CB5oXNIYQXG+YXSCYQXKkQXWU4oXbL5mjC5M/R5evC5PfniwBa5Gvd4gXE5/z7s/DQIXGl6PJ5v//5eCC46/F4YXCAgMzAoYXFkYXFABTvMC/4X0ACkCC/4XJu4AMCQOIAAeCC+0///zC6dz/8z/83C6V/CgN/+4XSn4DCF6ZcGC6Hyv53V+Z3WCgR3OkQAWA=")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 829b29ba9..71e2b3906 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -127,7 +127,8 @@ const snapshot = { for (let i = 0; i< this.dump.gridsize; i++) { this.dump.expVals[i] = 0; } - this.dump.score = scores.currentScore; + this.dump.score = 0; + this.dump.highScore = scores.highScore; this.dump.charIndex = charIndex; this.write(); debug(console.log("reset D U M P E D!", this.dump)); From 6380f1a124f6d4f538fa772979c52ca18a814430 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 00:28:45 +0100 Subject: [PATCH 42/69] v0.04 --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 92d34bed3..5512d7572 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.03", + "version": "0.04", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", From ebf30dc874c812502c8a51cbc281026797caacfb Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Sun, 20 Mar 2022 00:41:30 +0100 Subject: [PATCH 43/69] New icon --- apps/game1024/game1024.png | Bin 425 -> 582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png index 28b0079d8e0ed8691675d60a189be1c3c8869373..c0f7eaf212ebf597bf5eb069c0b5bbeddca2a573 100644 GIT binary patch delta 557 zcmZ3;J8s zU$){vZLB3he!+jgoqzvF?M}2mP=GPN$S;KP{G#$%K(@Q5i(`n#@wZoQ7d07(um)63 zjPkgnB>3WJR4B^BiE3Ajs1~-NrSvu1EWrk3->c6 z-42WOjIL+Cn=$v;epuDX;uve~kix{lF;#(WrM#snV|>n1wjzBIAJ+1_+rMz%NG!MU`-?S}g+m&zR5c6_hp^=$`AuXA|--F@%Y zALbLA?l3)hpR~dL)4>G{r-XjUaG7ar%iP6W#_ZUb`}EXVg9(eDeAS(G?!(sqYTGic onlqyQur<}j&N0t@bI`~>C%lrqclx*Uz#wMuboFyt=akR{02kT(jQ{`u delta 399 zcmV;A0dW4t1gQg%B!5CsOjJdHfPer100000fPjF2fPer10RI30|6E-EuCD(;K>ryT z|7&aiGc*7H|NnY={|pTOi;Mrm!~afB|JvIBoSgqACUr=|DgXcg1awkPQ_s)u@9rI0 zeE4!K~zY`?bh28f*=q8P)tBXR)0k0|9>?W6e+b}dZ=dH z7Z>HYa?z0xS`>uPiWNjf31tPMVh9+|4t9ZG1&wHvmTZI&oqPcl0Bo%eLiDFVLkiaZ z0K*B;CIwgxIyFx2&>jLcK?-JD%PDHLkV1hV3wax$l From 85d60201b783916fca3f8473fc4e62e157c29345 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Sun, 20 Mar 2022 00:42:04 +0100 Subject: [PATCH 44/69] to be replaced --- apps/game1024/game1024.png | Bin 582 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png deleted file mode 100644 index c0f7eaf212ebf597bf5eb069c0b5bbeddca2a573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sa{_!qT!Az)XlQ5va)CE=b^WPWA_$d3f6V z{Fcv|bMF6~Ioa7;tE%??uc}g0n=Ak_*8pVh|NqASjd}j_RQ<2&{@;E0|KWB2*UkAq z$M3(Nhj=a;QGP#0@SkYDiMZ|C3tQM(iE4-{a`FY*gvJin-X z7Le`k>EamTas2I-+eJ+VBCG*b6QextC<(qeniZ|NC1C5f|Nqx=wm5nAq%7mN+mT-5 zu!+y|jN-WyM(0ix_CHxveXy~**yl@Q+Qhqe6f_AlHw5)1M<K(9xW3*&{RC0f2o6}1Kj zo!Dz0bh<5kvzL2X#H)rGT=OPqB((0oeCkO<-{16OLW}D7SN}Y{vVM^|OPp`J;r_~{ zGRL+Z-)nh&+kw*STpmDY-@EmP`NXC>Oi$h?ZLt4zZ~?<9p&v3_W*XZvcQKbSJ2vJ% zJ$2S#!r~`ib!VOXu=W48OsnRMs6T8?wXt)|bKe{^vd;;xWbd8+?L07i89ZJ6T-G@y GGywqqH2s4B From 4420833dbdb6878808ab934f60bfdbcc096b882e Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Sun, 20 Mar 2022 00:42:52 +0100 Subject: [PATCH 45/69] New icon --- apps/game1024/game1024.png | Bin 0 -> 582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f7eaf212ebf597bf5eb069c0b5bbeddca2a573 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sa{_!qT!Az)XlQ5va)CE=b^WPWA_$d3f6V z{Fcv|bMF6~Ioa7;tE%??uc}g0n=Ak_*8pVh|NqASjd}j_RQ<2&{@;E0|KWB2*UkAq z$M3(Nhj=a;QGP#0@SkYDiMZ|C3tQM(iE4-{a`FY*gvJin-X z7Le`k>EamTas2I-+eJ+VBCG*b6QextC<(qeniZ|NC1C5f|Nqx=wm5nAq%7mN+mT-5 zu!+y|jN-WyM(0ix_CHxveXy~**yl@Q+Qhqe6f_AlHw5)1M<K(9xW3*&{RC0f2o6}1Kj zo!Dz0bh<5kvzL2X#H)rGT=OPqB((0oeCkO<-{16OLW}D7SN}Y{vVM^|OPp`J;r_~{ zGRL+Z-)nh&+kw*STpmDY-@EmP`NXC>Oi$h?ZLt4zZ~?<9p&v3_W*XZvcQKbSJ2vJ% zJ$2S#!r~`ib!VOXu=W48OsnRMs6T8?wXt)|bKe{^vd;;xWbd8+?L07i89ZJ6T-G@y GGywqqH2s4B literal 0 HcmV?d00001 From 5cb7e0620c86ccf2e281c6266e7aa43876d59593 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 20 Mar 2022 09:55:43 +0100 Subject: [PATCH 46/69] add Banglejs 1 compatibity to the terminal clock app --- apps/terminalclock/ChangeLog | 3 ++- apps/terminalclock/app.js | 22 +++++++++++++++++----- apps/terminalclock/metadata.json | 5 +++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/terminalclock/ChangeLog b/apps/terminalclock/ChangeLog index 6515ab627..14159bc19 100644 --- a/apps/terminalclock/ChangeLog +++ b/apps/terminalclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! -0.02: Rename "Activity" in "Motion" and display the true values for it +0.02: Rename "Activity" in "Motion" and display the true values for it +0.03: Add Banglejs 1 compatibility diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index ab83a696f..d219b84d8 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,16 +1,28 @@ var locale = require("locale"); var fontColor = g.theme.dark ? "#0f0" : "#000"; -var paddingY = 2; -var font6x8At4Size = 32; -var font6x8At2Size = 18; var heartRate = 0; +// handling the differents versions of the Banglejs smartwatch +if (process.env.HWVERSION == 1){ + var paddingY = 3; + var font6x8At4Size = 48; + var font6x8At2Size = 27; + var font6x8FirstTextSize = 6; + var font6x8DefaultTextSize = 3; +} +else{ + var paddingY = 2; + var font6x8At4Size = 32; + var font6x8At2Size = 18; + var font6x8FirstTextSize = 4; + var font6x8DefaultTextSize = 2; +} function setFontSize(pos){ if(pos == 1) - g.setFont("6x8", 4); + g.setFont("6x8", font6x8FirstTextSize); else - g.setFont("6x8", 2); + g.setFont("6x8", font6x8DefaultTextSize); } function clearField(pos){ diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json index de0244318..de369bf10 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -3,11 +3,12 @@ "name": "Terminal Clock", "shortName":"Terminal Clock", "description": "A terminal cli like clock displaying multiple sensor data", - "version":"0.02", + "version":"0.03", "icon": "app.png", "type": "clock", "tags": "clock", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, "readme": "README.md", "storage": [ {"name": "terminalclock.app.js","url": "app.js"}, From 31d835dad59e7d5c9c6d404c95c85ee5332a40c2 Mon Sep 17 00:00:00 2001 From: Joseph Paul Date: Sun, 20 Mar 2022 09:25:43 +0100 Subject: [PATCH 47/69] Cycling: Initial commit --- apps/cycling/ChangeLog | 1 + apps/cycling/README.md | 26 ++ apps/cycling/blecsc-emu.js | 111 ++++++++ apps/cycling/blecsc.js | 150 +++++++++++ apps/cycling/cscsensor.app.js | 420 +++++++++++++++++++++++++++++ apps/cycling/icons8-cycling-48.png | Bin 0 -> 1487 bytes apps/cycling/metadata.json | 16 ++ apps/cycling/settings.js | 37 +++ 8 files changed, 761 insertions(+) create mode 100644 apps/cycling/ChangeLog create mode 100644 apps/cycling/README.md create mode 100644 apps/cycling/blecsc-emu.js create mode 100644 apps/cycling/blecsc.js create mode 100644 apps/cycling/cscsensor.app.js create mode 100644 apps/cycling/icons8-cycling-48.png create mode 100644 apps/cycling/metadata.json create mode 100644 apps/cycling/settings.js diff --git a/apps/cycling/ChangeLog b/apps/cycling/ChangeLog new file mode 100644 index 000000000..ec66c5568 --- /dev/null +++ b/apps/cycling/ChangeLog @@ -0,0 +1 @@ +0.01: Initial version diff --git a/apps/cycling/README.md b/apps/cycling/README.md new file mode 100644 index 000000000..61ba1d455 --- /dev/null +++ b/apps/cycling/README.md @@ -0,0 +1,26 @@ +# Cycling +> Displays data from a BLE Cycling Speed and Cadence sensor. + +*Fork of the CSCSensor app using the layout library and separate module for CSC functionality* + +The following data are displayed: +- curent speed +- moving time +- average speed +- maximum speed +- trip distance +- total distance + +Total distance is not stored on the Bangle, but instead is calculated from the CWR (cumulative wheel revolutions) reported by the sensor. This metric is, according to the BLE spec, a absolute value that persists throughout the lifetime of the sensor and never rolls over. + +**Cadence / Crank features are currently not implemented** + +# TODO +* Settings: imperial/metric +* Store circumference per device address +* Sensor battery status +* Implement crank events / show cadence +* Bangle.js 1 compatibility + +# Development +There is a "mock" version of the `blecsc` module, which can be used to test features in the emulator. Check `blecsc-emu.js` for usage. diff --git a/apps/cycling/blecsc-emu.js b/apps/cycling/blecsc-emu.js new file mode 100644 index 000000000..ca5058545 --- /dev/null +++ b/apps/cycling/blecsc-emu.js @@ -0,0 +1,111 @@ +// UUID of the Bluetooth CSC Service +const SERVICE_UUID = "1816"; +// UUID of the CSC measurement characteristic +const MEASUREMENT_UUID = "2a5b"; + +// Wheel revolution present bit mask +const FLAGS_WREV_BM = 0x01; +// Crank revolution present bit mask +const FLAGS_CREV_BM = 0x02; + +/** + * Fake BLECSC implementation for the emulator, where it's hard to test + * with actual hardware. Generates "random" wheel events (no crank). + * + * To upload as a module, paste the entire file in the console using this + * command: require("Storage").write("blecsc-emu",``); + */ +class BLECSCEmulator { + constructor() { + this.timeout = undefined; + this.interval = 500; + this.ccr = 0; + this.lwt = 0; + this.handlers = { + // value + // disconnect + // wheelEvent + // crankEvent + }; + } + + getDeviceAddress() { + return 'fa:ke:00:de:vi:ce'; + } + + /** + * Callback for the GATT characteristicvaluechanged event. + * Consumers must not call this method! + */ + onValue(event) { + // Not interested in non-CSC characteristics + if (event.target.uuid != "0x" + MEASUREMENT_UUID) return; + + // Notify the generic 'value' handler + if (this.handlers.value) this.handlers.value(event); + + const flags = event.target.value.getUint8(0, true); + // Notify the 'wheelEvent' handler + if ((flags & FLAGS_WREV_BM) && this.handlers.wheelEvent) this.handlers.wheelEvent({ + cwr: event.target.value.getUint32(1, true), // cumulative wheel revolutions + lwet: event.target.value.getUint16(5, true), // last wheel event time + }); + + // Notify the 'crankEvent' handler + if ((flags & FLAGS_CREV_BM) && this.handlers.crankEvent) this.handlers.crankEvent({ + ccr: event.target.value.getUint16(7, true), // cumulative crank revolutions + lcet: event.target.value.getUint16(9, true), // last crank event time + }); + } + + /** + * Register an event handler. + * + * @param {string} event value|disconnect + * @param {function} handler handler function that receives the event as its first argument + */ + on(event, handler) { + this.handlers[event] = handler; + } + + fakeEvent() { + this.interval = Math.max(50, Math.min(1000, this.interval + Math.random()*40-20)); + this.lwt = (this.lwt + this.interval) % 0x10000; + this.ccr++; + + var buffer = new ArrayBuffer(8); + var view = new DataView(buffer); + view.setUint8(0, 0x01); // Wheel revolution data present bit + view.setUint32(1, this.ccr, true); // Cumulative crank revolutions + view.setUint16(5, this.lwt, true); // Last wheel event time + + this.onValue({ + target: { + uuid: "0x2a5b", + value: view, + }, + }); + + this.timeout = setTimeout(this.fakeEvent.bind(this), this.interval); + } + + /** + * Find and connect to a device which exposes the CSC service. + * + * @return {Promise} + */ + connect() { + this.timeout = setTimeout(this.fakeEvent.bind(this), this.interval); + return Promise.resolve(true); + } + + /** + * Disconnect the device. + */ + disconnect() { + if (!this.timeout) return; + clearTimeout(this.timeout); + } +} + +exports = BLECSCEmulator; diff --git a/apps/cycling/blecsc.js b/apps/cycling/blecsc.js new file mode 100644 index 000000000..7a47108e5 --- /dev/null +++ b/apps/cycling/blecsc.js @@ -0,0 +1,150 @@ +const SERVICE_UUID = "1816"; +// UUID of the CSC measurement characteristic +const MEASUREMENT_UUID = "2a5b"; + +// Wheel revolution present bit mask +const FLAGS_WREV_BM = 0x01; +// Crank revolution present bit mask +const FLAGS_CREV_BM = 0x02; + +/** + * This class communicates with a Bluetooth CSC peripherial using the Espruino NRF library. + * + * ## Usage: + * 1. Register event handlers using the \`on(eventName, handlerFunction)\` method + * You can subscribe to the \`wheelEvent\` and \`crankEvent\` events or you can + * have raw characteristic values passed through using the \`value\` event. + * 2. Search and connect to a BLE CSC peripherial by calling the \`connect()\` method + * 3. To tear down the connection, call the \`disconnect()\` method + * + * ## Events + * - \`wheelEvent\` - the peripharial sends a notification containing wheel event data + * - \`crankEvent\` - the peripharial sends a notification containing crank event data + * - \`value\` - the peripharial sends any CSC characteristic notification (including wheel & crank event) + * - \`disconnect\` - the peripherial ends the connection or the connection is lost + * + * Each event can only have one handler. Any call to \`on()\` will + * replace a previously registered handler for the same event. + */ +class BLECSC { + constructor() { + this.device = undefined; + this.ccInterval = undefined; + this.gatt = undefined; + this.handlers = { + // wheelEvent + // crankEvent + // value + // disconnect + }; + } + + getDeviceAddress() { + if (!this.device || !this.device.id) + return '00:00:00:00:00:00'; + return this.device.id.split(" ")[0]; + } + + checkConnection() { + if (!this.device) + console.log("no device"); + // else + // console.log("rssi: " + this.device.rssi); + } + + /** + * Callback for the GATT characteristicvaluechanged event. + * Consumers must not call this method! + */ + onValue(event) { + // Not interested in non-CSC characteristics + if (event.target.uuid != "0x" + MEASUREMENT_UUID) return; + + // Notify the generic 'value' handler + if (this.handlers.value) this.handlers.value(event); + + const flags = event.target.value.getUint8(0, true); + // Notify the 'wheelEvent' handler + if ((flags & FLAGS_WREV_BM) && this.handlers.wheelEvent) this.handlers.wheelEvent({ + cwr: event.target.value.getUint32(1, true), // cumulative wheel revolutions + lwet: event.target.value.getUint16(5, true), // last wheel event time + }); + + // Notify the 'crankEvent' handler + if ((flags & FLAGS_CREV_BM) && this.handlers.crankEvent) this.handlers.crankEvent({ + ccr: event.target.value.getUint16(7, true), // cumulative crank revolutions + lcet: event.target.value.getUint16(9, true), // last crank event time + }); + } + + /** + * Callback for the NRF disconnect event. + * Consumers must not call this method! + */ + onDisconnect(event) { + console.log("disconnected"); + if (this.ccInterval) + clearInterval(this.ccInterval); + + if (!this.handlers.disconnect) return; + this.handlers.disconnect(event); + } + + /** + * Register an event handler. + * + * @param {string} event wheelEvent|crankEvent|value|disconnect + * @param {function} handler function that will receive the event as its first argument + */ + on(event, handler) { + this.handlers[event] = handler; + } + + /** + * Find and connect to a device which exposes the CSC service. + * + * @return {Promise} + */ + connect() { + // Register handler for the disconnect event to be passed throug + NRF.on('disconnect', this.onDisconnect.bind(this)); + + // Find a device, then get the CSC Service and subscribe to + // notifications on the CSC Measurement characteristic. + // NRF.setLowPowerConnection(true); + return NRF.requestDevice({ + timeout: 5000, + filters: [{ services: [SERVICE_UUID] }], + }).then(device => { + this.device = device; + this.device.on('gattserverdisconnected', this.onDisconnect.bind(this)); + this.ccInterval = setInterval(this.checkConnection.bind(this), 2000); + return device.gatt.connect(); + }).then(gatt => { + this.gatt = gatt; + return gatt.getPrimaryService(SERVICE_UUID); + }).then(service => { + return service.getCharacteristic(MEASUREMENT_UUID); + }).then(characteristic => { + characteristic.on('characteristicvaluechanged', this.onValue.bind(this)); + return characteristic.startNotifications(); + }); + } + + /** + * Disconnect the device. + */ + disconnect() { + if (this.ccInterval) + clearInterval(this.ccInterval); + + if (!this.gatt) return; + try { + this.gatt.disconnect(); + } catch { + // + } + } +} + +exports = BLECSC; diff --git a/apps/cycling/cscsensor.app.js b/apps/cycling/cscsensor.app.js new file mode 100644 index 000000000..9de3f5a3e --- /dev/null +++ b/apps/cycling/cscsensor.app.js @@ -0,0 +1,420 @@ +const Layout = require('Layout'); + +const SETTINGS_FILE = 'cscsensor.json'; +const storage = require('Storage'); + +const RECONNECT_TIMEOUT = 4000; +const MAX_CONN_ATTEMPTS = 2; + +class CSCSensor { + constructor(blecsc, display) { + // Dependency injection + this.blecsc = blecsc; + this.display = display; + + // Load settings + this.settings = storage.readJSON(SETTINGS_FILE, 1) || {}; + this.wheelCirc = (this.settings.wheelcirc || 2230) / 1000; // unit: m + + // CSC runtime variables + this.movingTime = 0; // unit: s + this.lastBangleTime = Date.now(); // unit: ms + this.lwet = 0; // last wheel event time (unit: s/1024) + this.cwr = -1; // cumulative wheel revolutions + this.cwrTrip = 0; // wheel revolutions since trip start + this.speed = 0; // unit: m/s + this.maxSpeed = 0; // unit: m/s + this.speedFailed = 0; + + // Other runtime variables + this.connected = false; + this.failedAttempts = 0; + this.failed = false; + + // Layout configuration + this.layout = 0; + this.display.useMetricUnits(true); + // this.display.useMetricUnits(!require("locale").speed(1).toString().endsWith("mph")); + } + + onDisconnect(event) { + console.log("disconnected ", event); + + this.connected = false; + this.setLayout(0); + this.display.setDeviceAddress("unknown"); + + if (this.failedAttempts >= MAX_CONN_ATTEMPTS) { + this.failed = true; + this.display.setStatus("Connection failed after " + MAX_CONN_ATTEMPTS + " attempts."); + } else { + this.display.setStatus("Disconnected"); + setTimeout(this.connect.bind(this), RECONNECT_TIMEOUT); + } + + } + + connect() { + this.connected = false; + this.setLayout(0); + this.display.setStatus("Connecting..."); + console.log("Trying to connect to BLE CSC"); + + // Hook up events + this.blecsc.on('wheelEvent', this.onWheelEvent.bind(this)); + this.blecsc.on('disconnect', this.onDisconnect.bind(this)); + + // Scan for BLE device and connect + this.blecsc.connect() + .then(function() { + this.failedAttempts = 0; + this.failed = false; + this.connected = true; + var addr = this.blecsc.getDeviceAddress(); + console.log("Connected to " + addr); + + this.display.setDeviceAddress(addr); + this.display.setStatus("Connected"); + + // Switch to speed screen in 2s + setTimeout(function() { + this.setLayout(1); + this.updateScreen(); + }.bind(this), 2000); + }.bind(this)) + .catch(function(e) { + this.failedAttempts++; + this.onDisconnect(e); + }.bind(this)); + } + + disconnect() { + this.blecsc.disconnect(); + this.connected = false; + this.setLayout(0); + this.display.setStatus("Disconnected") + } + + setLayout(num) { + this.layout = num; + if (this.layout == 0) { + this.display.updateLayout("status"); + } else if (this.layout == 1) { + this.display.updateLayout("speed"); + } else if (this.layout == 2) { + this.display.updateLayout("distance"); + } + } + + reset() { + this.connected = false; + this.failed = false; + this.failedAttempts = 0; + } + + interact(d) { + // Only interested in tap / center button + if (d) return; + + // Reconnect in failed state + if (this.failed) { + this.reset(); + this.connect(); + } else if (this.connected) { + this.setLayout((this.layout + 1) % 3); + } + } + + updateScreen() { + var tripDist = this.cwrTrip * this.wheelCirc; + var avgSpeed = this.movingTime > 3 ? tripDist / this.movingTime : 0 + + this.display.setTotalDistance(this.cwr * this.wheelCirc); + this.display.setTripDistance(tripDist); + this.display.setSpeed(this.speed); + this.display.setAvg(avgSpeed); + this.display.setMax(this.maxSpeed); + this.display.setTime(Math.floor(this.movingTime)); + } + + onWheelEvent(event) { + // Calculate number of revolutions since last wheel event + var dRevs = (this.cwr > 0 ? event.cwr - this.cwr : 0); + this.cwr = event.cwr; + + // Increment the trip revolutions counter + this.cwrTrip += dRevs; + + // Calculate time delta since last wheel event + var dT = (event.lwet - this.lwet)/1024; + var now = Date.now(); + var dBT = (now-this.lastBangleTime)/1000; + this.lastBangleTime = now; + if (dT<0) dT+=64; // wheel event time wraps every 64s + if (Math.abs(dT-dBT)>3) dT = dBT; // not sure about the reason for this + this.lwet = event.lwet; + + // Recalculate current speed + if (dRevs>0 && dT>0) { + this.speed = dRevs * this.wheelCirc / dT; + this.speedFailed = 0; + this.movingTime += dT; + } else { + this.speedFailed++; + if (this.speedFailed>3) { + this.speed = 0; + } + } + + // Update max speed + if (this.speed>this.maxSpeed + && (this.movingTime>3 || this.speed<20) + && this.speed<50 + ) this.maxSpeed = this.speed; + + this.updateScreen(); + } +} + +class CSCDisplay { + constructor() { + this.metric = true; + this.fontLabel = "6x8"; + this.fontMed = "15%"; + this.fontLarge = "32%"; + this.currentLayout = "status"; + this.layouts = {}; + this.layouts.speed = new Layout({ + type: "v", + c: [ + { + type: "h", + id: "speed_g", + fillx: 1, + filly: 1, + pad: 4, + bgCol: "#fff", + c: [ + {type: undefined, width: 32, halign: -1}, + {type: "txt", id: "speed", label: "00.0", font: this.fontLarge, bgCol: "#fff", col: "#000", width: 122}, + {type: "txt", id: "speed_u", label: " km/h", font: this.fontLabel, col: "#000", width: 22, r: 90}, + ] + }, + { + type: "h", + id: "time_g", + fillx: 1, + pad: 4, + bgCol: "#000", + height: 32, + c: [ + {type: undefined, width: 32, halign: -1}, + {type: "txt", id: "time", label: "00:00", font: this.fontMed, bgCol: "#000", col: "#fff", width: 122}, + {type: "txt", id: "time_u", label: "mins", font: this.fontLabel, bgCol: "#000", col: "#fff", width: 22, r: 90}, + ] + }, + { + type: "h", + id: "stats_g", + fillx: 1, + bgCol: "#fff", + height: 32, + c: [ + { + type: "v", + pad: 4, + bgCol: "#fff", + c: [ + {type: "txt", id: "max_l", label: "MAX", font: this.fontLabel, col: "#000"}, + {type: "txt", id: "max", label: "00.0", font: this.fontMed, bgCol: "#fff", col: "#000", width: 69}, + ], + }, + { + type: "v", + pad: 4, + bgCol: "#fff", + c: [ + {type: "txt", id: "avg_l", label: "AVG", font: this.fontLabel, col: "#000"}, + {type: "txt", id: "avg", label: "00.0", font: this.fontMed, bgCol: "#fff", col: "#000", width: 69}, + ], + }, + {type: "txt", id: "stats_u", label: " km/h", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 22, r: 90}, + ] + }, + ], + }); + this.layouts.distance = new Layout({ + type: "v", + c: [ + { + type: "h", + id: "tripd_g", + fillx: 1, + pad: 4, + bgCol: "#fff", + height: 32, + c: [ + {type: "txt", id: "tripd_l", label: "TRP", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 36}, + {type: "txt", id: "tripd", label: "0", font: this.fontMed, bgCol: "#fff", col: "#000", width: 118}, + {type: "txt", id: "tripd_u", label: "km", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 22, r: 90}, + ] + }, + { + type: "h", + id: "totald_g", + fillx: 1, + pad: 4, + bgCol: "#000", + height: 32, + c: [ + {type: "txt", id: "totald_l", label: "TTL", font: this.fontLabel, bgCol: "#000", col: "#fff", width: 36}, + {type: "txt", id: "totald", label: "0", font: this.fontMed, bgCol: "#000", col: "#fff", width: 118}, + {type: "txt", id: "totald_u", label: "km", font: this.fontLabel, bgCol: "#000", col: "#fff", width: 22, r: 90}, + ] + }, + ], + }); + this.layouts.status = new Layout({ + type: "v", + c: [ + { + type: "h", + id: "status_g", + fillx: 1, + bgCol: "#fff", + height: 100, + c: [ + {type: "txt", id: "status", label: "Bangle Cycling", font: this.fontMed, bgCol: "#fff", col: "#000", width: 176, wrap: 1}, + ] + }, + { + type: "h", + id: "addr_g", + fillx: 1, + pad: 4, + bgCol: "#fff", + height: 32, + c: [ + { type: "txt", id: "addr_l", label: "MAC", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 36 }, + { type: "txt", id: "addr", label: "unknown", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 140 }, + ] + }, + ], + }); + } + + updateLayout(layout) { + this.currentLayout = layout; + + g.clear(); + this.layouts[layout].update(); + this.layouts[layout].render(); + } + + renderIfLayoutActive(layout, node) { + if (layout != this.currentLayout) return; + this.layouts[layout].render(node) + } + + useMetricUnits(metric) { + this.metric = metric; + + console.log("using " + (metric ? "metric" : "imperial") + " units"); + + var speedUnit = metric ? "km/h" : "mph"; + this.layouts.speed.speed_u.label = speedUnit; + this.layouts.speed.stats_u.label = speedUnit; + + var distanceUnit = metric ? "km" : "mi"; + this.layouts.distance.tripd_u.label = distanceUnit; + this.layouts.distance.totald_u.label = distanceUnit; + + this.updateLayout(this.currentLayout); + } + + convertDistance(meters) { + if (this.metric) return meters / 1000; + return meters / 1609.344; + } + + convertSpeed(mps) { + if (this.metric) return mps * 3.6; + return mps * 2.23694; + } + + setSpeed(speed) { + this.layouts.speed.speed.label = this.convertSpeed(speed).toFixed(1); + this.renderIfLayoutActive("speed", this.layouts.speed.speed_g); + } + + setAvg(speed) { + this.layouts.speed.avg.label = this.convertSpeed(speed).toFixed(1); + this.renderIfLayoutActive("speed", this.layouts.speed.stats_g); + } + + setMax(speed) { + this.layouts.speed.max.label = this.convertSpeed(speed).toFixed(1); + this.renderIfLayoutActive("speed", this.layouts.speed.stats_g); + } + + setTime(seconds) { + var time = ''; + var hours = Math.floor(seconds/3600); + if (hours) { + time += hours + ":"; + this.layouts.speed.time_u.label = " hrs"; + } else { + this.layouts.speed.time_u.label = "mins"; + } + + time += String(Math.floor((seconds%3600)/60)).padStart(2, '0') + ":"; + time += String(seconds % 60).padStart(2, '0'); + + this.layouts.speed.time.label = time; + this.renderIfLayoutActive("speed", this.layouts.speed.time_g); + } + + setTripDistance(distance) { + this.layouts.distance.tripd.label = this.convertDistance(distance).toFixed(1) + this.renderIfLayoutActive("distance", this.layouts.distance.tripd_g); + } + + setTotalDistance(distance) { + this.layouts.distance.totald.label = this.convertDistance(distance).toFixed(1) + this.renderIfLayoutActive("distance", this.layouts.distance.totald_g); + } + + setDeviceAddress(address) { + this.layouts.status.addr.label = address + this.renderIfLayoutActive("status", this.layouts.status.addr_g); + } + + setStatus(status) { + this.layouts.status.status.label = status + this.renderIfLayoutActive("status", this.layouts.status.status_g); + } +} + +var BLECSC; +if (process.env.BOARD === "EMSCRIPTEN" || process.env.BOARD === "EMSCRIPTEN2") { + // Emulator + BLECSC = require("blecsc-emu"); +} else { + // Actual hardware + BLECSC = require("blecsc"); +} +var blecsc = new BLECSC(); +var display = new CSCDisplay(); +var sensor = new CSCSensor(blecsc, display); + +E.on('kill',()=>{ + sensor.disconnect(); +}); + +Bangle.setUI("updown", d => { + sensor.interact(d); +}); + +sensor.connect(); +// Bangle.loadWidgets(); +// Bangle.drawWidgets(); diff --git a/apps/cycling/icons8-cycling-48.png b/apps/cycling/icons8-cycling-48.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc83859f1ac8d5b1d40aa787ab3c8bf339913fd GIT binary patch literal 1487 zcmV;=1u*)FP)BH^< zyW9n~y*qr_|Cil8&-47wInUcYcLAS#^2w*s6pf~HE?fR2B+da?2cQbX+sIIO#vR6} zC14F+`r0W52Ju37k`R;+ZG@6I2ZJY&z?9<-X7myuo-S{P&K=C?CBSq=-i|7FFn)>z zGlWX>KF@8r7q(gy1B1o}w0CMluJ4M^%-R8xwu0#!IG+Jvn>&239pdkH7KGgqBYtRX z)lMB~7s!Iy(Le8ue>L-ME?t%irW_D-wwd2XDaI0a{CFjS^1Q>z4XxT!ZQUV(a_xcY zE{>a0k)&U{slroVil2d!T}O7;Hcu~g6+8fRnFFc%UtKZp$@2HqpJHdAXn#>i&uvRZ zZKHNXw@71aWbpT6W)}f4c;Z))6)4X;oZQ+NP~X@#vf%BiZqhIKW&a1Sc;egR1P<-k z{(fzXNHrJz#96RAa7J5=dQ<-qCQE z#sWaFzaLh`#6j$w3wFY4@B61VVsb-5+>0Ap0N~oE+XF5)&8&G~VolTxt;^u;5muAI z_>fl;n3a~n52Q6S+yfz- z48{XqNg(<8jIQPm1UTEr`Kz%iCf2MA719#3*1J_6yDN_lu|C{ll(V;sW_)P6sQ&EA z`GY5RFQ4d%kKyF$lbAMStthU%DJ&Fw5yKGPCguXz*q;DLIxetq zQ&GO1>TEb!UZJ-wtLOsWr^WLUFR55a1JFZ+%wuOS_P?kzO>*eW))i2U?0003g14xmMV5(D= zZ)+Reo$m(#vmg$-zE*C@{b}Wv+)8JAH_U(7zD^lnc3c6*O@;Zc5&+BCtRi9%4{8tU z3bbC@QYuHZ@;KzXthu_VPlk?lHvFL^Vv3A`CVBba!c>K#2 zh4}zvSAa?YfJv1h2a}T^AOir1(O)_<)&blI;0B0S5!q)?A-+9YXT$Nbb2jB0BV5p zhYQ{teA!y4z+_T~w~NKZFaYQQ_@E@wkzQ5L?*O2Y{AYqV9l*<0I7)5>`!8};uXvO1 zvY0C{nbhHJVlELf;rgAm7ohxG!J2nQ8obi{Vaw^`W#@D(s8-t^BGESUbz+>c_z9mZ pnU^5{H~9$VZN5)F`Q(##^&bl8rz8LGDIEX+002ovPDHLkV1j9?%0U1C literal 0 HcmV?d00001 diff --git a/apps/cycling/metadata.json b/apps/cycling/metadata.json new file mode 100644 index 000000000..917658fad --- /dev/null +++ b/apps/cycling/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "cycling", + "name": "Bangle Cycling", + "shortName": "Cycling", + "version": "0.01", + "description": "Display live values from a BLE CSC sensor", + "icon": "icons8-cycling-48.png", + "tags": "outdoors,exercise,ble,bluetooth", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"cycling.app.js","url":"cycling.app.js"}, + {"name":"cycling.settings.js","url":"settings.js"}, + {"name":"blecsc","url":"blecsc.js"} + ] +} diff --git a/apps/cycling/settings.js b/apps/cycling/settings.js new file mode 100644 index 000000000..810d8afc0 --- /dev/null +++ b/apps/cycling/settings.js @@ -0,0 +1,37 @@ +// This file should contain exactly one function, which shows the app's settings +/** + * @param {function} back Use back() to return to settings menu + */ +(function(back) { + const SETTINGS_FILE = 'cscsensor.json' + // initialize with default settings... + let s = { + 'wheelcirc': 2230, + } + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + const saved = storage.readJSON(SETTINGS_FILE, 1) || {} + for (const key in saved) { + s[key] = saved[key]; + } + // creates a function to safe a specific setting, e.g. save('color')(1) + function save(key) { + return function (value) { + s[key] = value; + storage.write(SETTINGS_FILE, s); + } + } + const menu = { + '': { 'title': 'Cycle speed sensor' }, + '< Back': back, + 'Wheel circ.(mm)': { + value: s.wheelcirc, + min: 800, + max: 2400, + step: 5, + onchange: save('wheelcirc'), + }, + } + E.showMenu(menu); +}) From 14aca8db0fc687e162ec59b735399f09c9c6bf68 Mon Sep 17 00:00:00 2001 From: Joseph Paul Date: Sun, 20 Mar 2022 09:55:00 +0100 Subject: [PATCH 48/69] Cycling: Re-enable widgets; optimise font sizes --- .../{cscsensor.app.js => cycling.app.js} | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) rename apps/cycling/{cscsensor.app.js => cycling.app.js} (93%) diff --git a/apps/cycling/cscsensor.app.js b/apps/cycling/cycling.app.js similarity index 93% rename from apps/cycling/cscsensor.app.js rename to apps/cycling/cycling.app.js index 9de3f5a3e..4b53046d9 100644 --- a/apps/cycling/cscsensor.app.js +++ b/apps/cycling/cycling.app.js @@ -1,6 +1,6 @@ const Layout = require('Layout'); -const SETTINGS_FILE = 'cscsensor.json'; +const SETTINGS_FILE = 'cycling.json'; const storage = require('Storage'); const RECONNECT_TIMEOUT = 4000; @@ -57,7 +57,7 @@ class CSCSensor { connect() { this.connected = false; this.setLayout(0); - this.display.setStatus("Connecting..."); + this.display.setStatus("Connecting"); console.log("Trying to connect to BLE CSC"); // Hook up events @@ -180,7 +180,8 @@ class CSCDisplay { constructor() { this.metric = true; this.fontLabel = "6x8"; - this.fontMed = "15%"; + this.fontSmall = "15%"; + this.fontMed = "18%"; this.fontLarge = "32%"; this.currentLayout = "status"; this.layouts = {}; @@ -206,7 +207,7 @@ class CSCDisplay { fillx: 1, pad: 4, bgCol: "#000", - height: 32, + height: 36, c: [ {type: undefined, width: 32, halign: -1}, {type: "txt", id: "time", label: "00:00", font: this.fontMed, bgCol: "#000", col: "#fff", width: 122}, @@ -218,7 +219,7 @@ class CSCDisplay { id: "stats_g", fillx: 1, bgCol: "#fff", - height: 32, + height: 36, c: [ { type: "v", @@ -226,7 +227,7 @@ class CSCDisplay { bgCol: "#fff", c: [ {type: "txt", id: "max_l", label: "MAX", font: this.fontLabel, col: "#000"}, - {type: "txt", id: "max", label: "00.0", font: this.fontMed, bgCol: "#fff", col: "#000", width: 69}, + {type: "txt", id: "max", label: "00.0", font: this.fontSmall, bgCol: "#fff", col: "#000", width: 69}, ], }, { @@ -235,7 +236,7 @@ class CSCDisplay { bgCol: "#fff", c: [ {type: "txt", id: "avg_l", label: "AVG", font: this.fontLabel, col: "#000"}, - {type: "txt", id: "avg", label: "00.0", font: this.fontMed, bgCol: "#fff", col: "#000", width: 69}, + {type: "txt", id: "avg", label: "00.0", font: this.fontSmall, bgCol: "#fff", col: "#000", width: 69}, ], }, {type: "txt", id: "stats_u", label: " km/h", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 22, r: 90}, @@ -245,6 +246,7 @@ class CSCDisplay { }); this.layouts.distance = new Layout({ type: "v", + bgCol: "#fff", c: [ { type: "h", @@ -264,12 +266,12 @@ class CSCDisplay { id: "totald_g", fillx: 1, pad: 4, - bgCol: "#000", + bgCol: "#fff", height: 32, c: [ - {type: "txt", id: "totald_l", label: "TTL", font: this.fontLabel, bgCol: "#000", col: "#fff", width: 36}, - {type: "txt", id: "totald", label: "0", font: this.fontMed, bgCol: "#000", col: "#fff", width: 118}, - {type: "txt", id: "totald_u", label: "km", font: this.fontLabel, bgCol: "#000", col: "#fff", width: 22, r: 90}, + {type: "txt", id: "totald_l", label: "TTL", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 36}, + {type: "txt", id: "totald", label: "0", font: this.fontMed, bgCol: "#fff", col: "#000", width: 118}, + {type: "txt", id: "totald_u", label: "km", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 22, r: 90}, ] }, ], @@ -284,7 +286,7 @@ class CSCDisplay { bgCol: "#fff", height: 100, c: [ - {type: "txt", id: "status", label: "Bangle Cycling", font: this.fontMed, bgCol: "#fff", col: "#000", width: 176, wrap: 1}, + {type: "txt", id: "status", label: "Bangle Cycling", font: this.fontSmall, bgCol: "#fff", col: "#000", width: 176, wrap: 1}, ] }, { @@ -309,6 +311,7 @@ class CSCDisplay { g.clear(); this.layouts[layout].update(); this.layouts[layout].render(); + Bangle.drawWidgets(); } renderIfLayoutActive(layout, node) { @@ -380,7 +383,12 @@ class CSCDisplay { } setTotalDistance(distance) { - this.layouts.distance.totald.label = this.convertDistance(distance).toFixed(1) + const distance = this.convertDistance(distance); + if (distance >= 1000) { + this.layouts.distance.totald.label = String(Math.round(distance)); + } else { + this.layouts.distance.totald.label = distance.toFixed(1); + } this.renderIfLayoutActive("distance", this.layouts.distance.totald_g); } @@ -415,6 +423,5 @@ Bangle.setUI("updown", d => { sensor.interact(d); }); +Bangle.loadWidgets(); sensor.connect(); -// Bangle.loadWidgets(); -// Bangle.drawWidgets(); From a44c62630a0149abd9324c1a00b5ac13319abeaa Mon Sep 17 00:00:00 2001 From: Joseph Paul Date: Sun, 20 Mar 2022 10:51:00 +0100 Subject: [PATCH 49/69] Cycling: Implement settings --- apps/cycling/README.md | 20 +++++++---- apps/cycling/cycling.app.js | 60 ++++++++++++++++++++++--------- apps/cycling/settings.js | 72 +++++++++++++++++++++++-------------- 3 files changed, 103 insertions(+), 49 deletions(-) diff --git a/apps/cycling/README.md b/apps/cycling/README.md index 61ba1d455..7ba8ee224 100644 --- a/apps/cycling/README.md +++ b/apps/cycling/README.md @@ -1,7 +1,7 @@ # Cycling > Displays data from a BLE Cycling Speed and Cadence sensor. -*Fork of the CSCSensor app using the layout library and separate module for CSC functionality* +*This is a fork of the CSCSensor app using the layout library and separate module for CSC functionality. It also drops persistence of total distance on the Bangle, as this information is also persisted on the sensor itself. Further, it allows configuration of display units (metric/imperial) independent of chosen locale. Finally, multiple sensors can be used and wheel circumference can be configured for each sensor individually.* The following data are displayed: - curent speed @@ -11,16 +11,24 @@ The following data are displayed: - trip distance - total distance -Total distance is not stored on the Bangle, but instead is calculated from the CWR (cumulative wheel revolutions) reported by the sensor. This metric is, according to the BLE spec, a absolute value that persists throughout the lifetime of the sensor and never rolls over. +Other than in the original version of the app, total distance is not stored on the Bangle, but instead is calculated from the CWR (cumulative wheel revolutions) reported by the sensor. This metric is, according to the BLE spec, an absolute value that persists throughout the lifetime of the sensor and never rolls over. **Cadence / Crank features are currently not implemented** -# TODO -* Settings: imperial/metric -* Store circumference per device address +## Usage +Open the app and connect to a CSC sensor. + +Upon first connection, close the app afain and enter the settings app to configure the wheel circumference. The total circumference is (cm + mm) - it is split up into two values for ease of configuration. Check the status screen inside the Cycling app while connected to see the address of the currently connected sensor (if you need to differentiate between multiple sensors). + +Inside the Cycling app, use button / tap screen to: +- cycle through screens (if connected) +- reconnect (if connection aborted) + +## TODO * Sensor battery status * Implement crank events / show cadence * Bangle.js 1 compatibility +* Allow setting CWR on the sensor (this is a feature intended by the BLE CSC spec, in case the sensor is replaced or transferred to a different bike) -# Development +## Development There is a "mock" version of the `blecsc` module, which can be used to test features in the emulator. Check `blecsc-emu.js` for usage. diff --git a/apps/cycling/cycling.app.js b/apps/cycling/cycling.app.js index 4b53046d9..268284a29 100644 --- a/apps/cycling/cycling.app.js +++ b/apps/cycling/cycling.app.js @@ -1,7 +1,11 @@ const Layout = require('Layout'); +const storage = require('Storage'); const SETTINGS_FILE = 'cycling.json'; -const storage = require('Storage'); +const SETTINGS_DEFAULT = { + sensors: {}, + metric: true, +}; const RECONNECT_TIMEOUT = 4000; const MAX_CONN_ATTEMPTS = 2; @@ -13,8 +17,8 @@ class CSCSensor { this.display = display; // Load settings - this.settings = storage.readJSON(SETTINGS_FILE, 1) || {}; - this.wheelCirc = (this.settings.wheelcirc || 2230) / 1000; // unit: m + this.settings = storage.readJSON(SETTINGS_FILE, true) || SETTINGS_DEFAULT; + this.wheelCirc = undefined; // CSC runtime variables this.movingTime = 0; // unit: s @@ -34,13 +38,16 @@ class CSCSensor { // Layout configuration this.layout = 0; this.display.useMetricUnits(true); - // this.display.useMetricUnits(!require("locale").speed(1).toString().endsWith("mph")); + this.deviceAddress = undefined; + this.display.useMetricUnits((this.settings.metric)); } onDisconnect(event) { console.log("disconnected ", event); this.connected = false; + this.wheelCirc = undefined; + this.setLayout(0); this.display.setDeviceAddress("unknown"); @@ -51,7 +58,23 @@ class CSCSensor { this.display.setStatus("Disconnected"); setTimeout(this.connect.bind(this), RECONNECT_TIMEOUT); } + } + loadCircumference() { + if (!this.deviceAddress) return; + + // Add sensor to settings if not present + if (!this.settings.sensors[this.deviceAddress]) { + this.settings.sensors[this.deviceAddress] = { + cm: 223, + mm: 0, + }; + storage.writeJSON(SETTINGS_FILE, this.settings); + } + + const high = this.settings.sensors[this.deviceAddress].cm || 223; + const low = this.settings.sensors[this.deviceAddress].mm || 0; + this.wheelCirc = (10*high + low) / 1000; } connect() { @@ -70,12 +93,14 @@ class CSCSensor { this.failedAttempts = 0; this.failed = false; this.connected = true; - var addr = this.blecsc.getDeviceAddress(); - console.log("Connected to " + addr); + this.deviceAddress = this.blecsc.getDeviceAddress(); + console.log("Connected to " + this.deviceAddress); - this.display.setDeviceAddress(addr); + this.display.setDeviceAddress(this.deviceAddress); this.display.setStatus("Connected"); + this.loadCircumference(); + // Switch to speed screen in 2s setTimeout(function() { this.setLayout(1); @@ -90,9 +115,9 @@ class CSCSensor { disconnect() { this.blecsc.disconnect(); - this.connected = false; + this.reset(); this.setLayout(0); - this.display.setStatus("Disconnected") + this.display.setStatus("Disconnected"); } setLayout(num) { @@ -110,6 +135,7 @@ class CSCSensor { this.connected = false; this.failed = false; this.failedAttempts = 0; + this.wheelCirc = undefined; } interact(d) { @@ -127,7 +153,7 @@ class CSCSensor { updateScreen() { var tripDist = this.cwrTrip * this.wheelCirc; - var avgSpeed = this.movingTime > 3 ? tripDist / this.movingTime : 0 + var avgSpeed = this.movingTime > 3 ? tripDist / this.movingTime : 0; this.display.setTotalDistance(this.cwr * this.wheelCirc); this.display.setTripDistance(tripDist); @@ -297,7 +323,7 @@ class CSCDisplay { bgCol: "#fff", height: 32, c: [ - { type: "txt", id: "addr_l", label: "MAC", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 36 }, + { type: "txt", id: "addr_l", label: "ADDR", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 36 }, { type: "txt", id: "addr", label: "unknown", font: this.fontLabel, bgCol: "#fff", col: "#000", width: 140 }, ] }, @@ -316,13 +342,13 @@ class CSCDisplay { renderIfLayoutActive(layout, node) { if (layout != this.currentLayout) return; - this.layouts[layout].render(node) + this.layouts[layout].render(node); } useMetricUnits(metric) { this.metric = metric; - console.log("using " + (metric ? "metric" : "imperial") + " units"); + // console.log("using " + (metric ? "metric" : "imperial") + " units"); var speedUnit = metric ? "km/h" : "mph"; this.layouts.speed.speed_u.label = speedUnit; @@ -378,12 +404,12 @@ class CSCDisplay { } setTripDistance(distance) { - this.layouts.distance.tripd.label = this.convertDistance(distance).toFixed(1) + this.layouts.distance.tripd.label = this.convertDistance(distance).toFixed(1); this.renderIfLayoutActive("distance", this.layouts.distance.tripd_g); } setTotalDistance(distance) { - const distance = this.convertDistance(distance); + distance = this.convertDistance(distance); if (distance >= 1000) { this.layouts.distance.totald.label = String(Math.round(distance)); } else { @@ -393,12 +419,12 @@ class CSCDisplay { } setDeviceAddress(address) { - this.layouts.status.addr.label = address + this.layouts.status.addr.label = address; this.renderIfLayoutActive("status", this.layouts.status.addr_g); } setStatus(status) { - this.layouts.status.status.label = status + this.layouts.status.status.label = status; this.renderIfLayoutActive("status", this.layouts.status.status_g); } } diff --git a/apps/cycling/settings.js b/apps/cycling/settings.js index 810d8afc0..445c4ca33 100644 --- a/apps/cycling/settings.js +++ b/apps/cycling/settings.js @@ -3,35 +3,55 @@ * @param {function} back Use back() to return to settings menu */ (function(back) { - const SETTINGS_FILE = 'cscsensor.json' - // initialize with default settings... - let s = { - 'wheelcirc': 2230, - } - // ...and overwrite them with any saved values - // This way saved values are preserved if a new version adds more settings const storage = require('Storage') - const saved = storage.readJSON(SETTINGS_FILE, 1) || {} - for (const key in saved) { - s[key] = saved[key]; - } - // creates a function to safe a specific setting, e.g. save('color')(1) - function save(key) { - return function (value) { - s[key] = value; - storage.write(SETTINGS_FILE, s); - } - } + const SETTINGS_FILE = 'cycling.json' + + // Set default values and merge with stored values + let settings = Object.assign({ + metric: true, + sensors: {}, + }, (storage.readJSON(SETTINGS_FILE, true) || {})); + const menu = { - '': { 'title': 'Cycle speed sensor' }, + '': { 'title': 'Cycling' }, '< Back': back, - 'Wheel circ.(mm)': { - value: s.wheelcirc, - min: 800, - max: 2400, - step: 5, - onchange: save('wheelcirc'), + 'Units': { + value: settings.metric, + format: v => v ? 'metric' : 'imperial', + onchange: (metric) => { + settings.metric = metric; + storage.writeJSON(SETTINGS_FILE, settings); + }, }, } + + const sensorMenus = {}; + for (var addr of Object.keys(settings.sensors)) { + // Define sub menu + sensorMenus[addr] = { + '': { title: addr }, + '< Back': () => E.showMenu(menu), + 'cm': { + value: settings.sensors[addr].cm, + min: 80, max: 240, step: 1, + onchange: (v) => { + settings.sensors[addr].cm = v; + storage.writeJSON(SETTINGS_FILE, settings); + }, + }, + '+ mm': { + value: settings.sensors[addr].mm, + min: 0, max: 9, step: 1, + onchange: (v) => { + settings.sensors[addr].mm = v; + storage.writeJSON(SETTINGS_FILE, settings); + }, + }, + }; + + // Add entry to main menu + menu[addr] = () => E.showMenu(sensorMenus[addr]); + } + E.showMenu(menu); -}) +})(load) From 433e3a4967579e056f067675011ee3205491e00b Mon Sep 17 00:00:00 2001 From: Joseph Paul Date: Sun, 20 Mar 2022 10:59:24 +0100 Subject: [PATCH 50/69] Cycling: Add JS icon --- apps/cycling/cycling.icon.js | 1 + apps/cycling/metadata.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 apps/cycling/cycling.icon.js diff --git a/apps/cycling/cycling.icon.js b/apps/cycling/cycling.icon.js new file mode 100644 index 000000000..12c597956 --- /dev/null +++ b/apps/cycling/cycling.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH/OAAIuuGFYuEGFQv/ADOlwV8wK/qwN8AAelGAguiFogACWsulFw6SERcwAFSISLnSMuAFZWCGENWllWLRSZC0vOAAovWmUslkyvbqJwIuHGC4uBAARiDdAwueL4YACMQLmfX5IAFqwwoMIowpMQ4wpGIcywDiYAA2IAAgwGq2kFwIvGC5YtPDJIuCF4gXPFxQHLF44XQFxAKOF4oXRBg4LOFwYvEEag7OBgReQNZzLNF5IXPBJlXq4vVC5Qv8R9TXQFwbvYJBgLlNbYXRBoYOEA44XfCAgAFCxgXYDI4VPC7IA/AH4A/AH4AWA")) diff --git a/apps/cycling/metadata.json b/apps/cycling/metadata.json index 917658fad..cb4260bb2 100644 --- a/apps/cycling/metadata.json +++ b/apps/cycling/metadata.json @@ -11,6 +11,7 @@ "storage": [ {"name":"cycling.app.js","url":"cycling.app.js"}, {"name":"cycling.settings.js","url":"settings.js"}, - {"name":"blecsc","url":"blecsc.js"} + {"name":"blecsc","url":"blecsc.js"}, + {"name":"cycling.img","url":"cycling.icon.js","evaluate": true} ] } From bda630ed0869bb74ce72c517773ee2caea216e55 Mon Sep 17 00:00:00 2001 From: Joseph Paul Date: Sun, 20 Mar 2022 11:05:54 +0100 Subject: [PATCH 51/69] Cycling: don't call settings function --- apps/cycling/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cycling/settings.js b/apps/cycling/settings.js index 445c4ca33..76303379d 100644 --- a/apps/cycling/settings.js +++ b/apps/cycling/settings.js @@ -54,4 +54,4 @@ } E.showMenu(menu); -})(load) +}) From b97ee495c5308da28daa663c76e70b88cb304141 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 16:47:11 +0100 Subject: [PATCH 52/69] Changed name of Changelog to ChangeLog --- apps/game1024/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 apps/game1024/ChangeLog diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog new file mode 100644 index 000000000..af0925b0f --- /dev/null +++ b/apps/game1024/ChangeLog @@ -0,0 +1,4 @@ +0.01: Initial version +0.02: Temporary intermediate version +0.03: Basic colors +0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file From c37c8ea62facd212d7116f74f966b474043a9b53 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 16:51:33 +0100 Subject: [PATCH 53/69] Changed description of the game --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 5512d7572..6d72b9e9d 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -5,7 +5,7 @@ "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", - "description": "Join the numbers and get to the 1024, J or X tile!", + "description": "Swipe the squares up, down, to the left or right, join the numbers and get to the 10 (2^1024), J or X tile!", "type": "app", "tags": "game,puzzle", "allow_emulator": true, From d77fe09c99e3e1376906c12dad65dc11f424387b Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 16:51:55 +0100 Subject: [PATCH 54/69] rename of Changelog --- apps/game1024/Changelog | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 apps/game1024/Changelog diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog deleted file mode 100644 index af0925b0f..000000000 --- a/apps/game1024/Changelog +++ /dev/null @@ -1,4 +0,0 @@ -0.01: Initial version -0.02: Temporary intermediate version -0.03: Basic colors -0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file From d7c16c50dc7b7e8adbd82375f7bf22ab1a0374cb Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Mon, 21 Mar 2022 00:54:27 +0100 Subject: [PATCH 55/69] New screenshots foor the readme.md --- apps/game1024/README.md | 5 +- apps/game1024/app.js | 153 ++++++++++++---------------- apps/game1024/game1024_sc_watch.png | Bin 48769 -> 0 bytes apps/game1024/scrnshot_dn_300.jpg | Bin 0 -> 56911 bytes apps/game1024/scrnshot_lc_300.jpg | Bin 0 -> 55178 bytes 5 files changed, 68 insertions(+), 90 deletions(-) delete mode 100644 apps/game1024/game1024_sc_watch.png create mode 100644 apps/game1024/scrnshot_dn_300.jpg create mode 100644 apps/game1024/scrnshot_lc_300.jpg diff --git a/apps/game1024/README.md b/apps/game1024/README.md index 96ac8747b..e52961424 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -19,7 +19,7 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. ## Buttons on the screen - - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels + - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels. The level is indicated with a small number in the lower righthand corner of the Undo button - Button **\***: Change the text on the tile to number, capitals or Roman numbers - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. @@ -27,4 +27,5 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. -![Screenshot from the Banglejs 2 watch with the game](./game1024_sc_watch.png) \ No newline at end of file +![Screenshot from the Banglejs 2 watch with the game in dark theme](./scrnshot_dn_300.jpg) +![Screenshot from the Banglejs 2 watch with the game in light theme](./scrnshot_lc_300.jpg) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 71e2b3906..3b96b327f 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,4 +1,4 @@ -const debugMode = 'development'; // valid values are: off, test, production, development +const debugMode = 'off'; // valid values are: off, test, production, development const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; const rows = 4, cols = 4; const borderWidth = 6; @@ -26,7 +26,7 @@ const scores = { lastScores: [0], add: function(val) { this.currentScore = this.currentScore + Math.pow(2, val); - debug(console.log("new score=",this.currentScore)); + debug(() => console.log("new score=",this.currentScore)); }, addToUndo: function () { this.lastScores.push(this.currentScore); @@ -34,7 +34,7 @@ const scores = { }, undo: function () { this.currentScore = this.lastScores.pop(); - debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + debug(() => console.log("undo score =", this.currentScore, "rest:", this.lastScores)); }, reset: function () { this.currentScore = 0; @@ -44,25 +44,25 @@ const scores = { g.setColor(btnAtribs.fg); let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; - g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); - g.setFont12x20(1); - g.setFontAlign(0,0,0); + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y) + .setFont12x20(1) + .setFontAlign(0,0,0); let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; - g.setColor('#000000'); - g.drawString(this.currentScore, scrX+1, scrY+1); - g.setColor(btnAtribs.bg); - g.drawString(this.currentScore, scrX, scrY); + g.setColor('#000000') + .drawString(this.currentScore, scrX+1, scrY+1) + .setColor(btnAtribs.bg) + .drawString(this.currentScore, scrX, scrY); scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); - g.setFont("6x8:1x2"); - g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + g.setFont("6x8:1x2") + .drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); }, hsContents: function () { return {"highScore": this.highScore, "lastScore": this.currentScore}; }, check: function () { this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; - debug(console.log('highScore =', this.highScore)); + debug(() => console.log('highScore =', this.highScore)); } }; @@ -108,7 +108,7 @@ const snapshot = { if (this.counter == this.interval) { this.setDump(); this.write(); - debug(console.log("D U M P E D!", this.dump)); + debug(() => console.log("snapped the state of the game:", this.dump)); } }, recover: function () { @@ -131,7 +131,7 @@ const snapshot = { this.dump.highScore = scores.highScore; this.dump.charIndex = charIndex; this.write(); - debug(console.log("reset D U M P E D!", this.dump)); + debug(() => console.log("reset D U M P E D!", this.dump)); } }; const btnAtribs = {x: 134, w: 42, h: 42, fg:'#C0C0C0', bg:'#800000'}; @@ -201,7 +201,7 @@ const mover = { return canContinue; }, nonEmptyCells: function (dir) { - debug(console.log("Move: ", dir.name)); + debug(() => console.log("Move: ", dir.name)); const step = dir.step; // outer loop for all colums/rows for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { @@ -276,16 +276,16 @@ class Button { this.enabled = true; } draw() { - g.setColor(this.bg); - g.fillRect(this.x0, this.y0, this.x1, this.y1); - g.setFont(this.font); - g.setFontAlign(0,0,0); + g.setColor(this.bg) + .fillRect(this.x0, this.y0, this.x1, this.y1) + .setFont(this.font) + .setFontAlign(0,0,0); let strX = Math.floor((this.x0+this.x1)/2); let strY = Math.floor((this.y0+this.y1)/2); - g.setColor("#000000"); - g.drawString(this.text, strX+2, strY+2); - g.setColor(this.fg); - g.drawString(this.text, strX, strY); + g.setColor("#000000") + .drawString(this.text, strX+2, strY+2) + .setColor(this.fg) + .drawString(this.text, strX, strY); // buttons.push(this); } onClick() {if (typeof this.cb === 'function' && this.enabled) { @@ -309,20 +309,18 @@ class Cell { return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; } drawBg() { - g.setColor(this.getColor(this.expVal).bg); - g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setColor(this.getColor(this.expVal).bg) + .fillRect(this.x0, this.y0, this.x1, this.y1); } drawNumber() { if (this.expVal !== 0) { - g.setFont(cellFonts[charIndex]); - g.setFontAlign(0,0,0); + g.setFont(cellFonts[charIndex]) + .setFontAlign(0,0,0); let char = cellChars[charIndex][this.expVal]; let strX = Math.floor((this.x0 + this.x1)/2); let strY = Math.floor((this.y0 + this.y1)/2); - // g.setColor(cellShadowColor); - // g.drawString(this.expVal, strX+1, strY+1); - g.setColor(this.getColor(this.expVal).fg); - g.drawString(char, strX, strY); + g.setColor(this.getColor(this.expVal).fg) + .drawString(char, strX, strY); } } setExpVal(val) { @@ -389,24 +387,23 @@ function createGrid () { } } function messageGameOver () { - g.setColor("#1a0d00"); - g.setFont12x20(2); - g.setFontAlign(0,0,0); - g.drawString("G A M E", middle.x+13, middle.y-24); - g.drawString("O V E R !", middle.x+13, middle.y+24); - g.setColor("#ffffff"); - g.drawString("G A M E", middle.x+12, middle.y-25); - g.drawString("O V E R !", middle.x+12, middle.y+25); + g.setColor("#1a0d00") + .setFont12x20(2).setFontAlign(0,0,0) + .drawString("G A M E", middle.x+13, middle.y-24) + .drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff") + .drawString("G A M E", middle.x+12, middle.y-25) + .drawString("O V E R !", middle.x+12, middle.y+25); } function messageYouWin () { - g.setColor("#1a0d00"); - g.setFont12x20(2); - g.setFontAlign(0,0,0); - g.drawString("YOU HAVE", middle.x+18, middle.y-24); - g.drawString("W O N ! !", middle.x+18, middle.y+24); - g.setColor("#FF0808"); - g.drawString("YOU HAVE", middle.x+17, middle.y-25); - g.drawString("W O N ! !", middle.x+17, middle.y+25); + g.setColor("#1a0d00") + .setFont12x20(2) + .setFontAlign(0,0,0) + .drawString("YOU HAVE", middle.x+18, middle.y-24) + .drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808") + .drawString("YOU HAVE", middle.x+17, middle.y-25) + .drawString("W O N ! !", middle.x+17, middle.y+25); Bangle.buzz(200, 1); } function makeRandomNumber () { @@ -434,7 +431,7 @@ function initGame() { createGrid(); if (snReadOnInit) { snapshot.recover(); - debug(console.log("R E C O V E R E D !", snapshot.dump)); + debug(() => console.log("R E C O V E R E D !", snapshot.dump)); let sum = allSquares.reduce(function (tv, sq) {return (sq.expVal + tv) ;}, 0); if (!sum) { addRandomNumber(); @@ -482,7 +479,7 @@ function handlePopUpClicks(btn) { buttons.all.pop(); // remove the no button buttons.all.pop(); // remove the yes button buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again - debug(console.log("Button name =", name)); + debug(() => console.log("Button name =", name)); switch (name) { case 'yes': resetGame(); @@ -512,52 +509,27 @@ function resetGame() { /** * Function that can be used in test or development environment, or production. - * Depends on global constant EFTriggerDebugMode + * Depends on global constant debugMode * @param {function} func function to call like console.log() */ const debug = (func) => { switch (debugMode) { case "development": - // console.log("Development"); - if (typeof func === 'function') { - func(); - } - break; - case "test" : - console.log("--- test ---"); - if (typeof func === 'function') { - func(); - } - break; - case "off": - case "production": // ignore func + if (typeof func === 'function') { + func(); + } + break; + case "off": default: break; } }; -const test = { - drawAllColors: function(i) { - charIndex = i>2 ? 0 : i<0 ? 0 : i; - allSquares.forEach((sq,i) => { - let c = i<11 ? i : i-10; - sq.setExpVal(c); - debug(console.log("c=",c)); - }); - drawGrid(); - }, - youWin: function() { - messageYouWin(); - }, - gameOver: function() { - messageGameOver(); - } -}; // Handle a "click" event (only needed for menu button) function handleclick(e) { buttons.all.forEach(btn => { if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { btn.onClick(); - debug(console.log(btn.name)); + debug(() => console.log(btn.name)); } }); } @@ -650,7 +622,7 @@ function runGame(dir){ snapshot.make(); dragger.setEnabled(true); if (!(mover.anyLeft())) { - debug(console.log("G A M E O V E R !!")); + debug(() => console.log("G A M E O V E R !!")); snapshot.reset(); messageGameOver(); } @@ -659,12 +631,12 @@ function runGame(dir){ function updUndoLvlIndex() { let x = 170; let y = 60; - g.setColor(btnAtribs.fg); - g.fillRect(x-6,y-6, 176, 67); + g.setColor(btnAtribs.fg) + .fillRect(x-6,y-6, 176, 67); if (scores.lastScores.length > 0) { - g.setColor("#000000"); - g.setFont("4x6:2"); - g.drawString(scores.lastScores.length, x, y); + g.setColor("#000000") + .setFont("4x6:2") + .drawString(scores.lastScores.length, x, y); } } function incrCharIndex() { @@ -679,3 +651,8 @@ buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R initGame(); dragger.setEnabled(true); + +E.on('kill',function() { + this.write(); + debug(() => console.log("1024 game got killed!")); +}); \ No newline at end of file diff --git a/apps/game1024/game1024_sc_watch.png b/apps/game1024/game1024_sc_watch.png deleted file mode 100644 index ca8184b0be8935cac9afa5340793c342111d7fe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48769 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

ta@h|)hAIX9R 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%0A@s4$i z@1?9`6yb6G6Y;(zasT39TyRgvSwVmXUk2M)%^Bg128s7GCg^qyphZR~OmDFDu-qmH z%9k(Znt%>ywSeWSfciEGQffC0A7`CJ6LFRqz*=yo4nLI+`dPvLn_OjbQkakAnt3{o}k=)WT`-Gu|!iFY%924w-#9egd)B=6~ z|01IdFJ5U;M|Hrz`}e78TJ~QDR4!~Lz9Vk9t?G%Mp5nCy5Opnuh7(Tsbz6i{e^<{n z%Y$Fjq0pg0{+93|bh4JDEzE}H!s+su(A{<|kF^#t$5nR$f$#RX7J@s(8zfR*HTf6h z??JV^aCve8?zc)weSHODIUj-wpQ&#SgNSd+f)K-b8@3_8(2lyN1Ms{!RWybV%O-da zMk@)*3e9}{jSe!{D`L*n4j7t)(cF{lL(^LAGtqx5;kX!}#!Z8bmY9wQ7@h%Uj9zq- zhuKdJ`d>7UC;y)Sp9Nt0TygE*N9ssY^Pc>NSdB>{VY+&E-T^#;TlGq7-2CI(RqVkG zN6UEmq=)Bi_&vBX3^iqCK6};_OrVIREcM?;ER_}vqyGS}IYR9w&rXqVADosFkP5Y9 z{v2cg9W+zf{#C?h%DEG*oOs1cs1`Mv_fI)_2r$K=^^>=phue*Gb;d+ z**&I})x zP!dG7F1r3+Fl;v64rIJb^>v>G*70Bp-6Vlmr~YQ1Kyo0PAkyr^(XFWw;5Gq*Ui@_=u>=fi-`eqb#-1y{2<=b^n^+z<>1q$MtvL1}IpST0RV5NzX< zE&vspn=RZ$5rSE%^SmFxr~kOS7fF=VS-XRYn6a57*kkSsSi zYri-oPhq&c=U)bHOa$2VzAvNBSRqIWqhagcoO+OeVB6^U>CP)J-eKfh)A?jB3#}|a z0p2fatr%@}*z|RbYOMfoTAcBl0(St{EOZYT23pjKS5Ex##9&Yc3#*Q?M~p>c2Zeb% zOObU0nKu9^3e9VrAcHzc|vyoXI?Da2oF-PDt$Pvq0^xGV?14P-EY^t*(|~T(!hfas=K-opLJsGz<&PcxbtOv>g~e?fp2U5u-O0`1 zK)DNi>lC)})`;4@Vi*EMdj#3-=*rdaF%Cmi<=$x_3U0uJ*9RV>ITV(geBI?#0YF4{ z``h{Vh;7F}y;t$Wiqo*&_4zPps!}3&Hrt#cC0&<-UzZ=8=AzD5oP7m&hBof5n@+#S z&CYO&@-HI&~HNMX9w2fO`gt4m8R72%Ah=MJbFFjmmtRxqWI=K^NA(p zI4iyE4E4>9xN{+sxQ37Nj(dKp!;{vydCAM&ow;{9C^5*)=A8Y{okzFTc6s` ztG;ltvd?&9_i@LZl7!l_kGcN6FCaenZ853zt z`UfPgT{YHyNt;2`FQLQXgkr+Gc}Ej1L?%X`DT%rS9O*H^eMwUGx9x!kt`3N9d;b7> znLtp~M+h3=f9=N$Ng&(Xj(->>t-ObhIKe@5Y&<`_J`{H?^7+Gu36?l(o-#kAr>|c{ z)<8+zS53a|1O-+l(s&+>;X<=-C)n%8CMz^5CljLg=L(W+T--_5)^6a9Nh{0mpa0o5 CtLv}; From 286ec4cb806503eedbd53e7b3865b956728ac628 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 22 Mar 2022 01:15:51 +0100 Subject: [PATCH 66/69] Repaired the screenshot withe wrong caret. --- apps/game1024/screenshot.png | Bin 6263 -> 6079 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png index 5537a5eb5c1f16ec1406b833b8fd587f724c2f23..8be52f8cb7a7f0650f6b454fc9a7fd41ff6a58d6 100644 GIT binary patch literal 6079 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 literal 6263 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 Date: Tue, 22 Mar 2022 09:48:45 +0000 Subject: [PATCH 67/69] lightswitch 0.03: Settings page now uses built-in min/max/wrap (fix #1607) --- apps/lightswitch/ChangeLog | 1 + apps/lightswitch/metadata.json | 2 +- apps/lightswitch/settings.js | 16 ++++++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/apps/lightswitch/ChangeLog b/apps/lightswitch/ChangeLog index 7a7ecd027..4210ccf03 100644 --- a/apps/lightswitch/ChangeLog +++ b/apps/lightswitch/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Add the option to enable touching the widget only on clock and settings. +0.03: Settings page now uses built-in min/max/wrap (fix #1607) diff --git a/apps/lightswitch/metadata.json b/apps/lightswitch/metadata.json index 902b1536b..9ac388eda 100644 --- a/apps/lightswitch/metadata.json +++ b/apps/lightswitch/metadata.json @@ -2,7 +2,7 @@ "id": "lightswitch", "name": "Light Switch Widget", "shortName": "Light Switch", - "version": "0.02", + "version": "0.03", "description": "A fast way to switch LCD backlight on/off, change the brightness and show the lock status. All in one widget.", "icon": "images/app.png", "screenshots": [ diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index aac159148..bebb16d15 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -44,9 +44,11 @@ // return entry for string value return { value: entry.value.indexOf(settings[key]), + min : 0, + max : entry.value.length-1, + wrap : true, format: v => entry.title ? entry.title[v] : entry.value[v], onchange: function(v) { - this.value = v = v >= entry.value.length ? 0 : v < 0 ? entry.value.length - 1 : v; writeSetting(key, entry.value[v], entry.drawWidgets); if (entry.exec) entry.exec(entry.value[v]); } @@ -57,8 +59,10 @@ value: settings[key] * entry.factor, step: entry.step, format: v => v > 0 ? v + entry.unit : "off", + min : entry.min, + max : entry.max, + wrap : true, onchange: function(v) { - this.value = v = v > entry.max ? entry.min : v < entry.min ? entry.max : v; writeSetting(key, v / entry.factor, entry.drawWidgets); }, }; @@ -133,16 +137,16 @@ title: "Light Switch" }, "< Back": () => back(), - "-- Widget --------": 0, + "-- Widget": 0, "Bulb col": getEntry("colors"), "Image": getEntry("image"), - "-- Control -------": 0, + "-- Control": 0, "Touch": getEntry("touchOn"), "Drag Delay": getEntry("dragDelay"), "Min Value": getEntry("minValue"), - "-- Unlock --------": 0, + "-- Unlock": 0, "TapSide": getEntry("unlockSide"), - "-- Flash ---------": 0, + "-- Flash": 0, "TapSide ": getEntry("tapSide"), "Tap": getEntry("tapOn"), "Timeout": getEntry("tOut"), From 9abc9296df0be1144faec8a6b49109b8d9ef9b04 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 22 Mar 2022 15:22:05 +0000 Subject: [PATCH 68/69] hrm 0.09: Grey out BPM until confidence is over 50% --- apps/hrm/ChangeLog | 1 + apps/hrm/heartrate.js | 5 ++--- apps/hrm/metadata.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/hrm/ChangeLog b/apps/hrm/ChangeLog index e559adfb6..f05a9dc13 100644 --- a/apps/hrm/ChangeLog +++ b/apps/hrm/ChangeLog @@ -6,3 +6,4 @@ 0.06: Add widgets 0.07: Update scaling for new firmware 0.08: Don't force backlight on/watch unlocked on Bangle 2 +0.09: Grey out BPM until confidence is over 50% diff --git a/apps/hrm/heartrate.js b/apps/hrm/heartrate.js index 305f0e1bc..703b60c01 100644 --- a/apps/hrm/heartrate.js +++ b/apps/hrm/heartrate.js @@ -35,9 +35,9 @@ function onHRM(h) { g.clearRect(0,24,g.getWidth(),80); g.setFont("6x8").drawString("Confidence "+hrmInfo.confidence+"%", px, 75); var str = hrmInfo.bpm; - g.setFontVector(40).drawString(str,px,45); + g.setFontVector(40).setColor(hrmInfo.confidence > 50 ? g.theme.fg : "#888").drawString(str,px,45); px += g.stringWidth(str)/2; - g.setFont("6x8"); + g.setFont("6x8").setColor(g.theme.fg); g.drawString("BPM",px+15,45); } Bangle.on('HRM', onHRM); @@ -101,4 +101,3 @@ function readHRM() { lastHrmPt = [hrmOffset, y]; } } - diff --git a/apps/hrm/metadata.json b/apps/hrm/metadata.json index 3e94c163c..10821d094 100644 --- a/apps/hrm/metadata.json +++ b/apps/hrm/metadata.json @@ -1,7 +1,7 @@ { "id": "hrm", "name": "Heart Rate Monitor", - "version": "0.08", + "version": "0.09", "description": "Measure your heart rate and see live sensor data", "icon": "heartrate.png", "tags": "health", From e76535fece1bad8660c986c228f663f1faff0817 Mon Sep 17 00:00:00 2001 From: Brendan Hubble Date: Wed, 23 Mar 2022 18:44:01 +1100 Subject: [PATCH 69/69] touchtimer: ADD 5 second count down buzzer - This is a configurable option (Default is off) for the timer to buzz each second when there are 5 seconds left. --- apps/touchtimer/ChangeLog | 1 + apps/touchtimer/app.js | 8 ++++++++ apps/touchtimer/metadata.json | 2 +- apps/touchtimer/settings.js | 8 ++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog index fbabe6cb7..0969a3da4 100644 --- a/apps/touchtimer/ChangeLog +++ b/apps/touchtimer/ChangeLog @@ -1,3 +1,4 @@ 0.01: Initial creation of the touch timer app 0.02: Add settings menu 0.03: Add ability to repeat last timer +0.04: Add 5 second count down buzzer diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index 61d3a08fd..c2f2fb5e9 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -126,6 +126,14 @@ var main = () => { timerIntervalId = setInterval(() => { timerCountDown.draw(); + // Buzz lightly when there are less then 5 seconds left + if (settings.countDownBuzz) { + var remainingSeconds = timerCountDown.getAdjustedTime().seconds; + if (remainingSeconds <= 5 && remainingSeconds > 0) { + Bangle.buzz(); + } + } + if (timerCountDown.isFinished()) { buttonStartPause.value = "FINISHED!"; buttonStartPause.draw(); diff --git a/apps/touchtimer/metadata.json b/apps/touchtimer/metadata.json index 50c5f03dd..0f2b9f491 100644 --- a/apps/touchtimer/metadata.json +++ b/apps/touchtimer/metadata.json @@ -2,7 +2,7 @@ "id": "touchtimer", "name": "Touch Timer", "shortName": "Touch Timer", - "version": "0.03", + "version": "0.04", "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", diff --git a/apps/touchtimer/settings.js b/apps/touchtimer/settings.js index 885670f57..79424f250 100644 --- a/apps/touchtimer/settings.js +++ b/apps/touchtimer/settings.js @@ -31,6 +31,14 @@ writeSettings(settings); }, }, + "CountDown Buzz": { + value: !!settings.countDownBuzz, + format: value => value?"On":"Off", + onchange: (value) => { + settings.countDownBuzz = value; + writeSettings(settings); + }, + }, "Pause Between": { value: settings.pauseBetween, min: 1,

ta@h|)hAIX9R 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%0A@s4$i z@1?9`6yb6G6Y;(zasT39TyRgvSwVmXUk2M)%^Bg128s7GCg^qyphZR~OmDFDu-qmH z%9k(Znt%>ywSeWSfciEGQffC0A7`CJ6LFRqz*=yo4nLI+`dPvLn_OjbQkakAnt3{o}k=)WT`-Gu|!iFY%924w-#9egd)B=6~ z|01IdFJ5U;M|Hrz`}e78TJ~QDR4!~Lz9Vk9t?G%Mp5nCy5Opnuh7(Tsbz6i{e^<{n z%Y$Fjq0pg0{+93|bh4JDEzE}H!s+su(A{<|kF^#t$5nR$f$#RX7J@s(8zfR*HTf6h z??JV^aCve8?zc)weSHODIUj-wpQ&#SgNSd+f)K-b8@3_8(2lyN1Ms{!RWybV%O-da zMk@)*3e9}{jSe!{D`L*n4j7t)(cF{lL(^LAGtqx5;kX!}#!Z8bmY9wQ7@h%Uj9zq- zhuKdJ`d>7UC;y)Sp9Nt0TygE*N9ssY^Pc>NSdB>{VY+&E-T^#;TlGq7-2CI(RqVkG zN6UEmq=)Bi_&vBX3^iqCK6};_OrVIREcM?;ER_}vqyGS}IYR9w&rXqVADosFkP5Y9 z{v2cg9W+zf{#C?h%DEG*oOs1cs1`Mv_fI)_2r$K=^^>=phue*Gb;d+ z**&I})x zP!dG7F1r3+Fl;v64rIJb^>v>G*70Bp-6Vlmr~YQ1Kyo0PAkyr^(XFWw;5Gq*Ui@_=u>=fi-`eqb#-1y{2<=b^n^+z<>1q$MtvL1}IpST0RV5NzX< zE&vspn=RZ$5rSE%^SmFxr~kOS7fF=VS-XRYn6a57*kkSsSi zYri-oPhq&c=U)bHOa$2VzAvNBSRqIWqhagcoO+OeVB6^U>CP)J-eKfh)A?jB3#}|a z0p2fatr%@}*z|RbYOMfoTAcBl0(St{EOZYT23pjKS5Ex##9&Yc3#*Q?M~p>c2Zeb% zOObU0nKu9^3e9VrAcHzc|vyoXI?Da2oF-PDt$Pvq0^xGV?14P-EY^t*(|~T(!hfas=K-opLJsGz<&PcxbtOv>g~e?fp2U5u-O0`1 zK)DNi>lC)})`;4@Vi*EMdj#3-=*rdaF%Cmi<=$x_3U0uJ*9RV>ITV(geBI?#0YF4{ z``h{Vh;7F}y;t$Wiqo*&_4zPps!}3&Hrt#cC0&<-UzZ=8=AzD5oP7m&hBof5n@+#S z&CYO&@-HI&~HNMX9w2fO`gt4m8R72%Ah=MJbFFjmmtRxqWI=K^NA(p zI4iyE4E4>9xN{+sxQ37Nj(dKp!;{vydCAM&ow;{9C^5*)=A8Y{okzFTc6s` ztG;ltvd?&9_i@LZl7!l_kGcN6FCaenZ853zt z`UfPgT{YHyNt;2`FQLQXgkr+Gc}Ej1L?%X`DT%rS9O*H^eMwUGx9x!kt`3N9d;b7> znLtp~M+h3=f9=N$Ng&(Xj(->>t-ObhIKe@5Y&<`_J`{H?^7+Gu36?l(o-#kAr>|c{ z)<8+zS53a|1O-+l(s&+>;X<=-C)n%8CMz^5CljLg=L(W+T--_5)^6a9Nh{0mpa0o5 CtLv}; literal 0 HcmV?d00001 From e4fbd662c1f7e4b0338c83ed59c5d5f955d1b312 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Mar 2022 08:50:56 +0000 Subject: [PATCH 56/69] docs --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 38ce09f75..a6c449cc7 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,18 @@ try and keep filenames short to avoid overflowing the buffer. }, ``` +### Screenshots + +In the app `metadata.json` file you can add a list of screenshots with a line like: `"screenshots" : [ { url:"screenshot.png" } ],` + +To get a screenshot you can: + +* Type `g.dump()` in the left-hand side of the Web IDE when connected to a Bangle.js 2 - you can then +right-click and save the image shown in the terminal (this only works on Bangle.js 2 - Bangle.js 1 is +unable to read data back from the LCD controller). +* Run your code in the emulator and use the screenshot button in the bottom right of the window. + + ## Testing ### Online From 338a659bbdf205f7ca2925aedab893b2a052a24e Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 21 Mar 2022 11:02:52 +0100 Subject: [PATCH 57/69] bledetect - Set bangleJs compatible - Show widgets --- apps/bledetect/ChangeLog | 1 + apps/bledetect/bledetect.js | 2 ++ apps/bledetect/metadata.json | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/bledetect/ChangeLog b/apps/bledetect/ChangeLog index e52015f04..e9b98e08c 100644 --- a/apps/bledetect/ChangeLog +++ b/apps/bledetect/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Fixed issue with wrong device informations 0.03: Ensure manufacturer:undefined doesn't overflow screen +0.04: Set Bangle.js 2 compatible, show widgets diff --git a/apps/bledetect/bledetect.js b/apps/bledetect/bledetect.js index ca8699f9a..f3fc70e92 100644 --- a/apps/bledetect/bledetect.js +++ b/apps/bledetect/bledetect.js @@ -5,6 +5,7 @@ let menu = { function showMainMenu() { menu["< Back"] = () => load(); + Bangle.drawWidgets(); return E.showMenu(menu); } @@ -55,5 +56,6 @@ function waitMessage() { E.showMessage("scanning"); } +Bangle.loadWidgets(); scan(); waitMessage(); diff --git a/apps/bledetect/metadata.json b/apps/bledetect/metadata.json index f5e0ffb19..0c30fe8f6 100644 --- a/apps/bledetect/metadata.json +++ b/apps/bledetect/metadata.json @@ -2,11 +2,11 @@ "id": "bledetect", "name": "BLE Detector", "shortName": "BLE Detector", - "version": "0.03", + "version": "0.04", "description": "Detect BLE devices and show some informations.", "icon": "bledetect.png", "tags": "app,bluetooth,tool", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"bledetect.app.js","url":"bledetect.js"}, From 3c7e830e1c536cf68f21f548fba276265d23dad2 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 21 Mar 2022 11:03:32 +0100 Subject: [PATCH 58/69] sleepphasealarm fix comment typo --- apps/sleepphasealarm/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sleepphasealarm/app.js b/apps/sleepphasealarm/app.js index 39f9b59db..e963f2c40 100644 --- a/apps/sleepphasealarm/app.js +++ b/apps/sleepphasealarm/app.js @@ -29,11 +29,11 @@ function calc_ess(val) { if (nonmot) { slsnds+=1; if (slsnds >= sleepthresh) { - return true; // awake + return true; // sleep } } else { slsnds=0; - return false; // sleep + return false; // awake } } } From 127624b19fb293fc93a0d67f629fca1b269c29be Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Mon, 21 Mar 2022 16:17:16 +0100 Subject: [PATCH 59/69] Changed screenshot pictures with ide dumps --- apps/game1024/README.md | 7 +++++-- apps/game1024/game1024_sc_dump_dark.png | Bin 0 -> 4146 bytes apps/game1024/game1024_sc_dump_light.png | Bin 0 -> 3806 bytes 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 apps/game1024/game1024_sc_dump_dark.png create mode 100644 apps/game1024/game1024_sc_dump_light.png diff --git a/apps/game1024/README.md b/apps/game1024/README.md index e52961424..474e8c97e 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -27,5 +27,8 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. -![Screenshot from the Banglejs 2 watch with the game in dark theme](./scrnshot_dn_300.jpg) -![Screenshot from the Banglejs 2 watch with the game in light theme](./scrnshot_lc_300.jpg) \ No newline at end of file +In Dark theme with numbers: +![Screenshot from the Banglejs 2 watch with the game in dark theme](./game1024_sc_dump_dark.png) + +In Light theme with characters: +![Screenshot from the Banglejs 2 watch with the game in light theme](./game1024_sc_dump_light.png) \ No newline at end of file diff --git a/apps/game1024/game1024_sc_dump_dark.png b/apps/game1024/game1024_sc_dump_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..15ecb87d9e7e0180b7443b717e0aeb5409563fa0 GIT binary patch literal 4146 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 literal 0 HcmV?d00001 diff --git a/apps/game1024/game1024_sc_dump_light.png b/apps/game1024/game1024_sc_dump_light.png new file mode 100644 index 0000000000000000000000000000000000000000..286257be4e4c689b6770b99db2a5a5f6b1b1e4e5 GIT binary patch literal 3806 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 Date: Tue, 22 Mar 2022 09:05:53 +1100 Subject: [PATCH 60/69] touchtimer: ADD ability to repeat the timer - By adding the REPEAT value at the end of buzzCount loop it allows for finshed to be shown for the full buzzCount before it changes the text to REPEAT --- apps/touchtimer/ChangeLog | 3 ++- apps/touchtimer/app.js | 7 +++++++ apps/touchtimer/metadata.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog index 01904c6ea..fbabe6cb7 100644 --- a/apps/touchtimer/ChangeLog +++ b/apps/touchtimer/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial creation of the touch timer app -0.02: Add settings menu \ No newline at end of file +0.02: Add settings menu +0.03: Add ability to repeat last timer diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index ffa1af80a..61d3a08fd 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -141,6 +141,13 @@ var main = () => { if (buzzCount >= settings.buzzCount) { clearInterval(buzzIntervalId); buzzIntervalId = undefined; + + buttonStartPause.value = "REPEAT"; + buttonStartPause.draw(); + buttonStartPause.value = "START"; + timerCountDown = undefined; + timerEdit.draw(); + return; } else { Bangle.buzz(settings.buzzDuration * 1000, 1); diff --git a/apps/touchtimer/metadata.json b/apps/touchtimer/metadata.json index 645a0ce18..50c5f03dd 100644 --- a/apps/touchtimer/metadata.json +++ b/apps/touchtimer/metadata.json @@ -2,7 +2,7 @@ "id": "touchtimer", "name": "Touch Timer", "shortName": "Touch Timer", - "version": "0.02", + "version": "0.03", "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", From 9f4119930259752b0d3f8b450d232ea3467b76ba Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:47:53 -0700 Subject: [PATCH 61/69] Update mmind.app.js --- apps/mmind/mmind.app.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/mmind/mmind.app.js b/apps/mmind/mmind.app.js index e7def025d..10d315285 100644 --- a/apps/mmind/mmind.app.js +++ b/apps/mmind/mmind.app.js @@ -172,6 +172,7 @@ Bangle.on('touch', function(zone,e) { break; case 4: //new game + turn = 0; play = [-1,-1,-1,-1]; game = []; endgame=false; @@ -189,10 +190,3 @@ Bangle.on('touch', function(zone,e) { game = []; get_secret(); draw(); -//Bangle.loadWidgets(); -//Bangle.drawWidgets(); - - - - - From afb7a4846a705c6e9fc2165a8c031aabf3e6d054 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:48:21 -0700 Subject: [PATCH 62/69] Update ChangeLog --- apps/mmind/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/mmind/ChangeLog b/apps/mmind/ChangeLog index 939ac3b5d..040e62671 100644 --- a/apps/mmind/ChangeLog +++ b/apps/mmind/ChangeLog @@ -1 +1,2 @@ 0.01: First release +0.02: Make sure to reset turns From 347f6783b72eb5950d4b39876111d093c38d1092 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:48:31 -0700 Subject: [PATCH 63/69] Update metadata.json --- apps/mmind/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mmind/metadata.json b/apps/mmind/metadata.json index c2ed474b6..ea970ee23 100644 --- a/apps/mmind/metadata.json +++ b/apps/mmind/metadata.json @@ -3,7 +3,7 @@ "name": "Classic Mind Game", "shortName":"Master Mind", "icon": "mmind.png", - "version":"0.01", + "version":"0.02", "description": "This is the classic game for masterminds", "screenshots": [{"url":"screenshot_mmind.png"}], "type": "app", From 06a58ae1496e052b0fd245ac8780cc3663853acc Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 22 Mar 2022 00:35:51 +0100 Subject: [PATCH 64/69] Added a carret to the newly randomly added tiles --- apps/game1024/app.js | 47 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 3b96b327f..337350e30 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,4 +1,4 @@ -const debugMode = 'off'; // valid values are: off, test, production, development +const debugMode = 'development'; // valid values are: off, test, production, development const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; const rows = 4, cols = 4; const borderWidth = 6; @@ -17,7 +17,7 @@ const cellChars = [ const maxUndoLevels = 4; const noExceptions = true; let charIndex = 0; // plain numbers on the grid - +const themeBg = g.theme.bg; const scores = { @@ -304,13 +304,29 @@ class Cell { this.previousExpVals=[]; this.idx = idx; this.cb = cb; + this.isRndm = false; + this.ax = x0; + this.ay = Math.floor(0.2*width+y0); + this.bx = Math.floor(0.3*width+x0); + this.by = Math.floor(0.5*width+y0); + this.cx = x0; + this.cy = Math.floor(0.8*width+y0); } getColor(i) { return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; } drawBg() { - g.setColor(this.getColor(this.expVal).bg) - .fillRect(this.x0, this.y0, this.x1, this.y1); + debug(()=>console.log("Drawbg!!")); + if (this.isRndm == true) { + debug(()=>console.log('Random: (ax)', this.ax)); + g.setColor(this.getColor(this.expVal).bg) + .fillRect(this.x0, this.y0, this.x1, this.y1) + .setColor(themeBg) + .fillPoly([this.cx,this.cy,this.bx,this.by,this.ax,this.ay]); + } else { + g.setColor(this.getColor(this.expVal).bg) + .fillRect(this.x0, this.y0, this.x1, this.y1); + } } drawNumber() { if (this.expVal !== 0) { @@ -346,6 +362,19 @@ class Cell { this.cb(this.expVal); } } + setRndmFalse() { + this.isRndm = false; + } + setRndmTrue() { + this.isRndm = true; + } + drawRndmIndicator(){ + if (this.isRndm == true) { + debug(()=>console.log('Random: (ax)', this.ax)); + g.setColor(this.getColor(0).bg) + .fillPoly(this.ax,this.ay,this.bx,this.by,this.cx,this.cy); + } + } } function undoGame() { @@ -387,11 +416,12 @@ function createGrid () { } } function messageGameOver () { - g.setColor("#1a0d00") + const c = (g.theme.dark) ? {"fg": "#FFFFFF", "bg": "#808080"} : {"fg": "#FF0000", "bg": "#000000"}; + g.setColor(c.bg) .setFont12x20(2).setFontAlign(0,0,0) .drawString("G A M E", middle.x+13, middle.y-24) .drawString("O V E R !", middle.x+13, middle.y+24); - g.setColor("#ffffff") + g.setColor(c.fg) .drawString("G A M E", middle.x+12, middle.y-25) .drawString("O V E R !", middle.x+12, middle.y+25); } @@ -417,11 +447,13 @@ function addRandomNumber() { if (emptySquaresIdxs.length > 0) { let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + allSquares[emptySquaresIdxs[randomIdx]].setRndmTrue(); } } function drawGrid() { allSquares.forEach(sq => { sq.drawBg(); + // sq.drawRndmIndicator(); sq.drawNumber(); }); } @@ -497,7 +529,7 @@ function handlePopUpClicks(btn) { function resetGame() { g.clear(); scores.reset(); - allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();sq.setRndmFalse();}); addRandomNumber(); addRandomNumber(); drawGrid(); @@ -614,6 +646,7 @@ function runGame(dir){ mover.nonEmptyCells(dir); mover.mergeEqlCells(dir); mover.nonEmptyCells(dir); + allSquares.forEach(sq => {sq.setRndmFalse();}); addRandomNumber(); drawGrid(); scores.check(); From f2faa4e0de42093913d1560caffd8206c4bc59b2 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 22 Mar 2022 01:01:14 +0100 Subject: [PATCH 65/69] Updated the description for the chevron add-on, and added new images --- apps/game1024/ChangeLog | 3 ++- apps/game1024/README.md | 2 ++ apps/game1024/app.js | 2 +- apps/game1024/game1024_sc_dump_dark.png | Bin 4146 -> 4404 bytes apps/game1024/game1024_sc_dump_light.png | Bin 3806 -> 4054 bytes apps/game1024/metadata.json | 2 +- apps/game1024/screenshot.png | Bin 5313 -> 6263 bytes apps/game1024/scrnshot_dn_300.jpg | Bin 56911 -> 0 bytes apps/game1024/scrnshot_lc_300.jpg | Bin 55178 -> 0 bytes 9 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 apps/game1024/scrnshot_dn_300.jpg delete mode 100644 apps/game1024/scrnshot_lc_300.jpg diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog index af0925b0f..ffb1f94bc 100644 --- a/apps/game1024/ChangeLog +++ b/apps/game1024/ChangeLog @@ -1,4 +1,5 @@ 0.01: Initial version 0.02: Temporary intermediate version 0.03: Basic colors -0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file +0.04: Bug fix score reset after Game Over, new icon +0.05: Chevron marker on the randomly added square \ No newline at end of file diff --git a/apps/game1024/README.md b/apps/game1024/README.md index 474e8c97e..500453145 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -11,6 +11,8 @@ When two tiles with the same number are squashed together they will add up as ex **3 + 3 = 4** or **C + C = D** which is a representation of **2^3 + 2^3 = 2^4 = 16** +After each move a new tile will be added on a random empty square. The value can be 1 or 2, and will be marked with a chevron. + So you can continue till you reach **1024** which equals **2^(10)**. So when you reach tile **10** you have won. The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 337350e30..9f6081376 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,4 +1,4 @@ -const debugMode = 'development'; // valid values are: off, test, production, development +const debugMode = 'off'; // valid values are: off, test, production, development const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; const rows = 4, cols = 4; const borderWidth = 6; diff --git a/apps/game1024/game1024_sc_dump_dark.png b/apps/game1024/game1024_sc_dump_dark.png index 15ecb87d9e7e0180b7443b717e0aeb5409563fa0..87577ecfa39c5f663d4c883425a8d4625168631d 100644 GIT binary patch delta 4397 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 delta 4137 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 CG8;Gm diff --git a/apps/game1024/scrnshot_dn_300.jpg b/apps/game1024/scrnshot_dn_300.jpg deleted file mode 100644 index 2f4cc4bdae9e3b315db280c378f2ca4dd10d5e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56911 zcmeFZcUTn7@-RAxh-46u%pySqBxeLxM9Db_5*A?zl5-BLf}ltc5m3^K2uNIzoO2M6 z468)RNsuMEz_Q%I_kGVf&;5Si_uPB`y{BQAn(pfAuA1(y>KeMvzMcI5s5Mm7RR97o z-6XgP0B7^J^zH>X+5>>PIzMn30Kn@C0Uv4z)iHZn` z$$(Tu#Kh!8#O1_9IK;%|L`1<~;35FLB0m2MfQ2Fi@BiJ$3-AA;%>fn?{tZLU5y3