Module:Dice: Difference between revisions

1,010 bytes added ,  16:49, 31 July 2019
add fromRangeString and provide the original fromString as fromDiceString as well
(permit spaces everywhere (purely cosmetic))
(add fromRangeString and provide the original fromString as fromDiceString as well)
Line 8: Line 8:
local Dice = {}
local Dice = {}
Dice.__index = Dice
Dice.__index = Dice
--# Private
local function newDice(diceTable)
    return setmetatable({diceTable = diceTable}, Dice)
end


--# Interface
--# Interface
Line 21: Line 27:
     to form a compound dice distribution.
     to form a compound dice distribution.


     For example, Dice.fromString'5d3+1d2-1' gets the distribution that's
     For example, Dice.fromDiceString'5d3+1d2-1' gets the distribution that's
     represented by rolling 5 3-sided dice, rolling a 2-sided die, and
     represented by rolling 5 3-sided dice, rolling a 2-sided die, and
     subtracting 1 from their sum.
     subtracting 1 from their sum.
--]]
--]]
function Dice.fromString(diceString)
function Dice.fromDiceString(diceString)
     local diceTable = {}
     local diceTable = {}


Line 54: Line 60:
     end
     end


     return setmetatable({diceTable = diceTable}, Dice)
     return newDice(diceTable)
end
 
-- Dice.fromString is an alias for Dice.fromDiceString.
Dice.fromString = Dice.fromDiceString
 
--[[
    Get a dice distribution from a range string, which is of the form X-Y,
    where X and Y are nonnegative integers.
 
    This has the limitation that it doesn't accept negative numbers. To specify
    a distribution involving negative numbers, use the more general
    Dice.fromDiceString instead.
 
    For example, Dice.fromRangeString'4-8' gets the distribution that gives
    integers 4 through 8 with equal probability, equivalent to the distribution
    given by the dice string '1d5+3'.
--]]
function Dice.fromRangeString(rangeString)
    local minimum, maximum = rangeString:gsub('%s', ''):match'^(%d+)-(%d+)$'
    return newDice{
        {
            quantity = 1,
            size = maximum - minimum + 1,
        },
        {
            quantity = minimum - 1,
            size = 1,
        },
    }
end
end