class BCDice::GameSystem::Amadeus

Constants

CHECK_DICE_COUNT
HELP_MESSAGE

ダイスボットの使い方

ID

ゲームシステムの識別子

NAME

ゲームシステム名

SORT_KEY

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

TABLES

Public Class Methods

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

  @sort_add_dice = true
  @enabled_d66 = true
  @d66_sort_type = D66SortType::ASC
end

Private Class Methods

translate_tables(locale) click to toggle source
# File lib/bcdice/game_system/Amadeus.rb, line 134
def translate_tables(locale)
  {
    "ECT" => DiceTable::Table.from_i18n("Amadeus.table.ECT", locale),
    "BST" => DiceTable::Table.from_i18n("Amadeus.table.BST", locale),
    "RT" => DiceTable::Table.from_i18n("Amadeus.table.RT", locale),
    "PRT" => DiceTable::Table.from_i18n("Amadeus.table.PRT", locale),
    "FT" => DiceTable::Table.from_i18n("Amadeus.table.FT", locale),
    "BT" => DiceTable::D66Table.from_i18n("Amadeus.table.BT", locale),
    "FWT" => DiceTable::Table.from_i18n("Amadeus.table.FWT", locale),
    "BRT" => DiceTable::Table.from_i18n("Amadeus.table.BRT", locale),
    "RIT" => DiceTable::Table.from_i18n("Amadeus.table.RIT", locale),
    "WT" => DiceTable::Table.from_i18n("Amadeus.table.WT", locale),
    "NMT" => DiceTable::Table.from_i18n("Amadeus.table.NMT", locale),
    "TGT" => DiceTable::Table.from_i18n("Amadeus.table.TGT", locale),
    "CST" => DiceTable::Table.from_i18n("Amadeus.table.CST", locale),
    "GCVT" => DiceTable::Table.from_i18n("Amadeus.table.GCVT", locale),
    "YCVT" => DiceTable::Table.from_i18n("Amadeus.table.YCVT", locale),
    "ECVT" => DiceTable::Table.from_i18n("Amadeus.table.ECVT", locale),
    "CCVT" => DiceTable::Table.from_i18n("Amadeus.table.CCVT", locale),
    "NCVT" => DiceTable::Table.from_i18n("Amadeus.table.NCVT", locale),
    "DGVT" => DiceTable::Table.from_i18n("Amadeus.table.DGVT", locale),
    "DAVT" => DiceTable::Table.from_i18n("Amadeus.table.DAVT", locale),
    "PRCT" => DiceTable::Table.from_i18n("Amadeus.table.PRCT", locale),
    "TCCT" => DiceTable::Table.from_i18n("Amadeus.table.TCCT", locale),
    "INCT" => DiceTable::Table.from_i18n("Amadeus.table.INCT", locale),
    "PSCT" => DiceTable::Table.from_i18n("Amadeus.table.PSCT", locale),
    "LVCT" => DiceTable::Table.from_i18n("Amadeus.table.LVCT", locale),
    "DACT" => DiceTable::Table.from_i18n("Amadeus.table.DACT", locale),
    "RGT" => DiceTable::Table.from_i18n("Amadeus.table.RGT", locale),
    "FBT" => DiceTable::Table.from_i18n("Amadeus.table.FBT", locale),
    "CHVT" => DiceTable::Table.from_i18n("Amadeus.table.CHVT", locale),
    "LCVT" => DiceTable::Table.from_i18n("Amadeus.table.LCVT", locale),
    "KCVT" => DiceTable::Table.from_i18n("Amadeus.table.KCVT", locale),
    "SAT" => DiceTable::D66Table.from_i18n("Amadeus.table.SAT", locale),
    "SMT" => DiceTable::D66Table.from_i18n("Amadeus.table.SMT", locale),
  }
end

Public Instance Methods

eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/Amadeus.rb, line 52
def eval_game_system_specific_command(command)
  roll_amadeus(command) ||
    roll_tables(command, self.class::TABLES)
end

Private Instance Methods

roll_amadeus(command) click to toggle source
# File lib/bcdice/game_system/Amadeus.rb, line 59
def roll_amadeus(command)
  m = /^R([A-DS])([+\-\d]*)(@(\d))?((>=?)([+\-\d]*))?(@(\d))?$/i.match(command)
  unless m
    return nil
  end

  rank = m[1]
  modifier = ArithmeticEvaluator.eval(m[2])
  cmp_op = m[6] ? Normalize.comparison_operator(m[6]) : :>=
  target = m[7] ? ArithmeticEvaluator.eval(m[7]) : 4
  special = (m[4] || m[9] || 6).to_i

  dice_count = CHECK_DICE_COUNT[rank]

  dice_list = @randomizer.roll_barabara(dice_count, 6)
  dice_text = dice_list.join(",")
  special_text = (special == 6 ? "" : "@#{special}")

  dice_list = [dice_list.min] if rank == "D"
  available_inga = dice_list.size > 1
  inga_table = translate("Amadeus.inga_table")

  success = false
  critical = false
  fumble = false

  results =
    dice_list.map do |dice|
      total = dice + modifier
      result =
        if dice == 1
          fumble = true
          translate("Amadeus.fumble")
        elsif dice >= special
          critical = true
          success = true
          translate("Amadeus.special")
        elsif total.send(cmp_op, target)
          success = true
          translate("success")
        else
          translate("failure")
        end

      if available_inga
        inga = inga_table[dice - 1]
        "#{total}_#{result}[#{dice}#{inga}]"
      else
        "#{total}_#{result}[#{dice}]"
      end
    end

  sequence = [
    "(R#{rank}#{Format.modifier(modifier)}#{special_text}#{cmp_op}#{target})",
    "[#{dice_text}]#{Format.modifier(modifier)}",
    results.join(" / ")
  ]

  Result.new.tap do |r|
    r.text = sequence.join(" > ")
    if success
      r.success = true
      r.critical = critical
    else
      r.failure = true
      r.fumble = fumble
    end
  end
end