Class: BCDice::CommonCommand::AddDice::Node::DiceRollWithFilter

Inherits:
Object
  • Object
show all
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

Constructor Details

#initialize(times, sides, n_filtering, filter) ⇒ DiceRollWithFilter

ノードを初期化する

Parameters:

  • times (Object)

    ダイスを振る回数のノード

  • sides (Object, :implicit)

    ダイスの面数のノード(暗黙の面数を参照したい場合は ‘:implicit`)

  • n_filtering (Object)

    ダイスを残す/減らす個数のノード

  • filter (Filter)

    フィルタ



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

ノードを評価する(ダイスを振り、出目を選択して和を求める)

評価結果は出目の合計値になる。出目はランダマイザに記録される。

Parameters:

Returns:

  • (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

文字列に変換する

Returns:

  • (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

暗黙の面数を参照するか?

Returns:

  • (Boolean)


542
543
544
# File 'lib/bcdice/common_command/add_dice/node.rb', line 542

def implicit_sides?
  @sides == :implicit
end

#include_dice?Boolean

Returns:

  • (Boolean)


536
537
538
# File 'lib/bcdice/common_command/add_dice/node.rb', line 536

def include_dice?
  true
end

#outputString

メッセージへの出力を返す

Returns:

  • (String)


558
559
560
# File 'lib/bcdice/common_command/add_dice/node.rb', line 558

def output
  @text
end

#s_expString

ノードのS式を返す

Returns:

  • (String)


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