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