summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDavid Gay <eapoems@riseup.net>2024-04-13 21:21:01 -0400
committerDavid Gay <eapoems@riseup.net>2024-04-13 21:21:01 -0400
commitc900787aa7838d2c708c6c0e92f9da9f7c9121d2 (patch)
treea6dc8e4fc772feda4f8f06fb63e26ad4c5f6b8a6 /app
parent0d233ca818c3873b1d0da3aa132ccdf36c0d3d16 (diff)
Dice lib
Diffstat (limited to 'app')
-rw-r--r--app/lib/dice.rb29
-rw-r--r--app/lib/dice/result.rb32
-rw-r--r--app/lib/dice/roll.rb14
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