bcdice 3.2.0 → 3.3.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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -3
  3. data/README.md +1 -1
  4. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  5. data/i18n/StellarKnights/ja_jp.yml +2 -0
  6. data/i18n/StellarKnights/ko_kr.yml +498 -0
  7. data/i18n/zh_hans.yml +7 -0
  8. data/lib/bcdice/command/parsed.rb +11 -3
  9. data/lib/bcdice/command/parser.rb +179 -100
  10. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  11. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  12. data/lib/bcdice/game_system.rb +3 -0
  13. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  14. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -8
  15. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  16. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  17. data/lib/bcdice/game_system/BlindMythos.rb +38 -37
  18. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  19. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  20. data/lib/bcdice/game_system/DeadlineHeroes.rb +9 -8
  21. data/lib/bcdice/game_system/DoubleCross.rb +2 -0
  22. data/lib/bcdice/game_system/Emoklore.rb +22 -17
  23. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  24. data/lib/bcdice/game_system/GardenOrder.rb +11 -6
  25. data/lib/bcdice/game_system/KemonoNoMori.rb +25 -38
  26. data/lib/bcdice/game_system/KurayamiCrying.rb +86 -0
  27. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  28. data/lib/bcdice/game_system/LogHorizon.rb +10 -7
  29. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  30. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +2 -1
  31. data/lib/bcdice/game_system/Nechronica.rb +57 -91
  32. data/lib/bcdice/game_system/NinjaSlayer.rb +2 -3
  33. data/lib/bcdice/game_system/SRS.rb +17 -16
  34. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  35. data/lib/bcdice/game_system/Satasupe.rb +31 -31
  36. data/lib/bcdice/game_system/ScreamHighSchool.rb +3 -3
  37. data/lib/bcdice/game_system/Skynauts.rb +101 -140
  38. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  39. data/lib/bcdice/game_system/SteamPunkers.rb +11 -6
  40. data/lib/bcdice/game_system/StellarKnights.rb +28 -12
  41. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  42. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  43. data/lib/bcdice/game_system/TrinitySeven.rb +275 -276
  44. data/lib/bcdice/game_system/Utakaze.rb +52 -47
  45. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  46. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  47. data/lib/bcdice/version.rb +1 -1
  48. metadata +8 -2
@@ -0,0 +1,318 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/dice_table/chain_table"
4
+ require "bcdice/dice_table/sai_fic_skill_table"
5
+ require "bcdice/dice_table/table"
6
+ require "bcdice/format"
7
+
8
+ module BCDice
9
+ module GameSystem
10
+ class StarryDolls < Base
11
+ # ゲームシステムの識別子
12
+ ID = "StarryDolls"
13
+
14
+ # ゲームシステム名
15
+ NAME = "スタリィドール"
16
+
17
+ # ゲームシステム名の読みがな
18
+ SORT_KEY = "すたりいとおる"
19
+
20
+ # ダイスボットの使い方
21
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
22
+ ・行為判定 nD6±m@s>=t
23
+  nD6の行為判定を行う。スペシャル/ファンブル/成功/失敗を判定。
24
+   n: ダイス数
25
+   m: 修正(省略可)
26
+   s: スペシャル値(省略時 12)
27
+   t: 目標値(?指定可)
28
+ ・各種表
29
+  ・ランダム特技決定表 RTTn (n:分野番号、省略可能)
30
+    1願望 2元素 3星使い 4動作 5召喚 6人間性
31
+  ・ランダム分野表 RCT
32
+  ・ランダム星座表 HOR
33
+    ランダム星座表A HORA/ランダム星座表B HORB
34
+  ・主人関係表 MRT/関係属性表 RAT
35
+  ・奇跡表 MIR
36
+  ・戦果表 BRT
37
+  ・事件表 TRO
38
+  ・遭遇表 ENC
39
+  ・致命傷表 FWT
40
+  ・カタストロフ表 CAT
41
+  ・回想表
42
+    〈魔術師の庭〉回想表 JDSRT/〈セブンス・ヘブン〉回想表 SHRT
43
+    /〈祝福の鐘〉回想表 BCRT/〈オメガ探偵社〉回想表 ODRT
44
+ ・D66ダイスあり
45
+ INFO_MESSAGE_TEXT
46
+
47
+ def initialize(command)
48
+ super(command)
49
+
50
+ @d66_sort_type = D66SortType::ASC
51
+ end
52
+
53
+ def eval_game_system_specific_command(command)
54
+ action_roll(command) ||
55
+ roll_tables(command, TABLES) ||
56
+ RTT.roll_command(@randomizer, command)
57
+ end
58
+
59
+ private
60
+
61
+ SPECIAL = "スペシャル(【星命力】を1D6点回復)"
62
+ FUMBLE = "ファンブル(ランダムなサインが【蝕】状態へ変化)"
63
+
64
+ RTT = DiceTable::SaiFicSkillTable.new(
65
+ [
66
+ ["願望", ["創造", "研究", "守護", "絆", "*かに座", "夢", "*しし座", "自由", "恋愛", "脚光", "世界"]],
67
+ ["元素", ["光", "雷", "*ふたご座", "水", "火", "風", "木", "氷", "*おとめ座", "土", "闇"]],
68
+ ["星使い", ["*おうし座", "幸運", "幻影", "テレパシー", "予知夢", "星読み", "治癒", "天候", "変身", "時間停止", "*てんびん座"]],
69
+ ["動作", ["*おひつじ座", "精密", "高速", "怪力", "隠密", "飛行", "言霊", "模倣", "軽業", "歌舞", "*さそり座"]],
70
+ ["召喚", ["リボン", "照明具", "*うお座", "料理", "獣", "花", "乗り物", "書物", "*いて座", "武器", "財宝"]],
71
+ ["人間性", ["勇気", "知恵", "熱意", "調和", "*みずがめ座", "愛情", "*やぎ座", "センス", "根気", "礼節", "理性"]],
72
+ ]
73
+ )
74
+
75
+ def action_roll(command)
76
+ parser = Command::Parser.new("D6", round_type: round_type)
77
+ .has_prefix_number
78
+ .restrict_cmp_op_to(:>=)
79
+ .enable_critical
80
+ .enable_question_target
81
+ cmd = parser.parse(command)
82
+ return nil unless cmd
83
+
84
+ times = cmd.prefix_number
85
+ return nil if times < 1
86
+
87
+ fumble = 2
88
+ special = cmd.critical || 12
89
+
90
+ if special <= fumble
91
+ special = fumble + 1 # p.180
92
+ cmd.critical = special
93
+ end
94
+
95
+ dice_list = @randomizer.roll_barabara(times, 6)
96
+ dice_total = dice_list.sum()
97
+ total = dice_total + cmd.modify_number
98
+
99
+ result =
100
+ if dice_total <= fumble
101
+ Result.fumble(FUMBLE)
102
+ elsif dice_total >= special
103
+ Result.critical(SPECIAL)
104
+ elsif cmd.question_target?
105
+ Result.new
106
+ elsif total >= cmd.target_number
107
+ Result.success("成功")
108
+ else
109
+ Result.failure("失敗")
110
+ end
111
+
112
+ sequence = [
113
+ "(#{cmd.to_s(:after_modify_number)})",
114
+ "#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
115
+ total,
116
+ result.text
117
+ ].compact
118
+
119
+ result.text = sequence.join(" > ")
120
+ result
121
+ end
122
+
123
+ HOR_TABLE_A = DiceTable::Table.new(
124
+ "ランダム星座表A", # p.177
125
+ "1D6",
126
+ [
127
+ "おひつじ座",
128
+ "おうし座",
129
+ "ふたご座",
130
+ "かに座",
131
+ "しし座",
132
+ "おとめ座",
133
+ ]
134
+ )
135
+
136
+ HOR_TABLE_B = DiceTable::Table.new(
137
+ "ランダム星座表B", # p.177
138
+ "1D6",
139
+ [
140
+ "てんびん座",
141
+ "さそり座",
142
+ "いて座",
143
+ "やぎ座",
144
+ "みずがめ座",
145
+ "うお座",
146
+ ]
147
+ )
148
+
149
+ TABLES = {
150
+ "HORA" => HOR_TABLE_A,
151
+ "HORB" => HOR_TABLE_B,
152
+ "HOR" => DiceTable::ChainTable.new(
153
+ "ランダム星座表", # p.177
154
+ "1D6",
155
+ [
156
+ HOR_TABLE_A,
157
+ HOR_TABLE_A,
158
+ HOR_TABLE_A,
159
+ HOR_TABLE_B,
160
+ HOR_TABLE_B,
161
+ HOR_TABLE_B,
162
+ ]
163
+ ),
164
+ "MRT" => DiceTable::Table.new(
165
+ "主人関係表", # p.186
166
+ "1D6",
167
+ [
168
+ "親",
169
+ "友人",
170
+ "恩師",
171
+ "相棒",
172
+ "上司",
173
+ "恋人",
174
+ ]
175
+ ),
176
+ "RAT" => DiceTable::Table.new(
177
+ "関係属性表", # p.186
178
+ "1D6",
179
+ [
180
+ "尊敬/優越感",
181
+ "理解/反抗",
182
+ "愉快/恐怖",
183
+ "友情/競争",
184
+ "恋心/不気味",
185
+ "庇護/劣等感",
186
+ ]
187
+ ),
188
+ "MIR" => DiceTable::Table.new(
189
+ "奇跡表", # p.177
190
+ "1D6",
191
+ [
192
+ "空から降る一筋の光が星人形の体を包み込み、不思議な力を与えてくれる。",
193
+ "守護星座に関連する人や動物が現れ、星人形に力を貸してくれる。",
194
+ "運命が不自然なまでに星人形の味方をし、すべてが上手く進んでいく。",
195
+ "星人形の必要とするものが空中から次々と現れる。",
196
+ "少しの間だけ〈劇場〉の住人が正気に戻り、一致団結して星人形に協力してくれる。",
197
+ "体中に星命力が溢れ出し、限界を超えた大規模な星術を扱えるようになる。",
198
+ ]
199
+ ),
200
+ "BRT" => DiceTable::Table.new(
201
+ "戦果表", # p.191
202
+ "1D6",
203
+ [
204
+ "所持しているアイテムから一つを選び、同じものをもう一つ獲得する。所持していない場合はもう一度戦果表を使用する。",
205
+ "時計を獲得する。",
206
+ "ロザリオを獲得する。",
207
+ "コンパスを獲得する。",
208
+ "星の欠片を獲得する。",
209
+ "自由なアイテムを一つ獲得する。",
210
+ ]
211
+ ),
212
+ "TRO" => DiceTable::Table.new(
213
+ "事件表", # p.193
214
+ "2D6",
215
+ [
216
+ "〈変晶体〉を手にした途端、人形兵の軍勢に見つかり追われることに……! なんとかして振り切ろう!",
217
+ "〈変晶体〉を乗せた物体が空を飛んでいる。接触する方法はないだろうか。",
218
+ "不気味な商人が現れた。価値あるものを差し出せば、〈変晶体〉と交換してくれるという。上手く交渉しよう。",
219
+ "〈変晶体〉の影響で理性を失った人々が大喧嘩をしている。これでは浄化するのも困難だ……仲間と協力して仲裁しよう。",
220
+ "〈変晶体〉は建物の中にあるようだが、警備が厳重だ。どうやって侵入しようか……。",
221
+ "罪のない人たちが〈変晶体〉を持つ敵に捕らわれているようだ。仲間と共に人々を助け出し、〈変晶体〉を浄化しよう。",
222
+ "〈変晶体〉に操られた人々がこちらへ敵意の目を向けている。危害は加えたくないが、一体どうすれば……!",
223
+ "〈変晶体〉に取り憑かれた動物が、仲間に襲いかかった! 早く助け出さなければ!",
224
+ "仲間が敵にさらわれてしまった! 敵は〈変晶体〉も持っているようだ。追跡して仲間を助けなければ!",
225
+ "入り組んだ場所に迷い込んでしまった。〈変晶体〉の気配は近いはずだが、どこにあるのだろう?",
226
+ "〈変晶体〉は深い水の底に沈んでいるようだ。浄化する方法はないだろうか……。",
227
+ ]
228
+ ),
229
+ "ENC" => DiceTable::Table.new(
230
+ "遭遇表", # p.193
231
+ "1D6",
232
+ [
233
+ "『弁士』コオロギのパルランテ\n指定特技: 《調和/人間性5》\n効果: プラネタリカードルール非採用時、このセッション中【運命力】を1点上昇させる。\nプラネタリカードルール採用時、ベネフィックを1枚獲得する。",
234
+ "『航空士』鳩のコロンボ\n指定特技: 《熱意/人間性4》\n効果: コンパスを1つ獲得する。",
235
+ "『医者』カラスのコルヴォ\n指定特技: 《礼節/人間性11》\n効果: 星の欠片を1つ獲得する。",
236
+ "『御者』むく犬のメドーラ\n指定特技: 《知恵/人間性3》\n効果: 時計を1つ獲得する。",
237
+ "『道化』ピエロのアルレッキーノ\n指定特技: 《センス/人間性9》\n効果: 【関係】の使用チェックをすべてはずす。使用チェックがなければ、アルレッキーノに【関係】を獲得する。",
238
+ "『少女』ヤギのカプレッティーナ\n指定特技: 《愛情/人間性7》\n効果: ロザリオを1つ獲得する。",
239
+ ]
240
+ ),
241
+ "FWT" => DiceTable::Table.new(
242
+ "致命傷表", # p.184
243
+ "1D6",
244
+ [
245
+ "敵の攻撃は星人形の瞳を直撃し、宝石は鮮血のごとく砕け散った。PCは形骸化する。",
246
+ "なんとか致命傷は免れたが、もう戦闘は難しそうだ……。PCは戦闘から脱落する。",
247
+ "最後の力をふり絞り、星人形は持っていたものを仲間へ投げ渡した。PCは所持しているアイテムを誰かに譲渡したのち戦闘から脱落する。",
248
+ "星人形は自分の気持ちを誰かに託しながら、地面に倒れ込んだ。仲間のうち誰か一人がPCに対する【関係】を獲得したのち、PCは戦闘から脱落する。",
249
+ "ただでやられるわけにはいかない……! 星人形は捨て身の攻撃を放つ。PCはエネミー1体に霧装の【耐久値】と同じダメージを与えたのち、戦闘から脱落する。",
250
+ "こんなところで倒れるわけにはいかない。星人形は【星命力】1点で戦闘に復帰する。再度【星命力】が0になった場合、PCは致命傷表を使用せず戦闘から脱落する。",
251
+ ]
252
+ ),
253
+ "CAT" => DiceTable::Table.new(
254
+ "カタストロフ表", # p.198
255
+ "1D6",
256
+ [
257
+ "〈劇場〉全体が大きく揺れ、空間に裂け目が生じる。現実は塗り替えられ……〈変容区〉と化した。最も恐れていた事態に、星人形たちは呆然と立ち尽くすほかなかった。",
258
+ "激しい地鳴りと共に人形兵たちの増援が押し寄せ、形成が逆転してしまう。星人形たちはやむを得ず〈劇場〉を後にした。",
259
+ "「時間切れです」戦場に〈悪魔派〉がやってきた。星座の加護は遮られ、星人形の体から力が抜けていく。「いずれまた」という声を最後に星人形の意識は途絶え……現実世界で目を覚ました。",
260
+ "突如〈型堕ち〉が苦しみ始め、体に残っていた〈悪夢の霧〉を爆発させた。意識を失った星人形たちが目覚めたのは現実世界だった。……まだ再挑戦する時間はあるはずだ。",
261
+ "〈型堕ち〉は自分を制御できなくなり、〈悪夢の霧〉に呑まれて姿を消してしまった。主を失った〈劇場〉は成長も衰退もしないまま、鏡の中に残り続けることになるだろう。",
262
+ "〈型堕ち〉の体は膨張する〈悪夢の霧〉の圧力に耐えきれず、宝石を内側から破壊してしまった。〈型堕ち〉に残された命はあとわずかだ。星人形は〈型堕ち〉の最期を看取ることになる。",
263
+ ]
264
+ ),
265
+ "JDSRT" => DiceTable::Table.new(
266
+ "〈魔術師の庭〉回想表", # p.187
267
+ "1D6",
268
+ [
269
+ "仕事に必要な道具が不足し、急遽買い出しへ。荷物が重くなりそうだからと、キーNPCも手伝ってくれることになった。",
270
+ "キーNPCはあなたの仕事に感謝し、プレゼントを贈ってくれた。箱の中身はキーNPCのお気に入りの一品らしい。",
271
+ "主人はお客さんと話し込んでいる。あなたが部屋の片隅で退屈そうにしていると、キーNPCと目が合った。",
272
+ "整備作業がひと区切りついたところで、キーNPCがお茶とお菓子を持ってきてくれた。少し休憩しよう。",
273
+ "整備中、星人形の体に傷が見つかった。どこで付けたのだろう? あなたはキーNPCに聞いてみることにした。",
274
+ "部屋を移動中、あるものが目に留まる。それはキーNPCにとって思い出深いものであるようだ。",
275
+ ]
276
+ ),
277
+ "SHRT" => DiceTable::Table.new(
278
+ "〈セブンス・ヘブン〉回想表", # p.187
279
+ "1D6",
280
+ [
281
+ "掃除をしていたら、お家のものを引っ掛けて壊してしまった! そこへキーNPCがやってきて……。",
282
+ "キーNPCはちょっとお疲れの様子。あなたはお茶とお菓子を持って労ってあげることにした。",
283
+ "料理の材料を取りたいのに、棚に手が届かない……。あなたはキーNPCに助けを求めた。",
284
+ "キーNPCの仕事をお手伝い。こんな体験は初めてだ! あなたはワクワクしながら挑戦する。",
285
+ "お客さんの星人形に制服を貸し出して、一緒に写真撮影をすることに。照れてるだろうか? それともノリノリ?",
286
+ "今日はセブンス・ヘブンのファン感謝イベント。会場には、差し入れを持ったキーNPCの姿もあった。",
287
+ ]
288
+ ),
289
+ "BCRT" => DiceTable::Table.new(
290
+ "〈祝福の鐘〉回想表", # p.187
291
+ "1D6",
292
+ [
293
+ "終演後のエントランスで挨拶をしていると、キーNPCが誰かと話し込んでいる。ちょっと様子を見に行こう。",
294
+ "次の公演に向けて衣装合わせ。どんな役をやる? 衣装のフィット具合はどう? 確認していると、キーNPCが様子を見にやってきた。",
295
+ "基礎練習。地道なルーチンワークの間、スパイスとなるのはキーNPCとのおしゃべりだ。",
296
+ "学校での公演。終わったあと、子どもたちに囲まれてもみくちゃになる。キーNPCは、子どもが好きだったっけ?",
297
+ "地方巡業。一緒に移動するキーNPCと、あれこれ話し込んでいると、意外な話題に移っていって……。",
298
+ "撤収作業も終わりに近づくステージの上。誰もいない客席に向けて、キーNPCが遠い目をしている。",
299
+ ]
300
+ ),
301
+ "ODRT" => DiceTable::Table.new(
302
+ "〈オメガ探偵社〉回想表", # p.187
303
+ "1D6",
304
+ [
305
+ "事件調査のため、キーNPCに聞き込み。何か有益な情報は出るだろうか。世間話になってしまうかも?",
306
+ "依頼もなく平和な探偵事務所へ、キーNPCがやってきた。これが事件の序章に……なるんだろうか?",
307
+ "みんなで、近所の家のペット探し。キーNPCの見知ったペットらしく、ちょっと心配そうな顔をしている。",
308
+ "警察の事件調査を手伝うことに。キーNPCは、事件の重要参考人として呼び出されているようだ。",
309
+ "地道な張り込み調査をしているところへ、キーNPCがやってきた。あなたに差し入れもあるようだ。",
310
+ "華麗なる事件解決! 主人の推理をたくさん手伝うことができた。キーNPCも、あなたに一目置いてくれそう。",
311
+ ]
312
+ ),
313
+ }.freeze
314
+
315
+ register_prefix('\d+D6', RTT.prefixes, TABLES.keys)
316
+ end
317
+ end
318
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bcdice/base'
3
4
  require 'bcdice/dice_table/d66_range_table'
4
5
 
5
6
  module BCDice
@@ -52,19 +53,23 @@ module BCDice
52
53
 
53
54
  result =
54
55
  if dice_list.all? { |x| x == 1 }
55
- "ファンブル"
56
+ Result.fumble("ファンブル")
56
57
  elsif target_number
57
- successes >= target_number ? "成功" : "失敗"
58
+ successes >= target_number ? Result.success("成功") : Result.failure("失敗")
59
+ else
60
+ Result.new
58
61
  end
59
62
 
60
- sequence = [
63
+ result.text = [
61
64
  "(#{command})",
62
65
  "[#{dice_list_text}]",
63
66
  "成功数:#{successes}, 失敗数:#{failures}",
64
- result
65
- ].compact
67
+ result.text
68
+ ].compact.join(" > ")
66
69
 
67
- return sequence.join(" > ")
70
+ result.critical = dice_list.include?(6)
71
+
72
+ return result
68
73
  end
69
74
 
70
75
  # スチームパンカーズ用のテーブル
@@ -17,12 +17,15 @@ module BCDice
17
17
 
18
18
  # ダイスボットの使い方
19
19
  HELP_MESSAGE = <<~MESSAGETEXT
20
- ・判定 nSK[d][,k>l,...]
20
+ ・アタック判定 nSK[d][,k>l,...]
21
21
  []内は省略可能。
22
22
  n: ダイス数、d: アタック判定における対象の防御力、k, l: ダイスの出目がkならばlに変更(アマランサスのスキル「始まりの部屋」用)
23
23
  d省略時はダイスを振った結果のみ表示。(nSKはnB6と同じ)
24
24
 
25
25
  4SK: ダイスを4個振って、その結果を表示
26
+ 4+2SK: ダイスを4+2 (=6) 個振って、その結果を表示
27
+ 5/2SK: ダイスを5個の半分 (=2) 個振って、その結果を表示
28
+ (5+3)/2SK: ダイスを(5+3)個の半分 (=4) 個振って、その結果を表示
26
29
  5SK3: 【アタック判定:5ダイス】、対象の防御力を3として成功数を表示
27
30
  3SK,1>6: ダイスを3個振り、出目が1のダイスを全て6に変更し、その結果を表示
28
31
  6SK4,1>6,2>6: 【アタック判定:6ダイス】、出目が1と2のダイスを全て6に変更、対象の防御力を4として成功数を表示
@@ -73,10 +76,14 @@ module BCDice
73
76
  def eval_game_system_specific_command(command)
74
77
  command = command.upcase
75
78
 
76
- if (table = TABLES[command])
79
+ if (table = self.class::TABLES[command])
77
80
  table.roll(@randomizer)
78
- elsif (m = /(\d+)SK(\d)?((,\d>\d)+)?/.match(command))
79
- resolute_action(m[1].to_i, m[2] && m[2].to_i, m[3], command)
81
+ elsif (m = %r{([()+/\d]+)SK(\d)?((,\d>\d)+)?}.match(command))
82
+ num_dices = Arithmetic.eval(m[1], round_type: RoundType::FLOOR)
83
+
84
+ unless num_dices.nil?
85
+ resolute_action(num_dices, m[2] && m[2].to_i, m[3])
86
+ end
80
87
  elsif command == 'STB2'
81
88
  roll_all_situation_b2_tables
82
89
  elsif command == 'ALLS'
@@ -94,13 +101,15 @@ module BCDice
94
101
  # @param [Integer] num_dices
95
102
  # @param [Integer | nil] defence
96
103
  # @param [String] dice_change_text
97
- # @param [String] command
98
- # @return [String]
99
- def resolute_action(num_dices, defence, dice_change_text, command)
104
+ # @return [Result, String]
105
+ def resolute_action(num_dices, defence, dice_change_text)
100
106
  dices = @randomizer.roll_barabara(num_dices, 6).sort
101
107
  dice_text = dices.join(",")
102
108
 
103
- output = "(#{command}) > #{dice_text}"
109
+ output = "(#{remake_command(num_dices, defence, dice_change_text)}) > #{dice_text}"
110
+ if dices.empty?
111
+ return output + translate("StellarKnights.SK.no_dice_error")
112
+ end
104
113
 
105
114
  # FAQによると、ダイスの置き換えは宣言された順番に適用されていく
106
115
  dice_change_rules = parse_dice_change_rules(dice_change_text)
@@ -129,6 +138,13 @@ module BCDice
129
138
  end
130
139
  end
131
140
 
141
+ def remake_command(num_dices, defence, dice_change_text)
142
+ command = "#{num_dices}SK"
143
+ command += defence.to_s unless defence.nil?
144
+ command += dice_change_text unless dice_change_text.nil?
145
+ command
146
+ end
147
+
132
148
  def parse_dice_change_rules(text)
133
149
  return [] if text.nil?
134
150
 
@@ -144,11 +160,11 @@ module BCDice
144
160
  end
145
161
 
146
162
  def roll_all_situation_b2_tables
147
- (1..6).map { |num| TABLES["STB2#{num}"].roll(@randomizer) }.join("\n")
163
+ (1..6).map { |num| self.class::TABLES["STB2#{num}"].roll(@randomizer) }.join("\n")
148
164
  end
149
165
 
150
166
  def roll_all_situation_tables
151
- ['STA', 'STB', 'STC'].map { |command| TABLES[command].roll(@randomizer) }.join("\n")
167
+ ['STA', 'STB', 'STC'].map { |command| self.class::TABLES[command].roll(@randomizer) }.join("\n")
152
168
  end
153
169
 
154
170
  def roll_personality_table
@@ -169,7 +185,7 @@ module BCDice
169
185
  indexes = results.map { |r| r[1] }
170
186
  name = translate("StellarKnights.FT.name")
171
187
 
172
- return "#{name}(#{indexes.join(',')}) > #{values.join(',')}"
188
+ return "#{name}(#{indexes.join(',')}) > #{values.join(translate('StellarKnights.FT.sep'))}"
173
189
  end
174
190
 
175
191
  class << self
@@ -210,7 +226,7 @@ module BCDice
210
226
 
211
227
  TABLES = translate_tables(:ja_jp)
212
228
 
213
- register_prefix('\d+SK', 'STB2', 'ALLS', 'PET', 'FT', TABLES.keys)
229
+ register_prefix('[()+\/\d]+SK', 'STB2', 'ALLS', 'PET', 'FT', TABLES.keys)
214
230
  end
215
231
  end
216
232
  end