Class: BCDice::UserDefinedDiceTable

Inherits:
Object
  • Object
show all
Defined in:
lib/bcdice/user_defined_dice_table.rb

Overview

テキストで定義したダイス表を実行するクラス

Examples:

text = <<~TEXT
  飲み物表
  1D6
  1:水
  2:緑茶
  3:麦茶
  4:コーラ
  5:オレンジジュース
  6:選ばれし者の知的飲料
TEXT
table = BCDice::UserDefinedDiceTable.new(text)
table.valid?() #=> true
table.roll().text #=> "飲み物表(6) > 選ばれし者の知的飲料"
BCDice::UserDefinedDiceTable.eval(text) #=> #<BCDice::Result>

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text) ⇒ UserDefinedDiceTable

Returns a new instance of UserDefinedDiceTable.

Parameters:

  • text (String)

    ダイス表のテキストデータ



32
33
34
35
# File 'lib/bcdice/user_defined_dice_table.rb', line 32

def initialize(text)
  @text = text
  @rows = nil
end

Class Method Details

.roll(text) ⇒ Result nil

Parameters:

  • text (String)

Returns:



26
27
28
# File 'lib/bcdice/user_defined_dice_table.rb', line 26

def roll(text)
  new(text).roll()
end

Instance Method Details

#roll(randomizer: Randomizer.new) ⇒ Result?

ダイス表をロールする

Parameters:

  • randomizer (Randomizer) (defaults to: Randomizer.new)

Returns:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/bcdice/user_defined_dice_table.rb', line 40

def roll(randomizer: Randomizer.new)
  parse()

  index = roll_index(randomizer)
  unless valid? && index
    return nil
  end

  key = "#{index}:"
  row = @rows.find { |l| l.start_with?(key) }
  unless row
    return nil
  end

  chosen = row.delete_prefix(key).gsub('\n', "\n").strip
  Result.new.tap do |r|
    r.text = "#{@name}(#{index}) > #{chosen}"
    r.rands = randomizer.rand_results
    r.detailed_rands = randomizer.detailed_rand_results
  end
end

#valid?Boolean

有効なダイス表かをチェックする。テキスト形式のミスだけではなく、抜けている出目や範囲外の出目がないか確認する。

Returns:

  • (Boolean)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/bcdice/user_defined_dice_table.rb', line 64

def valid?
  parse()

  has_index = @rows.all? { |row| /^\d+:/.match?(row) }
  unless has_index
    return false
  end

  index_list = @rows.map(&:to_i).uniq.sort

  case @type
  when /^\d+D\d+$/
    valid_d?(index_list)
  when "D66", "D66N"
    valid_d66?(index_list)
  when "D66A", "D66S"
    valid_d66_asc_sort?(index_list)
  when "D66D"
    valid_d66_desc_sort?(index_list)
  else
    false
  end
end