class BCDice::GameSystem::StellarKnights

Constants

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/StellarKnights.rb, line 69
def initialize(command)
  super(command)

  @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
  @d66_sort_type = D66SortType::NO_SORT
end

Private Class Methods

translate_tables(locale) click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 194
def translate_tables(locale)
  {
    "TT" => DiceTable::D66GridTable.from_i18n("StellarKnights.tables.TT", locale),
    "STA" => DiceTable::Table.from_i18n("StellarKnights.tables.STA", locale),
    "STB" => DiceTable::D66OneThirdTable.from_i18n("StellarKnights.tables.STB", locale),
    "STB21" => DiceTable::Table.from_i18n("StellarKnights.tables.STB21", locale),
    "STB22" => DiceTable::Table.from_i18n("StellarKnights.tables.STB22", locale),
    "STB23" => DiceTable::Table.from_i18n("StellarKnights.tables.STB23", locale),
    "STB24" => DiceTable::Table.from_i18n("StellarKnights.tables.STB24", locale),
    "STB25" => DiceTable::Table.from_i18n("StellarKnights.tables.STB25", locale),
    "STB26" => DiceTable::Table.from_i18n("StellarKnights.tables.STB26", locale),
    "STC" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STC", locale),
    "GAT" => DiceTable::Table.from_i18n("StellarKnights.tables.GAT", locale),
    "HOT" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.HOT", locale),
    "DET" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.DET", locale),
    "WIT" => DiceTable::D66OneThirdTable.from_i18n("StellarKnights.tables.WIT", locale),
    "YST" => DiceTable::D66OneThirdTable.from_i18n("StellarKnights.tables.YST", locale),
    "YSTA" => DiceTable::D66OneThirdTable.from_i18n("StellarKnights.tables.YSTA", locale),
    "YSTM" => DiceTable::D66OneThirdTable.from_i18n("StellarKnights.tables.YSTM", locale),
    "STM" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STM", locale),
    "YSTL" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.YSTL", locale),
    "YSTR" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.YSTR", locale),
    "STBR" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STBR", locale),
    "STCR" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STCR", locale),
    "STBS" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STBS", locale),
    "STE" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STE", locale),
    "YSTB" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.YSTB", locale),
    "YSTF" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.YSTF", locale),
    "STAL" => DiceTable::D66HalfGridTable.from_i18n("StellarKnights.tables.STAL", locale),
  }
end

Public Instance Methods

eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 76
def eval_game_system_specific_command(command)
  command = command.upcase

  if (table = self.class::TABLES[command])
    table.roll(@randomizer)
  elsif (m = %r{([()+/\d]+)SK(\d)?((,\d>\d)+)?}.match(command))
    num_dices = Arithmetic.eval(m[1], RoundType::FLOOR)

    unless num_dices.nil?
      resolute_action(num_dices, m[2] && m[2].to_i, m[3])
    end
  elsif command == 'STB2'
    roll_all_situation_b2_tables
  elsif command == 'ALLS'
    roll_all_situation_tables
  elsif command == "PET"
    roll_personality_table
  elsif (m = /FT(\d+)?/.match(command))
    num = (m[1] || 5).to_i
    roll_fragment_table(num)
  end
end

Private Instance Methods

parse_dice_change_rules(text) click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 148
def parse_dice_change_rules(text)
  return [] if text.nil?

  # 正規表現の都合で先頭に ',' が残っているので取っておく
  text = text[1..-1]
  text.split(',').map do |rule|
    v = rule.split('>').map(&:to_i)
    {
      from: v[0],
      to: v[1],
    }
  end
end
remake_command(num_dices, defence, dice_change_text) click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 141
def remake_command(num_dices, defence, dice_change_text)
  command = "#{num_dices}SK"
  command += defence.to_s unless defence.nil?
  command += dice_change_text unless dice_change_text.nil?
  command
end
resolute_action(num_dices, defence, dice_change_text) click to toggle source

@param [Integer] num_dices @param [Integer | nil] defence @param [String] dice_change_text @return [Result, String]

# File lib/bcdice/game_system/StellarKnights.rb, line 105
def resolute_action(num_dices, defence, dice_change_text)
  dices = @randomizer.roll_barabara(num_dices, 6).sort
  dice_text = dices.join(",")

  output = "(#{remake_command(num_dices, defence, dice_change_text)}) > #{dice_text}"
  if dices.empty?
    return output + translate("StellarKnights.SK.no_dice_error")
  end

  # FAQによると、ダイスの置き換えは宣言された順番に適用されていく
  dice_change_rules = parse_dice_change_rules(dice_change_text)
  dice_change_rules.each do |rule|
    dices.map! { |val| val == rule[:from] ? rule[:to] : val }
  end

  unless dice_change_rules.empty?
    dices.sort!
    output += " > [#{dices.join(',')}]"
  end

  if defence.nil?
    success = false
    failure = false
  else
    success_num = dices.count { |val| val >= defence }
    output += " > " + translate("StellarKnights.SK.success_num", success_num: success_num)
    success = success_num > 0
    failure = !success
  end

  Result.new(output).tap do |r|
    r.success = success
    r.failure = failure
  end
end
roll_all_situation_b2_tables() click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 162
def roll_all_situation_b2_tables
  (1..6).map { |num| self.class::TABLES["STB2#{num}"].roll(@randomizer) }.join("\n")
end
roll_all_situation_tables() click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 166
def roll_all_situation_tables
  ['STA', 'STB', 'STC'].map { |command| self.class::TABLES[command].roll(@randomizer) }.join("\n")
end
roll_fragment_table(num) click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 178
def roll_fragment_table(num)
  if num <= 0
    return nil
  end

  results = Array.new(num) { get_table_by_d66(translate("StellarKnights.FT.items")) }
  values = results.map { |r| r[0] }
  indexes = results.map { |r| r[1] }
  name = translate("StellarKnights.FT.name")

  return "#{name}(#{indexes.join(',')}) > #{values.join(translate('StellarKnights.FT.sep'))}"
end
roll_personality_table() click to toggle source
# File lib/bcdice/game_system/StellarKnights.rb, line 170
def roll_personality_table
  value1, index1 = get_table_by_d66(translate("StellarKnights.PET.items"))
  value2, index2 = get_table_by_d66(translate("StellarKnights.PET.items"))
  name = translate("StellarKnights.PET.name")
  result = translate("StellarKnights.PET.result", value1: value1, value2: value2)
  return "#{name}(#{index1},#{index2}) > #{result}"
end