(function(root) { "use strict"; var droll = {}; // Define a "class" to represent a formula function DrollFormula() { this.numDice = 0; this.numSides = 0; this.modifier = 0; this.minResult = 0; this.maxResult = 0; this.avgResult = 0; } // Define a "class" to represent the results of the roll function DrollResult() { this.rolls = []; this.modifier = 0; this.total = 0; } /** * Returns a string representation of the roll result */ DrollResult.prototype.toString = function() { if (this.rolls.length === 1 && this.modifier === 0) { return this.rolls[0] + ''; } if (this.rolls.length > 1 && this.modifier === 0) { return this.rolls.join(' + ') + ' = ' + this.total; } if (this.rolls.length === 1 && this.modifier > 0) { return this.rolls[0] + ' + ' + this.modifier + ' = ' + this.total; } if (this.rolls.length > 1 && this.modifier > 0) { return this.rolls.join(' + ') + ' + ' + this.modifier + ' = ' + this.total; } if (this.rolls.length === 1 && this.modifier < 0) { return this.rolls[0] + ' - ' + Math.abs(this.modifier) + ' = ' + this.total; } if (this.rolls.length > 1 && this.modifier < 0) { return this.rolls.join(' + ') + ' - ' + Math.abs(this.modifier) + ' = ' + this.total; } }; /** * Parse the formula into its component pieces. * Returns a DrollFormula object on success or false on failure. */ droll.parse = function(formula) { var pieces = null; var result = new DrollFormula(); pieces = formula.match(/^([1-9]\d*)?d([1-9]\d*)([+-]\d+)?$/i); if (!pieces) { return false; } result.numDice = (pieces[1] - 0) || 1; result.numSides = (pieces[2] - 0); result.modifier = (pieces[3] - 0) || 0; result.minResult = (result.numDice * 1) + result.modifier; result.maxResult = (result.numDice * result.numSides) + result.modifier; result.avgResult = (result.maxResult + result.minResult) / 2; return result; }; /** * Test the validity of the formula. * Returns true on success or false on failure. */ droll.validate = function(formula) { return (droll.parse(formula)) ? true : false ; }; /** * Roll the dice defined by the formula. * Returns a DrollResult object on success or false on failure. */ droll.roll = function(formula) { var pieces = null; var result = new DrollResult(); pieces = droll.parse(formula); if (!pieces) { return false; } for (var a=0; a