diff --git a/src/constants.js b/src/constants.js index 6e96aa0..abbd7a9 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,6 +1,6 @@ const constants = { - rollRegex: /^(\d+)?([dhl])(\d+)(\s*([+\-*x\/])\s*(\d+))?/, - optionRollRegex: /^(\d+)?(([dhl])(\d+))?(\s*([+\-*x\/])\s*(\d+))?/, + rollRegex: /^(\d+)?([dhlfb])(\d+)(\s*([+\-*x\/])\s*(\d+))?/, + optionRollRegex: /^(\d+)?(([dhlfb])(\d+))?(\s*([+\-*x\/])\s*(\d+))?/, descriptionRegex: /\s*((\d*-\d*)|(\d+))?([^;\n]+)/g, macroNameRegex: /^[a-z0-9]+$/, diff --git a/src/index.js b/src/index.js index 3c9f486..b792a93 100644 --- a/src/index.js +++ b/src/index.js @@ -113,6 +113,22 @@ const handleMessage = (message, respond) => { rollDice(dice, respond) } +const bleemRoll = (dice, rolls, comparison, resultDistance = -1) => { + let result = 0 + let pseudoMedian = Math.floor(dice.size / 2) + + for(let roll of rolls) { + let distance = Math.abs(roll - pseudoMedian) + + if(comparison(result, resultDistance)) { + result = roll + resultDistance = distance + } + } + + return result +} + const rollDice = (dice, respond) => { if(dice.size > 255) { respond('That die is way too big... .-.') @@ -132,6 +148,7 @@ const rollDice = (dice, respond) => { let result = 0 let operationSymbol = dice.operation let response = '' + let comparison switch(dice.mode.toLowerCase()) { case 'd': @@ -145,6 +162,14 @@ const rollDice = (dice, respond) => { case 'l': result = rolls.reduce((a, v) => v < a ? v : a, Infinity) break + + case 'f': + result = bleemRoll(dice, rolls, (l, r) => l > r, -1) + break + + case 'b': + result = bleemRoll(dice, rolls, (l, r) => l < r, Infinity) + break } switch(dice.operation) {