class BCDice::GameSystem::DoubleCross::DX

成功判定コマンドのノード

Public Class Methods

new(num, critical_value, modifier, target_value) click to toggle source

ノードを初期化する @param [Integer] num ダイス数 @param [Integer] critical_value クリティカル値 @param [Integer] modifier 修正値 @param [Integer] target_value 目標値

# File lib/bcdice/game_system/DoubleCross.rb, line 44
def initialize(num, critical_value, modifier, target_value)
  @num = num
  @critical_value = critical_value
  @modifier = modifier
  @target_value = target_value

  @modifier_str = Format.modifier(@modifier)
  @expression = node_expression()

  @locale = :ja_jp
end

Public Instance Methods

execute(randomizer) click to toggle source

成功判定を行う @param randomizer [Randomizer] @return [Result] 判定結果

# File lib/bcdice/game_system/DoubleCross.rb, line 59
def execute(randomizer)
  if @critical_value < 2
    return Result.new("(#{@expression}) > #{translate('DoubleCross.DX.invalid_critical')}")
  end

  if @num < 1
    return Result.failure("(#{@expression}) > #{translate('DoubleCross.DX.auto_failure')}")
  end

  # 出目のグループの配列
  value_groups = []
  # 次にダイスロールを行う際のダイス数
  num_of_dice = @num
  # 回転数
  loop_count = 0

  while num_of_dice > 0 && loop_count < CommonCommand::RerollDice::REROLL_LIMIT
    values = randomizer.roll_barabara(num_of_dice, 10)

    value_group = ValueGroup.new(values, @critical_value)
    value_groups.push(value_group)

    # 次回はクリティカル発生数と等しい個数のダイスを振る
    # [3rd ルールブック1 p. 185]
    num_of_dice = value_group.num_of_critical_occurrences

    loop_count += 1
  end

  return result(value_groups)
end

Private Instance Methods

node_expression() click to toggle source

数式表記を返す @return [String]

# File lib/bcdice/game_system/DoubleCross.rb, line 95
def node_expression
  lhs = "#{@num}DX#{@critical_value}#{@modifier_str}"

  return @target_value ? "#{lhs}>=#{@target_value}" : lhs
end
result(value_groups) click to toggle source

判定結果を返す @param [Array<ValueGroup>] value_groups 出目のグループの配列 @return [Result]

# File lib/bcdice/game_system/DoubleCross.rb, line 104
def result(value_groups)
  r = Result.new

  r.fumble = value_groups[0].values.all?(1)

  sum = value_groups.map(&:max).sum
  achieved_value = r.fumble? ? 0 : (sum + @modifier)

  # ファンブルかどうかを含む達成値の表記
  achieved_value_with_if_fumble =
    if r.fumble?
      "#{achieved_value} (#{translate('fumble')})"
    else
      achieved_value.to_s
    end

  r.critical = value_groups.length > 1

  parts = [
    "(#{@expression})",
    "#{value_groups.join('+')}#{@modifier_str}",
    achieved_value_with_if_fumble
  ]

  if @target_value
    # 行為判定成功か?
    #
    # ファンブル時は自動失敗、達成値が目標値以上ならば行為判定成功
    # [3rd ルールブック1 pp. 186-187]
    success = !r.fumble? && (achieved_value >= @target_value)

    if success
      r.success = true
    else
      r.failure = true
    end

    compare_result_text = translate(success ? 'success' : 'failure')
    parts.push(compare_result_text)
  end

  r.text = parts.join(' > ')

  return r
end