Class: BCDice::DiceTable::RangeTable
- Inherits:
-
Object
- Object
- BCDice::DiceTable::RangeTable
- Defined in:
- lib/bcdice/dice_table/range_table.rb
Overview
各項目について、Rangeを用いて出目の合計の範囲を指定する、表のクラス。
このクラスを使うと、表の定義を短く書ける。このクラスを使って表を定義するときは、各項目を以下の形で書く。
[出目の合計の範囲, 内容]
「出目の合計の範囲」には、Integerを要素とするRangeか、Integerを置ける。
roll メソッドで表を振ると、出目の合計値と対応する項目が選ばれる。
Direct Known Subclasses
GameSystem::DeadlineHeroes::RealNameChart, GameSystem::ShuumatsuKikou::FiveItemsTable
Defined Under Namespace
Classes: Item, RollResult
Constant Summary collapse
- DICE_ROLL_METHOD_RE =
項目を選ぶときのダイスロールの方法を表す正規表現
/\A(\d+)D(\d+)\z/i.freeze
- DEFAULT_FORMATTER =
表を振った結果の整形処理(既定の処理)
lambda do |table, result| "#{table.name}(#{result.sum}) > #{result.content}" end
Instance Attribute Summary collapse
-
#name ⇒ String
readonly
表の名前.
-
#num_of_dice ⇒ Integer
readonly
振るダイスの個数.
-
#num_of_sides ⇒ Integer
readonly
振るダイスの面数.
Class Method Summary collapse
Instance Method Summary collapse
-
#fetch(value) ⇒ Item
指定された値に対応する項目を返す.
-
#initialize(name, dice_roll_method, items) {|table, result| ... } ⇒ RangeTable
constructor
表を初期化する.
-
#roll(randomizer) ⇒ RollResult
表を振る.
Constructor Details
#initialize(name, dice_roll_method, items) {|table, result| ... } ⇒ RangeTable
表を初期化する
ブロックを与えると、独自の結果整形処理を指定できる。ブロックは振った表(table
)と振った結果(result
)を引数として受け取る。
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/bcdice/dice_table/range_table.rb', line 140 def initialize(name, dice_roll_method, items, &formatter) @name = name.freeze @formatter = formatter || DEFAULT_FORMATTER m = DICE_ROLL_METHOD_RE.match(dice_roll_method) unless m raise( ArgumentError, "#{@name}: invalid dice roll method: #{dice_roll_method}" ) end @num_of_dice = m[1].to_i @num_of_sides = m[2].to_i store(items) end |
Instance Attribute Details
#name ⇒ String (readonly)
Returns 表の名前.
64 65 66 |
# File 'lib/bcdice/dice_table/range_table.rb', line 64 def name @name end |
#num_of_dice ⇒ Integer (readonly)
Returns 振るダイスの個数.
66 67 68 |
# File 'lib/bcdice/dice_table/range_table.rb', line 66 def num_of_dice @num_of_dice end |
#num_of_sides ⇒ Integer (readonly)
Returns 振るダイスの面数.
68 69 70 |
# File 'lib/bcdice/dice_table/range_table.rb', line 68 def num_of_sides @num_of_sides end |
Class Method Details
.conv_string_range(x) ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/bcdice/dice_table/range_table.rb', line 79 def conv_string_range(x) case x when Integer return x when String return x.include?("..") ? Range.new(*x.split("..", 2).map { |n| Integer(n) }) : Integer(x) end raise( TypeError, "#{@name}: #{x} (#{x.class}) must be a String or an Integer" ) end |
.from_i18n(key, locale) ⇒ Object
71 72 73 74 75 76 77 |
# File 'lib/bcdice/dice_table/range_table.rb', line 71 def from_i18n(key, locale) table = I18n.t(key, locale: locale) converted_items = table[:items].map do |item| [conv_string_range(item[0]), item[1]] end new(table[:name], table[:type], converted_items) end |
Instance Method Details
#fetch(value) ⇒ Item
指定された値に対応する項目を返す
162 163 164 165 166 167 168 169 |
# File 'lib/bcdice/dice_table/range_table.rb', line 162 def fetch(value) item = @items.find { |i| i.range.include?(value) } unless item raise RangeError, "#{@name}: value is out of range: #{value}" end return item end |
#roll(randomizer) ⇒ RollResult
表を振る
174 175 176 177 178 179 180 181 182 |
# File 'lib/bcdice/dice_table/range_table.rb', line 174 def roll(randomizer) values = randomizer.(@num_of_dice, @num_of_sides) sum = values.sum() result = RollResult.new(sum, values, fetch(sum).content) result.formatted = @formatter[self, result] return result end |