2023-02-10 00:17:21 +00:00
|
|
|
var menu = true;
|
2023-02-25 04:39:42 +00:00
|
|
|
const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100];
|
|
|
|
const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20
|
2023-02-10 00:17:21 +00:00
|
|
|
|
|
|
|
function drawMenu() {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
|
|
|
stringArr = new Array ("", "", "", "", "", "", "", "");
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
|
|
|
|
if (SELECTION_ARRAY [i] != 0) {
|
|
|
|
|
|
|
|
stringArr [i] = "" + DICE_ARRAY [SELECTION_ARRAY [i]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g.clear();
|
|
|
|
g.setFont ("Vector", 40);
|
|
|
|
|
|
|
|
g.drawString ((" " + stringArr [0]).slice (-3), 5, 10);
|
|
|
|
g.drawString ((" " + stringArr [1]).slice (-3), 5, 50);
|
|
|
|
g.drawString ((" " + stringArr [2]).slice (-3), 5, 90);
|
|
|
|
g.drawString ((" " + stringArr [3]).slice (-3), 5, 130);
|
|
|
|
g.drawString ((" " + stringArr [4]).slice (-3), 96, 10);
|
|
|
|
g.drawString ((" " + stringArr [5]).slice (-3), 96, 50);
|
|
|
|
g.drawString ((" " + stringArr [6]).slice (-3), 96, 90);
|
|
|
|
g.drawString ((" " + stringArr [7]).slice (-3), 96, 130);
|
2023-02-10 00:17:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function touchHandler (button, xy) {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
|
|
|
if (! menu) {
|
|
|
|
|
|
|
|
menu = true;
|
|
|
|
drawMenu();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (xy.x <= 87) { // left
|
|
|
|
|
|
|
|
if (xy.y <= 43) {
|
|
|
|
|
|
|
|
selection = 0;
|
|
|
|
} else if (xy.y <= 87) {
|
|
|
|
|
|
|
|
selection = 1;
|
|
|
|
} else if (xy.y <= 131) {
|
|
|
|
|
|
|
|
selection = 2;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
selection = 3;
|
|
|
|
}
|
|
|
|
} else { // right
|
|
|
|
|
|
|
|
if (xy.y <= 43) {
|
|
|
|
|
|
|
|
selection = 4;
|
|
|
|
} else if (xy.y <= 87) {
|
|
|
|
|
|
|
|
selection = 5;
|
|
|
|
} else if (xy.y <= 131) {
|
|
|
|
|
|
|
|
selection = 6;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
selection = 7;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// increment SELECTION_ARRAY [selection]
|
|
|
|
if (SELECTION_ARRAY [selection] == 7) {
|
|
|
|
|
|
|
|
SELECTION_ARRAY [selection] = 0;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
SELECTION_ARRAY [selection] += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
drawMenu();
|
|
|
|
}
|
|
|
|
|
|
|
|
function accelHandler (xyz) {
|
|
|
|
|
2023-02-26 04:21:47 +00:00
|
|
|
if (xyz.diff >= 0.4) {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
|
|
|
menu = false;
|
2023-02-26 04:02:33 +00:00
|
|
|
mutex (rollDice);
|
2023-02-26 03:44:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let lock = false;
|
|
|
|
function mutex (functionRef) {
|
|
|
|
|
|
|
|
if (lock) {
|
|
|
|
|
|
|
|
return Promise.reject (new Error ("mutex is busy"));
|
|
|
|
}
|
|
|
|
|
|
|
|
lock = true;
|
2023-02-26 03:58:41 +00:00
|
|
|
return new Promise ((resolve, reject) => {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
2023-02-26 03:58:41 +00:00
|
|
|
functionRef().then ((result) => {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
|
|
|
lock = false;
|
2023-02-26 03:50:34 +00:00
|
|
|
resolve (result);
|
2023-02-26 03:58:41 +00:00
|
|
|
}).catch ((error) => {
|
|
|
|
|
|
|
|
lock = false;
|
|
|
|
reject (error);
|
2023-02-26 03:44:11 +00:00
|
|
|
});
|
|
|
|
});
|
2023-02-25 12:52:26 +00:00
|
|
|
}
|
|
|
|
|
2023-02-26 03:44:11 +00:00
|
|
|
function rollDice() {
|
|
|
|
|
|
|
|
resultsArr = new Uint8Array (8);
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
|
|
|
|
if (SELECTION_ARRAY [i] != 0) {
|
|
|
|
|
|
|
|
resultsArr [i] = random (DICE_ARRAY [SELECTION_ARRAY [i]]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g.clear();
|
|
|
|
g.setFont ("Vector", 40);
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
|
|
|
|
if (SELECTION_ARRAY [i] != 0) {
|
|
|
|
|
|
|
|
g.drawString ((" " + resultsArr [i]).slice (-3), 5, 10 + 40 * i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 4; i < 8; i++) {
|
|
|
|
|
|
|
|
if (SELECTION_ARRAY [i] != 0) {
|
|
|
|
|
|
|
|
g.drawString ((" " + resultsArr [i]).slice (-3), 96, 10 + 40 * (i - 4));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return vibrate();
|
2023-02-25 18:16:33 +00:00
|
|
|
}
|
|
|
|
|
2023-02-26 03:44:11 +00:00
|
|
|
function vibrate() {
|
|
|
|
|
2023-02-26 04:21:47 +00:00
|
|
|
return new Promise ((resolve, reject) => {
|
|
|
|
|
|
|
|
return Bangle.buzz (50, 0.5).then ((value) => {
|
|
|
|
|
|
|
|
setTimeout (() => {
|
|
|
|
|
|
|
|
resolve (value);
|
|
|
|
}, 150);
|
|
|
|
});
|
|
|
|
});
|
2023-02-25 04:39:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function random (max) {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
|
|
|
return Math.round (Math.random() * (max - 1) + 1);
|
2023-02-25 12:52:26 +00:00
|
|
|
}
|
|
|
|
|
2023-02-10 00:17:21 +00:00
|
|
|
drawMenu();
|
|
|
|
Bangle.on ('touch', touchHandler);
|
2023-02-26 03:44:11 +00:00
|
|
|
Bangle.on ('accel', accelHandler);
|
2023-02-25 18:27:12 +00:00
|
|
|
setWatch (function() {
|
2023-02-26 03:44:11 +00:00
|
|
|
|
|
|
|
menu = false;
|
|
|
|
mutex (rollDice);
|
2023-02-25 18:27:12 +00:00
|
|
|
}, BTN, {repeat: true, edge: "falling", debounce: 10});
|