class Mythal::Roll
Constants
- DICE_VARIANTS
- NUMBER_OF_DICE
Attributes
denomination[R]
dice_string[R]
modifier[R]
number_of_dice[R]
Public Class Methods
new(*dice_string)
click to toggle source
# File lib/mythal/roll.rb, line 8 def initialize(*dice_string) @dice_string = dice_string.join.gsub(" ", '') end
Public Instance Methods
call()
click to toggle source
# File lib/mythal/roll.rb, line 12 def call result end
Private Instance Methods
format_output_message(rolls, total)
click to toggle source
# File lib/mythal/roll.rb, line 57 def format_output_message(rolls, total) subtotal = rolls.inject(:+) sign = modifier > 0 ? "+" : "-" messages = rolls.map { |roll| "rolling d#{denomination}... #{roll}" } messages << "#{subtotal} #{sign} #{modifier.abs}" unless modifier.zero? messages << total messages.join("\n") end
match_data()
click to toggle source
# File lib/mythal/roll.rb, line 66 def match_data @match_data ||= pattern.match(dice_string) end
max_dice()
click to toggle source
# File lib/mythal/roll.rb, line 96 def max_dice NUMBER_OF_DICE.max end
min_dice()
click to toggle source
# File lib/mythal/roll.rb, line 92 def min_dice NUMBER_OF_DICE.min end
parse_input_string()
click to toggle source
# File lib/mythal/roll.rb, line 70 def parse_input_string @number_of_dice = match_data[1].to_i @denomination = match_data[2].to_i @modifier = match_data[3] ? match_data[3].to_i : 0 end
pattern()
click to toggle source
# File lib/mythal/roll.rb, line 80 def pattern @pattern ||= /^(-?\d+)d(\d+)?([+-]\d+)?$/ end
random_dice_roll()
click to toggle source
# File lib/mythal/roll.rb, line 76 def random_dice_roll rand(1..denomination) end
result()
click to toggle source
# File lib/mythal/roll.rb, line 36 def result return DiceRollResult.new(message: "can't roll #{dice_string}") unless match_data parse_input_string return DiceRollResult.new(message: "can't roll #{dice_string}") unless valid_denomination? return DiceRollResult.new(message: "can only roll #{min_dice} - #{max_dice} dice") unless valid_number_of_dice? rolls = Array.new(number_of_dice) { random_dice_roll } total = rolls.inject(:+) + modifier message = format_output_message(rolls, total) DiceRollResult.new( rolls: rolls, total: total, message: message, success: true, modifier: modifier, ) end
valid_denomination?()
click to toggle source
# File lib/mythal/roll.rb, line 84 def valid_denomination? DICE_VARIANTS.include?(denomination) end
valid_number_of_dice?()
click to toggle source
# File lib/mythal/roll.rb, line 88 def valid_number_of_dice? NUMBER_OF_DICE.include?(number_of_dice) end