Class: BCDice::CommonCommand::AddDice::Node::DiceRollWithFilter
- Inherits:
-
Object
- Object
- BCDice::CommonCommand::AddDice::Node::DiceRollWithFilter
- Defined in:
- lib/bcdice/common_command/add_dice/node.rb
Overview
フィルタ処理付きダイスロールのノード。
ダイスロール後、条件に従って出目を選択し、和を求める。
Defined Under Namespace
Classes: Filter
Constant Summary collapse
- KEEP_HIGHEST =
大きな出目から複数個取る
Filter.new( :KH, lambda { |sorted_values, n| sorted_values.reverse.take(n) } ).freeze
- KEEP_LOWEST =
小さな出目から複数個取る
Filter.new( :KL, lambda { |sorted_values, n| sorted_values.take(n) } ).freeze
- DROP_HIGHEST =
大きな出目から複数個除く
Filter.new( :DH, lambda { |sorted_values, n| sorted_values.reverse.drop(n) } ).freeze
- DROP_LOWEST =
小さな出目から複数個除く
Filter.new( :DL, lambda { |sorted_values, n| sorted_values.drop(n) } ).freeze
Instance Method Summary collapse
-
#eval(game_system, randomizer) ⇒ Integer
ノードを評価する(ダイスを振り、出目を選択して和を求める).
-
#expr(game_system) ⇒ String
文字列に変換する.
-
#implicit_sides? ⇒ Boolean
暗黙の面数を参照するか?.
- #include_dice? ⇒ Boolean
-
#initialize(times, sides, n_filtering, filter) ⇒ DiceRollWithFilter
constructor
ノードを初期化する.
-
#output ⇒ String
メッセージへの出力を返す.
-
#s_exp ⇒ String
ノードのS式を返す.
Constructor Details
#initialize(times, sides, n_filtering, filter) ⇒ DiceRollWithFilter
ノードを初期化する
499 500 501 502 503 504 505 506 507 508 509 510 511 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 499 def initialize(times, sides, n_filtering, filter) if sides != :implicit && !sides.respond_to?(:eval) raise TypeError, "sides must be a Node or :implicit (#{sides.inspect})" end @times = times @sides = sides @n_filtering = n_filtering @filter = filter # ダイスを振った結果の出力 @text = nil end |
Instance Method Details
#eval(game_system, randomizer) ⇒ Integer
ノードを評価する(ダイスを振り、出目を選択して和を求める)
評価結果は出目の合計値になる。出目はランダマイザに記録される。
520 521 522 523 524 525 526 527 528 529 530 531 532 533 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 520 def eval(game_system, randomizer) times = @times.eval(game_system, nil) sides = eval_sides(game_system) n_filtering = @n_filtering.eval(game_system, nil) sorted_values = randomizer.roll(times, sides).sort total = @filter .apply[sorted_values, n_filtering] .sum() @text = "#{total}[#{sorted_values.join(',')}]" return total end |
#expr(game_system) ⇒ String
文字列に変換する
548 549 550 551 552 553 554 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 548 def expr(game_system) times = @times.eval(game_system, nil) sides = eval_sides(game_system) n_filtering = @n_filtering.eval(game_system, nil) "#{times}D#{sides}#{@filter.abbr}#{n_filtering}" end |
#implicit_sides? ⇒ Boolean
暗黙の面数を参照するか?
542 543 544 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 542 def implicit_sides? @sides == :implicit end |
#include_dice? ⇒ Boolean
536 537 538 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 536 def include_dice? true end |
#output ⇒ String
メッセージへの出力を返す
558 559 560 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 558 def output @text end |
#s_exp ⇒ String
ノードのS式を返す
564 565 566 567 568 |
# File 'lib/bcdice/common_command/add_dice/node.rb', line 564 def s_exp sides_s_exp = implicit_sides? ? @sides.inspect : @sides.s_exp "(DiceRollWithFilter #{@times.s_exp} #{sides_s_exp} #{@filter.abbr.inspect} #{@n_filtering.s_exp})" end |