bcdice 3.11.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/i18n/FutariSousa/ko_kr.yml +1625 -529
  4. data/i18n/Insane/ko_kr.yml +393 -258
  5. data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
  6. data/lib/bcdice/arithmetic/parser.rb +4 -2
  7. data/lib/bcdice/base.rb +1 -1
  8. data/lib/bcdice/command/parser.rb +4 -2
  9. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  10. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  11. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  12. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  13. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  14. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  15. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  16. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  17. data/lib/bcdice/game_system/AniMalus.rb +221 -0
  18. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  19. data/lib/bcdice/game_system/Avandner.rb +1 -1
  20. data/lib/bcdice/game_system/BBN.rb +1 -1
  21. data/lib/bcdice/game_system/BadLife.rb +3 -3
  22. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  23. data/lib/bcdice/game_system/Chill3.rb +6 -6
  24. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  25. data/lib/bcdice/game_system/Elric.rb +1 -1
  26. data/lib/bcdice/game_system/Emoklore.rb +4 -6
  27. data/lib/bcdice/game_system/FullFace.rb +92 -0
  28. data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
  29. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
  30. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  31. data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
  32. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  33. data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
  34. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  35. data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
  36. data/lib/bcdice/game_system/Liminal.rb +136 -0
  37. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  38. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  39. data/lib/bcdice/game_system/NRR.rb +122 -0
  40. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  41. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  42. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  43. data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
  44. data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
  45. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  46. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  47. data/lib/bcdice/game_system/Postman.rb +3 -3
  48. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  49. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +10 -7
  50. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  51. data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
  52. data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
  53. data/lib/bcdice/game_system/Siren.rb +97 -0
  54. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  55. data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
  56. data/lib/bcdice/game_system/Strave.rb +1 -1
  57. data/lib/bcdice/game_system/SwordWorld.rb +16 -0
  58. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
  59. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  60. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  61. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +21 -9
  62. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +179 -0
  63. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  64. data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
  65. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
  66. data/lib/bcdice/game_system/sword_world/rating_parser.rb +177 -130
  67. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
  68. data/lib/bcdice/game_system.rb +12 -0
  69. data/lib/bcdice/loader.rb +1 -1
  70. data/lib/bcdice/version.rb +1 -1
  71. metadata +32 -5
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class ArknightsFan < Base
6
+ # ゲームシステムの識別子
7
+ ID = "ArknightsFan"
8
+
9
+ # ゲームシステム名
10
+ NAME = "アークナイツTRPG by Dapto"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "ああくないつTRPGはいたふと"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ ■ 判定 (nADm>=x)
17
+ nDmのダイスロールをして、x 以下であれば成功。
18
+ 出目が91以上でエラー。
19
+ 出目が10以下でクリティカル。
20
+
21
+ ■ 判定 (nABm>=x)
22
+ nBmのダイスロールをして、
23
+ x 以下であれば成功数+1。
24
+ 出目が91以上でエラー。成功数+1。
25
+ 出目が10以下でクリティカル。成功数-1。
26
+ 上記による成功数をカウント。
27
+
28
+ ■ 判定 (nABm>=x--役職)
29
+ nBmのダイスロールをして、
30
+ 出目が x 以下であれば成功数+1。
31
+ 出目が91以上でエラー。成功数+1。
32
+ 出目が10以下でクリティカル。成功数-1。
33
+ 上記による成功数をカウントした上で、以下の役職による成功数増加効果を適応。
34
+ 狙撃(SNIPER) 成功数1以上のとき、成功数+1。
35
+ TEXT
36
+
37
+ register_prefix('\d*AD\d*', '\d*AB\d*', '--ADDICTION', '--WORSENING')
38
+
39
+ def eval_game_system_specific_command(command)
40
+ roll_ad(command) || roll_ab(command) || roll_addiction(command) || roll_worsening(command)
41
+ end
42
+
43
+ private
44
+
45
+ def roll_ad(command)
46
+ m = /^(\d*)AD(\d*)<=(\d+)$/.match(command)
47
+ return nil unless m
48
+
49
+ times = m[1]
50
+ sides = m[2]
51
+ target = m[3].to_i
52
+ times = !times.empty? ? times.to_i : 1
53
+ sides = !sides.empty? ? sides.to_i : 100
54
+ return roll_d(command, times, sides, target)
55
+ end
56
+
57
+ def roll_ab(command)
58
+ m = /^(\d*)AB(\d*)<=(\d+)(?:--([^\d\s]+)(0)?)?$/.match(command)
59
+ return nil unless m
60
+
61
+ times = m[1]
62
+ sides = m[2]
63
+ target = m[3].to_i
64
+ type = m[4]
65
+ suffix = m[5]
66
+ times = !times.empty? ? times.to_i : 1
67
+ sides = !sides.empty? ? sides.to_i : 100
68
+
69
+ if suffix || type.nil?
70
+ roll_b(command, times, sides, target)
71
+ else
72
+ roll_b_withtype(command, times, sides, target, type)
73
+ end
74
+ end
75
+
76
+ def roll_d(command, times, sides, target)
77
+ dice_list = @randomizer.roll_barabara(times, sides).sort
78
+ total = dice_list.sum
79
+ success = total <= target
80
+
81
+ crierror =
82
+ if total <= 10
83
+ "Critical"
84
+ elsif total >= 91
85
+ "Error"
86
+ else
87
+ "Neutral"
88
+ end
89
+
90
+ result =
91
+ if success && (crierror == "Critical")
92
+ "クリティカル!"
93
+ elsif success && (crierror == "Neutral")
94
+ "成功"
95
+ elsif success && (crierror == "Error")
96
+ "成功"
97
+ elsif !success && (crierror == "Critical")
98
+ "失敗"
99
+ elsif !success && (crierror == "Neutral")
100
+ "失敗"
101
+ elsif !success && (crierror == "Error")
102
+ "エラー"
103
+ end
104
+
105
+ if times == 1
106
+ return "(#{command}) > #{dice_list.join(',')} > #{result}"
107
+ else
108
+ return "(#{command}) > #{total}[#{dice_list.join(',')}] > #{result}"
109
+ end
110
+ end
111
+
112
+ def roll_b(command, times, sides, target)
113
+ dice_list, success_count, critical_count, error_count = process_b(times, sides, target)
114
+ result_count = success_count + critical_count - error_count
115
+
116
+ return "(#{command}) > [#{dice_list.join(',')}] > #{success_count}+#{critical_count}C-#{error_count}E > 成功数#{result_count}"
117
+ end
118
+
119
+ def roll_b_withtype(command, times, sides, target, type)
120
+ dice_list, success_count, critical_count, error_count = process_b(times, sides, target)
121
+ result_count = success_count + critical_count - error_count
122
+
123
+ type_effect =
124
+ if (type == "SNIPER") && (result_count > 0)
125
+ 1
126
+ else
127
+ 0
128
+ end
129
+ result_count += type_effect
130
+
131
+ return "(#{command}) > [#{dice_list.join(',')}] > #{success_count}+#{critical_count}C-#{error_count}E+#{type_effect}(#{type}) > 成功数#{result_count}"
132
+ end
133
+
134
+ def process_b(times, sides, target)
135
+ dice_list = @randomizer.roll_barabara(times, sides).sort
136
+
137
+ success_count = 0
138
+ critical_count = 0
139
+ error_count = 0
140
+
141
+ dice_list.each do |value|
142
+ success_count += 1 if value <= target
143
+ critical_count += 1 if value <= 10
144
+ error_count += 1 if value >= 91
145
+ end
146
+
147
+ return [dice_list, success_count, critical_count, error_count]
148
+ end
149
+
150
+ ADDICTION_TABLE = [
151
+ "中枢神経障害",
152
+ "多臓器不全",
153
+ "急性ストレス反応",
154
+ ].freeze
155
+
156
+ def roll_addiction(command)
157
+ return nil if command != "--ADDICTION"
158
+
159
+ value = @randomizer.roll_once(3)
160
+ chosen = ADDICTION_TABLE[value - 1]
161
+
162
+ return "--ADDICTION > #{chosen}"
163
+ end
164
+
165
+ WORSENING_TABLE = [
166
+ "末梢神経障害",
167
+ "内臓機能不全",
168
+ "精神症状",
169
+ ].freeze
170
+
171
+ def roll_worsening(command)
172
+ return nil if command != "--WORSENING"
173
+
174
+ value = @randomizer.roll_once(3)
175
+ chosen = WORSENING_TABLE[value - 1]
176
+ elapse = @randomizer.roll_once(6) + 1
177
+
178
+ return "--WORSENING > #{chosen}: #{elapse} rounds"
179
+ end
180
+ end
181
+ end
182
+ end
@@ -85,7 +85,7 @@ module BCDice
85
85
  totalDamage = totalSuccessCount * damage + totalCriticalCount * criticalTrigger
86
86
 
87
87
  result += "(#{diceCount}D10\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage}"
88
- result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
88
+ result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
89
89
  result += " > #{totalDamage}ダメージ"
90
90
  else
91
91
  result += "(#{diceCount}D10\<\=#{target}) > #{text} > 成功数:#{totalSuccessCount}"
@@ -72,7 +72,7 @@ module BCDice
72
72
  @roll_times = m[1].to_i
73
73
  @modify_str = m[2] || ''
74
74
  @modify = m[2].to_i
75
- @difficulty = m[4] ? m[4].to_i : nil
75
+ @difficulty = m[4]&.to_i
76
76
 
77
77
  base = critical_base(@roll_times)
78
78
  @critical = base + m[7].to_i
@@ -58,7 +58,7 @@ module BCDice
58
58
  fumble = 1
59
59
 
60
60
  isStormy = (m[2] == 'GL') # 波乱万丈
61
- if isStormy
61
+ if isStormy
62
62
  critical -= 3
63
63
  fumble += 1
64
64
  end
@@ -69,7 +69,7 @@ module BCDice
69
69
  critical, fumble = get_critival_fumble(critical, fumble, m[8], m[9])
70
70
 
71
71
  target = get_value(m[11])
72
- optionalText = (m[13] || '')
72
+ optionalText = m[13] || ''
73
73
 
74
74
  return checkRoll(diceCount, modify, critical, fumble, target, isStormy, optionalText)
75
75
  end
@@ -116,7 +116,7 @@ module BCDice
116
116
 
117
117
  if isCritical
118
118
  result += "成功(クリティカル)"
119
- elsif total >= target
119
+ elsif total >= target
120
120
  result += "成功"
121
121
  else
122
122
  result += "失敗"
@@ -121,7 +121,7 @@ module BCDice
121
121
  set += 1 if diceCount > 1
122
122
  end
123
123
 
124
- if criticalCallDice != 0
124
+ if criticalCallDice != 0
125
125
  c_cnt = diceCountList[criticalCallDice - 1]
126
126
  suc = c_cnt * 2
127
127
 
@@ -16,7 +16,7 @@ module BCDice
16
16
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
17
  ・1D100で判定時に成否、Botchを判定
18
18
   例)1D100<=50
19
-    Chill3 : (1D100<=50) > 55 > Botch
19
+    (1D100<=50) > 55 > Botch
20
20
  INFO_MESSAGE_TEXT
21
21
 
22
22
  def result_1d100(total, dice_total, cmp_op, target)
@@ -30,21 +30,21 @@ module BCDice
30
30
  if tens == ones
31
31
  if (total > target) || (dice_total == 100) # 00は必ず失敗
32
32
  if target > 100 # 目標値が100を超えている場合は、00を振ってもBotchにならない
33
- return Result.failure("失敗")
33
+ return Result.failure("Failure")
34
34
  else
35
35
  return Result.fumble("Botch")
36
36
  end
37
37
  else
38
- return Result.critical("C成功")
38
+ return Result.critical("Colossal Success")
39
39
  end
40
40
  elsif (total <= target) || (dice_total == 1) # 01は必ず成功
41
41
  if total <= (target / 2)
42
- return Result.success("H成功")
42
+ return Result.success("High Success")
43
43
  else
44
- return Result.success("L成功")
44
+ return Result.success("Low Success")
45
45
  end
46
46
  else
47
- return Result.failure("失敗")
47
+ return Result.failure("Failure")
48
48
  end
49
49
  end
50
50
  end
@@ -64,7 +64,7 @@ module BCDice
64
64
  result += " > #{successValue}#{targetText}"
65
65
 
66
66
  if target > 0
67
- if successValue >= target
67
+ if successValue >= target
68
68
  result += " > 【成功】"
69
69
  else
70
70
  result += " > 【失敗】"
@@ -22,7 +22,7 @@ module BCDice
22
22
  if total <= 1
23
23
  Result.critical("貫通") # 1は常に貫通
24
24
  elsif total >= 100
25
- Result.fumble("致命的失敗") # 100は常に致命的失敗
25
+ Result.fumble("致命的失敗") # 100は常に致命的失敗
26
26
  elsif target == '?'
27
27
  Result.nothing
28
28
  elsif total <= (target / 5.0).ceil
@@ -57,14 +57,12 @@ module BCDice
57
57
  def dice_roll(num_dice, success_threshold)
58
58
  # ダイスを振った結果を配列として取得
59
59
  values = @randomizer.roll_barabara(num_dice, 10)
60
- values_without_critical = values.reject { |num| num <= CRITICAL_VALUE }
61
-
62
- critical = values.size - values_without_critical.size
63
- success = values_without_critical.count { |num| num <= success_threshold }
64
- fumble = values_without_critical.count { |num| num >= FUMBLE_VALUE }
60
+ critical = values.count(CRITICAL_VALUE)
61
+ success = values.count { |num| num <= success_threshold }
62
+ fumble = values.count(FUMBLE_VALUE)
65
63
 
66
64
  # 成功値
67
- success_value = 2 * critical + success - fumble
65
+ success_value = critical + success - fumble
68
66
  result = compare_result(success_value)
69
67
 
70
68
  result.text = "#{values} > #{success_value} > #{translate('Emoklore.success_count', count: success_value)} #{result.text}"
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FullFace < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'FullFace'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'フルフェイス'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふるふえいす'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 x+bFF<=t x:ヒート(省略時は3) b:判定修正 t:能力値
18
+
19
+ 例)FF<=2: 能力値2で判定し、その結果(成功数,1の目の数,バースト)を表示。
20
+ 6FF<=3: ヒート6,能力値3で戦闘判定し、その結果( 〃 )を表示。
21
+ 8+2FF<=3:ヒート8,判定修正+2,能力値3で戦闘判定し、その結果( 〃 )を表示。
22
+ INFO_MESSAGETEXT
23
+
24
+ register_prefix('([+\d]+)*FF')
25
+
26
+ def eval_game_system_specific_command(command)
27
+ resolute_action(command)
28
+ end
29
+
30
+ private
31
+
32
+ # 技能判定
33
+ # @param [String] command
34
+ # @return [Result]
35
+ def resolute_action(command)
36
+ m = /^(\d*)([+\d]+)*FF<=(\d)$/.match(command)
37
+ return nil unless m
38
+
39
+ heat_level = m[1].to_i
40
+ heat_level = 3 if heat_level == 0
41
+ modify = Arithmetic.eval("0#{m[2]}", @round_type)
42
+ status_no = m[3].to_i
43
+
44
+ dice_array = []
45
+
46
+ dice = @randomizer.roll_barabara(heat_level, 6)
47
+ ones = dice.count(1)
48
+ sixs = dice.count(6)
49
+ success_num = dice.count { |val| val <= status_no }
50
+ dice_array.push(dice.join(","))
51
+
52
+ if modify > 0
53
+ dice = @randomizer.roll_barabara(modify, 6)
54
+ ones += dice.count(1)
55
+ success_num += dice.count { |val| val <= status_no }
56
+ dice_array.push(dice.join(","))
57
+ end
58
+ ones_total = ones
59
+
60
+ while ones > 0
61
+ dice = @randomizer.roll_barabara(ones, 6)
62
+ ones = dice.count(1)
63
+ ones_total += ones
64
+ success_num += dice.count { |val| val <= status_no }
65
+ dice_array.push(dice.join(","))
66
+ end
67
+
68
+ return Result.new.tap do |result|
69
+ if sixs >= 2
70
+ result.fumble = true
71
+ result.condition = false
72
+ else
73
+ result.condition = (success_num > 0)
74
+ result.critical = (ones_total > 0)
75
+ end
76
+ result_txt = []
77
+ result_txt.push("成功度(#{success_num})")
78
+ result_txt.push("1の目(#{ones_total})") if ones_total > 0
79
+ result_txt.push("バースト") if result.fumble?
80
+
81
+ sequence = [
82
+ "(#{heat_level}#{Format.modifier(modify)}FF<=#{status_no})",
83
+ dice_array.join('+').to_s,
84
+ result_txt.join(',').to_s,
85
+ ].compact
86
+
87
+ result.text = sequence.join(" > ")
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -9,7 +9,7 @@ module BCDice
9
9
  ID = 'FutariSousa:Korean'
10
10
 
11
11
  # ゲームシステム名
12
- NAME = '둘이서 수사(후타리소우사)'
12
+ NAME = '둘이서 수사'
13
13
 
14
14
  # ゲームシステム名の読みがな
15
15
  SORT_KEY = '国際化:Korean:둘이서 수사'
@@ -17,26 +17,51 @@ module BCDice
17
17
  # ダイスボットの使い方
18
18
  HELP_MESSAGE = <<~MESSAGETEXT
19
19
  ・판정용 커맨드
20
- 탐정용:【DT】…10면체 주사위를 2개 굴려 판정합니다.『유리』라면【3DT】, 『불리』라면【1DT】를 사용합니다.
21
- 조수용:【AS】…6면체 주사위를 2개 굴려 판정합니다. 『유리』라면【3AS】, 『불리』라면【1AS】를 사용합니다.
20
+ 탐정용:【DT】…10면체 주사위를 2개 굴려 판정합니다.『유리함』이라면【3DT】, 『불리함』이라면【1DT】를 사용합니다.
21
+ 조수용:【AS】…6면체 주사위를 2개 굴려 판정합니다. 『유리함』이라면【3AS】, 『불리함』이라면【1AS】를 사용합니다.
22
+  
22
23
  ・각종표
23
- 【조사】
24
- 이상한 버릇 결정표 SHRD
25
-  지껄이다표  SHFM/강압적인 수사표  SHBT/시치미 떼기표   SHPI
26
-  사건에 몰두표 SHEG/파트너와……표  SHWP/무언가 하고 있다표 SHDS
27
-  기상천외표  SHFT/갑작스런 번뜩임표 SHIN/희노애락표     SHEM
28
- 이벤트표
29
-  현장에서  EVS/어째서? EVW/협력자와 함께 EVN
30
-  상대쪽에서 EVC/VS용의자 EVV
31
- 조사의 장애표 OBT  변조표 ACT  목격자표 EWT  미제사건표 WMT
24
+ 【세션 시】
25
+ 기벽 결정 SHRD
26
+  발언 표       SHFM/수사 강행 표     SHBT/시치미 표       SHPI
27
+  사건에 몰두 표    SHEG/파트너와…… 표     SHWP/뭔가 하고 있음 표   SHDS
28
+  기상천외 표     SHFT/갑작스런 영감 표    SHIN/희노애락 표      SHEM
29
+  인간 모방 표     SHHE/인간 모방 실패 표   SHHF/파트너를 향한 장난 표 SHMP
30
+  의미심장 표     SHSB/초조함 표       SHFR/갑자기 왜그래 표   SHIS
31
+  억지 요구 표    SHSE/멀쩡해 보임 표     SHLM/질투에 사로잡힘 표   SHJS
32
+  오만한 태도 표   SHAR/비교적 가벼운 행동 표 SHRM/노 타임 표      SHNT
33
+  수사 방식 표    SHIM/귀족 표        SHNO/설명하지 않음 표   SHNE
34
+  형사 특유의 습관 표 SHHD
35
+  
36
+ 이벤트 표
37
+  현장에서 EVS/왜? EVW/협력자와 함께 EVN
38
+  알아서 찾아온 단서 EVC/VS용의자 EVV
39
+  폐쇄 공간 EVE
40
+  탐정 혼자 수사 EVD/조수 혼자 수사 EVA/관광 수사 EVT
41
+  예상치 못한 힌트 EVH/실험을 해보자 EVX/게스트 수사 EVG
42
+  형사 탐문 수사 EVQ/형사 대규모 수사 EVM/비밀스러운 정보 교환 EVP
43
+  동료들과 함께 수사 EVO/단골 가게 시추에이션 EVF/하드B 형사 액션 EVB
44
+  탐정을 얌전하게 만드는 수사 EVL/전통적 수사 EVZ/원시적 수사 EVR
45
+  
46
+ 감정 표
47
+  감정 표A/B   FLT66・FLT10
48
+  마음에 드는 점  FLTL66 /마음에 안 드는 점  FLTD66
49
+  무작위 감정 결정 표(당친법)  FLTRA
50
+  얼굴 부위       FLTF66/신체 부위      FLTB66/생활 습관    FLTH66
51
+  마음이 들뜨는 감각   FLTS66/타인에 대한 태도  FLTA66/헤비 웨이트   FLTW66
52
+  동료          FLTC66/부하        FLTU66/상사     FLTO66
53
+  수사 방식 FLTI66
54
+ 조사 방해 요인 표 OBT  상태 이상 표 ACT  목격자 표 EWT  미제 사건 표 WMT
55
+ 추억의 물품 결정 표 MIT  에피소드 동반 추억의 물품 결정 표 MITE  
56
+ 호칭 표A・B  NCT66・NCT10
57
+  
32
58
  【설정】
33
- 배경표
34
-  탐정 운명의 혈통  BGDD/천상의 재능  BGDG/마니아    BGDM
35
-  조수 정의로운 사람 BGAJ/정렬적인 사람 BGAP/말려든 사람 BGAI
36
- 신장표 HT  아지트표 BT  관계표 GRT  추억의 물건 결정표 MIT
37
- 직업표A・B  JBT66・JBT10  패션 특징표A・B    FST66・FST10
38
- 감정표A・B  FLT66・FLT10  좋아하는 것/싫어하는 것표A・B LDT66・LDT10
39
- 호칭표A・B NCT66・NCT10
59
+ 배경 표
60
+  탐정 운명의 혈통  BGDD/천성적인 재능  BGDG/마니아   BGDM
61
+  조수 정의로운 사람 BGAJ/정열적인 사람  BGAP/말려든 사람 BGAI
62
+ 신장 HT  아지트 BT  관계 GRT
63
+ 직업 표A・B  JBT66・JBT10  패션 특징 표A・B  FST66・FST10
64
+ 호불호 표A・B  LDT66・LDT10
40
65
  MESSAGETEXT
41
66
 
42
67
  register_prefix_from_super_class()
@@ -17,12 +17,12 @@ module BCDice
17
17
  ・判定コマンド(nHRFx+x)
18
18
  注意:難易度は必要成功数を表す
19
19
 
20
- 難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Winのチェックを行う
20
+ 難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Win、Total Failureのチェックを行う
21
21
  (Desperationダイスがある場合)OverreachとDespairの発生チェックを行う
22
22
  例) (難易度)HRF(通常ダイス)+(Desperationダイス)
23
23
  (難易度)HRF(通常ダイス)
24
24
 
25
- 難易度省略:成功数のカウント、判定失敗、Critical処理、(Desperationダイスがある場合)Despairチェックを行う
25
+ 難易度省略:成功数のカウント、判定失敗、Critical処理、Total Failure、(Desperationダイスがある場合)Despairチェックを行う
26
26
  判定成功、Overreachのチェックを行わない
27
27
  Critical Win、(Desperationダイスがある場合)Despair、Overreachのヒントを出力
28
28
  例) HRF(通常ダイス)+(Desperationダイス)
@@ -56,6 +56,10 @@ module BCDice
56
56
 
57
57
  desperaton_dice_pool = m[DESPERATION_DICE_INDEX]&.to_i
58
58
  if desperaton_dice_pool
59
+ if desperaton_dice_pool > 5
60
+ return "Desperationダイス指定は5ダイスが最大です。"
61
+ end
62
+
59
63
  desperaton_dice_text, desperaton_success_dice, desperaton_ten_dice, desperaton_botch_dice = make_dice_roll(desperaton_dice_pool)
60
64
 
61
65
  ten_dice += desperaton_ten_dice
@@ -102,6 +106,9 @@ module BCDice
102
106
  if desperaton_botch_dice > 0
103
107
  return Result.fumble("#{result_text}:判定失敗! [Despair]")
104
108
  end
109
+ if success_dice == 0
110
+ return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
111
+ end
105
112
 
106
113
  return Result.failure("#{result_text}:判定失敗!")
107
114
  end
@@ -111,7 +118,7 @@ module BCDice
111
118
  return Result.fumble("#{result_text}:判定失敗! [Despair]")
112
119
  end
113
120
 
114
- return Result.failure("#{result_text}:判定失敗!")
121
+ return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
115
122
  else
116
123
  if desperaton_botch_dice > 0
117
124
  result_text = "#{result_text}\n 判定失敗なら [Despair]"
@@ -13,7 +13,10 @@ module BCDice
13
13
  SORT_KEY = 'むけんのふあんたしあ'
14
14
 
15
15
  # ダイスボットの使い方
16
- HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。"
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ 1D20に目標値を設定した場合に、成功レベルの自動判定を行います。
18
+ 例: 1D20<=16
19
+ INFO_MESSAGE_TEXT
17
20
 
18
21
  # ゲーム別成功度判定(1d20)
19
22
  def result_1d20(total, _dice_total, cmp_op, target)
@@ -20,28 +20,28 @@ module BCDice
20
20
  스페셜/펌블/성공/실패를 판정
21
21
  ・각종표
22
22
  씬표   ST
23
-  사실은 무서운 현대 일본 씬표 HJST/광조의 20년대 씬표 MTST
24
-  암흑의 빅토리아 씬표 DVST
25
- 수식표    DT
23
+  사실은 무서운 현대 일본 장면표 HJST/광란의 20년대 장면표 MTST
24
+  빅토리아의 어둠 장면표 DVST
25
+ 형용표    DT
26
26
   본체표 BT/부위표 PT
27
27
  감정표      FT
28
28
  직업표      JT
29
- 배드엔딩표  BET
29
+ 배드엔드표  BET
30
30
  랜덤 특기 결정표 RTT
31
31
  지정특기(폭력)표  (TVT)
32
- 지정특기(감정)표  (TET)
32
+ 지정특기(정서)표  (TET)
33
33
  지정특기(지각)표  (TPT)
34
34
  지정특기(기술)표  (TST)
35
35
  지정특기(지식)표  (TKT)
36
36
  지정특기(괴이)표  (TMT)
37
- 회화 중에 발생하는 공포표(CHT)
38
- 거리에서 조우하는 공포표(VHT)
37
+ 회화 중에 생겨나는 공포표(CHT)
38
+ 거리에서 마주치는 공포표(VHT)
39
39
  갑자기 찾아오는 공포표(IHT)
40
- 폐허에서 조우하는 공포표(RHT)
41
- 야외에서 조우하는 공포표(MHT)
42
- 정보 속에 숨어 있는 공포표(LHT)
40
+ 폐허에서 마주치는 공포표(RHT)
41
+ 야외에서 마주치는 공포표(MHT)
42
+ 정보 속에 숨어있는 공포표(LHT)
43
43
  조우표 도시 (ECT) 산림 (EMT) 해변 (EAT)/반응표 RET
44
- 야근 조우하는 공포표 OHT/야근 전화표 OPT/야근 씬표 OWT
44
+ 야근 호러 스케이프 OHT/야근 전화표 OPT/야근 장면표 OWT
45
45
  회사명 결정표1 CNT1/회사명 결정표2 CNT2/회사명 결정표3 CNT3
46
46
  ・D66 다이스 있음.
47
47
  INFO_MESSAGE_TEXT
@@ -37,7 +37,7 @@ module BCDice
37
37
  SceneSituation, SSi
38
38
  HELP
39
39
 
40
- ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+\-])([+\-*/()\d]+)\])?}i.freeze
40
+ ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+-])([+\-*/()\d]+)\])?}i.freeze
41
41
  register_prefix('AT(TACK|K)?')
42
42
 
43
43
  def initialize(command)