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
@@ -128,27 +128,30 @@ module BCDice
128
128
  dice_total = dice_list.sum()
129
129
  total = dice_total + parsed.modify_number
130
130
 
131
+ result = result_text(dice_count, dice_list, total, parsed)
132
+
131
133
  sequence = [
132
134
  "(#{parsed})",
133
135
  "#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(parsed.modify_number)}",
134
136
  total,
135
- result_text(dice_count, dice_list, total, parsed),
137
+ result.text,
136
138
  ].compact
137
139
 
138
- return sequence.join(" > ")
140
+ result.text = sequence.join(" > ")
141
+ result
139
142
  end
140
143
 
141
144
  def result_text(dice_count, dice_list, total, parsed)
142
145
  if dice_list.count(6) >= 2
143
- translate("LogHorizon.LH.critical")
146
+ Result.critical(translate("LogHorizon.LH.critical"))
144
147
  elsif dice_list.count(1) >= dice_count
145
- translate("LogHorizon.LH.fumble")
148
+ Result.fumble(translate("LogHorizon.LH.fumble"))
146
149
  elsif parsed.cmp_op.nil?
147
- nil
150
+ Result.new
148
151
  elsif total >= parsed.target_number
149
- translate('success')
152
+ Result.success(translate("success"))
150
153
  else
151
- translate('failure')
154
+ Result.failure(translate("failure"))
152
155
  end
153
156
  end
154
157
 
@@ -244,7 +247,7 @@ module BCDice
244
247
 
245
248
  # 財宝表ロール
246
249
  def roll_treasure(command)
247
- m = /^TRS(\d+)*([+\-\d]+)?$/.match(command)
250
+ m = /^TRS(\d+)?([+\-\d]+)?$/.match(command)
248
251
  return nil unless m
249
252
 
250
253
  character_rank = m[1].to_i
@@ -261,7 +264,7 @@ module BCDice
261
264
 
262
265
  ### 財宝表 ###
263
266
  def roll_treasure_table(command)
264
- m = /^([CMIHG]TRS)(\d+)*([+\-\d]+)?(\$)?$/.match(command)
267
+ m = /^([CMIHG]TRS)(\d+)?([+\-\d]+)?(\$)?$/.match(command)
265
268
  return nil unless m
266
269
 
267
270
  type = m[1]
@@ -286,7 +289,7 @@ module BCDice
286
289
 
287
290
  # 拡張ルール財宝表
288
291
  def roll_treasure_table_b2(command)
289
- m = /^([CMIO]TRSE)(\d+)*([+\-\d]+)?(\$)?$/.match(command)
292
+ m = /^([CMIO]TRSE)(\d+)?([+\-\d]+)?(\$)?$/.match(command)
290
293
  return nil unless m
291
294
 
292
295
  type = m[1]
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/MagicaLogia"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class MagicaLogia_SimplifiedChinese < MagicaLogia
8
+ # ゲームシステムの識別子
9
+ ID = "MagicaLogia:SimplifiedChinese"
10
+
11
+ # ゲームシステム名
12
+ NAME = "魔导书大战"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "国際化:Simplified Chinese:魔导书大战"
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・判定
20
+ 可以判定大成功/大失败/成功/失败
21
+ ・各种表
22
+ 经历表 BGT/初期锚点表 DAT/命运属性表 FAT
23
+ 愿望表 WIT/战利品表 PT
24
+ 时间流逝表 TPT/大判时间流逝表 TPTB
25
+ 事件表 AT
26
+ 大失败表 FT/变调表 WT
27
+ 命运转变表表 FCT
28
+  典型性灾厄 TCT/物理性灾厄 PCT/精神性灾厄 MCT/狂气性灾厄 ICT
29
+  社会性灾厄 SCT/超自然灾厄 XCT/不可思议的灾厄 WCT/喜剧性灾厄 CCT
30
+  魔法使的灾厄 MGCT
31
+ 场景表 ST/大判场景表 STB
32
+  极限环境 XEST/内心世界 IWST/魔法都市 MCST
33
+  死后世界 WDST/迷宫世界 LWST
34
+  魔法书架 MBST/魔法学院 MAST/克雷德塔 TCST
35
+  平行世界 PWST/终末世界 PAST/异世界酒吧 GBST
36
+  星影 SLST/旧图书馆 OLST
37
+ 世界法则追加表 WLAT/徘徊怪物表 WMT
38
+ 随机领域表 RCT
39
+ 随机特技表 RTT
40
+  星领域随机特技表 RTS, RTT1
41
+  兽领域随机特技表 RTB, RTT2
42
+  力领域随机特技表 RTF, RTT3
43
+  歌领域随机特技表 RTP, RTT4
44
+  梦领域随机特技表 RTD, RTT5
45
+  暗领域随机特技表 RTN, RTT6
46
+ 空白秘密表 BST
47
+  宿敌表 MIT/谋略表 MOT/因缘表 MAT
48
+  奇人表 MUT/力场表 MFT/同盟表 MLT
49
+ 落花表 FFT
50
+ 那之后表 FLT
51
+ ・可以使用D66
52
+ INFO_MESSAGE_TEXT
53
+
54
+ register_prefix_from_super_class()
55
+
56
+ def initialize(command)
57
+ super(command)
58
+
59
+ @locale = :zh_hans
60
+ end
61
+
62
+ SKILL_TABLE = translate_skill_table(:zh_hans)
63
+ TABLES = translate_tables(:zh_hans, SKILL_TABLE)
64
+ end
65
+ end
66
+ end
@@ -44,18 +44,19 @@ module BCDice
44
44
  return string
45
45
  end
46
46
 
47
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
48
- return '' if target == '?'
49
- return '' unless cmp_op == :>=
47
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
48
+ return nil unless cmp_op == :>=
50
49
 
51
50
  if dice_total <= 2
52
- "絶対失敗"
51
+ Result.fumble("絶対失敗")
53
52
  elsif dice_total >= 12
54
- "絶対成功"
53
+ Result.critical("絶対成功")
54
+ elsif target == "?"
55
+ Result.nothing
55
56
  elsif total >= target
56
- "成功"
57
+ Result.success("成功")
57
58
  else
58
- "失敗"
59
+ Result.failure("失敗")
59
60
  end
60
61
  end
61
62
 
@@ -104,7 +105,8 @@ module BCDice
104
105
 
105
106
  if signOfInequality != "" # 成功度判定処理
106
107
  cmp_op = Normalize.comparison_operator(signOfInequality)
107
- output += check_2D6(total_n, dice_now, dice_num, cmp_op, diff)
108
+ result = result_2d6(total_n, dice_now, dice_num, cmp_op, diff)
109
+ output += " > #{result.text}" if result
108
110
  end
109
111
 
110
112
  return output
@@ -51,12 +51,12 @@ module BCDice
51
51
  'TT', 'NT', 'ET', 'MPT',
52
52
  'T1T', 'T2T', 'T3T', 'T4T', 'T5T',
53
53
  'NAME',
54
- 'DFT', 'IDT\d*',
54
+ 'DFT', 'IDT',
55
55
  'WIT', 'LIT', 'RIT', 'SIT', 'RWIT', 'RUIT',
56
56
  'IFT',
57
57
  '\d+RET',
58
- 'PNT\d*', 'MLT\d*',
59
- 'KNT\d+', 'WORD\d+'
58
+ 'PNT', 'MLT',
59
+ 'KNT', 'WORD'
60
60
  )
61
61
 
62
62
  def initialize(command)
@@ -77,38 +77,38 @@ module BCDice
77
77
  return string
78
78
  end
79
79
 
80
- def check_nD6(total, dice_total, dice_list, cmp_op, target)
81
- return '' if target == '?'
80
+ def result_nd6(total, dice_total, dice_list, cmp_op, target)
81
+ return Result.nothing if target == "?"
82
+ return nil unless cmp_op == :>=
82
83
 
83
- result = get2D6Result(total, dice_total, cmp_op, target)
84
- result += getKiryokuResult(total, dice_list, target)
84
+ result = result_nd6_only(total, dice_total, cmp_op, target)
85
+ result.text += kiryoku_result(total, dice_list, target)
85
86
 
86
87
  return result
87
88
  end
88
89
 
89
- alias check_2D6 check_nD6
90
+ def result_nd6_only(total, dice_total, cmp_op, target)
91
+ return nil unless cmp_op == :>=
90
92
 
91
- def get2D6Result(total_n, dice_n, signOfInequality, diff)
92
- return '' unless signOfInequality == :>=
93
-
94
- if dice_n <= 2
95
- " 絶対失敗"
96
- elsif dice_n >= 12
97
- " > 絶対成功"
93
+ if dice_total <= 2
94
+ Result.fumble("絶対失敗")
95
+ elsif dice_total >= 12
96
+ Result.critical("絶対成功")
97
+ elsif total >= target
98
+ Result.success("成功")
98
99
  else
99
- get2D6ResultOnlySuccess(total_n, diff)
100
+ Result.failure("失敗")
100
101
  end
101
102
  end
102
103
 
103
- def get2D6ResultOnlySuccess(total_n, diff)
104
- if total_n >= diff
105
- " 成功"
106
- else
107
- " > 失敗"
108
- end
104
+ def result_2d6_text(total, dice_total, cmp_op, target)
105
+ text = result_nd6_only(total, dice_total, cmp_op, target)&.text
106
+ return "" if text.nil?
107
+
108
+ return " > #{text}"
109
109
  end
110
110
 
111
- def getKiryokuResult(total_n, dice_list, diff)
111
+ def kiryoku_result(total_n, dice_list, diff)
112
112
  num_6 = dice_list.count(6)
113
113
 
114
114
  if num_6 == 0
@@ -131,7 +131,7 @@ module BCDice
131
131
  none6Dice_n = maxDice1 + maxDice2
132
132
  debug("none6Dice_n", none6Dice_n)
133
133
  debug("diff", diff)
134
- none6DiceReuslt = get2D6ResultOnlySuccess(none6Total_n, diff)
134
+ none6DiceReuslt = (none6Total_n >= diff ? " > 成功" : " > 失敗")
135
135
 
136
136
  return " (もしくは) #{none6Total_n}#{none6DiceReuslt} & 《気力》1点獲得"
137
137
  end
@@ -180,8 +180,8 @@ module BCDice
180
180
 
181
181
  if signOfInequality != "" # 成功度判定処理
182
182
  cmp_op = Normalize.comparison_operator(signOfInequality)
183
- output += get2D6Result(total_n, dice_now, cmp_op, diff)
184
- output += getKiryokuResult(total_n, dice_list, diff)
183
+ output += result_2d6_text(total_n, dice_now, cmp_op, diff)
184
+ output += kiryoku_result(total_n, dice_list, diff)
185
185
  end
186
186
 
187
187
  return output
@@ -65,14 +65,15 @@ module BCDice
65
65
  'BDT', 'TBO', 'CBO', 'SBO', 'VBO',
66
66
  'ET', 'FET', 'HET', 'SDT', 'IEQ', 'FRT',
67
67
  'T1T', 'T2T', 'T3T', 'T4T', 'T5T',
68
- 'MPT', 'KNT\d+', 'WORD\d+', 'NAME', 'NNAME', 'NM',
68
+ 'MPT', 'KNT', 'WORD', 'NAME', 'NNAME', 'NM',
69
69
  'RT', 'CIR', 'RUIR', 'RWIR',
70
70
  'WIT', 'LIT', 'RIT', 'SIT', 'NRWT', 'NRUT', 'ARWT', 'ARUT',
71
71
  'KET', 'TET', 'NST', 'RET', 'FAT', 'HRT', 'BLT',
72
72
  'BUS', 'SHS', 'ASS', 'SUS', 'SCS', 'LAS', 'NES', 'COS', 'ENS', 'TOS',
73
73
  'ABUS', 'ASHS', 'AASS', 'ASUS', 'ASCS', 'ALAS', 'ANES', 'ACOS', 'AENS', 'ATOS',
74
74
  'SE', 'ARN', 'WEN', 'NEN', 'CEN', 'SEN', 'OEN',
75
- 'DFT\d+'
75
+ 'DFT',
76
+ 'PNT', 'MLT'
76
77
  )
77
78
 
78
79
  def initialize(command)
@@ -82,7 +83,7 @@ module BCDice
82
83
  @d66_sort_type = D66SortType::ASC
83
84
  end
84
85
 
85
- def getKiryokuResult(_total_n, dice_list, _diff)
86
+ def kiryoku_result(_total_n, dice_list, _diff)
86
87
  num_6 = dice_list.count(6)
87
88
 
88
89
  if num_6 == 0
@@ -35,7 +35,7 @@ module BCDice
35
35
  例)CRCM98 対物で数値98の戦闘結果を参照する。
36
36
  MESSAGETEXT
37
37
 
38
- register_prefix('AR', 'SR', 'HR<=.+', 'CC', 'ACT', 'ACL', 'ACS', 'CRC[A-Z]\d+')
38
+ register_prefix('AR', 'SR', 'HR<=', 'CC', 'ACT', 'ACL', 'ACS', 'CRC[A-Z]')
39
39
 
40
40
  def eval_game_system_specific_command(command)
41
41
  result = roll_tables(command, TABLES)
@@ -62,17 +62,13 @@ module BCDice
62
62
  return string
63
63
  end
64
64
 
65
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
66
- return '' if cmp_op != :>= || target == "?"
65
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
66
+ return nil if cmp_op != :>=
67
67
 
68
68
  if dice_total >= 12
69
- "絶対成功"
69
+ Result.critical("絶対成功")
70
70
  elsif dice_total <= 2
71
- "絶対失敗"
72
- elsif total >= target
73
- " > 成功"
74
- else
75
- " > 失敗"
71
+ Result.fumble("絶対失敗")
76
72
  end
77
73
  end
78
74
 
@@ -85,11 +81,14 @@ module BCDice
85
81
  return text
86
82
  end
87
83
 
88
- def check_1D100(total, dice_total, cmp_op, target)
89
- return '' if target == '?'
90
- return '' unless cmp_op == :<=
84
+ def result_1d100(_total, dice_total, cmp_op, _target)
85
+ return nil unless cmp_op == :<=
91
86
 
92
- return getResult(total, dice_total, target)
87
+ if dice_total <= 5
88
+ Result.critical("絶対成功")
89
+ elsif dice_total >= 96
90
+ Result.fumble("絶対失敗")
91
+ end
93
92
  end
94
93
 
95
94
  def getHitResult(total_n, _dice_n, diff)
@@ -106,15 +105,6 @@ module BCDice
106
105
  return ' > 成功'
107
106
  end
108
107
 
109
- def getResult(total_n, dice_n, diff)
110
- return ' > 絶対成功' if dice_n <= 5
111
- return ' > 絶対失敗' if dice_n >= 96
112
-
113
- return ' > 成功' if total_n <= diff
114
-
115
- return ' > 失敗'
116
- end
117
-
118
108
  # 戦闘結果チャートを振る
119
109
  # @param [String] suv 耐久レベル
120
110
  # @param [String] num 数値
@@ -51,11 +51,11 @@ module BCDice
51
51
  MESSAGETEXT
52
52
 
53
53
  register_prefix(
54
- '[AS]R\d+',
55
- '(HU|BK|WA|SC|BG|IN|PT|HT|TA|AC|HE|TR|VT|BO|CS|TH|AM|GD|HC|BI|BT|AI)HIT\d*',
56
- 'SUV[A-Z]\d+', '[HTALMEBPD]DMG[LMHO]',
57
- 'CRT\d*', '[GSME]AC\d*', '[ASL]MA\d*(\+\d+)?',
58
- 'SEC', 'NAC', 'LDC', '[W]ENC\d*'
54
+ '[AS]R',
55
+ '(HU|BK|WA|SC|BG|IN|PT|HT|TA|AC|HE|TR|VT|BO|CS|TH|AM|GD|HC|BI|BT|AI)HIT',
56
+ 'SUV[A-Z]', '[HTALMEBPD]DMG[LMHO]',
57
+ 'CRT', '[GSME]AC', '[ASL]MA',
58
+ 'SEC', 'NAC', 'LDC', '[W]ENC'
59
59
  )
60
60
 
61
61
  def eval_game_system_specific_command(command)
@@ -77,23 +77,25 @@ module BCDice
77
77
 
78
78
  result =
79
79
  if dice_value <= fumble
80
- translate("MonotoneMuseum.automatic_failure")
80
+ Result.fumble(translate("MonotoneMuseum.automatic_failure"))
81
81
  elsif dice_value >= critical
82
- translate("MonotoneMuseum.automatic_success")
82
+ Result.critical(translate("MonotoneMuseum.automatic_success"))
83
83
  elsif total >= target
84
- translate("success")
84
+ Result.success(translate("success"))
85
85
  else
86
- translate("failure")
86
+ Result.failure(translate("failure"))
87
87
  end
88
88
 
89
89
  sequence = [
90
90
  "(#{command})",
91
91
  "#{dice_value}[#{dice_str}]#{Format.modifier(modify_number)}",
92
92
  total.to_s,
93
- result,
93
+ result.text,
94
94
  ]
95
95
 
96
- return sequence.join(" > ")
96
+ result.text = sequence.join(" > ")
97
+
98
+ result
97
99
  end
98
100
 
99
101
  # モノトーンミュージアム用のテーブル
@@ -17,10 +17,10 @@ module BCDice
17
17
  # ダイスボットの使い方
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
19
  ・判定 (nNC+m)
20
-  ダイス数n、修正値mで判定ロールを行います。
20
+  ダイス数n、修正値mで判定ロールを行います(省略=1)
21
21
   ダイス数が2以上の時のパーツ破損数も表示します。
22
22
  ・攻撃判定 (nNA+m)
23
-  ダイス数n、修正値mで攻撃判定ロールを行います。
23
+  ダイス数n、修正値mで攻撃判定ロールを行います(省略=1)
24
24
   命中部位とダイス数が2以上の時のパーツ破損数も表示します。
25
25
 
26
26
 
@@ -37,119 +37,92 @@ module BCDice
37
37
  @default_target_number = 6 # 目標値が空欄の時の目標値
38
38
  end
39
39
 
40
- private
41
-
42
- def replace_text(string)
43
- string = string.gsub(/(\d+)NC(10)?([+\-][+\-\d]+)/i) { "#{Regexp.last_match(1)}R10#{Regexp.last_match(3)}[0]" }
44
- string = string.gsub(/(\d+)NC(10)?/i) { "#{Regexp.last_match(1)}R10[0]" }
45
- string = string.gsub(/(\d+)NA(10)?([+\-][+\-\d]+)/i) { "#{Regexp.last_match(1)}R10#{Regexp.last_match(3)}[1]" }
46
- string = string.gsub(/(\d+)NA(10)?/i) { "#{Regexp.last_match(1)}R10[1]" }
47
-
48
- return string
40
+ def eval_game_system_specific_command(command)
41
+ roll_tables(command, self.class::TABLES) || nechronica_check(command)
49
42
  end
50
43
 
51
- public
44
+ def result_nd10(total, _dice_total, value_list, cmp_op, target)
45
+ # 後方互換を維持するため、1d10>=nを目標値nの1NCとして処理
46
+ if value_list.count != 1 || cmp_op != :>= || target.nil? || target == "?"
47
+ return nil
48
+ end
52
49
 
53
- def eval_game_system_specific_command(command)
54
- return roll_tables(command, self.class::TABLES) || nechronica_check(command)
50
+ result_nechronica([total], target)
55
51
  end
56
52
 
57
53
  private
58
54
 
59
- def check_nD10(total, _dice_total, dice_list, cmp_op, target) # ゲーム別成功度判定(nD10)
60
- return '' if target == '?'
61
- return '' unless cmp_op == :>=
62
-
63
- result =
64
- if total >= 11
65
- translate("Nechronica.critical")
66
- elsif total >= target
67
- translate("success")
68
- elsif dice_list.count { |i| i <= 1 } == 0
69
- translate("failure")
70
- elsif dice_list.size > 1
71
- fumble = translate("Nechronica.fumble")
72
- break_all_parts = translate("Nechronica.break_all_parts")
73
- "#{fumble} > #{break_all_parts}"
55
+ def result_nechronica(value_list, target)
56
+ if value_list.max >= target
57
+ if value_list.max >= 11
58
+ Result.critical(translate("Nechronica.critical"))
74
59
  else
75
- translate("Nechronica.fumble")
60
+ Result.success(translate("success"))
76
61
  end
77
-
78
- return " > #{result}"
62
+ elsif value_list.count { |i| i <= 1 } == 0
63
+ Result.failure(translate("failure"))
64
+ elsif value_list.size > 1
65
+ break_all_parts = translate("Nechronica.break_all_parts")
66
+ fumble = translate("Nechronica.fumble")
67
+ Result.fumble("#{fumble} > #{break_all_parts}")
68
+ else
69
+ Result.fumble(translate("Nechronica.fumble"))
70
+ end
79
71
  end
80
72
 
81
- def nechronica_check(string)
82
- string = replace_text(string)
83
- debug("nechronica_check string", string)
73
+ # Rコマンドの後方互換を維持する
74
+ def r_backward_compatibility(command)
75
+ m = command.match(/^(\d)?R10([+\-\d]+)?(\[(\d+)\])?$/)
76
+ return command unless m
84
77
 
85
- unless /(^|\s)S?((\d+)[rR]10([+\-\d]+)?(\[(\d+)\])?)(\s|$)/i =~ string
86
- return nil
78
+ if m[4] == "1"
79
+ "#{m[1]}NA#{m[2]}"
80
+ else
81
+ "#{m[1]}NC#{m[2]}"
87
82
  end
83
+ end
88
84
 
89
- string = Regexp.last_match(2)
90
-
91
- dice_n = 1
92
- dice_n = Regexp.last_match(3).to_i if Regexp.last_match(3)
93
-
94
- battleMode = Regexp.last_match(6).to_i
95
-
96
- modText = Regexp.last_match(4)
97
- mod = ArithmeticEvaluator.eval(modText)
98
-
99
- # 0=判定モード, 1=戦闘モード
100
- isBattleMode = (battleMode == 1)
101
- debug("nechronica_check string", string)
102
- debug("isBattleMode", isBattleMode)
103
-
104
- diff = 6
105
-
106
- dice = @randomizer.roll_barabara(dice_n, 10).sort
107
- n_max = dice.max
108
-
109
- total_n = n_max + mod
85
+ def nechronica_check(command)
86
+ command = r_backward_compatibility(command)
87
+ # 歴史的経緯で10を受理する
88
+ cmd = Command::Parser.new(/N[CA](10)?/, round_type: round_type)
89
+ .enable_prefix_number.parse(command)
90
+ return nil unless cmd
110
91
 
111
- output = "(#{string}) > [#{dice.join(',')}]"
112
- if mod < 0
113
- output += mod.to_s
114
- elsif mod > 0
115
- output += "+#{mod}"
116
- end
92
+ dice_count = [1, cmd.prefix_number.to_i].max
93
+ modify_number = cmd.modify_number || 0
117
94
 
118
- dice.map! { |i| i + mod }
95
+ dice = @randomizer.roll_barabara(dice_count, 10).sort
96
+ dice_mod = dice.map { |i| i + modify_number }
97
+ total = dice_mod.max
119
98
 
120
- dice_str = dice.join(",")
121
- output += " > #{total_n}[#{dice_str}]"
99
+ na = get_hit_location(total) if cmd.command.start_with?("NA")
122
100
 
123
- output += check_nD10(total_n, dice_n, dice, :>=, diff)
101
+ result = result_nechronica(dice_mod, 6)
124
102
 
125
- if isBattleMode
126
- hit_loc = getHitLocation(total_n)
127
- if hit_loc != '1'
128
- output += "#{hit_loc}"
129
- end
130
- end
103
+ sequence = [
104
+ "(#{cmd})",
105
+ "[#{dice.join(',')}]#{Format.modifier(modify_number)}",
106
+ "#{total}[#{dice_mod.join(',')}]",
107
+ result.text,
108
+ na,
109
+ ].compact
131
110
 
132
- return output
111
+ result.text = sequence.join(" > ")
112
+ return result
133
113
  end
134
114
 
135
- def getHitLocation(dice)
136
- output = '1'
137
-
138
- debug("getHitLocation dice", dice)
139
- return output if dice <= 5
115
+ def get_hit_location(value)
116
+ return nil if value <= 5
140
117
 
141
118
  table = translate("Nechronica.hit_location.table")
142
- index = dice - 6
119
+ text = table[(value - 6).clamp(0, 5)]
143
120
 
144
- addDamage = ""
145
- if dice > 10
146
- index = 5
147
- addDamage = translate("Nechronica.hit_location.additional_damage", damage: dice - 10)
121
+ if value > 10
122
+ text + translate("Nechronica.hit_location.additional_damage", damage: value - 10)
123
+ else
124
+ text
148
125
  end
149
-
150
- output = table[index] + addDamage
151
-
152
- return output
153
126
  end
154
127
 
155
128
  class << self
@@ -166,7 +139,7 @@ module BCDice
166
139
 
167
140
  TABLES = translate_tables(:ja_jp)
168
141
 
169
- register_prefix('\d+NC.*', '\d+NA.*', '\d+R10.*', TABLES.keys)
142
+ register_prefix('\d?NC', '\d?NA', '\dR10', TABLES.keys)
170
143
  end
171
144
  end
172
145
  end