class BCDice::GameSystem::ToshiakiHolyGrailWar

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/ToshiakiHolyGrailWar.rb, line 28
def eval_game_system_specific_command(command)
  roll_f(command)
end

Private Instance Methods

negative_modifier_bonus(modifier) click to toggle source
# File lib/bcdice/game_system/ToshiakiHolyGrailWar.rb, line 87
def negative_modifier_bonus(modifier)
  modifier <= -5 ? 1 : 0
end
positive_modifier_penalty(modifier) click to toggle source
# File lib/bcdice/game_system/ToshiakiHolyGrailWar.rb, line 79
def positive_modifier_penalty(modifier)
  if modifier <= 10
    0
  else
    modifier / 10
  end
end
roll_f(command) click to toggle source
# File lib/bcdice/game_system/ToshiakiHolyGrailWar.rb, line 34
def roll_f(command)
  parser = Command::Parser.new(/F(\d+)(\+\d+)*(-\d+)*/, round_type: RoundType::CEIL)
                          .disable_modifier
                          .enable_critical
  cmd = parser.parse(command)
  unless cmd
    return nil
  end

  m = cmd.command.match(/^F(\d+)((?:\+\d+)+)?((?:-\d+)+)?$/)
  unless m
    return nil
  end

  status = m[1].to_i
  positive_modifier = m[2] ? Arithmetic.eval(m[2], RoundType::CEIL) : 0
  negative_modifier = m[3] ? Arithmetic.eval(m[3], RoundType::CEIL) : 0
  side_bonus = cmd.critical || 0

  times = [status + positive_modifier + negative_modifier, 0].max
  sides = (6 - positive_modifier_penalty(positive_modifier) + negative_modifier_bonus(negative_modifier) + side_bonus).clamp(2, 10)

  list = @randomizer.roll_barabara(times, sides)
  total = list.sum()
  result =
    if cmd.cmp_op.nil?
      Result.new
    elsif total.send(cmd.cmp_op, cmd.target_number)
      Result.success("成功")
    else
      Result.failure("失敗")
    end

  sequence = [
    cmd,
    "(#{times}D#{sides}#{cmd.cmp_op}#{cmd.target_number})",
    "#{total}[#{list.join(',')}]",
    total,
    result.text,
  ].compact

  result.text = sequence.join(" > ")
  return result
end