bcdice/BCDice

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

Summary

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

module BCDice
  module DiceTable
    # 表を表すクラス
    class Table
      # @param key [String]
      # @param locale [Symbol]
      # @return [Table]
      def self.from_i18n(key, locale)
        table = I18n.t(key, locale: locale)
        new(table[:name], table[:type], table[:items])
      end

      # @param [String] name 表の名前
      # @param [String] type 項目を選ぶときのダイスロールの方法 '1D6'など
      # @param [Array<String>] 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 [BCDice] bcdice ランダマイザ
      # @return [String] 結果
      def roll(bcdice)
        value = bcdice.roll_sum(@times, @sides)
        return choice(value)
      end

      def choice(value)
        index = value - @times
        return RollResult.new(@name, value, @items[index])
      end
    end
  end
end