class BCDice::GameSystem::OracleEngine

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/OracleEngine.rb, line 39
def initialize(command)
  super(command)
  @sort_add_dice = true
  @sort_barabara_dice = true
end

Public Instance Methods

clamp(i, min, max) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 108
def clamp(i, min, max)
  if i < min
    min
  elsif i > max
    max
  else
    i
  end
end
clutch_roll(string) click to toggle source

クラッチロール

# File lib/bcdice/game_system/OracleEngine.rb, line 57
def clutch_roll(string)
  debug("clutch_roll begin", string)

  parser = Command::Parser.new(/\d+CL[67]?/, round_type: round_type)
                          .restrict_cmp_op_to(nil, :>=)

  @cmd = parser.parse(string)

  unless @cmd
    return nil
  end

  @times, @max_shift = @cmd.command.split("CL").map(&:to_i)
  @max_shift ||= 6
  @cmd.target_number = clamp(@cmd.target_number, 1, @max_shift) if @cmd.cmp_op

  if @times == 0
    return nil
  end

  dice_list = @randomizer.roll_barabara(@times, 6).map { |x| clamp(x + @cmd.modify_number, 1, @max_shift) }.sort

  sequence = [
    expr_clutch(),
    "[#{dice_list.join(', ')}]",
    result_clutch(dice_list.last)
  ]

  return sequence.join(' > ')
end
damage_roll(string) click to toggle source

ダメージロール

# File lib/bcdice/game_system/OracleEngine.rb, line 213
def damage_roll(string)
  parser = Command::Parser.new(/\d+D6/, round_type: round_type)
                          .restrict_cmp_op_to(nil)
                          .enable_dollar
  @cmd = parser.parse(string)
  return nil unless @cmd

  @times = @cmd.command.to_i
  @break = (@cmd.dollar || 0).abs

  if @times == 0
    return nil
  end

  dice_list = @randomizer.roll_barabara(@times, 6).sort
  dice_broken = dice_list.pop(@break)

  total_n = dice_list.inject(0, :+) + @cmd.modify_number
  total_n = 0 if total_n < 0

  sequence = [
    expr_damage(),
    result_damage(dice_list, dice_broken),
    total_n
  ]

  return sequence.join(' > ')
end
dice_result_r(dice_total, dice_list, break_list) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 166
def dice_result_r(dice_total, dice_list, break_list)
  modify_number_text = Format.modifier(@cmd.modify_number)

  if break_list.empty?
    "#{dice_total}[#{dice_list.join(', ')}]#{modify_number_text}"
  else
    "#{dice_total}[#{dice_list.join(', ')}]×[#{break_list.join(', ')}]#{modify_number_text}"
  end
end
eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 45
def eval_game_system_specific_command(command)
  case command
  when /\d+CL.*/i
    clutch_roll(command)
  when /\d+D6.*\$[+\-]?\d.*/
    damage_roll(command)
  when /\d+R6/
    r_roll(command)
  end
end
expr_clutch() click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 88
def expr_clutch()
  max_shift = @max_shift == 7 ? 7 : nil
  cmp_op = Format.comparison_operator(@cmd.cmp_op)
  modify_number = Format.modifier(@cmd.modify_number)

  "(#{@times}CL#{max_shift}#{modify_number}#{cmp_op}#{@cmd.target_number})"
end
expr_damage() click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 242
def expr_damage()
  modify_number = Format.modifier(@cmd.modify_number)
  brak = @break == 0 ? "" : "b[#{@break}]"

  "(#{@times}D6#{modify_number}#{brak})"
end
expr_r() click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 156
def expr_r()
  modify_number = Format.modifier(@cmd.modify_number)
  critical = @critical == 12 ? "" : "c[#{@critical}]"
  fumble = @fumble == 2 ? "" : "f[#{@fumble}]"
  brak = @break == 0 ? "" : "b[#{@break}]"
  cmp_op = Format.comparison_operator(@cmd.cmp_op)

  "(#{@times}R6#{modify_number}#{critical}#{fumble}#{brak}#{cmp_op}#{@cmd.target_number})"
end
normalize_critical(critical, string) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 192
def normalize_critical(critical, string)
  if /@[+-]/.match(string)
    critical = 12 + critical
  end

  if critical < 2
    critical = 2
  end

  return critical
end
normalize_fumble(fumble, string) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 204
def normalize_fumble(fumble, string)
  if /#[+-]/.match(string)
    fumble = 2 + fumble
  end

  return clamp(fumble, 0, 12)
end
r_roll(string) click to toggle source

判定

# File lib/bcdice/game_system/OracleEngine.rb, line 119
def r_roll(string)
  parser = Command::Parser.new(/\d+R6/, round_type: round_type)
                          .restrict_cmp_op_to(nil, :>=)
                          .enable_critical
                          .enable_fumble
                          .enable_dollar
  @cmd = parser.parse(string)
  unless @cmd
    return nil
  end

  @times = @cmd.command.to_i

  if @times == 0
    return nil
  end

  @critical = normalize_critical(@cmd.critical || 12, string)
  @fumble = normalize_fumble(@cmd.fumble || 2, string)
  @break = (@cmd.dollar || 0).abs

  dice_list = @randomizer.roll_barabara(@times, 6).sort
  dice_broken = dice_list.pop(@break)

  # ブレイク後のダイスから最大値2つの合計がダイスの値
  dice_total = dice_list.dup.pop(2).inject(0, :+)
  total = dice_total + @cmd.modify_number

  sequence = [
    expr_r(),
    dice_result_r(dice_total, dice_list, dice_broken),
    result_r(dice_total, total)
  ]

  return sequence.join(' > ')
end
result_clutch(after_shift) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 96
def result_clutch(after_shift)
  if @cmd.cmp_op != :>=
    "シフト#{after_shift}"
  elsif after_shift >= @cmd.target_number
    "成功 シフト#{@cmd.target_number}"
  else
    after_shift -= 1
    after_shift = 1 if after_shift < 1
    "失敗 シフト#{after_shift}"
  end
end
result_damage(dice_list, break_list) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 249
def result_damage(dice_list, break_list)
  dice_total = dice_list.inject(0, :+)
  modify_number_text = Format.modifier(@cmd.modify_number)

  if break_list.empty?
    "#{dice_total}[#{dice_list.join(', ')}]#{modify_number_text}"
  else
    "#{dice_total}[#{dice_list.join(', ')}]×[#{break_list.join(', ')}]#{modify_number_text}"
  end
end
result_r(dice_total, total) click to toggle source
# File lib/bcdice/game_system/OracleEngine.rb, line 176
def result_r(dice_total, total)
  if dice_total <= @fumble
    "ファンブル!"
  elsif dice_total >= @critical
    "クリティカル!"
  elsif @cmd.cmp_op == :>=
    if total >= @cmd.target_number
      "#{total} 成功"
    else
      "#{total} 失敗"
    end
  else
    total.to_s
  end
end