class BCDice::CommonCommand::AddDice::Node::Command

加算ロールコマンドのノード。

目標値が設定されていない場合は lhs のみを使用する。 目標値が設定されている場合は、lhscmp_oprhs を使用する。

Attributes

cmp_op[R]

比較演算子 @return [Symbol]

lhs[R]

左辺のノード @return [Object]

rhs[R]

右辺のノード @return [Integer, String]

Public Class Methods

new(secret, lhs, cmp_op = nil, rhs = nil) click to toggle source

ノードを初期化する @param [Object] lhs 左辺のノード @param [Symbol] cmp_op 比較演算子 @param [Integer, String] rhs 右辺のノード

# File lib/bcdice/common_command/add_dice/node.rb, line 29
def initialize(secret, lhs, cmp_op = nil, rhs = nil)
  @secret = secret
  @lhs = lhs
  @cmp_op = cmp_op
  @rhs = rhs
end

Public Instance Methods

eval(game_system, randomizer) click to toggle source
# File lib/bcdice/common_command/add_dice/node.rb, line 53
def eval(game_system, randomizer)
  randomizer = Randomizer.new(randomizer, game_system)
  total = @lhs.eval(game_system, randomizer)

  interrim_expr =
    unless randomizer.rand_results.size <= 1 && @lhs.is_a?(Node::DiceRoll)
      @lhs.output
    end

  result =
    if @cmp_op
      rhs = @rhs.eval(game_system, nil)
      game_system.check_result(total, randomizer.rand_results, @cmp_op, rhs)
    end
  result ||= Result.new

  sequence = [
    "(#{expr(game_system)})",
    interrim_expr,
    total,
    result&.text
  ].compact

  result.tap do |r|
    r.secret = @secret
    r.text = sequence.join(" > ")
  end
end
expr(game_system) click to toggle source

文字列に変換する @param game_system [BCDice::Base] @return [String]

# File lib/bcdice/common_command/add_dice/node.rb, line 39
def expr(game_system)
  @lhs.expr(game_system) + cmp_op_text + @rhs&.eval(game_system, nil).to_s
end
s_exp() click to toggle source

ノードのS式を返す @return [String]

# File lib/bcdice/common_command/add_dice/node.rb, line 45
def s_exp
  if @cmp_op
    "(Command (#{@cmp_op} #{@lhs.s_exp} #{@rhs.s_exp}))"
  else
    "(Command #{@lhs.s_exp})"
  end
end

Private Instance Methods

cmp_op_text() click to toggle source

メッセージ中で比較演算子をどのように表示するかを返す @return [String]

# File lib/bcdice/common_command/add_dice/node.rb, line 86
def cmp_op_text
  case @cmp_op
  when :'!='
    "<>"
  when :==
    "="
  else
    @cmp_op.to_s
  end
end