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
@@ -16,20 +16,24 @@ module BCDice
16
16
  HELP_MESSAGE = "貫通、クリティカル、ファンブルの自動判定を行います。\n"
17
17
 
18
18
  # ゲーム別成功度判定(1d100)
19
- def check_1D100(total, _dice_total, cmp_op, target)
20
- return '' if target == '?'
21
- return '' unless cmp_op == :<=
22
-
23
- # 1は常に貫通
24
- return " > 貫通" if total <= 1
25
- # 100は常に致命的失敗
26
- return " 致命的失敗" if total >= 100
27
-
28
- return " > 決定的成功" if total <= (target / 5 + 0.9)
29
- return " > 成功" if total <= target
30
- return " > 致命的失敗" if (total >= 99) && (target < 100)
31
-
32
- return " 失敗"
19
+ def result_1d100(total, _dice_total, cmp_op, target)
20
+ return nil unless cmp_op == :<=
21
+
22
+ if total <= 1
23
+ Result.critical("貫通") # 1は常に貫通
24
+ elsif total >= 100
25
+ Result.fumble("致命的失敗") # 100は常に致命的失敗
26
+ elsif target == '?'
27
+ Result.nothing
28
+ elsif total <= (target / 5.0).ceil
29
+ Result.critical("決定的成功")
30
+ elsif total <= target
31
+ Result.success("成功")
32
+ elsif (total >= 99) && (target < 100)
33
+ Result.fumble("致命的失敗")
34
+ else
35
+ Result.failure("失敗")
36
+ end
33
37
  end
34
38
  end
35
39
  end
@@ -1205,7 +1205,7 @@ module BCDice
1205
1205
  'RBT', 'SBT', 'BBT', 'CBT', 'DBT', 'IBT', 'FBT', 'LBT', 'PBT', 'NBT', 'ABT', 'VBT', 'GBT', 'HBT',
1206
1206
  'BFT', 'FWT', 'FT',
1207
1207
  'SRT', 'ORT', 'DRT', 'URT',
1208
- 'NJ\d+', 'BS\d+', TABLES.keys
1208
+ 'NJ', 'BS', TABLES.keys
1209
1209
  )
1210
1210
  end
1211
1211
  end
@@ -24,7 +24,7 @@ module BCDice
24
24
   ・射撃攻撃ファンブル表 SFT
25
25
  INFO_MESSAGE_TEXT
26
26
 
27
- register_prefix('EM\d+', 'HLT', 'MFT', 'SFT', '2R10')
27
+ register_prefix('EM', 'HLT', 'MFT', 'SFT', '2R10')
28
28
 
29
29
  def initialize(command)
30
30
  super(command)
@@ -45,18 +45,19 @@ module BCDice
45
45
  end
46
46
 
47
47
  # ゲーム別成功度判定(nD10)
48
- def check_nD10(total, dice_total, _dice_list, cmp_op, target)
49
- return '' if target == '?'
50
- return '' unless cmp_op == :>=
48
+ def result_nd10(total, dice_total, _dice_list, cmp_op, target)
49
+ return nil unless cmp_op == :>=
51
50
 
52
51
  if dice_total <= 2
53
- "ファンブル"
52
+ Result.fumble("ファンブル")
54
53
  elsif dice_total >= 20
55
- "クリティカル"
54
+ Result.critical("クリティカル")
55
+ elsif target == "?"
56
+ Result.nothing
56
57
  elsif total >= target
57
- "成功"
58
+ Result.success("成功")
58
59
  else
59
- "失敗"
60
+ Result.failure("失敗")
60
61
  end
61
62
  end
62
63
 
@@ -7,13 +7,13 @@ module BCDice
7
7
  ID = "Emoklore"
8
8
 
9
9
  # ゲームシステム名
10
- NAME = "エモクロア"
10
+ NAME = "エモクロアTRPG"
11
11
 
12
12
  # ゲームシステム名の読みがな
13
13
  #
14
14
  # 「ゲームシステム名の読みがなの設定方法」(docs/dicebot_sort_key.md)を参考にして
15
15
  # 設定してください
16
- SORT_KEY = "えもくろあ"
16
+ SORT_KEY = "えもくろあTRPG"
17
17
 
18
18
  # ダイスボットの使い方
19
19
  HELP_MESSAGE = <<~MESSAGETEXT
@@ -30,7 +30,7 @@ module BCDice
30
30
  MESSAGETEXT
31
31
 
32
32
  # ダイスボットで使用するコマンドを配列で列挙する
33
- register_prefix('\d*DM<=\d+', '(B|\d*)DA\d+')
33
+ register_prefix('\d*DM<=', '(B|\d*)DA')
34
34
 
35
35
  CRITICAL_VALUE = 1
36
36
  FUMBLE_VALUE = 10
@@ -53,7 +53,7 @@ module BCDice
53
53
  # ダイスロールの共通処理
54
54
  # @param [Integer] num_dice
55
55
  # @param [Integer] success_threshold
56
- # @return [String]
56
+ # @return [Result]
57
57
  def dice_roll(num_dice, success_threshold)
58
58
  # ダイスを振った結果を配列として取得
59
59
  values = @randomizer.roll_barabara(num_dice, 10)
@@ -65,33 +65,35 @@ module BCDice
65
65
 
66
66
  # 成功値
67
67
  success_value = 2 * critical + success - fumble
68
+ result = compare_result(success_value)
68
69
 
69
- "#{values} > #{success_value} > #{result_text(success_value)}"
70
+ result.text = "#{values} > #{success_value} > 成功数#{success_value} #{result.text}"
71
+ return result
70
72
  end
71
73
 
72
74
  # @param [Integer] success
73
- # @return [String]
74
- def result_text(success)
75
+ # @return [Result]
76
+ def compare_result(success)
75
77
  if success < 0
76
- "ファンブル!"
78
+ Result.fumble("ファンブル!")
77
79
  elsif success == 0
78
- "失敗!"
80
+ Result.failure("失敗!")
79
81
  elsif success == 1
80
- "成功!"
82
+ Result.success("成功!")
81
83
  elsif success == 2
82
- "ダブル!"
84
+ Result.critical("ダブル!")
83
85
  elsif success == 3
84
- "トリプル!"
86
+ Result.critical("トリプル!")
85
87
  elsif success <= 9
86
- "ミラクル!"
88
+ Result.critical("ミラクル!")
87
89
  else
88
- "カタストロフ!"
90
+ Result.critical("カタストロフ!")
89
91
  end
90
92
  end
91
93
 
92
94
  # 技能判定
93
95
  # @param [String] command コマンド
94
- # @return [String, nil] コマンドの結果
96
+ # @return [Result, nil] コマンドの結果
95
97
  def roll_dm(command)
96
98
  m = /^(\d+)?DM<=(\d+)$/.match(command)
97
99
  unless m
@@ -105,14 +107,15 @@ module BCDice
105
107
  end
106
108
 
107
109
  # ダイスロール本体
108
- ret_str = dice_roll(num_dice, success_threshold)
110
+ result = dice_roll(num_dice, success_threshold)
109
111
 
110
- return "(#{num_dice}DM<=#{success_threshold}) > #{ret_str}"
112
+ result.text = "(#{num_dice}DM<=#{success_threshold}) > #{result.text}"
113
+ return result
111
114
  end
112
115
 
113
116
  # 取得技能判定
114
117
  # @param [String] command コマンド
115
- # @return [String, nil] コマンドの結果
118
+ # @return [Result, nil] コマンドの結果
116
119
  def roll_da(command)
117
120
  m = /^(B|\d+)?DA(\d+)(\+\d+)?$/.match(command)
118
121
  unless m
@@ -123,8 +126,10 @@ module BCDice
123
126
  num_dice = (m[1] == "B" ? 1 : (m[1]&.to_i || 1)) + bonus
124
127
  success_threshold = m[1].to_i + m[2].to_i
125
128
 
126
- ret_str = dice_roll(num_dice, success_threshold)
127
- "(#{command}) > (#{num_dice}DM<=#{success_threshold}) > #{ret_str}"
129
+ result = dice_roll(num_dice, success_threshold)
130
+
131
+ result.text = "(#{command}) > (#{num_dice}DM<=#{success_threshold}) > #{result.text}"
132
+ return result
128
133
  end
129
134
  end
130
135
  end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FateCoreSystem < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'FateCoreSystem'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Fate Core System'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふえいとこあしすてむ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ■ ファッジダイスによる判定 (xDF+y>=t)
18
+ ファッジダイスをx個ダイスロールし、結果を判定します。
19
+ x: ダイス数
20
+ y: 修正値(省略可)
21
+ t: 目標値値(省略可)
22
+ 例)4DF, 4DF>=3, 4DF+1>=3
23
+ MESSAGETEXT
24
+
25
+ register_prefix('\d+DF')
26
+
27
+ def eval_game_system_specific_command(command)
28
+ roll_df(command)
29
+ end
30
+
31
+ private
32
+
33
+ def roll_df(command)
34
+ parser = Command::Parser.new("DF", round_type: @round_type)
35
+ .enable_prefix_number()
36
+ .restrict_cmp_op_to(:>=, nil)
37
+
38
+ parsed = parser.parse(command)
39
+ unless parsed
40
+ return nil
41
+ end
42
+
43
+ dice_list = roll_fate_dice(parsed.prefix_number)
44
+ total = dice_list.sum() + parsed.modify_number
45
+
46
+ fate_dice_list = dice_list.map do |i|
47
+ if i.zero?
48
+ "[ ]"
49
+ elsif i.positive?
50
+ "[+]"
51
+ else
52
+ "[-]"
53
+ end
54
+ end
55
+
56
+ result = outcome(total, parsed.target_number)
57
+ sequence = [
58
+ "(#{parsed})",
59
+ "#{fate_dice_list.join()}#{Format.modifier(parsed.modify_number)}",
60
+ result_ladder(total),
61
+ result.text,
62
+ ]
63
+
64
+ result.text = sequence.compact.join(" > ")
65
+ return result
66
+ end
67
+
68
+ def roll_fate_dice(times)
69
+ @randomizer.roll_barabara(times, 3).map { |i| i - 2 }
70
+ end
71
+
72
+ def result_ladder(total)
73
+ ladder =
74
+ case total.clamp(-2, 8)
75
+ when 8
76
+ "Legendary"
77
+ when 7
78
+ "Epic"
79
+ when 6
80
+ "Fantastic"
81
+ when 5
82
+ "Superb"
83
+ when 4
84
+ "Great"
85
+ when 3
86
+ "Good"
87
+ when 2
88
+ "Fair"
89
+ when 1
90
+ "Average"
91
+ when 0
92
+ "Mediocre"
93
+ when -1
94
+ "Poor"
95
+ else
96
+ "Terrible"
97
+ end
98
+
99
+ return "#{ladder}(#{format('%+d', total)})"
100
+ end
101
+
102
+ def outcome(total, target)
103
+ if target.nil?
104
+ Result.new
105
+ elsif total == target
106
+ Result.success("Tie")
107
+ elsif total >= target + 3
108
+ Result.critical("Succeed with Style")
109
+ elsif total >= target
110
+ Result.success("Succeed")
111
+ else
112
+ Result.failure("Fail")
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -20,7 +20,7 @@ module BCDice
20
20
  ※ WとBは片方指定(Bx, Wx)、入替指定(WxBx,BxWx)可能
21
21
  INFO_MESSAGE_TEXT
22
22
 
23
- register_prefix('FS\d+', '[WB]\d+')
23
+ register_prefix('FS', 'W', 'B')
24
24
 
25
25
  def eval_game_system_specific_command(command)
26
26
  roll_fs(command) || roll_white_black(command) || roll_white_black_single(command)
@@ -121,6 +121,10 @@ module BCDice
121
121
  class FW
122
122
  attr_accessor :dice_count, :target, :critical, :fumble
123
123
 
124
+ def initialize
125
+ @target = nil
126
+ end
127
+
124
128
  def self.roll(command, randomizer)
125
129
  fw = parse(command)
126
130
 
@@ -72,16 +72,17 @@ module BCDice
72
72
 
73
73
  result =
74
74
  if max <= 1
75
- translate("FutariSousa.DT.fumble")
75
+ Result.fumble(translate("FutariSousa.DT.fumble"))
76
76
  elsif dice_list.include?(SPECIAL_DICE)
77
- translate("FutariSousa.DT.special")
77
+ Result.critical(translate("FutariSousa.DT.special"))
78
78
  elsif max >= SUCCESS_THRESHOLD
79
- translate("success")
79
+ Result.success(translate("success"))
80
80
  else
81
- translate("failure")
81
+ Result.failure(translate("failure"))
82
82
  end
83
83
 
84
- return "#{command}(#{dice_list.join(',')}) > #{result}"
84
+ result.text = "#{command}(#{dice_list.join(',')}) > #{result.text}"
85
+ result
85
86
  end
86
87
 
87
88
  # 助手用判定コマンド AS
@@ -91,16 +92,17 @@ module BCDice
91
92
 
92
93
  result =
93
94
  if max <= 1
94
- translate("FutariSousa.AS.fumble")
95
+ Result.fumble(translate("FutariSousa.AS.fumble"))
95
96
  elsif dice_list.include?(SPECIAL_DICE)
96
- translate("FutariSousa.AS.special")
97
+ Result.critical(translate("FutariSousa.AS.special"))
97
98
  elsif max >= SUCCESS_THRESHOLD
98
- translate("FutariSousa.AS.success")
99
+ Result.success(translate("FutariSousa.AS.success"))
99
100
  else
100
- translate("failure")
101
+ Result.failure(translate("failure"))
101
102
  end
102
103
 
103
- return "#{command}(#{dice_list.join(',')}) > #{result}"
104
+ result.text = "#{command}(#{dice_list.join(',')}) > #{result.text}"
105
+ result
104
106
  end
105
107
 
106
108
  class << self
@@ -32,7 +32,7 @@ module BCDice
32
32
  ・D66ダイスあり
33
33
  INFO_MESSAGE_TEXT
34
34
 
35
- register_prefix('FEAR(\+?\d+)?', 'REACT((\+|\-)?\d*)', '[\d\+\-]+\-3D6?[\d\+\-]*')
35
+ register_prefix('FEAR', 'REACT', '[\d\+\-]+\-3D6?[\d\+\-]*')
36
36
 
37
37
  def initialize(command)
38
38
  super(command)
@@ -41,26 +41,23 @@ module BCDice
41
41
  end
42
42
 
43
43
  # ゲーム別成功度判定(nD6)
44
- def check_nD6(total, dice_total, dice_list, cmp_op, target)
45
- return '' if target == '?'
46
- return '' unless dice_list.size == 3 && cmp_op == :<=
44
+ def result_nd6(total, dice_total, dice_list, cmp_op, target)
45
+ return nil if target == "?"
46
+ return nil unless dice_list.size == 3 && cmp_op == :<=
47
47
 
48
48
  success = target - total # 成功度
49
49
 
50
- result =
51
- if critical?(dice_total, target)
52
- "クリティカル(成功度:#{success})"
53
- elsif fumble?(dice_total, target)
54
- "ファンブル(失敗度:#{success})"
55
- elsif dice_total >= 17
56
- "自動失敗(失敗度:#{success})"
57
- elsif total <= target
58
- "成功(成功度:#{success})"
59
- else
60
- "失敗(失敗度:#{success})"
61
- end
62
-
63
- " > #{result}"
50
+ if critical?(dice_total, target)
51
+ Result.critical("クリティカル(成功度:#{success})")
52
+ elsif fumble?(dice_total, target)
53
+ Result.fumble("ファンブル(失敗度:#{success})")
54
+ elsif dice_total >= 17
55
+ Result.failure("自動失敗(失敗度:#{success})")
56
+ elsif total <= target
57
+ Result.success("成功(成功度:#{success})")
58
+ else
59
+ Result.failure("失敗(失敗度:#{success})")
60
+ end
64
61
  end
65
62
 
66
63
  def eval_game_system_specific_command(command)
@@ -85,16 +82,8 @@ module BCDice
85
82
  modifier = ArithmeticEvaluator.eval(m[2])
86
83
  formated_modifier = Format.modifier(modifier)
87
84
 
88
- dice_list = @randomizer.roll_barabara(3, 6)
89
- dice_total = dice_list.sum()
90
- dice_str = dice_list.join(",")
91
-
92
- total = dice_total + modifier
93
-
94
- "(3D6#{formated_modifier}<=#{target_number}) > "\
95
- "#{dice_total}[#{dice_str}]#{formated_modifier} > "\
96
- "#{total}"\
97
- "#{check_nD6(total, dice_total, dice_list, :<=, target_number)}"
85
+ cmd = "3D6#{formated_modifier}<=#{target_number}"
86
+ return CommonCommand::AddDice.eval(cmd, self, @randomizer)
98
87
  end
99
88
 
100
89
  def roll_fear(command)
@@ -654,7 +654,7 @@ module BCDice
654
654
  )
655
655
  }.freeze
656
656
 
657
- register_prefix('GR', '[CEFAL]D[CT][-+\d]+', 'GHA[-+\d]+', TABLES.keys)
657
+ register_prefix('GR', '[CEFAL]D[CT]', 'GHA', TABLES.keys)
658
658
  end
659
659
  end
660
660
  end
@@ -26,7 +26,7 @@ module BCDice
26
26
  INFO_MESSAGE_TEXT
27
27
 
28
28
  register_prefix(
29
- 'GO(\-?\d+)(\/\d+)?(@\d+)?',
29
+ 'GO',
30
30
  'DC(SL|BL|IM|BR|RF|EL).+'
31
31
  )
32
32
 
@@ -58,6 +58,10 @@ module BCDice
58
58
 
59
59
  def check_roll_repeat_attack(success_rate, repeat_count, critical_border)
60
60
  success_rate_per_one = success_rate / repeat_count
61
+ # 連続攻撃は最終的な成功率が50%以上であることが必要 cf. p217
62
+ if repeat_count > 1 && success_rate_per_one < 50
63
+ return "D100<=#{success_rate_per_one}@#{critical_border} > 連続攻撃は成功率が50%以上必要です"
64
+ end
61
65
 
62
66
  check_roll(success_rate_per_one, critical_border)
63
67
  end
@@ -69,16 +73,17 @@ module BCDice
69
73
  dice_value = @randomizer.roll_once(100)
70
74
  result = get_check_result(dice_value, success_rate, critical_border, fumble_border)
71
75
 
72
- text = "D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result}"
73
- return text
76
+ result.text = "D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result.text}"
77
+ return result
74
78
  end
75
79
 
76
80
  def get_check_result(dice_value, success_rate, critical_border, fumble_border)
77
- return "クリティカル" if dice_value <= critical_border
78
- return "ファンブル" if dice_value >= fumble_border
79
- return "成功" if dice_value <= success_rate
81
+ # クリティカルとファンブルが重なった場合は、ファンブルとなる。 cf. p175
82
+ return Result.fumble("ファンブル") if dice_value >= fumble_border
83
+ return Result.critical("クリティカル") if dice_value <= critical_border
84
+ return Result.success("成功") if dice_value <= success_rate
80
85
 
81
- return "失敗"
86
+ return Result.failure("失敗")
82
87
  end
83
88
 
84
89
  def look_up_damage_chart(type, damage_value)
@@ -26,7 +26,7 @@ module BCDice
26
26
   例)GL
27
27
  MESSAGETEXT
28
28
 
29
- register_prefix('GK(#\d+)?', 'GL')
29
+ register_prefix('GK', 'GL')
30
30
 
31
31
  def eval_game_system_specific_command(command)
32
32
  output = nil
@@ -41,7 +41,7 @@ module BCDice
41
41
  MESSAGETEXT
42
42
 
43
43
  # 因果点は共有リソースなのでMCPIはシークレットダイスを無効化
44
- register_prefix('GS\(\d+\)', 'GS', '^MCPI.*\$\d+$', 'DB\d+')
44
+ register_prefix('GS', '^MCPI.*$', 'DB')
45
45
 
46
46
  def initialize(command)
47
47
  super(command)
@@ -28,15 +28,9 @@ module BCDice
28
28
  return string
29
29
  end
30
30
 
31
- def check_2D6(total, _dice_total, dice_list, cmp_op, target)
32
- return '' if target == '?'
33
-
31
+ def result_2d6(_total, _dice_total, dice_list, _cmp_op, _target)
34
32
  if dice_list == [5, 5]
35
- "ゴリティカル(自動的成功)"
36
- elsif total.send(cmp_op, target)
37
- " > 成功"
38
- else
39
- " > 失敗"
33
+ Result.critical("ゴリティカル(自動的成功)")
40
34
  end
41
35
  end
42
36
  end