class BCDice::GameSystem::Cthulhu7th::FullAuto

Constants

BONUS_DICE_RANGE
ROLL_FULL_AUTO_DIFFICULTY_THRESHOLD

連射処理を止める条件(難易度の閾値) @return [Hash<String, Integer>]

成功の種類の小文字表記 => 難易度の閾値

Public Class Methods

eval(command, randomizer) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 22
def self.eval(command, randomizer)
  new.eval(command, randomizer)
end

Public Instance Methods

eval(command, randomizer) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 26
def eval(command, randomizer)
  @randomizer = randomizer
  getFullAutoResult(command)
end

Private Instance Methods

getBulletResults(bullet_count, hit_type, diff, bullet_set_count_cap) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 175
def getBulletResults(bullet_count, hit_type, diff, bullet_set_count_cap)
  bullet_set_count = getSetOfBullet(diff, bullet_set_count_cap)
  hit_bullet_count_base = getHitBulletCountBase(diff, bullet_set_count)
  impale_bullet_count_base = (bullet_set_count / 2.to_f)

  lost_bullet_count = 0
  hit_bullet_count = 0
  impale_bullet_count = 0

  if !isLastBulletTurn(bullet_count, bullet_set_count)

    case hit_type
    when :hit
      hit_bullet_count = hit_bullet_count_base # 通常命中した弾数の計算

    when :impale
      impale_bullet_count = impale_bullet_count_base.floor # 貫通した弾数の計算
      hit_bullet_count = impale_bullet_count_base.ceil
    end

    lost_bullet_count = bullet_set_count

  else

    case hit_type
    when :hit
      hit_bullet_count = getLastHitBulletCount(bullet_count)

    when :impale
      impale_bullet_count = getLastHitBulletCount(bullet_count)
      hit_bullet_count = bullet_count - impale_bullet_count
    end

    lost_bullet_count = bullet_count
  end

  return hit_bullet_count, impale_bullet_count, lost_bullet_count
end
getFullAutoResult(command) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 35
def getFullAutoResult(command)
  m = /^FAR\((-?\d+),(-?\d+),(-?\d+)(?:,(-?\d+)?)?(?:,(-?\w+)?)?(?:,(-?\d+)?)?\)$/i.match(command)
  unless m
    return nil
  end

  bullet_count = m[1].to_i
  diff = m[2].to_i
  broken_number = m[3].to_i
  bonus_dice_count = m[4]&.to_i || 0
  stop_count = m[5]&.downcase || ""
  bullet_set_count_cap = m[6]&.to_i || diff / 10

  output = ""

  # 最大で(8回*(PC技能値最大値/10))=72発しか撃てないはずなので上限
  bullet_count_limit = 100
  if bullet_count > bullet_count_limit
    output += "弾薬が多すぎます。装填された弾薬を#{bullet_count_limit}発に変更します。\n"
    bullet_count = bullet_count_limit
  end

  # ボレーの上限の設定がおかしい場合の注意表示
  if (bullet_set_count_cap > diff / 10) && (diff > 39) && !m[6].nil?
    bullet_set_count_cap = diff / 10
    output += "ボレーの弾丸の数の上限は\[技能値÷10(切り捨て)\]発なので、それより高い数を指定できません。ボレーの弾丸の数を#{bullet_set_count_cap}発に変更します。\n"
  elsif (diff <= 39) && (bullet_set_count_cap > 3) && !m[6].nil?
    bullet_set_count_cap = 3
    output += "技能値が39以下ではボレーの弾丸の数の上限および下限は3発です。ボレーの弾丸の数を#{bullet_set_count_cap}発に変更します。\n"
  end

  # ボレーの下限の設定がおかしい場合の注意表示およびエラー表示
  return "ボレーの弾丸の数は正の数です。" if (bullet_set_count_cap <= 0) && !m[6].nil?

  if (bullet_set_count_cap < 3) && !m[6].nil?
    bullet_set_count_cap = 3
    output += "ボレーの弾丸の数の下限は3発です。ボレーの弾丸の数を3発に変更します。\n"
  end

  return "弾薬は正の数です。" if bullet_count <= 0
  return "目標値は正の数です。" if diff <= 0

  if broken_number < 0
    output += "故障ナンバーは正の数です。マイナス記号を外します。\n"
    broken_number = broken_number.abs
  end

  unless BONUS_DICE_RANGE.include?(bonus_dice_count)
    return "エラー。ボーナス・ペナルティダイスの値は#{BONUS_DICE_RANGE.min}~#{BONUS_DICE_RANGE.max}です。"
  end

  output += "ボーナス・ペナルティダイス[#{bonus_dice_count}]"
  output += rollFullAuto(bullet_count, diff, broken_number, bonus_dice_count, stop_count, bullet_set_count_cap)

  return output
end
getFumbleable(more_difficulty) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 287
def getFumbleable(more_difficulty)
  # 成功が49以下の出目のみとなるため、ファンブル値は上昇
  return (more_difficulty >= 1)
end
getHitBulletCountBase(diff, bullet_set_count) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 263
def getHitBulletCountBase(diff, bullet_set_count)
  hit_bullet_count_base = (bullet_set_count / 2)

  if (diff >= 1) && (diff < 30)
    hit_bullet_count_base = 1 # 技能値29以下での最低値保障
  end

  return hit_bullet_count_base
end
getHitResultInfos(dice_num, diff, more_difficulty) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 153
def getHitResultInfos(dice_num, diff, more_difficulty)
  total, total_list = roll_with_bonus(dice_num)

  fumbleable = getFumbleable(more_difficulty)
  hit_result = ResultLevel.from_values(total, diff, fumbleable).to_s

  return hit_result, total, total_list
end
getHitResultText(output, counts) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 162
def getHitResultText(output, counts)
  return "#{output}\n> #{counts[:hit_bullet]}発が通常命中、#{counts[:impale_bullet]}発が貫通、残弾#{counts[:bullet]}発"
end
getHitType(more_difficulty, hit_result) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 166
def getHitType(more_difficulty, hit_result)
  successList, impaleBulletList = getSuccessListImpaleBulletList(more_difficulty)

  return :hit if successList.include?(hit_result)
  return :impale if impaleBulletList.include?(hit_result)

  return ""
end
getLastHitBulletCount(bullet_count) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 277
def getLastHitBulletCount(bullet_count)
  # 残弾1での最低値保障処理
  if bullet_count == 1
    return 1
  end

  count = (bullet_count / 2.to_f).floor
  return count
end
getNextDifficultyMessage(more_difficulty) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 236
def getNextDifficultyMessage(more_difficulty)
  case more_difficulty
  when 1
    return "\n【難易度がハードに変更】"
  when 2
    return "\n【難易度がイクストリームに変更】"
  when 3
    return "\n【難易度がクリティカルに変更】"
  end

  return ""
end
getSetOfBullet(diff, bullet_set_count_cap) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 249
def getSetOfBullet(diff, bullet_set_count_cap)
  bullet_set_count = diff / 10

  if bullet_set_count_cap < bullet_set_count
    bullet_set_count = bullet_set_count_cap
  end

  if (diff >= 1) && (diff < 30)
    bullet_set_count = 3 # 技能値が29以下での最低値保障処理
  end

  return bullet_set_count
end
getSuccessListImpaleBulletList(more_difficulty) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 214
def getSuccessListImpaleBulletList(more_difficulty)
  successList = []
  impaleBulletList = []

  case more_difficulty
  when 0
    successList = ["ハード成功", "レギュラー成功"]
    impaleBulletList = ["クリティカル", "イクストリーム成功"]
  when 1
    successList = ["ハード成功"]
    impaleBulletList = ["クリティカル", "イクストリーム成功"]
  when 2
    successList = []
    impaleBulletList = ["クリティカル", "イクストリーム成功"]
  when 3
    successList = ["クリティカル"]
    impaleBulletList = []
  end

  return successList, impaleBulletList
end
isLastBulletTurn(bullet_count, bullet_set_count) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 273
def isLastBulletTurn(bullet_count, bullet_set_count)
  ((bullet_count - bullet_set_count) < 0)
end
rollFullAuto(bullet_count, diff, broken_number, dice_num, stop_count, bullet_set_count_cap) click to toggle source
# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 92
def rollFullAuto(bullet_count, diff, broken_number, dice_num, stop_count, bullet_set_count_cap)
  output = ""
  loopCount = 0

  counts = {
    hit_bullet: 0,
    impale_bullet: 0,
    bullet: bullet_count,
  }

  # 難易度変更用ループ
  (0..3).each do |more_difficulty|
    output += getNextDifficultyMessage(more_difficulty)

    # ペナルティダイスを減らしながらロール用ループ
    while dice_num >= BONUS_DICE_RANGE.min

      loopCount += 1
      hit_result, total, total_list = getHitResultInfos(dice_num, diff, more_difficulty)
      output += "\n#{loopCount}回目: > #{total_list.join(', ')} > #{hit_result}"

      if total >= broken_number
        output += " ジャム"
        return getHitResultText(output, counts)
      end

      hit_type = getHitType(more_difficulty, hit_result)
      hit_bullet, impale_bullet, lost_bullet = getBulletResults(counts[:bullet], hit_type, diff, bullet_set_count_cap)

      output += " (#{hit_bullet}発が命中、#{impale_bullet}発が貫通)"

      counts[:hit_bullet] += hit_bullet
      counts[:impale_bullet] += impale_bullet
      counts[:bullet] -= lost_bullet

      return getHitResultText(output, counts) if counts[:bullet] <= 0

      dice_num -= 1
    end

    # 指定された難易度となった場合、連射処理を途中で止める
    if shouldStopRollFullAuto?(stop_count, more_difficulty)
      output += "\n【指定の難易度となったので、処理を終了します。】"
      break
    end

    dice_num += 1
  end

  return getHitResultText(output, counts)
end
shouldStopRollFullAuto?(stop_count, difficulty) click to toggle source

連射処理を止めるべきかどうかを返す @param [String] stop_count 成功の種類 @param [Integer] difficulty 難易度 @return [Boolean]

# File lib/bcdice/game_system/cthulhu7th/full_auto.rb, line 148
def shouldStopRollFullAuto?(stop_count, difficulty)
  difficulty_threshold = ROLL_FULL_AUTO_DIFFICULTY_THRESHOLD[stop_count]
  return difficulty_threshold && difficulty >= difficulty_threshold
end