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
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bcdice/format"
4
+
3
5
  module BCDice
4
6
  module GameSystem
5
7
  class ColossalHunter < Base
@@ -14,10 +16,12 @@ module BCDice
14
16
 
15
17
  # ダイスボットの使い方
16
18
  HELP_MESSAGE = <<~MESSAGETEXT
17
- ・判定(CH±x>=y)
18
-  3D6の判定。クリティカル、ファンブルの自動判定を行います。
19
-  x:修正値。省略可能。y:目標値。省略可能。
20
-  例) CH CH+1 CH+2>=10
19
+ ・判定(nCH±x>=y)
20
+  nD6の判定。クリティカル、ファンブルの自動判定を行います。
21
+  n:ダイス数。省略可能。省略した場合3。
22
+  x:修正値。省略可能。
23
+  y:目標値。省略可能。
24
+  例) CH CH+1 CH+2>=10 4CH+1
21
25
  ・BIG-6表(B6T)
22
26
  ・覚醒表(AWT)
23
27
  ・現状表(CST)
@@ -45,65 +49,48 @@ module BCDice
45
49
  def getCheckRollDiceCommandResult(command)
46
50
  debug("getCheckRollDiceCommandResult command", command)
47
51
 
48
- return nil unless command =~ /(\d+)?CH([+\-\d]*)(>=([+\-\d]*))?$/i
52
+ parser = Command::Parser.new(/\d*CH/, round_type: round_type)
53
+ .restrict_cmp_op_to(nil, :>=)
49
54
 
50
- diceCount = (Regexp.last_match(1) || 3).to_i
51
- modifyText = (Regexp.last_match(2) || '')
52
- difficultyText = Regexp.last_match(4)
55
+ parsed = parser.parse(command)
56
+ unless parsed
57
+ return nil
58
+ end
53
59
 
54
- # 修正値の計算
55
- modify = getValue(modifyText, 0)
60
+ parsed.command = "3CH" unless parsed.command.start_with?(/\d/)
56
61
 
57
- # 目標値の計算
58
- difficulty = getValue(difficultyText, nil)
62
+ dice_count = parsed.command.to_i
63
+ modify = parsed.modify_number
59
64
 
60
65
  # ダイスロール
61
- dice_list = @randomizer.roll_barabara(diceCount, 6)
66
+ dice_list = @randomizer.roll_barabara(dice_count, 6)
62
67
  dice = dice_list.sum()
63
68
  dice_str = dice_list.join(",")
64
69
 
65
70
  total = dice + modify
66
71
 
67
- # 出力用ダイスコマンドを生成
68
- command = "#{diceCount}CH#{modifyText}"
69
- command += ">=#{difficulty}" unless difficulty.nil?
70
-
71
72
  # 出力文の生成
72
- result = "(#{command}) > #{dice}[#{dice_str}]#{modifyText} > #{total}"
73
+ text = "(#{parsed}) > #{dice}[#{dice_str}]#{Format.modifier(modify)} > #{total}"
73
74
 
74
- # クリティカル・ファンブルチェック
75
- if isFamble(dice)
76
- result += " > ファンブル"
77
- elsif isCritical(total)
78
- result += " > クリティカル"
79
- else
80
- result += getJudgeResultString(difficulty, total)
81
- end
75
+ result = get_judge_result(dice, total, parsed)
82
76
 
77
+ result.text = text + result.text
83
78
  return result
84
79
  end
85
80
 
86
81
  # 成否判定
87
- def getJudgeResultString(difficulty, total)
88
- return '' if difficulty.nil?
89
-
90
- return " > 成功" if total >= difficulty
91
-
92
- return " > 失敗"
93
- end
94
-
95
- def getValue(text, defaultValue)
96
- return defaultValue if text.nil? || text.empty?
97
-
98
- ArithmeticEvaluator.eval(text)
99
- end
100
-
101
- def isCritical(total)
102
- (total >= 16)
103
- end
104
-
105
- def isFamble(total)
106
- (total <= 5)
82
+ def get_judge_result(dice, total, parsed)
83
+ if dice <= 5
84
+ Result.fumble(" > ファンブル")
85
+ elsif total >= 16
86
+ Result.critical(" > クリティカル")
87
+ elsif parsed.cmp_op.nil?
88
+ Result.new("")
89
+ elsif total >= parsed.target_number
90
+ Result.success(" > 成功")
91
+ else
92
+ Result.failure(" > 失敗")
93
+ end
107
94
  end
108
95
 
109
96
  def getSourceSceneDiceCommandResult(command)
@@ -562,7 +549,7 @@ module BCDice
562
549
 
563
550
  }.freeze
564
551
 
565
- register_prefix("CH.*", "B6T", "CNP", TABLES.keys)
552
+ register_prefix('\d*CH', "B6T", "CNP", TABLES.keys)
566
553
  end
567
554
  end
568
555
  end
@@ -19,7 +19,7 @@ module BCDice
19
19
  例・CW8
20
20
  INFO_MESSAGE_TEXT
21
21
 
22
- register_prefix('CW\d+')
22
+ register_prefix('CW')
23
23
 
24
24
  def eval_game_system_specific_command(command)
25
25
  result = nil
@@ -48,7 +48,7 @@ module BCDice
48
48
 
49
49
  INFO_MESSAGE_TEXT
50
50
 
51
- register_prefix('CC(B)?\(\d+\)', 'CC(B)?', 'RES(B)?', 'CBR(B)?\(\d+,\d+\)')
51
+ register_prefix('CCB?', 'RESB?', 'CBRB?')
52
52
 
53
53
  def initialize(command)
54
54
  super(command)
@@ -193,12 +193,12 @@ module BCDice
193
193
  end
194
194
 
195
195
  def getRegistResult(command)
196
- m = /^RES(B)?([-\d]+)$/i.match(command)
196
+ m = /^RESB?(-?\d+)$/i.match(command)
197
197
  unless m
198
198
  return nil
199
199
  end
200
200
 
201
- value = m[2].to_i
201
+ value = m[1].to_i
202
202
  target = value * 5 + 50
203
203
 
204
204
  if target < 5
@@ -17,13 +17,19 @@ module BCDice
17
17
 
18
18
  # ダイスボットの使い方
19
19
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
20
- ※コマンドは入力内容の前方一致で検出しています。
21
20
  ・判定 CC(x)<=(目標値)
22
-  x:ボーナス・ペナルティダイス (2~-2)。省略可。
21
+  x:ボーナス・ペナルティダイス。省略可。
23
22
   目標値が無くても1D100は表示される。
24
23
   ファンブル/失敗/ レギュラー成功/ハード成功/
25
24
   イクストリーム成功/クリティカル を自動判定。
26
- 例)CC<=30 CC(2)<=50 CC(+2)<=50 CC(-1)<=75 CC-1<=50 CC1<=65 CC+1<=65 CC
25
+  例)CC<=30 CC(2)<=50 CC(+2)<=50 CC(-1)<=75 CC-1<=50 CC1<=65 CC+1<=65 CC
26
+
27
+ ・技能ロールの難易度指定 CC(x)<=(目標値)(難易度)
28
+  目標値の後に難易度を指定することで
29
+  成功/失敗/クリティカル/ファンブル を自動判定する。
30
+  難易度の指定:
31
+   r:レギュラー h:ハード e:イクストリーム c:クリティカル
32
+  例)CC<=70r CC1<=60h CC-2<=50e CC2<=99c
27
33
 
28
34
  ・組み合わせ判定 (CBR(x,y))
29
35
   目標値 x と y で%ロールを行い、成否を判定。
@@ -48,7 +54,7 @@ module BCDice
48
54
    強力でない呪文の場合 FCL/強力な呪文の場合 FCM
49
55
  INFO_MESSAGE_TEXT
50
56
 
51
- register_prefix('CC', 'CBR\(\d+,\d+\)', 'FAR', 'BMR', 'BMS', 'FCL', 'FCM', 'PH', 'MA')
57
+ register_prefix('CC', 'CBR', 'FAR', 'BMR', 'BMS', 'FCL', 'FCM', 'PH', 'MA')
52
58
 
53
59
  def eval_game_system_specific_command(command)
54
60
  case command
@@ -58,17 +64,17 @@ module BCDice
58
64
  combine_roll(command)
59
65
  when /^FAR/i
60
66
  getFullAutoResult(command)
61
- when /^BMR/i # 狂気の発作(リアルタイム)
67
+ when "BMR" # 狂気の発作(リアルタイム)
62
68
  roll_bmr_table()
63
- when /^BMS/i # 狂気の発作(サマリー)
69
+ when "BMS" # 狂気の発作(サマリー)
64
70
  roll_bms_table()
65
- when /^FCL/i # キャスティング・ロールのプッシュに失敗した場合(小)
71
+ when "FCL" # キャスティング・ロールのプッシュに失敗した場合(小)
66
72
  roll_1d8_table("キャスティング・ロール失敗(小)表", FAILED_CASTING_L_TABLE)
67
- when /^FCM/i # キャスティング・ロールのプッシュに失敗した場合(大)
73
+ when "FCM" # キャスティング・ロールのプッシュに失敗した場合(大)
68
74
  roll_1d8_table("キャスティング・ロール失敗(大)表", FAILED_CASTING_M_TABLE)
69
- when /^PH/i # 恐怖症表
75
+ when "PH" # 恐怖症表
70
76
  roll_1d100_table("恐怖症表", PHOBIAS_TABLE)
71
- when /^MA/i # マニア表
77
+ when "MA" # マニア表
72
78
  roll_1d100_table("マニア表", MANIAS_TABLE)
73
79
  end
74
80
  end
@@ -77,6 +83,7 @@ module BCDice
77
83
  LEVEL = [
78
84
  :fumble,
79
85
  :failure,
86
+ :success,
80
87
  :regular_success,
81
88
  :hard_success,
82
89
  :extreme_success,
@@ -88,23 +95,38 @@ module BCDice
88
95
  extreme_success: "イクストリーム成功",
89
96
  hard_success: "ハード成功",
90
97
  regular_success: "レギュラー成功",
98
+ success: "成功",
91
99
  fumble: "ファンブル",
92
100
  failure: "失敗",
93
101
  }.freeze
94
102
 
103
+ def self.with_difficulty_level(total, difficulty)
104
+ fumble = difficulty < 50 ? 96 : 100
105
+
106
+ if total == 1
107
+ ResultLevel.new(:critical)
108
+ elsif total >= fumble
109
+ ResultLevel.new(:fumble)
110
+ elsif total <= difficulty
111
+ ResultLevel.new(:success)
112
+ else
113
+ ResultLevel.new(:failure)
114
+ end
115
+ end
116
+
95
117
  def self.from_values(total, difficulty, fumbleable = false)
96
118
  fumble = difficulty < 50 || fumbleable ? 96 : 100
97
119
 
98
120
  if total == 1
99
121
  ResultLevel.new(:critical)
122
+ elsif total >= fumble
123
+ ResultLevel.new(:fumble)
100
124
  elsif total <= (difficulty / 5)
101
125
  ResultLevel.new(:extreme_success)
102
126
  elsif total <= (difficulty / 2)
103
127
  ResultLevel.new(:hard_success)
104
128
  elsif total <= difficulty
105
129
  ResultLevel.new(:regular_success)
106
- elsif total >= fumble
107
- ResultLevel.new(:fumble)
108
130
  else
109
131
  ResultLevel.new(:failure)
110
132
  end
@@ -117,7 +139,7 @@ module BCDice
117
139
  end
118
140
 
119
141
  def success?
120
- @level_index >= LEVEL.index(:regular_success)
142
+ @level_index >= LEVEL.index(:success)
121
143
  end
122
144
 
123
145
  def failure?
@@ -160,15 +182,26 @@ module BCDice
160
182
  end
161
183
 
162
184
  def skill_roll(command)
163
- m = /^CC([-+]?\d+)?(?:<=(\d+))?$/.match(command)
185
+ m = /^CC([-+]?\d+)?(?:<=(\d+)([RHEC])?)?$/.match(command)
164
186
  unless m
165
187
  return nil
166
188
  end
167
189
 
168
190
  bonus_dice = m[1].to_i
169
- difficulty = m[2].to_i
191
+ difficulty = m[2]&.to_i
192
+ difficulty_level = m[3]
193
+
194
+ if difficulty == 0
195
+ difficulty = nil
196
+ elsif difficulty_level == "H"
197
+ difficulty /= 2
198
+ elsif difficulty_level == "E"
199
+ difficulty /= 5
200
+ elsif difficulty_level == "C"
201
+ difficulty = 0
202
+ end
170
203
 
171
- if bonus_dice == 0 && difficulty == 0
204
+ if bonus_dice == 0 && difficulty.nil?
172
205
  dice = @randomizer.roll_once(100)
173
206
  return "1D100 > #{dice}"
174
207
  end
@@ -179,8 +212,13 @@ module BCDice
179
212
 
180
213
  total, total_list = roll_with_bonus(bonus_dice)
181
214
 
182
- expr = difficulty.zero? ? "1D100" : "1D100<=#{difficulty}"
183
- result = ResultLevel.from_values(total, difficulty) unless difficulty.zero?
215
+ expr = difficulty.nil? ? "1D100" : "1D100<=#{difficulty}"
216
+ result =
217
+ if difficulty_level
218
+ ResultLevel.with_difficulty_level(total, difficulty)
219
+ elsif difficulty
220
+ ResultLevel.from_values(total, difficulty)
221
+ end
184
222
 
185
223
  sequence = [
186
224
  "(#{expr}) ボーナス・ペナルティダイス[#{bonus_dice}]",
@@ -35,7 +35,7 @@ module BCDice
35
35
  ・實時型 Short/總結型 Longer
36
36
  INFO_MESSAGE_TEXT
37
37
 
38
- register_prefix('CC\(\d+\)', 'CC', 'CBR\(\d+,\d+\)', 'FAR\(\d+\)', 'FAR')
38
+ register_prefix('CC', 'CBR', 'FAR')
39
39
 
40
40
  def initialize(command)
41
41
  super(command)
@@ -32,7 +32,7 @@ module BCDice
32
32
  예)FAR(25,70,98) FAR(50,80,98,-1)
33
33
  INFO_MESSAGE_TEXT
34
34
 
35
- register_prefix('CC\(\d+\)', 'CC', 'CBR\(\d+,\d+\)', 'FAR\(\d+\)', 'FAR')
35
+ register_prefix('CC', 'CBR', 'FAR')
36
36
 
37
37
  def initialize(command)
38
38
  super(command)
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/Cthulhu"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Cthulhu_SimplifiedChinese < Cthulhu
8
+ # ゲームシステムの識別子
9
+ ID = 'Cthulhu:SimplifiedChinese'
10
+
11
+ # ゲームシステム名
12
+ NAME = '克苏鲁的呼唤 第六版'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Simplified Chinese:克苏鲁的呼唤 第六版'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ c=大成功值 / f=大失败值 / s=极难成功
20
+
21
+ 1d100<=n c・f・s全部关闭(只进行数值比较判定)
22
+
23
+ ・带cfs判定的判定指令
24
+
25
+ CC 掷1d100骰 c=1、f=100
26
+ CCB 同上,c=5、f=96
27
+
28
+ 例:CC<=80 (以80技能値进行行为判定。并以1%的标准使用cf的值)
29
+ 例:CCB<=55 (以55技能値进行行为判定。并以5%的标准使用cf的值)
30
+
31
+ ・关于组合骰
32
+
33
+ CBR(x,y) c=1、f=100
34
+ CBRB(x,y) c=5、f=96
35
+
36
+ ・关于对抗骰
37
+ RES(x-y) c=1、f=100
38
+ RESB(x-y) c=5、f=96
39
+
40
+ ※故障值判定
41
+
42
+ ・CC(x) c=1、f=100
43
+ x=故障值。骰点在x以上并且发生大失败时,会和大失败一起显示(文本为「大失败&故障」)
44
+ 没有发生大失败时,与成功或失败无关,文斗都会显示为「故障」(不显示成功或失败的情况下进行覆盖显示)
45
+
46
+ ・CCB(x) c=5、f=96
47
+ 同上
48
+
49
+ INFO_MESSAGE_TEXT
50
+
51
+ register_prefix_from_super_class()
52
+
53
+ def initialize(command)
54
+ super(command)
55
+
56
+ @locale = :zh_hans
57
+ end
58
+ end
59
+ end
60
+ end
@@ -43,17 +43,6 @@ module BCDice
43
43
  return string
44
44
  end
45
45
 
46
- # ゲーム別成功度判定(nD6)
47
- def check_nD6(total, _dice_total, _dice_list, cmp_op, target)
48
- if cmp_op != :>= || target == "?"
49
- ''
50
- elsif total >= target
51
- " > 成功"
52
- else
53
- " > 失敗"
54
- end
55
- end
56
-
57
46
  def check_roll(string)
58
47
  string = replace_text(string)
59
48
  return nil unless (m = /(^|\s)S?(3[rR]6([+\-\d]+)?(\[(\d+),(\d+)\])(([>=]+)(\d+))?)(\s|$)/i.match(string))
@@ -51,18 +51,19 @@ module BCDice
51
51
  end
52
52
 
53
53
  # ゲーム別成功度判定(2D6)
54
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
55
- return '' if target == '?'
56
- return '' unless cmp_op == :>=
54
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
55
+ return nil unless cmp_op == :>=
57
56
 
58
57
  if dice_total <= 2
59
- "ファンブル(判定失敗。失敗表(FT)を追加で1回振る)"
58
+ Result.fumble("ファンブル(判定失敗。失敗表(FT)を追加で1回振る)")
60
59
  elsif dice_total >= 12
61
- "スペシャル(判定成功。大成功表(GJT)を1回使用可能)"
60
+ Result.critical("スペシャル(判定成功。大成功表(GJT)を1回使用可能)")
61
+ elsif target == "?"
62
+ Result.nothing
62
63
  elsif total >= target
63
- "成功"
64
+ Result.success("成功")
64
65
  else
65
- "失敗"
66
+ Result.failure("失敗")
66
67
  end
67
68
  end
68
69
 
@@ -33,8 +33,8 @@ module BCDice
33
33
  INFO_MESSAGE_TEXT
34
34
 
35
35
  register_prefix(
36
- 'DLH\\d+([\\+\\-]\\d+)*',
37
- 'DC(L|S|C)\d+',
36
+ 'DLH',
37
+ 'DC[LSC]',
38
38
  'RNC[JO]',
39
39
  'HNC'
40
40
  )
@@ -71,10 +71,11 @@ module BCDice
71
71
  "行為判定(成功率:#{success_rate}%)",
72
72
  "1D100[#{dice10},#{dice01}]=#{roll_result_text}",
73
73
  roll_result_text.to_s,
74
- result
74
+ result.text
75
75
  ]
76
76
 
77
- return sequence.join(" > ")
77
+ result.text = sequence.join(" > ")
78
+ result
78
79
  end
79
80
 
80
81
  SUCCESS_STR = "成功"
@@ -84,19 +85,19 @@ module BCDice
84
85
 
85
86
  def action_result(total, tens, ones, success_rate)
86
87
  if total == 100 || success_rate <= 0
87
- FUMBLE_STR
88
+ Result.fumble(FUMBLE_STR)
88
89
  elsif total <= success_rate - 100
89
- CRITICAL_STR
90
+ Result.critical(CRITICAL_STR)
90
91
  elsif tens == ones
91
92
  if total <= success_rate
92
- CRITICAL_STR
93
+ Result.critical(CRITICAL_STR)
93
94
  else
94
- FUMBLE_STR
95
+ Result.fumble(FUMBLE_STR)
95
96
  end
96
97
  elsif total <= success_rate
97
- SUCCESS_STR
98
+ Result.success(SUCCESS_STR)
98
99
  else
99
- FAILURE_STR
100
+ Result.failure(FAILURE_STR)
100
101
  end
101
102
  end
102
103
 
@@ -28,7 +28,7 @@ module BCDice
28
28
  ・D66ダイスあり
29
29
  INFO_MESSAGE_TEXT
30
30
 
31
- register_prefix('[NAMUC]?URGE\d+')
31
+ register_prefix('[NAMUC]?URGE')
32
32
 
33
33
  def initialize(command)
34
34
  super(command)
@@ -38,21 +38,13 @@ module BCDice
38
38
  end
39
39
 
40
40
  # ゲーム別成功度判定(nD6)
41
- def check_nD6(total, _dice_total, dice_list, cmp_op, target)
41
+ def result_nd6(_total, _dice_total, dice_list, _cmp_op, target)
42
42
  if dice_list.count(1) >= 2 # 1の目が2個以上ならファンブル
43
- return "致命的失敗"
43
+ Result.fumble("致命的失敗")
44
44
  elsif dice_list.count(6) >= 2 # 6の目が2個以上あったらクリティカル
45
- return "効果的成功"
45
+ Result.critical("効果的成功")
46
46
  elsif target == "?"
47
- return ''
48
- end
49
-
50
- if [:>=, :>].include?(cmp_op)
51
- if total.send(cmp_op, target)
52
- " > 成功"
53
- else
54
- " > 失敗"
55
- end
47
+ Result.nothing
56
48
  end
57
49
  end
58
50
 
@@ -100,7 +100,7 @@ module BCDice
100
100
  )
101
101
  }.freeze
102
102
 
103
- register_prefix('RC\d+', 'DDC', TABLES.keys)
103
+ register_prefix('RC', 'DDC', TABLES.keys)
104
104
 
105
105
  def initialize(command)
106
106
  super(command)
@@ -30,6 +30,11 @@ module BCDice
30
30
  ・D66ダイスあり
31
31
  INFO_MESSAGE_TEXT
32
32
 
33
+ def initialize(command)
34
+ super(command)
35
+ @sides_implicit_d = 10
36
+ end
37
+
33
38
  register_prefix('\d+DX', 'ET')
34
39
 
35
40
  # 成功判定コマンドのノード
@@ -117,6 +122,8 @@ module BCDice
117
122
  achieved_value.to_s
118
123
  end
119
124
 
125
+ r.critical = value_groups.length > 1
126
+
120
127
  parts = [
121
128
  "(#{@expression})",
122
129
  "#{value_groups.join('+')}#{@modifier_str}",
@@ -239,7 +246,7 @@ module BCDice
239
246
  end
240
247
 
241
248
  # 疾風怒濤式の成功判定コマンドの正規表現マッチ情報からノードを作る
242
- # @param [MatchData] m 正規表現のマッチ情報
249
+ # @param command [String]
243
250
  # @return [DX]
244
251
  def parse_dx_shippu_doto(command)
245
252
  parser = Command::Parser.new(/\d+DX\d*/, round_type: round_type)
@@ -115,8 +115,9 @@ module BCDice
115
115
  dice_count = 4 if dice_count == 0
116
116
 
117
117
  dice_list = @randomizer.roll_barabara(dice_count, 6).sort
118
+ total = dice_list.sum()
118
119
 
119
- return "(#{command}) > #{dice_count}D6 > [ #{dice_list.join(', ')} ]"
120
+ return "(#{command}) > #{dice_count}D6 > [ #{dice_list.join(', ')} ] > #{total}"
120
121
  end
121
122
 
122
123
  def getReactionDiceCommandResult(command)
@@ -548,7 +549,7 @@ module BCDice
548
549
 
549
550
  TABLES = translate_tables(:ja_jp)
550
551
 
551
- register_prefix('DR', 'RT', 'HRT', 'CT\d+', TABLES.keys)
552
+ register_prefix('DR', 'RT', 'HRT', 'CT', TABLES.keys)
552
553
  end
553
554
  end
554
555
  end
@@ -16,34 +16,34 @@ module BCDice
16
16
  HELP_MESSAGE =
17
17
  '1D100<=m 方式の判定で成否、クリティカル・ファンブルを自動判定'
18
18
 
19
- def check_1D100(total, _dice_total, cmp_op, target)
20
- return '' if target == '?'
21
- return '' unless cmp_op == :<=
19
+ def result_1d100(total, _dice_total, cmp_op, target)
20
+ return nil if target == '?'
21
+ return nil unless cmp_op == :<=
22
22
 
23
- diceValue = total % 100 # 出目00は100ではなく00とする
24
- dice_ten_place = diceValue / 10
25
- dice_one_place = diceValue % 10
23
+ dice_value = total % 100 # 出目00は100ではなく00とする
24
+ dice_ten_place = dice_value / 10
25
+ dice_one_place = dice_value % 10
26
26
 
27
27
  if dice_ten_place == dice_one_place
28
- return '決定的失敗' if diceValue == 99
29
- return '00 > 決定的成功' if diceValue == 0
30
- return '決定的成功' if total <= target
28
+ return Result.fumble('決定的失敗') if dice_value == 99
29
+ return Result.critical('00 > 決定的成功') if dice_value == 0
30
+ return Result.critical('決定的成功') if total <= target
31
31
 
32
- return '決定的失敗'
32
+ return Result.fumble('決定的失敗')
33
33
  end
34
34
 
35
35
  diff_threshold = 30
36
36
 
37
37
  if total <= target
38
38
  if total >= diff_threshold
39
- 'エクセレント'
39
+ Result.success('エクセレント')
40
40
  else
41
- '成功'
41
+ Result.success('成功')
42
42
  end
43
43
  elsif (total - target) >= diff_threshold
44
- 'シビア'
44
+ Result.failure('シビア')
45
45
  else
46
- '失敗'
46
+ Result.failure('失敗')
47
47
  end
48
48
  end
49
49
  end