bcdice/BCDice

View on GitHub
lib/bcdice/dice_table/chain_table.rb

Summary

Maintainability
A
20 mins
Test Coverage
A
94%
# frozen_string_literal: true

module BCDice
  module DiceTable
    class ChainTable
      # @param [String] name 表の名前
      # @param [String] type 項目を選ぶときのダイスロールの方法 '1D6'など
      # @param [Array<String, #roll>] items 表の項目の配列
      def initialize(name, type, items)
        @name = name
        @items = items.freeze

        m = /(\d+)D(\d+)/i.match(type)
        unless m
          raise ArgumentError, "Unexpected table type: #{type}"
        end

        @times = m[1].to_i
        @sides = m[2].to_i
      end

      # 表を振る
      # @param randomizer [#roll_sum] ランダマイザ
      # @return [String] 結果
      def roll(randomizer)
        value = randomizer.roll_sum(@times, @sides)
        index = value - @times
        chosen = @items[index]
        chosen = chosen.roll(randomizer) if chosen.respond_to?(:roll)

        return RollResult.new(@name, value, chosen)
      end
    end
  end
end