class Hazard

This class roll the dice.

@author Cédric ZUGER

Constants

DICE_NAME_REGEXP
VERSION

Public Class Methods

from_string( dice_string ) click to toggle source

From string entry point, in case you have your dice description in a database for instance.

@param dice_string [String] the description of the dice. See help for detail.

@return [Object] if detail has been asked, it will return a [RolledDice] object, otherwise it will return an [Integer] containing the sum of the dice.

# File lib/hazard.rb, line 31
def self.from_string( dice_string )
  roll_dice( dice_string )
end
lucky?( dice ) click to toggle source

Roll a dice and return true if you rolled the highest number

@param dice [Integer] the dice you want to roll.

@return [Boolean] true if you scored the highest number, false otherwise.

# File lib/hazard.rb, line 45
def self.lucky?( dice )
  roll_dice( "d#{dice}" ) == dice
end
method_missing( method_name ) click to toggle source

Regular entry point. This is where you will go when you call Hazard.d6 for instance.

@param method_name [String] the description of the dice. See help for detail.

@return [Object] if detail has been asked, it will return a [RolledDice] object, otherwise it will return an [Integer] containing the sum of the dice.

Calls superclass method
# File lib/hazard.rb, line 16
def self.method_missing( method_name )
  method_name = method_name.to_s

  if method_name =~ DICE_NAME_REGEXP
    roll_dice( method_name )
  else
    super
  end
end
respond_to_missing?(method_name, include_private = false) click to toggle source

Hook the method_missing

Calls superclass method
# File lib/hazard.rb, line 36
def self.respond_to_missing?(method_name, include_private = false)
  method_name.to_s =~ DICE_NAME_REGEXP || super
end

Private Class Methods

dice_amount( dice_match ) click to toggle source
# File lib/hazard.rb, line 82
def self.dice_amount( dice_match )
  # Get the dice amount
  dice_amount = dice_match[2]

  # If no amount is given then the amount is 1
  # But if zero dice is specifically required we respect this choice.
  dice_amount.empty? ? 1 : dice_amount.to_i
end
roll_dice( method_name ) click to toggle source

Roll dice according to method name

@param method_name [String] the description of the dice. See help for detail.

@return [Object] if detail has been asked, it will return a [RolledDice] object, otherwise it will return an [Integer] containing the sum of the dice.

# File lib/hazard.rb, line 56
def self.roll_dice( method_name )
  # Parse the method name to get how many dice and what size of dice was required
  dice_match = method_name.to_s.match DICE_NAME_REGEXP

  # Get the roll type
  roll_type = dice_match[1]
  splitted_result = true if roll_type == 's'

  # Get the type of dice
  dice_type = dice_match[3].to_i

  # In some strange cases the user can request a roll of zero dice.
  # in this case we return nil.
  dm = dice_amount(dice_match)
  if dm > 0
    # Rolls the dice
    rolls = ( 1..dice_amount(dice_match) ).map{ Kernel.rand( 1..dice_type ) }

    # Unless splitted_result was requested, return the sum of the rolled dice
    return rolls.reduce(:+) unless splitted_result

    # Return a RolledDice otherwise
    RolledDice.new( rolls )
  end
end