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