bcdice 3.1.2 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
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