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