Skip to content

Commit

Permalink
Merge pull request #3727 from Le-Kat/upstream
Browse files Browse the repository at this point in the history
multidice: add settings page
  • Loading branch information
bobrippling authored Feb 2, 2025
2 parents 99e8485 + a4eab73 commit 2954d51
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 16 deletions.
5 changes: 5 additions & 0 deletions apps/multidice/ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,8 @@
1.28: increased vibration strength, added some comments, & some QOL
1.29: changed image
1.30: changed image, again
1.40: added various settings for controlling when & how to throw dice
1.41: fixed dumb mistake
1.42: okay maby I should've read the *whole* error log
1.43: playing whackamole with ESLint
1.44: fixed (?) settings app
57 changes: 43 additions & 14 deletions apps/multidice/app.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
var menu = true; // default to have the selection menu open
var settings = Object.assign({
vibrate: true,
shake: true,
screen: false,
shake_timeout: 200,
shake_duration: 100,
}, require('Storage').readJSON("multidice.json", true) || {});

var menu = true; // defaults to having the menu open
const DICE_ARRAY = [0, 4, 6, 8, 10, 12, 20, 100]; // 0 means nothing selected
const SELECTION_ARRAY = [6, 0, 0, 0, 0, 0, 0, 0]; // default to selecting a single d20

// function to draw the selection menu
function drawMenu() {

stringArr = new Array ("", "", "", "", "", "", "", "");
for (i = 0; i < 8; i++) {
var stringArr = new Array ("", "", "", "", "", "", "", "");
for (var i = 0; i < 8; i++) {

if (SELECTION_ARRAY [i] != 0) {

Expand Down Expand Up @@ -41,6 +49,7 @@ function touchHandler (button, xy) {
return;
}

var selection;
if (xy.x <= 87) { // left

if (xy.y <= 43) { // first
Expand Down Expand Up @@ -84,15 +93,30 @@ function touchHandler (button, xy) {
drawMenu();
}

var shaken = false;
var last_shaken = null;
function accelHandler (xyz) {

// if the screen should be on *and* it isn't, return
if (settings.screen && ! Bangle.isBacklightOn()) {

return;
}

if (xyz.diff >= 0.3) {

menu = false;
mutex (rollDice).catch (() => {
shaken = true;
last_shaken = Date.now();
} else if (shaken && last_shaken !== null) {

if (Date.now() - last_shaken > settings.shake_timeout) {

return; // not necessary, but prevents spamming the logs
});
last_shaken = null;
shaken = false;
menu = false;

mutex (rollDice).catch (() => { return; });
}
}
}

Expand Down Expand Up @@ -123,8 +147,8 @@ function mutex (functionRef) {
// function to roll all selected dice, and display them
function rollDice() {

resultsArr = new Uint8Array (8);
for (i = 0; i < 8; i++) {
var resultsArr = new Uint8Array (8);
for (var i = 0; i < 8; i++) {

if (SELECTION_ARRAY [i] != 0) {

Expand All @@ -135,15 +159,15 @@ function rollDice() {
g.clear();
g.setFont ("Vector", 40);

for (i = 0; i < 4; i++) {
for (var 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++) {
for (var i = 4; i < 8; i++) {

if (SELECTION_ARRAY [i] != 0) {

Expand All @@ -157,14 +181,19 @@ function rollDice() {
// triggers the vibration, then pauses before returning
function vibrate() {

if (! settings.vibrate) {

return (Promise.resolve (0));
}

return new Promise ((resolve, reject) => {

return Bangle.buzz (50, 1).then ((value) => {
return Bangle.buzz (settings.shake_duration, 1).then ((value) => {

setTimeout (() => {

resolve (value);
}, 200);
}, 2 * settings.shake_duration + settings.shake_timeout);
});
});
}
Expand All @@ -177,7 +206,7 @@ function random (max) {

drawMenu();
Bangle.on ('touch', touchHandler);
Bangle.on ('accel', accelHandler);
if (settings.shake) { Bangle.on ('accel', accelHandler); }
setWatch (function() {

menu = false;
Expand Down
6 changes: 4 additions & 2 deletions apps/multidice/metadata.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{ "id": "multidice",
"name": "multiple dice roller",
"shortName":"multidice",
"version":"1.30",
"version":"1.44",
"description": "roll anywhere from 1-8 dice at the same time",
"icon": "app.png",
"tags": "tool,game",
Expand All @@ -10,6 +10,8 @@
"allow_emulator": true,
"storage": [
{"name":"multidice.app.js","url":"app.js"},
{"name":"multidice.settings.js","url":"settings.js"},
{"name":"multidice.img","url":"app-icon.js","evaluate":true}
]
],
"data": [{"name": "multidice.json"}]
}
58 changes: 58 additions & 0 deletions apps/multidice/settings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
(function(back) {
var settings = Object.assign({
vibrate: true,
shake: true,
screen: false,
shake_timeout: 200,
shake_duration: 100,
}, require('Storage').readJSON("multidice.json", true) || {});

function writeSettings() {
require('Storage').writeJSON("multidice.json", settings);
}

// Show the menu
E.showMenu({
"" : { "title" : "multi dice roll" },
"< Back" : () => back(),
'vibrate on roll?': {
value: !!settings.vibrate,
onchange: v => {
settings.vibrate = v;
writeSettings();
}
},
'allow shaking?': {
value: !!settings.shake,
onchange: v => {
settings.shake = v;
writeSettings();
}
},
'screen on to shake?': {
value: !!settings.screen,
onchange: v => {
settings.screen = v;
writeSettings();
}
},
'shake timeout': {
value: settings.shake_timeout / 5,
min: 10, max: 40,
format: v => v * 5,
onchange: v => {
settings.shake_timeout = v * 5;
writeSettings();
}
},
'shake duration': {
value: settings.shake_duration / 5,
min: 10, max: 40,
format: v => v * 5,
onchange: v => {
settings.shake_duration = v * 5;
writeSettings();
}
},
});
})

0 comments on commit 2954d51

Please sign in to comment.