1
0
Fork 0
BangleApps/apps/rpgdice/app.js

93 lines
1.8 KiB
JavaScript

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 && face == getDie()) {
bgColor = 0x0000; // Critical Hit
fgColor = 0xF800;
} else if (lastBounce && face == 1){
bgColor = 0xF800; // Critical Miss
fgColor = 0x0000;
} else if (lastBounce){
bgColor = 0x0000; // Other Result
fgColor = 0xFFFF;
} else {
bgColor = 0x0000; // Still Rolling
fgColor = 0x7BEF;
}
}
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"});