From ddb503ec9230f23f2a6f8dbf0ba264c3c3ba80b1 Mon Sep 17 00:00:00 2001 From: Felipe Manga Date: Sat, 13 Jan 2024 16:30:28 +0000 Subject: [PATCH] Add PokeWalk watch face --- apps/pokewalk/README.md | 8 +++ apps/pokewalk/app-icon.js | 1 + apps/pokewalk/app.js | 104 +++++++++++++++++++++++++++++++++++ apps/pokewalk/app.png | Bin 0 -> 1342 bytes apps/pokewalk/metadata.json | 17 ++++++ apps/pokewalk/screenshot.png | Bin 0 -> 4217 bytes 6 files changed, 130 insertions(+) create mode 100644 apps/pokewalk/README.md create mode 100644 apps/pokewalk/app-icon.js create mode 100644 apps/pokewalk/app.js create mode 100644 apps/pokewalk/app.png create mode 100644 apps/pokewalk/metadata.json create mode 100644 apps/pokewalk/screenshot.png diff --git a/apps/pokewalk/README.md b/apps/pokewalk/README.md new file mode 100644 index 000000000..f2b77d67f --- /dev/null +++ b/apps/pokewalk/README.md @@ -0,0 +1,8 @@ +# PokeWalk + +A very simple watchface featuring a Pokemon trainer on a walk. + +![](screenshot.png) + +Relive your childhood using this simple watchface based on a Gameboy Classic version of Pokemon. +Widgets not supported diff --git a/apps/pokewalk/app-icon.js b/apps/pokewalk/app-icon.js new file mode 100644 index 000000000..d5ee64a73 --- /dev/null +++ b/apps/pokewalk/app-icon.js @@ -0,0 +1 @@ +atob("MDDD/9Bs3P9iCNDyE6YIKc3BmGrZttt/mEgL85vfZZtttiC5tt7Ztts28gBKg9sLW1uytiBtttu50VvCqpttALobW8Xm24LNttu3Am0Cy7Mlviok66SCAWrN71u200kgLZtktrNkG4SQkgK20m0EykkD49tvl1tmSLAAQCoE0ikQkkkJb5tuxXOEEZcDgaoEm8lCEkC+6ttt2gSSQZKgXbagkmBIAAUTbbN17jgAfa1arAHocAfIQlCfbbWy0BAXbKLPegkJL5Xww2SC7bWQUC0epULbeiEJMtviEk8RW7Ya0KrbbbZakAQNkvngkHPeK3bbW3bNttt5IAC1t8keGFvXwW6pLbNttklvZAVtOI8ASJveH+0BbNtttttlvWvO2E9AAB++Qwyq5tttttttva7Z1cHUD1XCA0kWttttttttt7LN0ny5NklAAClVtttttttttvZZACjpts4pt0K1tttttttttvbCAAAa5tkvNPq5tttttttttt7KAAdZttt63matttttJJtttt7VVBRXNtvbLxW5tttJJJNttt7ZN0G77Nuq/5W5tttIwlJttt7ZZ7yv7W2RZtXbNtpQkhJtttvZQMSq20mCrO3apJJEkmJJLN7ZDvXAQkkKSdJJJJJEk/pJJJJJDbj0AkgZkhJJLwpIgFI1JJJJD7KSgAdPAxSEkklJEpIkkkyVCVMm239QEdAEkkmpJJEkkkyDjrMm+6BUcFAQkkklJIkkkkwACrZAfbC7i40CEkkkkkkkkmQXPLbNe21bXUoAEkkkkkkkkmAJukrJttvbbT1AAkkkkkkkkwANEklYkklu7gJAAEkkkkkkmABQcEmkkkky6+DIAAEkkkkkwAIW30Gkm2kkfbW1AACEkkkyADoK21EC2G3kfptvIAAASSQAABAEkqwE2mkkes7bZUAAAAAABIAEkmLgm0kgVtt7bK0AAAAcKCcEkknaEknZZttt25JfgDiriT2o38lbYnba3Ntt7ZZJJJLrg0dK0m33bbbJY3Wt7Vbr/3bXgnrN028C7bZRbREqqhZsiD23efbN0CVbXWoK3Z00wBN5kltbbZbNvfZk58wE25yEgDZtkl55Lj7NtvZts83gi18AALNt3NzLWAK5tvVtkgGAAX/8VJVuw1vZ6gW37b1umk0L6X23oUVWk1uDbwVLgX8=") diff --git a/apps/pokewalk/app.js b/apps/pokewalk/app.js new file mode 100644 index 000000000..fdad9e6e0 --- /dev/null +++ b/apps/pokewalk/app.js @@ -0,0 +1,104 @@ +const sprites = [ + atob("EBWDASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQACSSSSSP5ASSSSR/JICSSSJJJJASSSJIBJASSSBB+IASSSOB+BwSSSR+B+CSSSSP/wSSSSSQACSSQ=="), + atob("EBWDASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSASSSSSSSIASSSSSRJIASSQCRJJIASICNJJAABIBthAABJARgAAJIACSBJAJJACSSJJBIACSSQJIAASSSSQAASSSSSSQSSSQ=="), + atob("EBWDASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSAACSSSSRthgSSSSNsNgSSSRttsMCSSRtttsCSSNtddsCSRtsNdsCSRLJbJASSSLJJACSSSSALZASSSSAKJASSSRIBIACSSQIKBRQSSSARaACSSSSSACSQ=="), + atob("EBWDASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSACSSSSSBhgCSSSRthtgSSSNthtgSSSNtttsCSBNtttsCRJNv9tsCRJJh9tgCRJJNtgMCSJJAANhgSQAMNthgSSSNhsNgCSSRsBsMCSSSAAAASSSSSASSQ=="), + atob("EBWDAkkAAAAAkkh////+Ekh////+Ekh////+Ekg22222EkgwAAAGEgAxyAAGABwwAAAGOBwwAAAGGBwwAAAGGBw22222GBwSSQACGBw22222GBwSSSSSGB+AAAAA+B//////+ASAAAAASABzzzz+AEgySSSeEkhzz/+eEkg22222Eg=="), + atob("EBWDASSSQACSSSSQLRQCSSALaLbQARbRbRaLaBbRbbaLaBaBbbaBaCBRbbaKASOL7/fRwSQP///wCSR/x+P+CSSPx+PwSSSQP/wCSSSBAAIASSR+J/B+CSR+JJB+CSSJJJJASSSQJJACSSSR+B+CSSSSASASSSSSSSSSSSSSSSSSSQ==") +]; + +const tiles = [ + atob("EBCDAVlllllllssMMssMMkFlkEFlkMsssssssllllllllssssssssllllllllssssssssllllllllssMMssMMkFlkEFlkMsssssssllllllllssssssssllllllllssssssssg=="), + atob("EBCDAVlllllllssMMssMMkFlkEFlkMsssssssllllllllssssssssllllllllssssssssllllrrpLssMMtdLZUFlkLpZLMssstJZLFlllpZLZsssspZJNVlllrLZrsssstZNdQ=="), + atob("EBCDAFkkllkklkkskkkskkkkkkkkkskkkskkkkkklkkklkkkkkkkklkkklkkkkkkkkkkklkkllkklkkskkkskkkkkkkkkskkkskkkkkklkkklkkkkkkkklkkklkkkkkkkkkkkg=="), + atob("EBCDAdtttttttsNsNsNsNhhhhhhhhgkEhgkEhsEghsEghkEggkEggkggEkggEskAlskAlttttttttsNsNsNsNhhhhhhhhgkEhgkEhsEghsEghkEggkEggkggEkggEskAlskAlg==") +]; + +const walk = [ +atob("EBWDASSSSSSSSSSAAAASSSRJJJICSSRJJJJASSJJJJJwCSJJJJJxASJJJJJxASBJJJAJASABJIJICSAAAAAASSQMNsNgSSSMNtsCSSRBttgSSSNmAACSSSGAG2ASSSA2GxsCSSGAAxsCSSQw2AASSSQAwACSSSRsCSSSSSSASSSSSQ=="), + atob("EBWDASSAAAASSSRJJJICSSRJJJJASSJJJJJwCSJJJJJxASJJJJJxASBJJJAJASABJIJICSAAAAAASSQMNsNgSSSMNtsCSSRBttgSSSJIAACSSSMAGwwSSSA2GwwSSSGAGwwSSSQwNgCSSSSAwGCSSSSSG2CSSSSSBsCSSSSSQASSSQ=="), + atob("EBWDASSSSSSSSSSAAAASSSRJJJICSSRJJJJASSJJJJJwCSJJJJJxASJJJJJxASBJJJAJASABJIJICSAAAAAASSQMNsNgSSSMNtsCSSRBttgSSSNmAACSSSGwGGwSSSANg2wSSSGNgGASSSQwAwGCSSSAAG2CSSSSSNgCSSSSSQASSQ=="), + 0 +]; +walk[3] = walk[1]; + +const scale = 2; +const mapWidth = Math.ceil(176 / (16 * scale)); +const mapHeight = 4; +const map = new Uint8Array(mapWidth * mapHeight); +const Y = 176 - mapHeight/2*16*scale - 16*scale/2; +let frame = 0; + +function init() { + g.clear(); + g.setFont('6x8', 4); + g.setFontAlign(0, 0.5); + for (let i = 0; i < mapWidth; ++i) + shiftMap(); +} + +function tick(full){ + frame++; + + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(); + var time = (" "+h).substr(-2) + ":" + m.toString().padStart(2,0); + + g.setColor(g.theme.fg); + g.drawString(time, 176/2, (176 - mapHeight * 16 * scale) / 2, true); + + if (full) { + let py = (176 - mapHeight * 16 * scale); + g.setColor(g.theme.bg); + g.fillRect(0, py - 5 * scale, 176, py); + if (!(frame & 3)) + shiftMap(); + drawMap(); + g.drawImage(walk[frame & 3], 16 * scale, Y, {scale:2}); + } +} + +function shiftMap() { + for (let y = 0; y < mapHeight; ++y) { + const i = y * mapWidth; + for (let x = 0; x < mapWidth - 1; ++x) { + map[i + x] = map[i + x + 1]; + } + const t = Math.random() * tiles.length | 0; + const s = Math.random() < 0.95 ? 0 : 1 + Math.random() * sprites.length | 0; + map[i + mapWidth - 1] = t | (s << 4); + } +} + +function drawMap(){ + let py = (176 - mapHeight * 16 * scale); + for (let y = 0; y < mapHeight; ++y, py += 16 * scale) { + const i = y * mapWidth; + for (let x = 0; x < mapWidth; ++x) { + let M = map[i + x]; + let t = M & 0xF; + g.drawImage(tiles[t], x * 16 * scale, py, {scale:2}); + } + } + py = (176 - mapHeight * 16 * scale) - 5 * scale; + for (let y = 0; y < mapHeight; ++y, py += 16 * scale) { + const i = y * mapWidth; + for (let x = 0; x < mapWidth; ++x) { + let M = map[i + x]; + let s = M >> 4; + if (s) + g.drawImage(sprites[s - 1], x * 16 * scale, py, {scale:2}); + } + } +} + + +init(); +tick(true); + +var interval = setInterval(tick, 700); +Bangle.on("lock", (locked) => { + clearInterval(interval); + tick(); + interval = setInterval(tick.bind(null, !locked), locked ? 60 * 1000 : 700); +}); diff --git a/apps/pokewalk/app.png b/apps/pokewalk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..4836605bd70ddbf5f34b1cc99678b36f1edb3eda GIT binary patch literal 1342 zcmV-E1;P4>P)_u0*WeVMDdB<;=|jaKE7&m6}=k%A!n6+jhO^MikN{%&zR6xup9O zjF^*-!F(%xRoRa5dcls4(GyE+4e2N|A(7-Z0c^v@7|5p9>v|pI$|U>VwX@tn^d6NV z4u@lc`^MAWWq1VjadF=F0b3GO6(I^~?|di^(l%msRGT~npfobs8zQKX-|DIfj{E55 zqtimDnsY6yE@OC&1ps=ccAg>@h~D6rBC4{sRBJ^D&hms;)u*1wS(r}MfxbQ1b4m!& zJ6=2h=zU{2g%^`rsi8a74TXklPh|8o9I!=v1|o55Hvnw>l>%*TFRe4Q;!zNs*)KS&lq%jqATVwqJ;S&lj=+`4|Bjai#4GZJLp8JE%-~ z{0i|#2+i{a^Fwe$4*Z8Q(5We?Z_rFC04X?l$B`mG2x%O9%9I}}>8%tX0yK*NB2l|1 zHK;D>ZD_^QTPol78U3Bn5dn=#AxH&RP{jN?m^06={+Lh1TJ=nLZ}&h7&zu8r;2_s8 zKn#%&A^-_IgjTjEfukJqf?1Ga*-x4Lga8110^>MT%^?j?KXW-JIk19~qs_MxH9!ZR zlZ9$S=AbVq?)0-JhktL7ia5@}ROeifZK))L(ncWg1zzm~xLrWq)=X!AGv-sn$FWu* zU{CLl4J1?iW$YSi@CPMz4f6J7!OQFT0HAXSdIG#iyCKKmqUv{u@!Nj1DI&svrkG%Y z$yyz{AN&jPYlY+`S2}A1fo!-y?Obh=_HO{N?%FuQ3T>0dp?PUg#@`T;P+lhk0k6HU zT#%G51^&ezWcAo5{_L_qrka*!|7VY}VKLDr05t@0{6rnh3-KwvwRudKRc1_4q;VS@ z_Z5f$rM=!Uz6bJLv|meJ_|KL{E%-9A-@4=4>>~eIA5Jm{(kyZ?VZ7D)04AOfS2^bF+EJIpcc? z8%l=(6~h!-ddQzA?g)-??GfH^0|!0%#5M#-r?j9n$F+cAb6^rZXmfpIuqt&ptE}6F(cYr&MmHG6k7#T41lY~{QxDT^d25D z6<)*90qBRz_N>Ow@=N-<8k)xua*ZF1vlx@(*0(|&m1>Bs#AC@o2PEYf@DKoQO*}lr zIP2(_DLtt%`fX?g$CFBQG4Hsnahrt`zi&AF4?&l9Eh^xynE(I)07*qoM6N<$g2?5G Aj{pDw literal 0 HcmV?d00001 diff --git a/apps/pokewalk/metadata.json b/apps/pokewalk/metadata.json new file mode 100644 index 000000000..3f97e2fe6 --- /dev/null +++ b/apps/pokewalk/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "pokewalk", + "name": "pokewalk clock", + "version": "0.01", + "description": "A very simple watchface featuring a Pokemon trainer on a walk.", + "readme": "README.md", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"pokewalk.app.js","url":"app.js"}, + {"name":"pokewalk.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/pokewalk/screenshot.png b/apps/pokewalk/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc9d65102ff1c1165bebb87c64e96cb73c7246b GIT binary patch literal 4217 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 literal 0 HcmV?d00001