bcdice 3.1.2 → 3.4.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 (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
@@ -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)
@@ -117,6 +117,8 @@ module BCDice
117
117
  achieved_value.to_s
118
118
  end
119
119
 
120
+ r.critical = value_groups.length > 1
121
+
120
122
  parts = [
121
123
  "(#{@expression})",
122
124
  "#{value_groups.join('+')}#{@modifier_str}",
@@ -239,7 +241,7 @@ module BCDice
239
241
  end
240
242
 
241
243
  # 疾風怒濤式の成功判定コマンドの正規表現マッチ情報からノードを作る
242
- # @param [MatchData] m 正規表現のマッチ情報
244
+ # @param command [String]
243
245
  # @return [DX]
244
246
  def parse_dx_shippu_doto(command)
245
247
  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
@@ -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} > #{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