From 6bac8e982b1b116e6b9f5e5ffd18a8557a7b5f11 Mon Sep 17 00:00:00 2001 From: Stefano Baldan Date: Fri, 3 Apr 2020 10:22:14 +0200 Subject: [PATCH] RPG dice app --- apps.json | 14 +++++++ apps/rpgdice/ChangeLog | 1 + apps/rpgdice/app-icon.js | 1 + apps/rpgdice/app.js | 86 +++++++++++++++++++++++++++++++++++++++ apps/rpgdice/rpgdice.png | Bin 0 -> 6491 bytes 5 files changed, 102 insertions(+) create mode 100755 apps/rpgdice/ChangeLog create mode 100755 apps/rpgdice/app-icon.js create mode 100755 apps/rpgdice/app.js create mode 100755 apps/rpgdice/rpgdice.png diff --git a/apps.json b/apps.json index 3bdc55f07..15f6a0cda 100644 --- a/apps.json +++ b/apps.json @@ -1020,5 +1020,19 @@ {"name":"balltastic.app.js","url":"app.js"}, {"name":"balltastic.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "rpgdice", + "name": "RPG dice", + "icon": "rpgdice.png", + "version": "0.01", + "description": "Simple RPG dice rolling app.", + "tags": "game,fun", + "type": "app", + "allow_emulator": true, + "storage": [ + {"name":"rpgdice.app.js","url": "app.js"}, + {"name":"rpgdice.img","url": "app-icon.js","evaluate":true} + ] } ] diff --git a/apps/rpgdice/ChangeLog b/apps/rpgdice/ChangeLog new file mode 100755 index 000000000..7b83706bf --- /dev/null +++ b/apps/rpgdice/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/rpgdice/app-icon.js b/apps/rpgdice/app-icon.js new file mode 100755 index 000000000..d6fd1fda5 --- /dev/null +++ b/apps/rpgdice/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwgMJgMQgMZzOREaERiERzIACiIVOAIIUCz///ORgIXNIQIAC/4ABJJYsBCogYEAYMQiAWGLAoAJJI8JLAYoCAAgJBJIIwGBohxBJI4YBJIwOFC4w5EC4hdOzIgCyLFDC45hHAAZJDgJAKMQwyBSYSOBxIXGPRTdChOfxChHbpRhBC4P5GAgAOgEZFAKjIBAz1EC5YYJxAvBJ4IXQzGIxEQB4RbPCoOIwEAOKAsCC4QvCFiAXDdwwsMC5eebogVGAALWBC42f/AWLC4zwCUgIEBCxK+DE4bsFC5+f/IrBC4RzHXwkZzATEDgP/RZAXFz5ECf4oXMCYKICC6hABMAQXOgAXBLgLrHRxZfCC6sBCo4XLLwIXBbAgXRMIQAGRxgwChIXVgEQIYimOGAZ6CSgOJC6CrCC4TZBC6IwCC4QWQPQYXKOggAFPQOfC5AWKPQgXGCpR6FOwoWOPQQXDIZYwHC4QVRAAQXBBxgA=")) \ No newline at end of file diff --git a/apps/rpgdice/app.js b/apps/rpgdice/app.js new file mode 100755 index 000000000..2007d6ab0 --- /dev/null +++ b/apps/rpgdice/app.js @@ -0,0 +1,86 @@ +const dice = [4, 6, 8, 10, 12, 20, 100]; +const nFlips = 20; +const delay = 500; + +let dieIndex = 1; +let face = 0; +let rolling = false; + +let bgColor; +let fgColor; + +function getDie() { + return dice[dieIndex]; +} + +function setColors(lastBounce) { + if (lastBounce) { + bgColor = 0xFFFF; + fgColor = 0x0000; + } else { + bgColor = 0x0000 + fgColor = 0xFFFF; + } +} + +function flipFace() { + while(true) { + let newFace = Math.floor(Math.random() * getDie()) + 1; + if (newFace !== face) { + face = newFace; + break; + } + } +} + +function draw() { + g.setColor(bgColor); + g.fillRect(0, 0, g.getWidth(), g.getHeight()); + g.setColor(fgColor); + g.setFontAlign(0, 0); + g.setFontVector(40); + g.drawString('d' + getDie(), 180, 30); + g.setFontVector(100); + g.drawString(face, 120, 120); +} + +function roll(bounces) { + flipFace(); + setColors(bounces === 0); + draw(); + if (bounces > 0) { + setTimeout(() => roll(bounces - 1), delay / bounces); + } else { + rolling = false; + } +} + +function startRolling() { + if (rolling) return; + rolling = true; + roll(nFlips); +} + +function changeDie() { + if (rolling) return; + dieIndex = (dieIndex + 1) % dice.length; + draw(); +} + +Bangle.on('lcdPower',function(on) { + if (on) { + startRolling(); + } +}); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +startRolling(); + +// Top button rolls the die, bottom button changes it +setWatch(startRolling, BTN1, {repeat:true}); +setWatch(changeDie, BTN3, {repeat:true}); + +// Show launcher when middle button pressed +setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"}); diff --git a/apps/rpgdice/rpgdice.png b/apps/rpgdice/rpgdice.png new file mode 100755 index 0000000000000000000000000000000000000000..d14b9c8368ff88c94648cdde8487a412985850b7 GIT binary patch literal 6491 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 Bk5&Kx literal 0 HcmV?d00001