diff options
author | David Gay <eapoems@riseup.net> | 2024-04-13 21:21:01 -0400 |
---|---|---|
committer | David Gay <eapoems@riseup.net> | 2024-04-13 21:21:01 -0400 |
commit | c900787aa7838d2c708c6c0e92f9da9f7c9121d2 (patch) | |
tree | a6dc8e4fc772feda4f8f06fb63e26ad4c5f6b8a6 /app | |
parent | 0d233ca818c3873b1d0da3aa132ccdf36c0d3d16 (diff) |
Dice lib
Diffstat (limited to 'app')
-rw-r--r-- | app/lib/dice.rb | 29 | ||||
-rw-r--r-- | app/lib/dice/result.rb | 32 | ||||
-rw-r--r-- | app/lib/dice/roll.rb | 14 |
3 files changed, 75 insertions, 0 deletions
diff --git a/app/lib/dice.rb b/app/lib/dice.rb new file mode 100644 index 0000000..3b6df48 --- /dev/null +++ b/app/lib/dice.rb @@ -0,0 +1,29 @@ +module Dice + # @param sides [Integer] + # @return [Dice::Result] + def self.roll(sides) + result = Dice::Result.new + result.add_roll Dice::Roll.new(sides) + result + end + + # @param formula [String] + def self.roll_formula(formula) + # Will add other delimiters later. + parts = formula.split("d") + + if parts.length < 2 + raise "Invalid formula: #{formula}" + end + + num_dice = parts[0].empty? ? 1 : parts[0].to_i + sides = parts[1].to_i + + result = Dice::Result.new + num_dice.times do + result.add_roll Dice::Roll.new(sides) + end + + result + end +end diff --git a/app/lib/dice/result.rb b/app/lib/dice/result.rb new file mode 100644 index 0000000..103a282 --- /dev/null +++ b/app/lib/dice/result.rb @@ -0,0 +1,32 @@ +class Dice::Result + attr_reader :rolls + + def initialize + @rolls = [] + end + + # @param other [Dice::Result] + def ==(other) + sides == other.sides && face == other.face + end + + # @param roll [Dice::Roll] + def add_roll(roll) + @rolls << roll + end + + # @return [Integer] + def total + @rolls.sum(&:face) + end + + def increase_sides_below_max(max_value, increase_by) + @rolls.each do |roll| + roll.increase_side_below_max(max_value, increase_by) + end + end + + def to_s + "#{total} (#{@rolls.map(&:face).join(', ')})" + end +end diff --git a/app/lib/dice/roll.rb b/app/lib/dice/roll.rb new file mode 100644 index 0000000..dd4788b --- /dev/null +++ b/app/lib/dice/roll.rb @@ -0,0 +1,14 @@ +class Dice::Roll + attr_reader :sides, :face + + # @param sides [Integer] + # @param face [Integer] (Optional) Rolled if not provided. + def initialize(sides, face = nil) + @sides = sides + @face = face || rand(1..sides) + end + + def increase_side_below_max(max_value, increase_by) + @face += increase_by if @face < max_value + end +end |