module Cinch::Plugins::Dicebag::Die
Module to manage the actuall roling of specific dice.
Constants
- MOD_REGEX
- ROLLS_REGEX
- SIDES_REGEX
Public Class Methods
cast(die)
click to toggle source
Rolls an n-sided die a given amount of times and returns the total @param [String] count Number of times to roll the die. @return [Fixnum] The total from rolling the die.
# File lib/cinch/plugins/dicebag/die.rb, line 40 def self.cast(die) # Pull out the data from the roll. modifier = die[MOD_REGEX] count = (die[ROLLS_REGEX, 1] || 1).to_i sides = die[SIDES_REGEX, 1].to_i # init the total total = 0 # Bail if the roll isn't sane looking. return total unless check_die_sanity(count, sides) # Roll dem dice! count.times { total += rand(sides) + 1 } # Parse the modifier and apply it, if there is one return total += parse_modifier(modifier) unless modifier.nil? total end
check_die_sanity(count, sides)
click to toggle source
Makes sure people aren't doing silly things.
# File lib/cinch/plugins/dicebag/die.rb, line 62 def self.check_die_sanity(count, sides) return false if count.nil? || sides.nil? || sides < 1 || count < 1 true end
clean_roll(dice)
click to toggle source
Remove any stupid crap people try to sneak into the rolls.
# File lib/cinch/plugins/dicebag/die.rb, line 68 def self.clean_roll(dice) dice.delete_if { |d| d.match(/\d*d\d+([\-\+]\d+)?/).nil? } dice end
die_check?(dice)
click to toggle source
Takes an array of rolls and does sanity on it. @param [Array] dice Array of strings that correspond to valid
die rolls. (i.e. ['4d6', '6d10']
@return [Boolean] Result of sanity check.
# File lib/cinch/plugins/dicebag/die.rb, line 77 def self.die_check?(dice) # Check to make sure it's not a stupid large roll, they clog threads. count = dice.map { |d| d[/(\d+)d\d+/, 1].to_i || 1 }.inject(0, :+) return false if count >= 10_000 true end
parse_modifier(modifier)
click to toggle source
Parse out the modified and return it as an int.
# File lib/cinch/plugins/dicebag/die.rb, line 85 def self.parse_modifier(modifier) operator = modifier[/\A[\+\-]/] int = modifier[/\d+\z/].to_i 0.send(operator, int) end
roll(dice)
click to toggle source
Takes a dice roll string or Array of dice rolls, sanitizes them,
parses them, and dispatches their calculation to `Die.cast`.
@param [Array] dice Array of strings that correspond to valid die
rolls. (i.e. ['4d6', '6d10']
@return [Fixnum] The total from rolling all of the dice.
# File lib/cinch/plugins/dicebag/die.rb, line 15 def self.roll(dice) # Convert to an array if it's a single die roll dice = [dice] if dice.is_a?(String) # Clean out anything invalid dice = clean_roll(dice) # Initialize a total total = nil # Return if the sanity fails return 'I don\'t have that many dice!' unless die_check?(dice) # Roll each group and total up the returned value dice.each do |die| total ||= 0 total += cast(die) end total end