From fa70e5354c6df1485b546900123022c2a5a930a4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 4 Dec 2022 16:42:24 +0100 Subject: [PATCH] aiclock -- support clkinfo module and updated icons of some clkinfos... --- apps/aiclock/ChangeLog | 1 + apps/aiclock/README.md | 4 +- apps/aiclock/aiclock.app.js | 285 +++++++++++++++++++++++++++++++----- apps/aiclock/impl.png | Bin 2743 -> 2597 bytes apps/aiclock/impl_2.png | Bin 0 -> 2459 bytes apps/aiclock/impl_3.png | Bin 0 -> 2487 bytes apps/aiclock/metadata.json | 6 +- apps/ha/ChangeLog | 3 +- apps/ha/ha.clkinfo.js | 2 +- apps/ha/metadata.json | 2 +- apps/smpltmr/ChangeLog | 3 +- apps/smpltmr/clkinfo.js | 3 +- apps/smpltmr/metadata.json | 2 +- apps/weather/ChangeLog | 1 + apps/weather/clkinfo.js | 2 +- apps/weather/metadata.json | 2 +- core | 2 +- modules/clock_info.js | 2 +- 18 files changed, 270 insertions(+), 50 deletions(-) create mode 100644 apps/aiclock/impl_2.png create mode 100644 apps/aiclock/impl_3.png diff --git a/apps/aiclock/ChangeLog b/apps/aiclock/ChangeLog index 96b389f6e..fb5aed3e3 100644 --- a/apps/aiclock/ChangeLog +++ b/apps/aiclock/ChangeLog @@ -2,3 +2,4 @@ 0.02: Design improvements and fixes. 0.03: Indicate battery level through line occurrence. 0.04: Use widget_utils module. +0.05: Support for clkinfo. \ No newline at end of file diff --git a/apps/aiclock/README.md b/apps/aiclock/README.md index 9e23de3a6..31dd5aa29 100644 --- a/apps/aiclock/README.md +++ b/apps/aiclock/README.md @@ -10,7 +10,9 @@ The original output of stable diffusion is shown here: My implementation is shown below. Note that horizontal lines occur randomly, but the probability is correlated with the battery level. So if your screen contains only -a few lines its time to charge your bangle again ;) +a few lines its time to charge your bangle again ;) Also note that the upper text +implementes the clkinfo module and can be configured via touch left/right/up/down. +Touch at the center to trigger the selected action. ![](impl.png) diff --git a/apps/aiclock/aiclock.app.js b/apps/aiclock/aiclock.app.js index 5d4e98fcd..b5bb30b9d 100644 --- a/apps/aiclock/aiclock.app.js +++ b/apps/aiclock/aiclock.app.js @@ -1,6 +1,14 @@ -/** +/************************************************ * AI Clock */ + const storage = require('Storage'); + const clock_info = require("clock_info"); + + + + /************************************************ + * Assets + */ require("Font7x11Numeric7Seg").add(Graphics); Graphics.prototype.setFontGochiHand = function(scale) { // Actual height 27 (29 - 3) @@ -13,7 +21,7 @@ Graphics.prototype.setFontGochiHand = function(scale) { return this; } -/* +/************************************************ * Set some important constants such as width, height and center */ var W = g.getWidth(),R=W/2; @@ -21,6 +29,120 @@ var H = g.getHeight(); var cx = W/2; var cy = H/2; var drawTimeout; +var lock_input = false; + + +/************************************************ + * SETTINGS + */ +const SETTINGS_FILE = "aiclock.setting.json"; +let settings = { + menuPosX: 0, + menuPosY: 0, +}; +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} + + +/************************************************ + * Menu + */ +function getDate(){ + var date = new Date(); + return ("0"+date.getDate()).substr(-2) + "/" + ("0"+(date.getMonth()+1)).substr(-2) +} + + +// Custom clockItems menu - therefore, its added here and not in a clkinfo.js file. +var clockItems = { + name: getDate(), + img: null, + items: [ + { name: "Week", + get: () => ({ text: "Week " + weekOfYear(), img: null}), + show: function() { clockItems.items[0].emit("redraw"); }, + hide: function () {} + }, + ] + }; + +function weekOfYear() { + var date = new Date(); + date.setHours(0, 0, 0, 0); + // Thursday in current week decides the year. + date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); + // January 4 is always in week 1. + var week1 = new Date(date.getFullYear(), 0, 4); + // Adjust to Thursday in week 1 and count number of weeks from date to week1. + return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 + - 3 + (week1.getDay() + 6) % 7) / 7); +} + + + +// Load menu +var menu = clock_info.load(); +menu = menu.concat(clockItems); + + + // Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it. + if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){ + settings.menuPosX = 0; + settings.menuPosY = 0; + } + + // Set draw functions for each item + menu.forEach((menuItm, x) => { + menuItm.items.forEach((item, y) => { + function drawItem() { + // For the clock, we have a special case, as we don't wanna redraw + // immediately when something changes. Instead, we update data each minute + // to save some battery etc. Therefore, we hide (and disable the listener) + // immedeately after redraw... + item.hide(); + + // After drawing the item, we enable inputs again... + lock_input = false; + + var info = item.get(); + drawMenuItem(info.text, info.img); + } + + item.on('redraw', drawItem); + }) + }); + + + function canRunMenuItem(){ + if(settings.menuPosY == 0){ + return false; + } + + var menuEntry = menu[settings.menuPosX]; + var item = menuEntry.items[settings.menuPosY-1]; + return item.run !== undefined; + } + + + function runMenuItem(){ + if(settings.menuPosY == 0){ + return; + } + + var menuEntry = menu[settings.menuPosX]; + var item = menuEntry.items[settings.menuPosY-1]; + try{ + var ret = item.run(); + if(ret){ + Bangle.buzz(300, 0.6); + } + } catch (ex) { + // Simply ignore it... + } + } + /* * Based on the great multi clock from https://github.com/jeffmer/BangleApps/ @@ -76,7 +198,50 @@ function toAngle(a){ return a } + +function drawMenuItem(text, image){ + if(text == null){ + drawTime(); + return + } + // image = atob("GBiBAAD+AAH+AAH+AAH+AAH/AAOHAAYBgAwAwBgwYBgwYBgwIBAwOBAwOBgYIBgMYBgAYAwAwAYBgAOHAAH/AAH+AAH+AAH+AAD+AA=="); + + text = String(text); + + g.reset().setBgColor("#fff").setColor("#000"); + g.setFontAlign(0,0); + g.setFont("Vector", 20); + + var imgWidth = image == null ? 0 : 24; + var strWidth = g.stringWidth(text); + var strHeight = text.split('\n').length > 1 ? 40 : Math.max(24, imgWidth+2); + var w = imgWidth + strWidth; + + g.clearRect(cx-w/2-8, 40-strHeight/2-1, cx+w/2+4, 40+strHeight/2) + + // Draw right line as designed by stable diffusion + g.drawLine(cx+w/2+5, 40-strHeight/2-1, cx+w/2+5, 40+strHeight/2); + g.drawLine(cx+w/2+6, 40-strHeight/2-1, cx+w/2+6, 40+strHeight/2); + g.drawLine(cx+w/2+7, 40-strHeight/2-1, cx+w/2+7, 40+strHeight/2); + + // And finally the text + g.drawString(text, cx+imgWidth/2, 42); + g.drawString(text, cx+1+imgWidth/2, 41); + + if(image != null) { + var scale = image.width ? imgWidth / image.width : 1; + g.drawImage(image, W/2 + -strWidth/2-4 - parseInt(imgWidth/2), 41-12, {scale: scale}); + } + + drawTime(); +} + + function drawTime(){ + // Draw digital time first + drawDigits(); + + // And now the analog time var drawHourHand = g.drawRotRect.bind(g,8,12,R-38); var drawMinuteHand = g.drawRotRect.bind(g,6,12,R-12 ); @@ -90,13 +255,6 @@ function drawTime(){ h += date.getMinutes()/60.0; h = parseInt(h*360/12); - // Draw minute and hour bg - g.setColor(g.theme.bg); - drawHourHand(toAngle(h-3)); - drawHourHand(toAngle(h+3)); - drawMinuteHand(toAngle(m-2)); - drawMinuteHand(toAngle(m+3)); - // Draw minute and hour fg g.setColor(g.theme.fg); drawHourHand(h); @@ -104,28 +262,6 @@ function drawTime(){ } - -function drawDate(){ - var date = new Date(); - g.setFontAlign(0,0); - g.setFontGochiHand(); - - var text = ("0"+date.getDate()).substr(-2) + "/" + ("0"+(date.getMonth()+1)).substr(-2); - var w = g.stringWidth(text); - g.setColor(g.theme.bg); - g.fillRect(cx-w/2-4, 20, cx+w/2+4, 40+12); - - g.setColor(g.theme.fg); - // Draw right line as designed by stable diffusion - g.drawLine(cx+w/2+5, 20, cx+w/2+5, 40+12); - g.drawLine(cx+w/2+6, 20, cx+w/2+6, 40+12); - g.drawLine(cx+w/2+7, 20, cx+w/2+7, 40+12); - - // And finally the text - g.drawString(text, cx, 40); -} - - function drawDigits(){ var date = new Date(); @@ -156,20 +292,35 @@ function drawDigits(){ } +function drawDate(){ + var menuEntry = menu[settings.menuPosX]; + + // The first entry is the overview... + if(settings.menuPosY == 0){ + drawMenuItem(menuEntry.name, menuEntry.img); + return; + } + + // Draw item if needed + lock_input = true; + var item = menuEntry.items[settings.menuPosY-1]; + item.show(); +} + + + + function draw(){ // Queue draw in one minute queueDraw(); - g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); - g.setColor(1,1,1); + drawBackground(); drawDate(); - drawDigits(); - drawTime(); drawCircle(Bangle.isLocked()); } @@ -190,6 +341,68 @@ Bangle.on('lock', function(isLocked) { drawCircle(isLocked); }); +Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.22); + var right = g.getWidth() - left; + var upper = parseInt(g.getHeight() * 0.22); + var lower = g.getHeight() - upper; + + var is_upper = e.y < upper; + var is_lower = e.y > lower; + var is_left = e.x < left && !is_upper && !is_lower; + var is_right = e.x > right && !is_upper && !is_lower; + var is_center = !is_upper && !is_lower && !is_left && !is_right; + + if(lock_input){ + return; + } + + if(is_lower){ + Bangle.buzz(40, 0.6); + settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1); + + draw(); + } + + if(is_upper){ + Bangle.buzz(40, 0.6); + settings.menuPosY = settings.menuPosY-1; + settings.menuPosY = settings.menuPosY < 0 ? menu[settings.menuPosX].items.length : settings.menuPosY; + + draw(); + } + + if(is_right){ + Bangle.buzz(40, 0.6); + settings.menuPosX = (settings.menuPosX+1) % menu.length; + settings.menuPosY = 0; + draw(); + } + + if(is_left){ + Bangle.buzz(40, 0.6); + settings.menuPosY = 0; + settings.menuPosX = settings.menuPosX-1; + settings.menuPosX = settings.menuPosX < 0 ? menu.length-1 : settings.menuPosX; + draw(); + } + + if(is_center){ + if(canRunMenuItem()){ + runMenuItem(); + } + } +}); + + +E.on("kill", function(){ + try{ + storage.write(SETTINGS_FILE, settings); + } catch(ex){ + // If this fails, we still kill the app... + } +}); + /* * Some helpers @@ -203,7 +416,6 @@ function queueDraw() { } - /* * Lets start widgets, listen for btn etc. */ @@ -216,6 +428,7 @@ Bangle.loadWidgets(); * area to the top bar doesn't get cleared. */ require('widget_utils').hide(); + // Clear the screen once, at startup and draw clock g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); draw(); diff --git a/apps/aiclock/impl.png b/apps/aiclock/impl.png index 92374b68059bb87f00feb41525d8b6dcb9d91c87..8a9e43e2deabf9a80b9cc59b763db5bf3bf15a47 100644 GIT binary patch delta 2576 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 delta 2723 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 literal 0 HcmV?d00001 diff --git a/apps/aiclock/impl_3.png b/apps/aiclock/impl_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a036d14b24b0ac1cc982f108f92039254b97f9 GIT binary patch literal 2487 zcmai0X*AUP8~@IX8QG9x(IOhMg~=AlGJ`BB{O6u?-`yAg=bUGG^Ld_go;}gh!dOgrzc2tm%+$olny;Dv z@GcZzR@6?p@D(h?+Sm}3cgfEJAQWV3WMD&fS)j9ni_VA|-P_suGLkbwSAFyR$uIW} zs=8Tz{)z`mejG~v{T?@;Pa4|~^sSIASlyG5qODQ@5QbNgpzi7Q!xGSOOGg;M_#b?Y zI4+ug1yIa}jhBHaqF8!kdvkN*{DrF`>lO->^|hAhRp7*FZ5APlHP!BXE)^VGmRWQL zfV&X${VS}lDLzUTKv6$jS&;w}FwQ{&9%nnVLV@y@P)CA+|3bdY6#NInL~&m2aJhCZ zn>*dAXa5qS!0MjDfzwC4>vAYD-(|MI?$mqbi^P;IcUW^Gh(|CNPbv>1;&7vE>K3Z~p^l6Q~p_5!pN4Rwqt2*S#aTZsKvvIN` zQ-GXt&@UKS;JK}qpy$kaGrMc-*x7(4WZ*N4;kTr0?I4*r4rYGgit>u<^C@S%6Jt(K z)<7D9ZA>w2JUR-HoCZ)fsX+NqPZJ<#eoA{7Zqj{XY}b(Q$P$KV5Qc0bk=o7-;4Wdi zLY8#VjW5rQn0ZK>W4lgt#hzcdl~>H}v@d0;b-?PrtGoL=t`QX=nms(-Q46aZh>xn> zIvK$bAHW>t?BrFZ^j{YyMgQ*QY!mX==DZpK=4Xm4{ZS*Egba*odRIsqCsV(*6Cyoz zSieAe`gkE;#&=NWx_{WOkgk`QKRR)CRgyH{lO`@d`{?Vj zK7c#bc)$&WXDw;$rOC&F@A(dl)? z$W!RF3pYwFxqDB}1k)*2agcLpbetPEEm7AK1DC2~DMy56b5Rs}>}o5FeD|-e ztM-T} z$TLItve--1^h`7yg84GG2(0*B3H#;Ykk$CL4U4Q%!4^3%KQK><>x)?utsG6IG=92{+}CvX?{u`+MpD8Uk1jYqKvb$|1K%^FQZGePf*fFE zrxy?9C}b0s22kh?AfGZz)D#+u-`9JGEy3>!i38AV$6hd|xwUVL$@g|pYm6M(|Ki3; zFjz6fP#(EMz zk5)em&i?uMdN552_+7rM3s3lgVpH$E_+fFUxUJp_I0=l|<>>z$Py;S}OAfcKAr3GC zfsZiJO$T%%#zCMarCMJULOy?eH~5xw;wjKVvye-USk_8^cq2gk(m6l+C&Hyu_;-Q} zGLXh|7fnt}MOl3hi3#Df zgK3kV3KNT84)5Nh3j2w2TcejY6GloBkzsNahT+Fa_1q4^-=uPvpMH}{vgy`IN4oQ_ z*=MQk_+MYjO6$l*fV%VA{RZ zk1oEggUq4`j4I|OT^Q2H3sN+mGiyPm;)}U(W)GFYs5(XlI+0h!Qlt0_dQoe6f@qm~ z_C+5?6uSAwZVt*v>GV+V;BYiO;CD2%H|PvgrK~Tp7m>SVdjh?&zb#FCWKkuTZVIz+ zv{_8NxTAX7Q44Kv*VQ<01r2oLWwI5BXL!x%K}U(lT&R?l__m*FE15TPS#PfFBInX{ zC!ROOr8aA~apE6!ooql|>n@xQNk$O+)Qv|jqX*L_0-gvblQ@4g5~sop4qf*X_UcKU31U&$<_ioG|f#2dMKr6#(3>Jb9>`?pYzyRp@8 zmc1n?9=hR~Sw0S18Ev{F=`DRccw~5KQA?G8|N1hf7LyrK){vqF*K+qq_NXaVwOp(z zK0G1BKdVWN!R9+Ei{-7^By$*l^zX2L<&{GH5<$l;U16Y{JKir1c>QYw8VZ!TsJbvD zXnMA_nj|>3sc_911_JzJwkBY8tlI=T01<{=Tgd+h@;oMQ+ka;FxJo$x69cB_EsV+y HiLw6!gEO)t literal 0 HcmV?d00001 diff --git a/apps/aiclock/metadata.json b/apps/aiclock/metadata.json index 0da23e8ca..1c3c68609 100644 --- a/apps/aiclock/metadata.json +++ b/apps/aiclock/metadata.json @@ -3,7 +3,7 @@ "name": "AI Clock", "shortName":"AI Clock", "icon": "aiclock.png", - "version":"0.04", + "version":"0.05", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "A watch face that was designed by an AI (stable diffusion) and implemented by a human.", @@ -11,7 +11,9 @@ "tags": "clock", "screenshots": [ {"url":"orig.png"}, - {"url":"impl.png"} + {"url":"impl.png"}, + {"url":"impl_2.png"}, + {"url":"impl_3.png"}, ], "storage": [ {"name":"aiclock.app.js","url":"aiclock.app.js"}, diff --git a/apps/ha/ChangeLog b/apps/ha/ChangeLog index a4865be3f..f9ca3c16d 100644 --- a/apps/ha/ChangeLog +++ b/apps/ha/ChangeLog @@ -2,4 +2,5 @@ 0.02: Includeas the ha.lib.js library that can be used by other apps or clocks. 0.03: Added clkinfo for clocks. 0.04: Feedback if clkinfo run is called. -0.05: Clkinfo improvements. \ No newline at end of file +0.05: Clkinfo improvements. +0.06: Updated clkinfo icon. \ No newline at end of file diff --git a/apps/ha/ha.clkinfo.js b/apps/ha/ha.clkinfo.js index 1b1e468d7..d6a0f72a0 100644 --- a/apps/ha/ha.clkinfo.js +++ b/apps/ha/ha.clkinfo.js @@ -4,7 +4,7 @@ var haItems = { name: "Home", - img: atob("GBiBAf/////////n///D//+B//8A//48T/wkD/gkD/A8D+AYB8AYA4eZ4QyZMOyZN+fb5+D/B+B+B+A8B+AYB+AYB+AYB+AYB+A8Bw=="), + img: atob("GBiBAAAAAAAAAAAAAAAYAAA+AAB+AADD4AHb4APD4Afn8A/n+BxmOD0mnA0ksAwAMA+B8A/D8A/n8A/n8A/n8A/n8AAAAAAAAAAAAA=="), items: [] }; diff --git a/apps/ha/metadata.json b/apps/ha/metadata.json index fad052544..089450f55 100644 --- a/apps/ha/metadata.json +++ b/apps/ha/metadata.json @@ -1,7 +1,7 @@ { "id": "ha", "name": "HomeAssistant", - "version": "0.05", + "version": "0.06", "description": "Integrates your BangleJS into HomeAssistant.", "icon": "ha.png", "type": "app", diff --git a/apps/smpltmr/ChangeLog b/apps/smpltmr/ChangeLog index b09100f50..805e8546f 100644 --- a/apps/smpltmr/ChangeLog +++ b/apps/smpltmr/ChangeLog @@ -1,4 +1,5 @@ 0.01: Release 0.02: Rewrite with new interface 0.03: Added clock infos to expose timer functionality to clocks. -0.04: Improvements of clock infos. \ No newline at end of file +0.04: Improvements of clock infos. +0.05: Updated clkinfo icon. \ No newline at end of file diff --git a/apps/smpltmr/clkinfo.js b/apps/smpltmr/clkinfo.js index 1a63a9b7e..c16e6127e 100644 --- a/apps/smpltmr/clkinfo.js +++ b/apps/smpltmr/clkinfo.js @@ -63,10 +63,9 @@ } catch(ex){ } } - var img = atob("GBiBAeAAB+AAB/v/3/v/3/v/3/v/3/v/n/n/H/z+P/48//85//+b//+b//8p//4E//yCP/kBH/oAn/oAX/oAX/oAX/oAX+AAB+AABw==") var smpltmrItems = { name: "Timer", - img: img, + img: atob("GBiBAAB+AAB+AAAYAAAYAAB+AA3/sA+B8A4AcAwMMBgPGBgPmDAPjDAPzDAPzDP/zDP/zDH/jBn/mBj/GAw8MA4AcAeB4AH/gAB+AA=="), items: [ { name: null, diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index ce526d1ba..2191902de 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -2,7 +2,7 @@ "id": "smpltmr", "name": "Simple Timer", "shortName": "Simple Timer", - "version": "0.04", + "version": "0.05", "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool,alarm,timer,clkinfo", diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index aefb903b9..1b6c1b9b5 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -17,3 +17,4 @@ 0.18: Added hasRange to clkinfo. 0.19: Added weather condition to clkinfo. 0.20: Added weather condition with temperature to clkinfo. +0.21: Updated clkinfo icon. \ No newline at end of file diff --git a/apps/weather/clkinfo.js b/apps/weather/clkinfo.js index 339ff39c3..3cdd31c59 100644 --- a/apps/weather/clkinfo.js +++ b/apps/weather/clkinfo.js @@ -28,7 +28,7 @@ //FIXME ranges are somehow arbitrary var weatherItems = { name: "Weather", - img: atob("GBiBAf+///u5//n7//8f/9wHP8gDf/gB//AB/7AH/5AcP/AQH/DwD/uAD84AD/4AA/wAAfAAAfAAAfAAAfgAA/////+bP/+zf/+zfw=="), + img: atob("GBiBAABAAARGAAYEAADgACP4wDf8gAf+AA/+AE/4AG/jwA/v4A8P8AR/8DH/8AH//AP//g///g///g///gf//AAAAABkwABMgABMgA=="), items: [ { name: "conditionWithTemperature", diff --git a/apps/weather/metadata.json b/apps/weather/metadata.json index dd8b6c293..500eac012 100644 --- a/apps/weather/metadata.json +++ b/apps/weather/metadata.json @@ -1,7 +1,7 @@ { "id": "weather", "name": "Weather", - "version": "0.20", + "version": "0.21", "description": "Show Gadgetbridge weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/core b/core index 3a953179b..764197500 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 3a953179b7bb9f574d4e77d5f34b6b7deee1e884 +Subproject commit 76419750083a88ee7a569db3975ae1bdd6dc155a diff --git a/modules/clock_info.js b/modules/clock_info.js index 238888b1c..50968311e 100644 --- a/modules/clock_info.js +++ b/modules/clock_info.js @@ -77,7 +77,7 @@ exports.load = function() { // actual menu var menu = [{ name: "Bangle", - img: atob("GBiBAf8B//4B//4B//4B//4A//x4//n+f/P/P+fPn+fPn+fP3+/Px+/Px+fn3+fzn+f/n/P/P/n+f/x4//4A//4B//4B//4B//8B/w=="), + img: atob("GBiBAAD+AAH+AAH+AAH+AAH/AAOHAAYBgAwAwBgwYBgwYBgwIBAwOBAwOBgYIBgMYBgAYAwAwAYBgAOHAAH/AAH+AAH+AAH+AAD+AA=="), items: [ { name : "Battery", hasRange : true,