class BCDice::GameSystem::Warhammer

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

  @round_type = RoundType::CEIL # 端数切り上げに設定
end

Public Instance Methods

eval_game_system_specific_command(command) click to toggle source
# File lib/bcdice/game_system/Warhammer.rb, line 37
def eval_game_system_specific_command(command)
  output_msg = nil

  case command.upcase

  when /^(WH\d+(@[\dWH]*)?)/i
    attackCommand = Regexp.last_match(1)
    output_msg = getAttackResult(attackCommand)

  when /^(WH[HABTLW]\d+)/i
    criticalCommand = Regexp.last_match(1)
    output_msg = getCriticalResult(criticalCommand)
  end

  return output_msg
end
getAttackResult(string) click to toggle source
# File lib/bcdice/game_system/Warhammer.rb, line 314
def getAttackResult(string)
  debug("getAttackResult begin string", string)

  pos_type = ""

  if /(.+)(@.*)/ =~ string
    string = Regexp.last_match(1)
    pos_type = Regexp.last_match(2)
    debug("pos_type", pos_type)
  end

  unless /WH(\d+)/i =~ string
    return '1'
  end

  diff = Regexp.last_match(1).to_i

  total_n = @randomizer.roll_once(100)

  output = "(#{string}) > #{total_n}"
  output += result_1d100_text(total_n, total_n, :<=, diff)

  pos_num = (total_n % 10) * 10 + (total_n / 10).to_i
  pos_num = 100 if total_n >= 100

  output += wh_atpos(pos_num, pos_type) if total_n <= diff

  return output
end
getCriticalResult(string) click to toggle source

WHFRP関連 ########################

# File lib/bcdice/game_system/Warhammer.rb, line 75
def getCriticalResult(string)
  # クリティカル効果データ
  whh = [
    '01:打撃で状況が把握出来なくなる。次ターンは1回の半アクションしか行なえない。',
    '02:耳を強打された為、耳鳴りが酷く目眩がする。1Rに渡って一切のアクションを行なえない。',
    '03:打撃が頭皮を酷く傷つけた。【武器技術度】に-10%。治療を受けるまで継続。',
    '04:鎧が損傷し当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら1Rの間アクションを行なえない。',
    '05:転んで倒れ、頭がくらくらする。1Rに渡ってあらゆるテストに-30で、立ち上がるには起立アクションが必要。',
    '06:1d10R気絶。',
    '07:1d10分気絶。以後CTはサドンデス。',
    '08:顔がずたずたになって倒れ、以後無防備状態。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると片方の視力を失う。',
    '09:凄まじい打撃により頭蓋骨が粉砕される。死は瞬時に訪れる。',
    '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。',
  ]
  wha = [
    '01:手に握っていたものを落とす。盾はくくりつけられている為、影響なし。',
    '02:打撃で腕が痺れ、1Rの間使えなくなる。',
    '03:手の機能が失われ、治療を受けるまで回復できない。手で握っていたもの(盾を除く)は落ちる。',
    '04:鎧が損傷する。当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら腕が痺れ、1Rの間使えなくなる。',
    '05:腕の機能が失われ、治療を受けるまで回復できない。手で握っていたもの(盾を除く)は落ちる。',
    '06:腕が砕かれる。手で握っていたもの(盾を除く)は落ちる。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。',
    '07:手首から先が血まみれの残骸と化す。手で握っていたもの(盾を除く)は落ちる。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑健】テストに失敗すると手の機能を失う。',
    '08:腕は血まみれの肉塊がぶら下がっている状態になる。手で握っていたもの(盾を除く)は落ちる。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑健】テストに失敗すると肘から先の機能を失う。',
    '09:大動脈に傷が及んだ。コンマ数秒の内に損傷した肩から血を噴出して倒れる。ショックと失血により、ほぼ即死する。',
    '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。',
  ]
  whb = [
    '01:打撃で息が詰まる。1Rの間、キャラクターの全てのテストや攻撃に-20%。',
    '02:股間への一撃。苦痛のあまり、1Rに渡って一切のアクションを行なえない。',
    '03:打撃で肋骨がぐちゃぐちゃになる。以後治療を受けるまでの間、【武器技術度】に-10%。',
    '04:鎧が損傷する。当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら股間への一撃、1Rに渡って一切のアクションを行なえない。',
    '05:転んで倒れ、息が詰まって悶絶する。1Rに渡ってあらゆるテストに-30の修正、立ち上がるには起立アクションが必要。',
    '06:1d10R気絶。',
    '07:ひどい内出血が起こり、無防備状態。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。',
    '08:脊髄が粉砕されて倒れ、以後治療を受けるまで無防備状態。以後CTはサドンデスを適用。【頑強】テストに失敗すると腰から下が不随になる。',
    '09:凄まじい打撃により複数の臓器が破裂し、死は数秒のうちに訪れる。',
    '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。',
  ]
  whl = [
    '01:よろめく。次のターン、1回の半アクションしか行なえない。',
    '02:脚が痺れる。1Rに渡って【移動】は半減し、脚に関連する【敏捷】テストに-20%。回避が出来なくなる。',
    '03:脚の機能が失われ、治療を受けるまで回復しない。【移動】は半減し、脚に関連する【敏捷】テストに-20%。回避が出来なくなる。',
    '04:鎧が損傷する。当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら脚が痺れる、1Rに渡って【移動】は半減し、脚に関連する【敏捷】テストに-20%、回避不可になる。',
    '05:転んで倒れ、頭がくらくらする。1Rに渡ってあらゆるテストに-30の修正、立ち上がるには起立アクションが必要。',
    '06:脚が砕かれ、無防備状態。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。',
    '07:脚は血まみれの残骸と化し、無防備状態になる。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると足首から先を失う。',
    '08:脚は血まみれの肉塊がぶらさがっている状態。以後無防備状態。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると膝から下を失う。',
    '09:大動脈に傷が及ぶ。コンマ数秒の内に脚の残骸から血を噴出して倒れ、ショックと出血で死は瞬時に訪れる。',
    '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。',
  ]
  whw = [
    '01:軽打。1ラウンドに渡って、あらゆるテストに-10%。',
    '02:かすり傷。+10%の【敏捷】テストを行い、失敗なら直ちに高度を1段階失う。地上にいるクリーチャーは、次のターンには飛び立てない。',
    '03:損傷する。【飛行移動力】が2点低下する。-10%の【敏捷】テストを行い、失敗なら直ちに高度を1段階失う。地上にいるクリーチャーは、次のターンには飛び立てない。',
    '04:酷く損傷する。【飛行移動力】が4点低下する。-30%の【敏捷】テストを行い、失敗なら直ちに高度を1段階失う。地上にいるクリーチャーは、1d10ターンが経過するまで飛び立てない。',
    '05:翼が使えなくなる。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。',
    '06:翼の付け根に傷が開く。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。治療を受けるまで毎R被害者のターン開始時に20%の確率で死亡。以後CTはサドンデスを適用。',
    '07:翼は血まみれの残骸と化し、無防備状態になる。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。治療を受けるまで毎R被害者のターン開始時に20%の確率で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると飛行能力を失う。',
    '08:翼が千切れてバラバラになり、無防備状態になる。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。治療を受けるまで毎R被害者のターン開始時に20%の確率で死亡。以後CTはサドンデスを適用。飛行能力を失う。',
    '09:大動脈が切断された。コンマ数秒の内に血を噴き上げてくずおれる、ショックと出血で死は瞬時に訪れる。',
    '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。',
  ]

  criticalTable = [
    5, 7, 9, 10, 10, 10, 10, 10, 10, 10, # 01-10
    5, 6, 8, 9, 10, 10, 10, 10, 10, 10, # 11-20
    4, 6, 8, 9, 9, 10, 10, 10, 10, 10, # 21-30
    4, 5, 7, 8, 9, 9, 10, 10, 10, 10, # 31-40
    3, 5, 7, 8, 8, 9, 9, 10, 10, 10, # 41-50
    3, 4, 6, 7, 8, 8, 9, 9, 10, 10, # 51-60
    2, 4, 6, 7, 7, 8, 8, 9, 9, 10, # 61-70
    2, 3, 5, 6, 7, 7, 8, 8, 9, 9,  # 71-80
    1, 3, 5, 6, 6, 7, 7, 8, 8, 9,  # 81-90
    1, 2, 4, 5, 6, 6, 7, 7, 8, 8,  # 91-00
  ]

  unless /WH([HABTLW])(\d+)/ =~ string
    return '1'
  end

  partsWord = Regexp.last_match(1) # 部位
  criticalValue = Regexp.last_match(2).to_i # クリティカル値
  criticalValue = 10 if criticalValue > 10
  criticalValue = 1 if criticalValue < 1

  whpp = ''
  whppp = ''

  case partsWord
  when /H/i
    whpp = '頭部'
    whppp = whh
  when /A/i
    whpp = '腕部'
    whppp = wha
  when /[TB]/i
    whpp = '胴体'
    whppp = whb
  when /L/i
    whpp = '脚部'
    whppp = whl
  when /W/i
    whpp = '翼部'
    whppp = whw
  end

  dice_now = @randomizer.roll_once(100)

  crit_no = ((dice_now - 1) / 10).to_i * 10
  crit_num = criticalTable[crit_no + criticalValue - 1]

  resultText = whppp[crit_num - 1]
  if crit_num >= 5
    resultText += 'サドンデス×'
  else
    resultText += 'サドンデス○'
  end

  output = "#{whpp}CT表(#{dice_now}+#{criticalValue}) > #{resultText}"

  return output
end
get_wh_atpos_message(pos_i, pos_num) click to toggle source
# File lib/bcdice/game_system/Warhammer.rb, line 299
def get_wh_atpos_message(pos_i, pos_num)
  output = ""

  output += ' ' + pos_i[0] + ":"

  1.step(pos_i.length + 1, 2) do |i|
    if pos_num <= pos_i[i]
      output += pos_i[i + 1]
      break
    end
  end

  return output
end
result_1d100(total, _dice_total, cmp_op, target) click to toggle source
# File lib/bcdice/game_system/Warhammer.rb, line 54
def result_1d100(total, _dice_total, cmp_op, target)
  return Result.nothing if target == '?'
  return nil unless cmp_op == :<=

  if total <= target
    Result.success("成功(成功度#{(target - total) / 10})")
  else
    Result.failure("失敗(失敗度#{(total - target) / 10})")
  end
end
result_1d100_text(total, dice_total, cmp_op, target) click to toggle source
# File lib/bcdice/game_system/Warhammer.rb, line 65
def result_1d100_text(total, dice_total, cmp_op, target)
  result = result_1d100(total, dice_total, cmp_op, target)&.text
  if result.nil?
    ""
  else
    " > #{result}"
  end
end
wh_atpos(pos_num, pos_type) click to toggle source
# File lib/bcdice/game_system/Warhammer.rb, line 198
def wh_atpos(pos_num, pos_type) # WHFRP2命中部位表
  debug("wh_atpos begin pos_type", pos_type)
  pos_2l = [
    '二足',
    15, '頭部',
    35, '右腕',
    55, '左腕',
    80, '胴体',
    90, '右脚',
    100, '左脚',
  ]
  pos_2lw = [
    '有翼二足',
    15, '頭部',
    25, '右腕',
    35, '左腕',
    45, '右翼',
    55, '左翼',
    80, '胴体',
    90, '右脚',
    100, '左脚',
  ]
  pos_4l = [
    '四足',
    15, '頭部',
    60, '胴体',
    70, '右前脚',
    80, '左前脚',
    90, '右後脚',
    100, '左後脚',
  ]
  pos_4la = [
    '半人四足',
    10, '頭部',
    20, '右腕',
    30, '左腕',
    60, '胴体',
    70, '右前脚',
    80, '左前脚',
    90, '右後脚',
    100, '左後脚',
  ]
  pos_4lw = [
    '有翼四足',
    10, '頭部',
    20, '右翼',
    30, '左翼',
    60, '胴体',
    70, '右前脚',
    80, '左前脚',
    90, '右後脚',
    100, '左後脚',
  ]
  pos_b = [
    '鳥',
    15, '頭部',
    35, '右翼',
    55, '左翼',
    80, '胴体',
    90, '右脚',
    100, '左脚',
  ]

  wh_pos = [pos_2l, pos_2lw, pos_4l, pos_4la, pos_4lw, pos_b]

  pos_t = 0
  debug("pos_type", pos_type)
  if pos_type != ""
    case pos_type
    when /@(2W|W2)/i
      pos_t = 1
    when /@(4W|W4)/i
      pos_t = 4
    when /@(4H|H4)/i
      pos_t = 3
    when /@4/i
      pos_t = 2
    when /@W/i
      pos_t = 5
    else
      unless  /@(2H|H2|2)/i =~ pos_type
        pos_t = -1
      end
    end
  end

  output = ""

  debug("pos_t", pos_t)
  if pos_t < 0
    wh_pos.each do |pos_i|
      output += get_wh_atpos_message(pos_i, pos_num)
    end
  else
    pos_i = wh_pos[pos_t]
    output += get_wh_atpos_message(pos_i, pos_num)
  end

  return output
end