bcdice 3.1.2 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +154 -75
  3. data/README.md +3 -2
  4. data/i18n/Cthulhu/zh_hans.yml +11 -0
  5. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  6. data/i18n/StellarKnights/ja_jp.yml +498 -0
  7. data/i18n/StellarKnights/ko_kr.yml +498 -0
  8. data/i18n/zh_hans.yml +7 -0
  9. data/lib/bcdice/command/parsed.rb +11 -3
  10. data/lib/bcdice/command/parser.rb +179 -100
  11. data/lib/bcdice/common_command/add_dice.rb +1 -1
  12. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  13. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  14. data/lib/bcdice/common_command/calc.rb +1 -1
  15. data/lib/bcdice/common_command/choice.rb +78 -7
  16. data/lib/bcdice/dice_table.rb +3 -0
  17. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  18. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  19. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  20. data/lib/bcdice/game_system.rb +10 -0
  21. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  22. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  23. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  24. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  25. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  26. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  27. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  28. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  29. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  30. data/lib/bcdice/game_system/Avandner.rb +1 -1
  31. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  32. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  33. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  34. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  35. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  36. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  37. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  38. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  39. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  40. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  41. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  42. data/lib/bcdice/game_system/Chill.rb +10 -10
  43. data/lib/bcdice/game_system/Chill3.rb +9 -9
  44. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  45. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  46. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  47. data/lib/bcdice/game_system/Cthulhu.rb +1 -1
  48. data/lib/bcdice/game_system/Cthulhu7th.rb +50 -12
  49. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  50. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  51. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  52. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  53. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  54. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  55. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  56. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  57. data/lib/bcdice/game_system/DoubleCross.rb +3 -1
  58. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  59. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  60. data/lib/bcdice/game_system/Elric.rb +18 -14
  61. data/lib/bcdice/game_system/Elysion.rb +1 -1
  62. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  63. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  64. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  65. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  66. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  67. data/lib/bcdice/game_system/GURPS.rb +17 -28
  68. data/lib/bcdice/game_system/Garako.rb +1 -1
  69. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  70. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  71. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  72. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  73. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  74. data/lib/bcdice/game_system/Gundog.rb +9 -8
  75. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  76. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  77. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  78. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  79. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  80. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  81. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  82. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  83. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  84. data/lib/bcdice/game_system/Insane.rb +13 -20
  85. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  86. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  87. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  88. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  89. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  90. data/lib/bcdice/game_system/KanColle.rb +4 -9
  91. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  92. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  93. data/lib/bcdice/game_system/KurayamiCrying.rb +141 -2
  94. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  95. data/lib/bcdice/game_system/LogHorizon.rb +13 -10
  96. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  97. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  98. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  99. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  100. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  101. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  102. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  103. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  104. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  105. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  106. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  107. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  108. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  109. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  110. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  111. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  112. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  113. data/lib/bcdice/game_system/Postman.rb +1 -1
  114. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  115. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  116. data/lib/bcdice/game_system/Revulture.rb +123 -0
  117. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  118. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  119. data/lib/bcdice/game_system/SRS.rb +17 -16
  120. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  121. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  122. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  123. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  124. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  125. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  126. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  127. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  128. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  129. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  130. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  131. data/lib/bcdice/game_system/SterileLife.rb +2 -3
  132. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  133. data/lib/bcdice/game_system/Strave.rb +1 -1
  134. data/lib/bcdice/game_system/SwordWorld.rb +16 -7
  135. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
  136. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
  137. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  138. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  139. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  140. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  141. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  142. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  143. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  144. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  145. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  146. data/lib/bcdice/game_system/WARPS.rb +11 -9
  147. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  148. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  149. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  150. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  151. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  152. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  153. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  154. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  155. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
  156. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  157. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  158. data/lib/bcdice/repl.rb +1 -1
  159. data/lib/bcdice/result.rb +26 -0
  160. data/lib/bcdice/version.rb +1 -1
  161. metadata +22 -5
@@ -18,8 +18,8 @@ module BCDice
18
18
  INFO_MESSAGE_TEXT
19
19
 
20
20
  # ゲーム別成功度判定(1d100)
21
- def check_1D100(total, _dice_total, cmp_op, target)
22
- return '' if target == '?'
21
+ def result_1d100(total, _dice_total, cmp_op, target)
22
+ return Result.nothing if target == '?'
23
23
  return nil unless cmp_op == :<=
24
24
 
25
25
  # RuneQuest QUICK-START RULESを元に修正
@@ -28,18 +28,18 @@ module BCDice
28
28
 
29
29
  if (total <= 1) || (total <= critical_value)
30
30
  # 1は常に決定的成功
31
- "決定的成功"
31
+ Result.critical("決定的成功")
32
32
  elsif total >= 100
33
33
  # 100は常に致命的失敗
34
- "致命的失敗"
34
+ Result.fumble("致命的失敗")
35
35
  elsif total <= (target.to_f / 5).round
36
- "効果的成功"
36
+ Result.success("効果的成功")
37
37
  elsif total <= target
38
- "成功"
38
+ Result.success("成功")
39
39
  elsif total >= 95 + critical_value
40
- "致命的失敗"
40
+ Result.fumble("致命的失敗")
41
41
  else
42
- "失敗"
42
+ Result.failure("失敗")
43
43
  end
44
44
  end
45
45
  end
@@ -21,7 +21,7 @@ module BCDice
21
21
  例)R8,6>=13
22
22
  INFO_MESSAGE_TEXT
23
23
 
24
- register_prefix('R\d+')
24
+ register_prefix('R')
25
25
 
26
26
  def initialize(command)
27
27
  super(command)
@@ -219,7 +219,7 @@ module BCDice
219
219
 
220
220
  # 固有のダイスロールコマンドを実行する
221
221
  # @param [String] command 入力されたコマンド
222
- # @return [String, nil] ダイスロールコマンドの実行結果
222
+ # @return [Result, nil] ダイスロールコマンドの実行結果
223
223
  def eval_game_system_specific_command(command)
224
224
  alias_replaced_with_2d6 = replace_alias_for_srs_roll_with_2d6(command)
225
225
 
@@ -297,7 +297,7 @@ module BCDice
297
297
 
298
298
  # 成功判定を実行する
299
299
  # @param [SRSRollNode] srs_roll 成功判定ノード
300
- # @return [String] 成功判定結果
300
+ # @return [Result] 成功判定結果
301
301
  def execute_srs_roll(srs_roll)
302
302
  dice_list = @randomizer.roll_barabara(2, 6)
303
303
  dice_list.sort! if @sort_add_dice
@@ -307,35 +307,36 @@ module BCDice
307
307
 
308
308
  modified_sum = sum + srs_roll.modifier
309
309
 
310
+ result = compare_result(srs_roll, sum, modified_sum)
311
+
310
312
  parts = [
311
313
  "(#{srs_roll})",
312
314
  "#{sum}[#{dice_str}]#{Format.modifier(srs_roll.modifier)}",
313
315
  modified_sum,
314
- compare_result(srs_roll, sum, modified_sum)
316
+ result.text
315
317
  ]
316
318
 
317
- return parts.compact.join(' > ')
319
+ result.text = parts.compact.join(' > ')
320
+ result
318
321
  end
319
322
 
320
323
  # ダイスロール結果を目標値、クリティカル値、ファンブル値と比較する
321
324
  # @param [SRSRollNode] srs_roll 成功判定ノード
322
325
  # @param [Integer] sum 出目の合計
323
326
  # @param [Integer] modified_sum 修正後の値
324
- # @return [String, nil] 比較結果
327
+ # @return [Result] 比較結果
325
328
  def compare_result(srs_roll, sum, modified_sum)
326
329
  if sum >= srs_roll.critical_value
327
- return '自動成功'
328
- end
329
-
330
- if sum <= srs_roll.fumble_value
331
- return '自動失敗'
332
- end
333
-
334
- if srs_roll.target_value
335
- return modified_sum >= srs_roll.target_value ? '成功' : '失敗'
330
+ Result.critical("自動成功")
331
+ elsif sum <= srs_roll.fumble_value
332
+ Result.fumble("自動失敗")
333
+ elsif srs_roll.target_value.nil?
334
+ Result.new
335
+ elsif modified_sum >= srs_roll.target_value
336
+ Result.success("成功")
337
+ else
338
+ Result.failure("失敗")
336
339
  end
337
-
338
- return nil
339
340
  end
340
341
  end
341
342
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bcdice/base'
4
+
3
5
  module BCDice
4
6
  module GameSystem
5
7
  class SamsaraBallad < Base
@@ -59,38 +61,63 @@ module BCDice
59
61
  total = 100 if total == 0
60
62
  end
61
63
 
62
- cmp_result = compare(total, cmd)
64
+ result = compare(total, cmd)
65
+
66
+ result_str =
67
+ if result.failure?
68
+ "失敗"
69
+ elsif result.success?
70
+ "成功"
71
+ end
72
+
73
+ additional_str =
74
+ if result.fumble?
75
+ "ファンブル"
76
+ elsif result.critical?
77
+ "クリティカル"
78
+ end
63
79
 
64
80
  sequence = [
65
81
  "(D100#{cmd.cmp_op}#{cmd.target_number})",
66
82
  places_text,
67
83
  total.to_s,
68
- cmp_result,
84
+ result_str,
85
+ additional_str,
69
86
  ].compact
70
87
 
71
- return sequence.join(" > ")
88
+ result.text = sequence.join(" > ")
89
+
90
+ return result
72
91
  end
73
92
 
74
93
  private
75
94
 
76
- # @return [String]
77
- # @return [nil]
95
+ # @return [Result]
78
96
  def compare(total, cmd)
79
97
  if [:<=, :<].include?(cmd.cmp_op)
80
98
  if !total.send(cmd.cmp_op, cmd.target_number)
81
- "失敗"
99
+ Result.failure(nil)
82
100
  elsif fumble_?(total, cmd.fumble)
83
- "ファンブル"
101
+ Result.new.tap do |r|
102
+ r.success = true
103
+ r.fumble = true
104
+ end
84
105
  elsif critical_?(total, cmd.critical)
85
- "クリティカル"
106
+ Result.critical(nil)
86
107
  else
87
- "成功"
108
+ Result.success(nil)
88
109
  end
89
110
  elsif fumble_?(total, cmd.fumble)
90
111
  # ファンブル優先
91
- "ファンブル"
112
+ Result.new.tap do |r|
113
+ r.fumble = true
114
+ end
92
115
  elsif critical_?(total, cmd.critical)
93
- "クリティカル"
116
+ Result.new.tap do |r|
117
+ r.critical = true
118
+ end
119
+ else
120
+ Result.new
94
121
  end
95
122
  end
96
123
 
@@ -49,7 +49,7 @@ module BCDice
49
49
  ・D66ダイスあり
50
50
  INFO_MESSAGE_TEXT
51
51
 
52
- register_prefix('\d+R', 'SR\d+', 'TAGT', 'GETSST', 'NPCT', TABLES.keys, ALIASES.keys)
52
+ register_prefix('\d+R', 'SR', 'TAGT', 'GETSST', 'NPCT', TABLES.keys, ALIASES.keys)
53
53
 
54
54
  CREATE_ARMS_STRUCT = Struct.new(:base_parts, :accessory_parts, :parts_effect, :hit, :damage, :life, :kutibeni, :kiba, :abilities)
55
55
 
@@ -64,7 +64,7 @@ module BCDice
64
64
  debug("eval_game_system_specific_command begin string", command)
65
65
 
66
66
  result = checkRoll(command)
67
- return result unless result.empty?
67
+ return result unless result.nil?
68
68
 
69
69
  debug("判定ロールではなかった")
70
70
 
@@ -81,13 +81,13 @@ module BCDice
81
81
  debug("checkRoll begin string", string)
82
82
 
83
83
  m = /^(\d+)R>=(\d+)(\[(\d+)?(,|,\d+)?(,\d+(S)?)?\])?$/i.match(string)
84
- return '' unless m
84
+ return nil unless m
85
85
 
86
86
  roll_times = m[1].to_i
87
87
  target = m[2].to_i
88
88
  params = m[3]
89
89
 
90
- min_suc, fumble, critical, isCriticalStop = getRollParams(params)
90
+ min_suc, fumble, critical, is_critical_stop = get_roll_params(params)
91
91
 
92
92
  result = ""
93
93
 
@@ -104,8 +104,8 @@ module BCDice
104
104
  end
105
105
 
106
106
  if fumble >= 6
107
- result += "#{getJudgeInfo(target, fumble, critical)} > ファンブル率が6を超えたため自動失敗!"
108
- return result
107
+ result += "#{get_judge_info(target, fumble, critical)} > ファンブル率が6を超えたため自動失敗!"
108
+ return Result.failure(result)
109
109
  end
110
110
 
111
111
  if target < 5
@@ -113,23 +113,30 @@ module BCDice
113
113
  target = 5
114
114
  end
115
115
 
116
- dice_str, total_suc, isCritical, isFumble = checkRollLoop(roll_times, min_suc, target, critical, fumble, isCriticalStop)
116
+ dice_str, total_suc, is_critical, is_fumble = check_roll_loop(roll_times, min_suc, target, critical, fumble, is_critical_stop)
117
117
 
118
- result += "#{getJudgeInfo(target, fumble, critical)} > #{dice_str} > 成功度#{total_suc}"
118
+ result += "#{get_judge_info(target, fumble, critical)} > #{dice_str} > 成功度#{total_suc}"
119
119
 
120
- if isFumble
120
+ if is_fumble
121
121
  result += " > ファンブル"
122
122
  end
123
123
 
124
- if isCritical && (total_suc > 0)
124
+ if is_critical && (total_suc > 0)
125
125
  result += " > 必殺発動可能!"
126
126
  end
127
127
 
128
128
  debug('checkRoll result result', result)
129
- return result
129
+
130
+ return Result.new.tap do |r|
131
+ r.text = result
132
+ r.success = !is_fumble && min_suc > 0 && total_suc >= min_suc
133
+ r.failure = is_fumble
134
+ r.critical = is_critical
135
+ r.fumble = is_fumble
136
+ end
130
137
  end
131
138
 
132
- def getRollParams(params)
139
+ def get_roll_params(params)
133
140
  min_suc = 0
134
141
  fumble = 1
135
142
  critical = 13
@@ -154,19 +161,14 @@ module BCDice
154
161
  return min_suc, fumble, critical, isCriticalStop
155
162
  end
156
163
 
157
- def getJudgeInfo(target, fumble, critical)
158
- "【難易度#{target}、ファンブル率#{fumble}#{getcriticalString(critical)}】"
164
+ def get_judge_info(target, fumble, critical)
165
+ return "【難易度#{target}、ファンブル率#{fumble}、必殺#{critical == 13 ? 'なし' : critical.to_s}】"
159
166
  end
160
167
 
161
- def getcriticalString(critical)
162
- criticalString = (critical == 13 ? "なし" : critical.to_s)
163
- return "、必殺#{criticalString}"
164
- end
165
-
166
- def checkRollLoop(roll_times, min_suc, target, critical, fumble, isCriticalStop)
168
+ def check_roll_loop(roll_times, min_suc, target, critical, fumble, is_critical_stop)
167
169
  dice_str = ''
168
- isFumble = false
169
- isCritical = false
170
+ is_fumble = false
171
+ is_critical = false
170
172
  total_suc = 0
171
173
 
172
174
  roll_times.times do |_i|
@@ -193,38 +195,36 @@ module BCDice
193
195
  total_suc += dice_suc
194
196
 
195
197
  if critical <= d1 + d2
196
- isCritical = true
198
+ is_critical = true
197
199
  dice_str += "『必殺!』"
198
200
  end
199
201
 
200
202
  if (d1 == d2) && (d1 <= fumble) # ファンブルの確認
201
- isFumble = true
202
- isCritical = false
203
+ is_fumble = true
204
+ is_critical = false
203
205
  break
204
206
  end
205
207
 
206
- if isCritical && isCriticalStop # 必殺止めの確認
208
+ if is_critical && is_critical_stop # 必殺止めの確認
207
209
  break
208
210
  end
209
211
  end
210
212
 
211
- return dice_str, total_suc, isCritical, isFumble
213
+ return dice_str, total_suc, is_critical, is_fumble
212
214
  end
213
215
 
214
216
  def check_seigou(string)
215
217
  debug("check_seigou begin string", string)
216
218
 
217
- m = /^SR(\d+).*$/i.match(string)
218
- return '' unless m
219
-
220
- target = m[1].to_i
221
- sr_parser = Command::Parser.new(/SR\d+/i, round_type: round_type)
219
+ sr_parser = Command::Parser.new("SR", round_type: round_type)
220
+ .has_suffix_number
222
221
  .restrict_cmp_op_to(nil)
223
222
  cmd = sr_parser.parse(string)
224
223
  return '' unless cmd
225
224
 
226
225
  dice = @randomizer.roll_sum(2, 6)
227
226
  diceTotal = dice + cmd.modify_number
227
+ target = cmd.suffix_number
228
228
 
229
229
  seigou = if target < diceTotal
230
230
  "「激」"
@@ -37,8 +37,8 @@ module BCDice
37
37
  INFO_MESSAGE_TEXT
38
38
 
39
39
  register_prefix(
40
- '(SH|SHS)(\-?\d+)(\/\d+)?(@\d+)?',
41
- '(EM|TR|FE)(\-?\d+)(@\d+)?',
40
+ '(SH|SHS)',
41
+ '(EM|TR|FE)',
42
42
  'DC(SL|BL|IM|BR|RF|EL).+'
43
43
  )
44
44
 
@@ -73,13 +73,13 @@ module BCDice
73
73
 
74
74
  dice_value = @randomizer.roll_once(100)
75
75
  result = get_check_result(dice_value, success_rate, critical_border, fumble_border)
76
- title, supplementary = get_supplementary(command_type, result)
76
+ title, supplementary = get_supplementary(command_type, result.text)
77
77
  unless supplementary.empty?
78
78
  supplementary = "(#{supplementary})"
79
79
  end
80
80
 
81
- text = "#{title}判定 D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result}#{supplementary}"
82
- return text
81
+ result.text = "#{title}判定 D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result.text}#{supplementary}"
82
+ return result
83
83
  end
84
84
 
85
85
  def get_supplementary(command_type, result)
@@ -24,11 +24,12 @@ module BCDice
24
24
  register_prefix('SF', 'ST')
25
25
 
26
26
  def change_text(string)
27
- string.gsub(/SF/i, "2D6").gsub(/ST/i, "2D6")
27
+ string.gsub(/S[FT]/i, "2D6")
28
28
  end
29
29
 
30
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
31
- return '' if target == '?'
30
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
31
+ return Result.nothing if target == '?'
32
+ return nil unless [:>=, :>].include?(cmp_op)
32
33
 
33
34
  critical = false
34
35
  fumble = false
@@ -39,28 +40,23 @@ module BCDice
39
40
  fumble = true
40
41
  end
41
42
 
42
- totalValueBonus = 0
43
- if cmp_op == :>=
44
- totalValueBonus = 1
45
- end
43
+ totalValueBonus = (cmp_op == :>= ? 1 : 0)
46
44
 
47
- if [:>=, :>].include?(cmp_op)
48
- if (total + totalValueBonus) > target
49
- if critical
50
- return " > 自動成功(劇的成功)"
51
- elsif fumble
52
- return " > 自動失敗"
53
- else
54
- return " > 成功"
55
- end
45
+ if (total + totalValueBonus) > target
46
+ if critical
47
+ Result.critical("自動成功(劇的成功)")
48
+ elsif fumble
49
+ Result.failure("自動失敗")
50
+ else
51
+ Result.success("成功")
52
+ end
53
+ else
54
+ if critical
55
+ Result.success("自動成功")
56
+ elsif fumble
57
+ Result.fumble("自動失敗(致命的失敗)")
56
58
  else
57
- if critical
58
- return " > 自動成功"
59
- elsif fumble
60
- return " > 自動失敗(致命的失敗)"
61
- else
62
- return " > 失敗"
63
- end
59
+ Result.failure("失敗")
64
60
  end
65
61
  end
66
62
  end
@@ -16,12 +16,13 @@ module BCDice
16
16
 
17
17
  # ダイスボットの使い方
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
- ・行為判定 SG@s#f>=x
20
-  2D6の行為判定を行う
19
+ ・行為判定 nSG@s#f>=x
20
+  2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
21
+  n: ダイス数 (省略時 2)
21
22
   s: スペシャル値 (省略時 12)
22
23
   f: ファンブル値 (省略時 2)
23
24
   x: 目標値 (省略可)
24
-  例)SG, SG@11, SG@11#3, SG#3>=7
25
+  例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
25
26
  ・各種表
26
27
   ・(無印)シーン表 ST/ファンブル表 FT/感情表 ET
27
28
     /変調表 WT/戦場表 BT/異形表 MT
@@ -68,7 +69,7 @@ module BCDice
68
69
  end
69
70
  end
70
71
 
71
- register_prefix("SG")
72
+ register_prefix('\d*SG')
72
73
 
73
74
  def eval_game_system_specific_command(command)
74
75
  result = action_roll(command) || roll_tables(command, TABLES) || RTT.roll_command(@randomizer, command)
@@ -94,17 +95,23 @@ module BCDice
94
95
  private
95
96
 
96
97
  def action_roll(command)
97
- parser = Command::Parser.new("SG", round_type: round_type)
98
+ parser = Command::Parser.new(/\d*SG/, round_type: round_type)
98
99
  .restrict_cmp_op_to(:>=, nil)
99
100
  .enable_critical
100
101
  .enable_fumble
101
102
  cmd = parser.parse(command)
102
103
  return nil unless cmd
103
104
 
105
+ times = cmd.command.start_with?(/\d/) ? cmd.command.to_i : 2
106
+ return nil if times <= 1
107
+
104
108
  cmd.critical ||= 12
105
109
  cmd.fumble ||= 2
106
110
 
107
- dice_list = @randomizer.roll_barabara(2, 6).sort
111
+ dice_list_full = @randomizer.roll_barabara(times, 6).sort
112
+ dice_list_full_str = "[#{dice_list_full.join(',')}]" if times > 2
113
+
114
+ dice_list = dice_list_full[-2, 2]
108
115
  dice_total = dice_list.sum()
109
116
  total = dice_total + cmd.modify_number
110
117
 
@@ -123,6 +130,7 @@ module BCDice
123
130
 
124
131
  sequence = [
125
132
  "(#{cmd.to_s(:after_modify_number)})",
133
+ dice_list_full_str,
126
134
  "#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
127
135
  total,
128
136
  result.text