Rollux/diceRolling.js

91 lines
2.8 KiB
JavaScript
Raw Normal View History

2019-05-18 12:18:45 +00:00
module.exports = {
roll: function (req) {
if (typeof req !== "string") {
2019-12-23 09:09:29 +00:00
return "<@138725786067664897>! You don goofed!";
2019-05-18 12:18:45 +00:00
}
2019-05-18 12:18:45 +00:00
// Splits request into segments. Example "3d6+3+5d2" => ["3d6", "+3", "+5d2"]
2019-12-23 09:09:29 +00:00
var segments = req.replace(/\s/g, '').match(/([+\-]?\d{0,}d\d{1,})|([+\-*/x]\d{1,})/gi);
2019-05-18 12:18:45 +00:00
var message = '';
2019-12-23 09:09:29 +00:00
var i = -1;
var results = [];
var curResult = 0;
var curMod = 1;
2019-05-18 12:18:45 +00:00
segments.forEach(e => {
if (e.match(/([+\-]?\d{0,}d\d{1,})/gi)) { // xdy
// if not first add previous result and resetting curResult
if (i >= 0) {
2019-12-23 09:09:29 +00:00
curResult *= curMod;
results[i] = curResult;
2019-05-18 12:18:45 +00:00
2019-12-23 09:09:29 +00:00
curResult = 0;
2019-05-18 12:18:45 +00:00
}
i++;
// Set modifier for dice group
2019-12-23 09:09:29 +00:00
curMod = (e.substring(0, 1) === '-') ? -1 : 1;
2019-05-18 12:18:45 +00:00
// dice[0] = number of rolls, dice[1] = sides of dice rolled
2019-12-23 09:09:29 +00:00
var dice = e.replace(/[+\-]?/, '').split(/d/i);
var rolls = [];
2019-05-18 12:18:45 +00:00
for (var l = 0; l < parseInt(dice[0] === '' ? 1 : dice[0]); l++) {
2019-12-23 09:09:29 +00:00
rolls[l] = rollDice(dice[1]);
curResult += rolls[l];
2019-05-18 12:18:45 +00:00
}
// add result to message
2019-12-23 09:09:29 +00:00
var sign = e.match(/[+\-]/);
message += ((sign === null) ? ' ' : ' ' + sign) + '[' + rolls.toString() + ']';
} else if (e.match(/([+\-*/x]\d{1,})/gi)) { // Modifier
2019-05-18 12:18:45 +00:00
switch (e.substring(0, 1)) {
case '+':
2019-12-23 09:09:29 +00:00
curResult += parseInt(e.substring(1));
2019-05-18 12:18:45 +00:00
break;
case '-':
2019-12-23 09:09:29 +00:00
curResult -= parseInt(e.substring(1));
2019-05-18 12:18:45 +00:00
break;
case '*':
case 'x':
2019-12-23 09:09:29 +00:00
curResult *= parseInt(e.substring(1));
2019-05-18 12:18:45 +00:00
break;
case '/':
2019-12-23 09:09:29 +00:00
curResult /= parseInt(e.substring(1));
2019-05-18 12:18:45 +00:00
break;
}
2019-12-23 09:09:29 +00:00
message += e;
2019-05-18 12:18:45 +00:00
}
})
2019-12-23 09:09:29 +00:00
curResult *= curMod;
results[i] = curResult;
2019-05-18 12:18:45 +00:00
// Adding the sum to the message
2019-12-23 09:09:29 +00:00
var sum = 0;
2019-05-18 12:18:45 +00:00
if (results.length > 1){
2019-12-23 09:09:29 +00:00
sum = results.reduce(getSum);
2019-05-18 12:18:45 +00:00
} else if (results.length === 1){
2019-12-23 09:09:29 +00:00
sum = results[0];
}
2019-12-23 09:09:29 +00:00
message += ' = ' + sum;
2019-05-18 12:18:45 +00:00
2019-12-23 09:09:29 +00:00
if (message.length > 2000)
message = "Response was to long. Sum: " + sum;
return message;
2019-05-18 12:18:45 +00:00
}
}
/**
* Roll one dice, returns result
* @param {int} dice Amount of sides od dice rolled
*/
function rollDice(dice) {
return parseInt((Math.random() * dice) + 1)
}
function getSum(total, num) {
return total + num
}