class BCDice::GameSystem::Cthulhu7th_ChineseTraditional

Constants

HELP_MESSAGE

ダイスボットの使い方

ID

ゲームシステムの識別子

NAME

ゲームシステム名

SORT_KEY

ゲームシステム名の読みがな

Public Class Methods

new(command) click to toggle source
Calls superclass method BCDice::Base::new
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 40
def initialize(command)
  super(command)

  @bonus_dice_range = (-2..2)
end

Public Instance Methods

eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 46
def eval_game_system_specific_command(command)
  case command
  when /CC/i
    return getCheckResult(command)
  when /CBR/i
    return getCombineRoll(command)
  when /FAR/i
    return getFullAutoResult(command)
  end

  return nil
end
getBulletResults(bullet_count, hit_type, diff) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 270
def getBulletResults(bullet_count, hit_type, diff)
  bullet_set_count = getSetOfBullet(diff)
  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
      hit_bullet_count = impale_bullet_count_base.floor
      impale_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
      halfbull = bullet_count / 2.to_f

      hit_bullet_count = halfbull.floor
      impale_bullet_count = halfbull.ceil
    end

    lost_bullet_count = bullet_count
  end

  return hit_bullet_count, impale_bullet_count, lost_bullet_count
end
getCheckResult(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 59
def getCheckResult(command)
  nil unless /^CC([-\d]+)?<=(\d+)/i =~ command
  bonus_dice_count = Regexp.last_match(1).to_i # 獎勵、懲罰骰數量
  diff = Regexp.last_match(2).to_i

  return "錯誤。目標值需為1以上。" if diff <= 0

  unless @bonus_dice_range.include?(bonus_dice_count)
    return "錯誤。獎勵、懲罰骰値為#{@bonus_dice_range.min}~#{@bonus_dice_range.max}。"
  end

  output = ""
  output += "(1D100<=#{diff})"
  output += " 獎勵、懲罰骰値[#{bonus_dice_count}]"

  units_digit = rollPercentD10
  total_list = getTotalLists(bonus_dice_count, units_digit)

  total = getTotal(total_list, bonus_dice_count)
  result_text = getCheckResultText(total, diff)

  output += " > #{total_list.join(', ')} > #{total} > #{result_text}"

  return output
end
getCheckResultText(total, diff, fumbleable = false) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 113
def getCheckResultText(total, diff, fumbleable = false)
  if total <= diff
    return "決定性的成功" if total == 1
    return "極限的成功" if total <= (diff / 5)
    return "困難的成功" if total <= (diff / 2)

    return "通常成功"
  end

  fumble_text = "致命的失敗"

  return fumble_text if total == 100

  if total >= 96
    if diff < 50
      return fumble_text
    else
      return fumble_text if fumbleable
    end
  end

  return "失敗"
end
getCombineRoll(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 137
def getCombineRoll(command)
  return nil unless /CBR\((\d+),(\d+)\)/i =~ command

  diff_1 = Regexp.last_match(1).to_i
  diff_2 = Regexp.last_match(2).to_i

  total = @randomizer.roll_once(100)

  result_1 = getCheckResultText(total, diff_1)
  result_2 = getCheckResultText(total, diff_2)

  successList = ["決定性的成功", "極限的成功", "困難的成功", "通常成功"]

  succesCount = 0
  succesCount += 1 if successList.include?(result_1)
  succesCount += 1 if successList.include?(result_2)
  debug("succesCount", succesCount)

  rank =
    if succesCount >= 2
      "成功"
    elsif succesCount == 1
      "部分的成功"
    else
      "失敗"
    end

  return "(1d100<=#{diff_1},#{diff_2}) > #{total}[#{result_1},#{result_2}] > #{rank}"
end
getFullAutoResult(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 167
def getFullAutoResult(command)
  return nil unless /^FAR\((-?\d+)(,(-?\d+))(,(-?\d+))(,(-?\d+))?\)/i =~ command

  bullet_count = Regexp.last_match(1).to_i
  diff = Regexp.last_match(3).to_i
  broken_number = Regexp.last_match(5).to_i
  bonus_dice_count = (Regexp.last_match(7) || 0).to_i

  output = ""

  # 射擊數不超過(8回*(PC技能値最大値/10))=72的上限
  bullet_count_limit = 100
  if bullet_count > bullet_count_limit
    output += "\n彈藥太多。請改裝填#{bullet_count_limit}發。\n"
    bullet_count = bullet_count_limit
  end

  return "正確裝填數。" if bullet_count <= 0
  return "正確目標值。" if diff <= 0

  if broken_number < 0
    output += "\n正確故障值。排除獎勵記號。\n"
    broken_number = broken_number.abs
  end

  unless @bonus_dice_range.include?(bonus_dice_count)
    return "\n錯誤。獎勵、懲罰骰値為#{@bonus_dice_range.min}~#{@bonus_dice_range.max}です。"
  end

  output += "獎勵、懲罰骰値[#{bonus_dice_count}]"
  output += rollFullAuto(bullet_count, diff, broken_number, bonus_dice_count)

  return output
end
getFumbleable(more_difficlty) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 380
def getFumbleable(more_difficlty)
  # 成功判定時因只擲出49以下數值,而大失敗率上昇
  return (more_difficlty >= 1)
end
getHitBulletCountBase(diff, bullet_set_count) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 356
def getHitBulletCountBase(diff, bullet_set_count)
  hit_bullet_count_base = (bullet_set_count / 2)

  if (diff >= 1) && (diff < 10)
    hit_bullet_count_base = 1 # 技能值9以下的最低限度保障處理
  end

  return hit_bullet_count_base
end
getHitResultInfos(dice_num, diff, more_difficlty) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 246
def getHitResultInfos(dice_num, diff, more_difficlty)
  units_digit = rollPercentD10
  total_list = getTotalLists(dice_num, units_digit)
  total = getTotal(total_list, dice_num)

  fumbleable = getFumbleable(more_difficlty)
  hit_result = getCheckResultText(total, diff, fumbleable)

  return hit_result, total, total_list
end
getHitResultText(output, counts) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 257
def getHitResultText(output, counts)
  return "#{output}\n> #{counts[:hit_bullet]}發射擊命中、#{counts[:impale_bullet]}射擊貫穿、剩餘彈藥#{counts[:bullet]}發"
end
getHitType(more_difficlty, hit_result) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 261
def getHitType(more_difficlty, hit_result)
  successList, impaleBulletList = getSuccessListImpaleBulletList(more_difficlty)

  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_ChineseTraditional.rb, line 370
def getLastHitBulletCount(bullet_count)
  # 在剩餘彈藥為1的最低限度保障處理
  if bullet_count == 1
    return 1
  end

  count = (bullet_count / 2.to_f).floor
  return count
end
getNextDifficltyMessage(more_difficlty) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 333
def getNextDifficltyMessage(more_difficlty)
  case more_difficlty
  when 1
    return "\n    變更難度為困難的成功"
  when 2
    return "\n    變更難度為極限的成功"
  when 3
    return "\n    變更難度為決定性的成功"
  end

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

  if (diff >= 1) && (diff < 10)
    bullet_set_count = 1 # 技能值9以下的最低限度保障處理
  end

  return bullet_set_count
end
getSuccessListImpaleBulletList(more_difficlty) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 311
def getSuccessListImpaleBulletList(more_difficlty)
  successList = []
  impaleBulletList = []

  case more_difficlty
  when 0
    successList = ["困難的成功", "通常成功"]
    impaleBulletList = ["決定性的成功", "極限的成功"]
  when 1
    successList = ["困難的成功"]
    impaleBulletList = ["決定性的成功", "極限的成功"]
  when 2
    successList = []
    impaleBulletList = ["決定性的成功", "極限的成功"]
  when 3
    successList = ["決定性的成功"]
    impaleBulletList = []
  end

  return successList, impaleBulletList
end
getTotal(total_list, bonus_dice_count) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 107
def getTotal(total_list, bonus_dice_count)
  return total_list.min if bonus_dice_count >= 0

  return total_list.max
end
getTotalLists(bonus_dice_count, units_digit) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 92
def getTotalLists(bonus_dice_count, units_digit)
  total_list = []

  tens_digit_count = 1 + bonus_dice_count.abs
  tens_digit_count.times do
    bonus = rollPercentD10
    total = (bonus * 10) + units_digit
    total = 100 if total == 0

    total_list.push(total)
  end

  return total_list
end
isLastBulletTurn(bullet_count, bullet_set_count) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 366
def isLastBulletTurn(bullet_count, bullet_set_count)
  ((bullet_count - bullet_set_count) < 0)
end
rollFullAuto(bullet_count, diff, broken_number, dice_num) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 202
def rollFullAuto(bullet_count, diff, broken_number, dice_num)
  output = ""
  loopCount = 0

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

  # 難度變更用Loop
  (0..3).each do |more_difficlty|
    output += getNextDifficltyMessage(more_difficlty)

    # ペナルティダイスを減らしながらロール用ループ削減獎勵骰時角色用Loop
    while dice_num >= @bonus_dice_range.min

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

      if total >= broken_number
        output += "卡彈"
        return getHitResultText(output, counts)
      end

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

      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

    dice_num += 1
  end

  return getHitResultText(output, counts)
end
rollPercentD10() click to toggle source
# File lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb, line 85
def rollPercentD10
  dice = @randomizer.roll_once(10)
  dice = 0 if dice == 10

  return dice
end