Class: BCDice::GameSystem::GoblinSlayer

Inherits:
Base
  • Object
show all
Defined in:
lib/bcdice/game_system/GoblinSlayer.rb

Constant Summary collapse

ID =

ゲームシステムの識別子

'GoblinSlayer'
NAME =

ゲームシステム名

'ゴブリンスレイヤーTRPG'
SORT_KEY =

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

'こふりんすれいやあTRPG'
HELP_MESSAGE =

ダイスボットの使い方

<<~MESSAGETEXT
  ・判定 GS(x)@c#f>=y
   2d6の判定を行い、達成値を出力します。
   xは基準値、yは目標値、cは大成功の下限、fは大失敗の上限です。いずれも省略可能です。
   cが未指定の場合には c=12 、fが未指定の場合には f=2 となります。
   yが設定されている場合、大成功/成功/失敗/大失敗を自動判定します。
   例)GS>=12 GS>10 GS(10)>14 GS+10>=15 GS10>=15 GS(10) GS+10 GS10 GS
     GS@10 GS@10#3 GS#3@10

  ・祈念 MCPI(n)$m
   祈念を行います。
   nは【幸運】などによるボーナスです。この値は省略可能です。
   mは因果点の現在値です。
   因果点の現在値を使用して祈念を行い、成功/失敗を自動判定します。
   例)MCPI$3 MCPI(1)$4 MCPI+2$5 MCPI2$6

  ・命中判定の効力値によるボーナス DB(n)
   ダメージ効力表による威力へのボーナスを自動で求めます。
   nは命中判定の効力値です。
   例)DB(15) DB12

  ※上記コマンドの計算内で割り算を行った場合、小数点以下は切り上げされます。
   ただしダイス出目を割り算した場合、小数点以下は切り捨てされます。
   例)入力:GS(8+3/2) 実行結果:(GS10) > 10 + 3[1,2] > 13
     入力:2d6/2     実行結果:(2D6/2) > 3[1,2]/2 > 1

  ※MCPIでは、シークレットダイスを使用できません。
MESSAGETEXT
CRITICAL =
12
FUMBLE =
2

Instance Attribute Summary

Attributes inherited from Base

#d66_sort_type, #default_cmp_op, #default_target_number, #randomizer, #reroll_dice_reroll_threshold, #round_type, #sides_implicit_d, #upper_dice_reroll_threshold

Instance Method Summary collapse

Methods inherited from Base

#change_text, #check_result, command_pattern, #enable_debug, #enabled_d9?, eval, #eval, #grich_text, prefixes_pattern, register_prefix, register_prefix_from_super_class, #sort_add_dice?, #sort_barabara_dice?

Methods included from Translate

#translate

Constructor Details

#initialize(command) ⇒ GoblinSlayer

Returns a new instance of GoblinSlayer.



48
49
50
51
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 48

def initialize(command)
  super(command)
  @round_type = RoundType::CEIL
end

Instance Method Details

#calc_threshold(option1, option1_value, _option2, option2_value) ⇒ Object



109
110
111
112
113
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 109

def calc_threshold(option1, option1_value, _option2, option2_value)
  critical, fumble = option1 == "@" ? [option1_value, option2_value] : [option2_value, option1_value]

  return [critical&.to_i || CRITICAL, fumble&.to_i || FUMBLE]
end

#damageBonus(command) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 139

def damageBonus(command)
  m = /^DB(\d+)$/i.match(command)
  unless m
    return nil
  end

  num = m[1].to_i
  fmt = "命中判定の効力値によるボーナス > "

  if num < 15
    return fmt + "なし"
  end

  times =
    if num >= 40
      5
    elsif num >= 30
      4
    elsif num >= 25
      3
    elsif num >= 20
      2
    else
      1
    end

  dice_list = @randomizer.roll_barabara(times, 6)
  total = dice_list.sum()
  diceText = dice_list.join(",")

  return fmt + "#{total}[#{diceText}] > #{total}"
end

#eval_game_system_specific_command(command) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 53

def eval_game_system_specific_command(command)
  case command
  when /^GS/i
    return getCheckResult(command)
  when /^MCPI/i
    return murmurChantPrayInvoke(command)
  when /^DB/i
    return damageBonus(command)
  else
    return nil
  end
end

#getCheckResult(command) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 66

def getCheckResult(command)
  m = /^GS([-+]?\d+)?(?:(?:([@#])([-+]?\d+))(?:([@#])([-+]?\d+))?)?(?:(>=?)(\d+))?$/i.match(command)
  unless m
    return nil
  end

  basis = m[1].to_i # 基準値
  target = m[7].to_i
  cmp_op = m[6]
  without_compare = cmp_op.nil?

  option1 = m[2]
  option1_value = m[3]
  option2 = m[4]
  option2_param = m[5]

  if option1 && option1 == option2
    return nil
  end

  threshold_critical, threshold_fumble = calc_threshold(option1, option1_value, option2, option2_param)

  dice_list = @randomizer.roll_barabara(2, 6)
  total = dice_list.sum()
  diceText = dice_list.join(",")

  achievement = basis + total # 達成値

  fumble = total <= threshold_fumble
  critical = total >= threshold_critical

  result = "#{resultStr(achievement, target, cmp_op, fumble, critical)}"
  if without_compare && !fumble && !critical
    result = ""
  end
  basis_str = basis == 0 ? "" : "#{basis} + "

  return "(#{command}) > #{basis_str}#{total}[#{diceText}] > #{achievement}#{result}"
end

#murmurChantPrayInvoke(command) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 115

def murmurChantPrayInvoke(command)
  m = /^MCPI(\+?\d+)?\$(\d+)$/i.match(command)
  unless m
    return nil
  end

  luck = m[1].to_i # 幸運
  volition = m[2].to_i # 因果点
  if volition >= 12
    return "因果点が12点以上の場合、因果点は使用できません。"
  end

  dice_list = @randomizer.roll_barabara(2, 6)
  total = dice_list.sum()
  diceText = dice_list.join(",")

  achievement = total + luck

  result = "#{resultStr(achievement, volition, '>=', false, false)}"
  luck_str = luck == 0 ? "" : "+#{luck}"

  return "祈念(2d6#{luck_str}) > #{total}[#{diceText}]#{luck_str}#{achievement}#{result}, 因果点:#{volition}点 → #{volition + 1}"
end

#resultStr(achievement, target, cmp_op, fumble, critical) ⇒ String

判定結果の文字列を返す

Parameters:

  • achievement (Integer)

    達成値

  • target (Integer)

    目標値

  • cmp_op (String)

    達成値と目標値を比較する比較演算子

  • fumble (Boolean)

    ファンブルかどうか

  • critical (Boolean)

    クリティカルかどうか

Returns:

  • (String)


179
180
181
182
183
184
185
186
187
# File 'lib/bcdice/game_system/GoblinSlayer.rb', line 179

def resultStr(achievement, target, cmp_op, fumble, critical)
  return '大失敗' if fumble
  return '大成功' if critical
  if cmp_op == ">="
    return achievement >= target ? "成功" : "失敗"
  else
    return achievement > target ? "成功" : "失敗"
  end
end