class BCDice::GameSystem::Villaciel

Constants

ACCIDENT_CHART
ARMESEAR_PETIT_QUEST_CHART
ARMESEAR_PREVIOUS_JOB_CHART
D6
EDIBLE_PLANT2_CHARTS
EDIBLE_PLANT_CHARTS
FAILURE_STR
FISHING_BLACK_CHART
FISHING_COMMON_CHART
FISHING_GRAY_CHART
FISHING_LAKE_CHART
FISHING_RIVER_CHART
FISHING_SALT_LAKE_CHART
FISHING_WHITE_CHART
HELP_MESSAGE

ダイスボットの使い方

ID

ゲームシステムの識別子

IMPROVED_SPECIES_CHART
INEDIBLE_PLANT2_CHART
INEDIBLE_PLANT_CHART
LEAST_GEM_SUCCESS_ROLL
LEAST_MINING_SUCCESS_ROLL
LEAST_SUCCESS_ROLL
MOHUMOHU_ANIMAL_CHART
MOHUMOHU_DRAGON_CHART
MOHUMOHU_INSECT_CHART
MOHUMOHU_VILLACIEL2_CHART
MOHUMOHU_VILLACIEL_CHART
MUTANT_PLANT_CHART
NAME

ゲームシステム名

SKILL_CHART
SORT_KEY

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

SUCCESS_STR
VILLACIEL_PETIT_QUEST_CHART
VILLACIEL_PREVIOUS_JOB_CHART

Public Class Methods

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

  @d66_sort_type = D66SortType::NO_SORT # D66あり。ただし、現行ルールにある6x6の表については別のコマンドを用意
  @round_type = RoundType::CEIL # 端数は切り上げ
end

Public Instance Methods

eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 59
def eval_game_system_specific_command(command)
  case command
  when /\d+VBS/
    resolute_action(command)
  when /\d+VF/
    resolute_frontier_action(command)
  when /\d+VM/
    resolute_mining_action(command)
  when /\d+VG/
    resolute_cutting_gem_action(command)
  when /PJ[VA]?/
    use_previous_job_chart(command)
  when /PQ[VA]?/
    use_petit_quest_chart(command)
  when 'AC'
    use_accident_chart(command)
  when /MM([IAD]|V[VA]?)/
    use_mohumohu_chart(command)
  when /F[LRWGBCS]/
    use_fishing_chart(command)
  when /IP[VA]?/
    use_inedible_plant_chart(command)
  when /EP[VA]?\d?/
    use_edible_plant_chart(command)
  when 'MP'
    use_mutant_plant_chart(command)
  when 'IS'
    use_improved_species_chart(command)
  end
end

Private Instance Methods

derive_achievement(num_dices, command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 97
def derive_achievement(num_dices, command)
  # 達成数計算の際にはトライアンフ「出目が6だったダイスは達成数2としてカウントする」を考慮する必要があるが、要は「達成数=成功数+出目が最大値だったダイスの数」になる
  dice_list = @randomizer.roll_barabara(num_dices, D6)
  dice_str = dice_list.join(",")
  num_triumph_dices = dice_list.count(6)
  num_successes = dice_list.count { |dice| dice >= LEAST_SUCCESS_ROLL }
  achievement = num_successes + num_triumph_dices

  output = "(#{command}) > [#{dice_str}] > 達成数: #{achievement}"
  return achievement, output
end
resolute_action(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 109
def resolute_action(command)
  match_data = command.match(/(\d+)VBS(>=(\d+))?/)

  num_dices = match_data[1].to_i
  achievement, output = derive_achievement(num_dices, command)
  return output unless match_data[2]

  difficulty = match_data[3].to_i
  output += achievement >= difficulty ? SUCCESS_STR : FAILURE_STR

  return output
end
resolute_cutting_gem_action(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 171
def resolute_cutting_gem_action(command)
  num_dices = command.match(/(\d+)VG/)[1].to_i
  resolute_difficult_action(num_dices, LEAST_GEM_SUCCESS_ROLL, command)[0]
end
resolute_difficult_action(num_dices, least_success_roll, command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 144
def resolute_difficult_action(num_dices, least_success_roll, command)
  # 1個でもleast_success_roll以上の出目が出たら成功となる判定

  # 出目の最大値がnならば「1個でもn以上の出目が出た」ことになる
  dice_list = @randomizer.roll_barabara(num_dices, D6)
  dice_str = dice_list.join(',')
  largest_roll = dice_list.max()
  is_successful = largest_roll >= least_success_roll

  output = "(#{command}) > [#{dice_str}]"
  output += is_successful ? SUCCESS_STR : FAILURE_STR

  return output, is_successful
end
resolute_frontier_action(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 124
def resolute_frontier_action(command)
  num_dices = command.match(/(\d+)VF/)[1].to_i
  achievement, output = derive_achievement(num_dices, command)

  chart_index =
    case achievement
    when 0..2
      achievement
    when 3, 4
      3
    when 5..8
      4
    else
      5
    end

  skill = SKILL_CHART[chart_index]
  return "#{output} > #{skill}"
end
resolute_mining_action(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 162
def resolute_mining_action(command)
  num_dices = command.match(/(\d+)VM/)[1].to_i
  output, is_successful = resolute_difficult_action(num_dices, LEAST_MINING_SUCCESS_ROLL, command)
  return output unless is_successful

  roll_result = @randomizer.roll_once(D6)
  "#{output} > (1D6) > [#{roll_result}] > アイテムを#{roll_result}個獲得"
end
use_6x6_chart(chart, chart_name) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 303
def use_6x6_chart(chart, chart_name)
  # 6x6の表からランダムに参照する
  # chartは文字列の配列の配列であることを仮定
  # D66ロールによる表参照と近いが、D66の方は13, 42などの数値に対応した表なのに対し、こちらは「下3マス、右2マス」という風にセルを参照する
  y_roll = @randomizer.roll_once(D6)
  cell_text, x_roll = get_table_by_1d6(chart[y_roll - 1])
  "#{chart_name} > [#{y_roll},#{x_roll}] > 下#{y_roll}マス、右#{x_roll}マス > #{cell_text}"
end
use_accident_chart(_command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 298
def use_accident_chart(_command)
  chart_text, roll_result = get_table_by_1d6(ACCIDENT_CHART)
  "アクシデント表 > [#{roll_result}] > #{chart_text}"
end
use_armesear_edible_plant_chart(chart_id, output) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 495
def use_armesear_edible_plant_chart(chart_id, output)
  output + use_6x6_chart(EDIBLE_PLANT2_CHARTS[chart_id - 1], "可食植物表#{chart_id}(アルメサール)")
end
use_edible_plant_chart(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 499
def use_edible_plant_chart(command)
  match_data = command.match(/EP([VA]?)(\d?)/)
  chart_symbol = match_data[1] == '' ? 'V' : match_data[1]

  case chart_symbol
  when 'V'
    case match_data[2]
    when ''
      roll_result = @randomizer.roll_once(D6)
      return '(1D6) > [6] > 好きな表を選んでおっけー!' if roll_result == D6

      use_villaciel_edible_plant_chart(roll_result, "(1D6) > [#{roll_result}] > ")
    else
      chart_id = match_data[2].to_i
      return '' unless chart_id >= 1 && chart_id <= 5

      use_villaciel_edible_plant_chart(chart_id, '')
    end
  when 'A'
    case match_data[2]
    when ''
      roll_result = @randomizer.roll_once(D6)
      use_armesear_edible_plant_chart(roll_result.even? ? 1 : 2, "(1D6) > [#{roll_result}] > ")
    else
      chart_id = match_data[2].to_i
      return '' unless [1, 2].include?(chart_id)

      use_armesear_edible_plant_chart(chart_id, '')
    end
  end
end
use_fishing_chart(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 411
def use_fishing_chart(command)
  case command
  when 'FL' then use_6x6_chart(FISHING_LAKE_CHART, '釣り・湖表')
  when 'FR' then use_6x6_chart(FISHING_RIVER_CHART, '釣り・河表')
  when 'FW' then use_6x6_chart(FISHING_WHITE_CHART, '釣り・白雲表')
  when 'FG' then use_6x6_chart(FISHING_GRAY_CHART, '釣り・灰雲表')
  when 'FB' then use_6x6_chart(FISHING_BLACK_CHART, '釣り・黒雲表')
  when 'FC' then use_6x6_chart(FISHING_COMMON_CHART, '釣り・共通表')
  when 'FS' then use_6x6_chart(FISHING_SALT_LAKE_CHART, '釣り・塩湖表')
  end
end
use_improved_species_chart(_command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 549
def use_improved_species_chart(_command)
  use_6x6_chart(IMPROVED_SPECIES_CHART, '改良種表')
end
use_inedible_plant_chart(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 437
def use_inedible_plant_chart(command)
  match_data = command.match(/IP([VA]?)/)
  chart_symbol = match_data[1] == '' ? 'V' : match_data[1]

  case chart_symbol
  when 'V' then use_6x6_chart(INEDIBLE_PLANT_CHART, '不食植物表(ヴィラシエル)')
  when 'A' then use_6x6_chart(INEDIBLE_PLANT2_CHART, '不食植物表(アルメサール)')
  end
end
use_mohumohu_chart(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 343
def use_mohumohu_chart(command)
  case command
  when 'MMI' then use_6x6_chart(MOHUMOHU_INSECT_CHART, 'もふもふ表・昆虫')
  when 'MMA' then use_6x6_chart(MOHUMOHU_ANIMAL_CHART, 'もふもふ表・動物')
  when /MMV[VA]?/
    match_data = command.match(/MMV([VA]?)/)
    chart_symbol = match_data[1] == '' ? 'V' : match_data[1]

    case chart_symbol
    when 'V'
      y_roll = @randomizer.roll_once(D6)
      cell_text, x_roll = get_table_by_1d6(MOHUMOHU_VILLACIEL_CHART[1 - y_roll % 2])
      "もふもふ表・ヴィラシエル種(ヴィラシエル) > [#{y_roll},#{x_roll}] > 下#{y_roll.even? ? '偶数' : '奇数'}、右#{x_roll}マス > #{cell_text}"
    when 'A' then use_6x6_chart(MOHUMOHU_VILLACIEL2_CHART, 'もふもふ表・ヴィラシエル種(アルメサール)')
    end
  when 'MMD' then use_6x6_chart(MOHUMOHU_DRAGON_CHART, 'もふもふ表・鋼龍種')
  end
end
use_mutant_plant_chart(_command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 538
def use_mutant_plant_chart(_command)
  use_6x6_chart(MUTANT_PLANT_CHART, '変異植物表')
end
use_petit_quest_chart(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 267
def use_petit_quest_chart(command)
  match_data = command.match(/PQ([VA]?)/)
  chart_symbol = match_data[1] == '' ? 'V' : match_data[1]

  roll_result1 = @randomizer.roll_once(D6)
  chart_text, roll_result2 = case chart_symbol
                             when 'V'
                               chart_index = case roll_result1
                                             when 1, 2 then 0
                                             when 3, 4 then 1
                                             when 5 then 2
                                             when 6 then 3
                                             end
                               get_table_by_1d6(VILLACIEL_PETIT_QUEST_CHART[chart_index])
                             when 'A' then get_table_by_1d6(ARMESEAR_PETIT_QUEST_CHART[(roll_result1 - 1) / 2])
                             end

  chart_title = case chart_symbol
                when 'V' then 'ぷちクエスト表(ヴィラシエル)'
                when 'A' then 'ぷちクエスト表(アルメサール)'
                end
  "#{chart_title} > [#{roll_result1},#{roll_result2}] > #{chart_text}"
end
use_previous_job_chart(command) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 207
def use_previous_job_chart(command)
  match_data = command.match(/PJ([VA]?)/)
  chart_symbol = match_data[1] == '' ? 'V' : match_data[1]

  roll_result1 = @randomizer.roll_once(D6)
  chart_text, roll_result2 = case chart_symbol
                             when 'V' then get_table_by_1d6(VILLACIEL_PREVIOUS_JOB_CHART[(roll_result1 - 1) / 3])
                             when 'A' then get_table_by_1d6(ARMESEAR_PREVIOUS_JOB_CHART[(roll_result1 - 1) / 2])
                             end

  chart_title = case chart_symbol
                when 'V' then '前職表(ヴィラシエル)'
                when 'A' then '前職表(アルメサール)'
                end
  "#{chart_title} > [#{roll_result1},#{roll_result2}] > #{chart_text}"
end
use_villaciel_edible_plant_chart(chart_id, output) click to toggle source
# File lib/bcdice/game_system/Villaciel.rb, line 491
def use_villaciel_edible_plant_chart(chart_id, output)
  output + use_6x6_chart(EDIBLE_PLANT_CHARTS[chart_id - 1], "可食植物表#{chart_id}(ヴィラシエル)")
end