class BCDice::GameSystem::BBN
Constants
- HELP_MESSAGE
- ID
- NAME
- SORT_KEY
Public Instance Methods
eval_game_system_specific_command(command)
click to toggle source
# File lib/bcdice/game_system/BBN.rb, line 29 def eval_game_system_specific_command(command) unless parse(command) return nil end # ダイスロール dice_list = @randomizer.roll_barabara(@roll_times, 6) dice = dice_list.sum() dice_str = dice_list.join(",") total = dice + @modify # 出力文の生成 sequence = [ "(#{command})", "#{dice}[#{dice_str}]#{@modify_str}", total ] # クリティカルとファンブルが同時に発生した時にはクリティカルが優先 if critical_?(dice_list) sequence.push("クリティカル!", *additional_roll(dice_list.count(6), total)) elsif fumble_?(dice_list) sequence.push("ファンブル!") elsif @difficulty sequence.push(total >= @difficulty ? "成功" : "失敗") end return sequence.join(" > ") end
Private Instance Methods
additional_roll(additional_dice, total)
click to toggle source
クリティカルの追加ロールをする 追加ロールで6が出た場合、さらに追加ロールが行われる
@param additional_dice [Integer] クリティカルによる追加のダイス数 @param total [Integer] 現在の合計値 @return [Array<String>]
# File lib/bcdice/game_system/BBN.rb, line 113 def additional_roll(additional_dice, total) sequence = [] reroll_count = 0 # 追加クリティカルは無限ループしうるので、10回に制限 while additional_dice > 0 && reroll_count < 10 reroll_count += 1 dice_list = @randomizer.roll_barabara(additional_dice, 6) dice_total = dice_list.sum() dice_str = dice_list.join(",") additional_dice = dice_list.count(6) sequence.push("#{total}+#{dice_total}[#{dice_str}]") sequence.push("追加クリティカル!") if additional_dice > 0 total += dice_total end if additional_dice > 0 sequence.push("無限ループ防止のため中断") end sequence.push total if @difficulty sequence.push(total >= @difficulty ? "成功" : "失敗") end return sequence end
critical_?(dice_list)
click to toggle source
@return [Boolean] クリティカルか
# File lib/bcdice/game_system/BBN.rb, line 98 def critical_?(dice_list) dice_list.count(6) >= @critical end
critical_base(roll_times)
click to toggle source
振るダイスの数からクリティカルとファンブルの基本値を算出する
@param roll_times [Integer] 振るダイスの数 @return [Integer] クリティカルの値
# File lib/bcdice/game_system/BBN.rb, line 88 def critical_base(roll_times) case roll_times when 1, 2 roll_times else (roll_times.to_f / 2).ceil end end
fumble_?(dice_list)
click to toggle source
@return [Boolean] ファンブルか
# File lib/bcdice/game_system/BBN.rb, line 103 def fumble_?(dice_list) dice_list.count(1) >= @fumble end
parse(command)
click to toggle source
コマンド文字列をパースする
@param command [String] コマンド @return [Boolean] パースに成功したか
# File lib/bcdice/game_system/BBN.rb, line 66 def parse(command) m = /^(\d+)BN([+-]\d+)?(>=(([+-]?\d+)))?(\[([+-]?\d+)?(,([+-]?\d+))?\])?/.match(command) unless m return false end @roll_times = m[1].to_i @modify_str = m[2] || '' @modify = m[2].to_i @difficulty = m[4] ? m[4].to_i : nil base = critical_base(@roll_times) @critical = base + m[7].to_i @fumble = base + m[9].to_i return true end