bcdice 3.2.0 → 3.3.0

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