class BCDice::GameSystem::Cthulhu7th

Constants

FAILED_CASTING_L_TABLE

キャスティング・ロールのプッシュに失敗した場合(小)

FAILED_CASTING_M_TABLE

キャスティング・ロールのプッシュに失敗した場合(大)

HELP_MESSAGE

ダイスボットの使い方

ID

ゲームシステムの識別子

MADNESS_REAL_TIME_TABLE
MADNESS_SUMMARY_TABLE
MANIAS_TABLE

マニア表

NAME

ゲームシステム名

PHOBIAS_TABLE

恐怖症表

SORT_KEY

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

Public Instance Methods

eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th.rb, line 59
def eval_game_system_specific_command(command)
  case command
  when /^CC/i
    skill_roll(command)
  when /^CBR/i
    combine_roll(command)
  when /^FAR/i
    getFullAutoResult(command)
  when /^BMR/i # 狂気の発作(リアルタイム)
    roll_bmr_table()
  when /^BMS/i # 狂気の発作(サマリー)
    roll_bms_table()
  when /^FCL/i # キャスティング・ロールのプッシュに失敗した場合(小)
    roll_1d8_table("キャスティング・ロール失敗(小)表", FAILED_CASTING_L_TABLE)
  when /^FCM/i # キャスティング・ロールのプッシュに失敗した場合(大)
    roll_1d8_table("キャスティング・ロール失敗(大)表", FAILED_CASTING_M_TABLE)
  when /^PH/i # 恐怖症表
    roll_1d100_table("恐怖症表", PHOBIAS_TABLE)
  when /^MA/i # マニア表
    roll_1d100_table("マニア表", MANIAS_TABLE)
  end
end

Private Instance Methods

combine_roll(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th.rb, line 244
def combine_roll(command)
  m = /^CBR\((\d+),(\d+)\)$/.match(command)
  return nil unless m

  difficulty_1 = m[1].to_i
  difficulty_2 = m[2].to_i

  total = @randomizer.roll_once(100)

  result_1 = ResultLevel.from_values(total, difficulty_1)
  result_2 = ResultLevel.from_values(total, difficulty_2)

  rank =
    if result_1.success? && result_2.success?
      "成功"
    elsif result_1.success? || result_2.success?
      "部分的成功"
    else
      "失敗"
    end

  Result.new.tap do |r|
    r.text = "(1d100<=#{difficulty_1},#{difficulty_2}) > #{total}[#{result_1},#{result_2}] > #{rank}"
    r.success = result_1.success? && result_2.success?
    r.failure = result_1.failure? && result_2.failure?
  end
end
getFullAutoResult(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th.rb, line 240
def getFullAutoResult(command)
  FullAuto.eval(command, @randomizer)
end
roll_1d100_table(table_name, table) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th.rb, line 175
def roll_1d100_table(table_name, table)
  total_n = @randomizer.roll_once(100)
  index = total_n - 1

  text = table[index]

  return "#{table_name}(#{total_n}) > #{text}"
end
roll_1d8_table(table_name, table) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th.rb, line 166
def roll_1d8_table(table_name, table)
  total_n = @randomizer.roll_once(8)
  index = total_n - 1

  text = table[index]

  return "#{table_name}(#{total_n}) > #{text}"
end
roll_bmr_table() click to toggle source

表一式 即時の恐怖症表

# File lib/bcdice/game_system/Cthulhu7th.rb, line 274
def roll_bmr_table()
  total_n = @randomizer.roll_once(10)
  text = MADNESS_REAL_TIME_TABLE[total_n - 1]

  time_n = @randomizer.roll_once(10)

  return "狂気の発作(リアルタイム)(#{total_n}) > #{text}(1D10>#{time_n}ラウンド)"
end
roll_bms_table() click to toggle source

略式の恐怖表

# File lib/bcdice/game_system/Cthulhu7th.rb, line 297
def roll_bms_table()
  total_n = @randomizer.roll_once(10)
  text = MADNESS_SUMMARY_TABLE[total_n - 1]

  time_n = @randomizer.roll_once(10)

  return "狂気の発作(サマリー)(#{total_n}) > #{text}(1D10>#{time_n}時間)"
end
skill_roll(command) click to toggle source
# File lib/bcdice/game_system/Cthulhu7th.rb, line 184
def skill_roll(command)
  m = /^CC([-+]?\d+)?(?:<=(\d+)([RHEC])?)?$/.match(command)
  unless m
    return nil
  end

  bonus_dice = m[1].to_i
  difficulty = m[2]&.to_i
  difficulty_level = m[3]

  if difficulty == 0
    difficulty = nil
  elsif difficulty_level == "H"
    difficulty /= 2
  elsif difficulty_level == "E"
    difficulty /= 5
  elsif difficulty_level == "C"
    difficulty = 0
  end

  if bonus_dice == 0 && difficulty.nil?
    dice = @randomizer.roll_once(100)
    return "1D100 > #{dice}"
  end

  if bonus_dice.abs > 100
    return "ボーナス・ペナルティダイスの値は-100以上、100以下としてください"
  end

  total, total_list = roll_with_bonus(bonus_dice)

  expr = difficulty.nil? ? "1D100" : "1D100<=#{difficulty}"
  result =
    if difficulty_level
      ResultLevel.with_difficulty_level(total, difficulty)
    elsif difficulty
      ResultLevel.from_values(total, difficulty)
    end

  sequence = [
    "(#{expr}) ボーナス・ペナルティダイス[#{bonus_dice}]",
    total_list.join(", "),
    total,
    result,
  ].compact

  Result.new.tap do |r|
    r.text = sequence.join(" > ")
    if result
      r.condition = result.success?
      r.critical = result.critical?
      r.fumble = result.fumble?
    end
  end
end