bcdice 3.1.3 → 3.5.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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +186 -76
  3. data/README.md +3 -2
  4. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  5. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  6. data/i18n/Cthulhu/zh_hans.yml +11 -0
  7. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  8. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  9. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  10. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  11. data/i18n/StellarKnights/ja_jp.yml +498 -0
  12. data/i18n/StellarKnights/ko_kr.yml +498 -0
  13. data/i18n/zh_hans.yml +7 -0
  14. data/lib/bcdice/command/parsed.rb +11 -3
  15. data/lib/bcdice/command/parser.rb +179 -100
  16. data/lib/bcdice/common_command/add_dice.rb +1 -1
  17. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  18. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  19. data/lib/bcdice/common_command/calc.rb +1 -1
  20. data/lib/bcdice/common_command/choice.rb +82 -7
  21. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  22. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  23. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  24. data/lib/bcdice/common_command.rb +2 -0
  25. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  26. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  27. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  28. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  29. data/lib/bcdice/dice_table.rb +3 -0
  30. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  31. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  32. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  33. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  34. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  35. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  36. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  37. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  38. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  39. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  40. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  41. data/lib/bcdice/game_system/Avandner.rb +1 -1
  42. data/lib/bcdice/game_system/BadLife.rb +264 -289
  43. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  44. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  45. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  46. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  47. data/lib/bcdice/game_system/BeginningIdol.rb +118 -2392
  48. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  49. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  50. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  51. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  52. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  53. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  54. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  55. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  56. data/lib/bcdice/game_system/Chill.rb +10 -10
  57. data/lib/bcdice/game_system/Chill3.rb +9 -9
  58. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  59. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  60. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  61. data/lib/bcdice/game_system/Cthulhu.rb +3 -3
  62. data/lib/bcdice/game_system/Cthulhu7th.rb +56 -18
  63. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  64. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  65. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  66. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  67. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  68. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  69. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  70. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  71. data/lib/bcdice/game_system/DoubleCross.rb +8 -1
  72. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  73. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  74. data/lib/bcdice/game_system/Elric.rb +18 -14
  75. data/lib/bcdice/game_system/Elysion.rb +1 -1
  76. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  77. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  78. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  79. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  80. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  82. data/lib/bcdice/game_system/GURPS.rb +17 -28
  83. data/lib/bcdice/game_system/Garako.rb +1 -1
  84. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  85. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  86. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  87. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  88. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  89. data/lib/bcdice/game_system/Gundog.rb +9 -8
  90. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  91. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  92. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  93. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  94. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  95. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  96. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  97. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  98. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  99. data/lib/bcdice/game_system/Insane.rb +13 -20
  100. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  101. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  102. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  103. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  104. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  105. data/lib/bcdice/game_system/KanColle.rb +4 -9
  106. data/lib/bcdice/game_system/Karukami.rb +84 -0
  107. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  108. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  109. data/lib/bcdice/game_system/KurayamiCrying.rb +142 -3
  110. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  111. data/lib/bcdice/game_system/LogHorizon.rb +10 -7
  112. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  113. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  114. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  115. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  116. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  117. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  118. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  119. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  120. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  121. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  122. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  123. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  124. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  125. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  126. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  127. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  128. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  129. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  130. data/lib/bcdice/game_system/Postman.rb +1 -1
  131. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  132. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  133. data/lib/bcdice/game_system/Revulture.rb +123 -0
  134. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  135. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  136. data/lib/bcdice/game_system/SRS.rb +17 -16
  137. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  138. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  139. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  140. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  141. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  142. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  143. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  144. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  145. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  146. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  147. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  148. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  149. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  150. data/lib/bcdice/game_system/Strave.rb +1 -1
  151. data/lib/bcdice/game_system/SwordWorld.rb +22 -9
  152. data/lib/bcdice/game_system/SwordWorld2_0.rb +22 -7
  153. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -2
  154. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  155. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  156. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  157. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  158. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  159. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  160. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  161. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  162. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  163. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  164. data/lib/bcdice/game_system/WARPS.rb +11 -9
  165. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  166. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  167. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  168. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  169. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  170. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  171. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  172. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  173. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  174. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  175. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  176. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  177. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  178. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  179. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  180. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  181. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  182. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  183. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  184. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  185. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  186. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  187. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  188. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +50 -7
  189. data/lib/bcdice/game_system/sword_world/rating_parser.rb +148 -107
  190. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  191. data/lib/bcdice/game_system.rb +18 -1
  192. data/lib/bcdice/repl.rb +1 -1
  193. data/lib/bcdice/result.rb +26 -0
  194. data/lib/bcdice/version.rb +1 -1
  195. metadata +48 -6
@@ -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