bcdice 3.9.0 → 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,7 +25,7 @@ module BCDice
25
25
  例2)KC6 → 目標値6の継続判定
26
26
  ・罠動作チェック+獲物表(P163): CTR
27
27
  罠ごとに1D12を振り、12が出た場合には生き物が罠を動作させ、その影響を受けている。
28
- ・各種表
28
+ ・各種表(基本ルールブック)
29
29
  ・大失敗表(P120): FT
30
30
  ・能力値ランダム決定表(P121): RST
31
31
  ・ランダム所要時間表(P122): RTT
@@ -38,6 +38,16 @@ module BCDice
38
38
  ・食材採集表(P157): GFT
39
39
  ・水採集表(P157): GWT
40
40
  ・白の魔石効果表(P186): WST
41
+ ・部位ダメージ関連の表(参照先ページはリプレイ&データブック「嚙神ノ宴」のもの)
42
+ ・人間部位表(P216): HPT
43
+ ・部位ダメージ段階表(P217): PDT
44
+ ・四足動物部位表(P225): QPT
45
+ ・無足動物部位表(P225): APT
46
+ ・二足動物部位表(P226): TPT
47
+ ・鳥部位表(P226): BPT
48
+ ・頭足動物部位表(P227): CPT
49
+ ・昆虫部位表(P227): IPT
50
+ ・蜘蛛部位表(P228): SPT
41
51
  MESSAGETEXT
42
52
 
43
53
  def eval_game_system_specific_command(command)
@@ -237,6 +247,128 @@ module BCDice
237
247
  '大型動物を召喚する',
238
248
  ]
239
249
  ),
250
+ 'HPT' => DiceTable::RangeTable.new(
251
+ '人間部位表',
252
+ '1D12',
253
+ [
254
+ [1..2, '右腕部'],
255
+ [3..4, '左腕部'],
256
+ [5..6, '右脚部'],
257
+ [7..8, '左脚部'],
258
+ [9..11, '胴部'],
259
+ [12, '頭部'],
260
+ ]
261
+ ),
262
+ 'PDT' => DiceTable::RangeTable.new(
263
+ '部位ダメージ段階表',
264
+ '1D12',
265
+ [
266
+ [1..6, '軽傷'],
267
+ [7..10, '重傷'],
268
+ [11, '破壊'],
269
+ [12, '喪失'],
270
+ ]
271
+ ),
272
+ 'QPT' => DiceTable::RangeTable.new(
273
+ '四足動物部位表',
274
+ '1D12',
275
+ [
276
+ [1..2, '異形'],
277
+ [3, '武器'],
278
+ [4, '右前脚部'],
279
+ [5, '左前脚部'],
280
+ [6, '右後脚部'],
281
+ [7, '左後脚部'],
282
+ [8..10, '胴部'],
283
+ [11..12, '頭部'],
284
+ ]
285
+ ),
286
+ 'APT' => DiceTable::RangeTable.new(
287
+ '無足動物部位表',
288
+ '1D12',
289
+ [
290
+ [1..3, '異形'],
291
+ [4..6, '武器'],
292
+ [7..10, '胴部'],
293
+ [11..12, '頭部'],
294
+ ]
295
+ ),
296
+ 'TPT' => DiceTable::RangeTable.new(
297
+ '二足動物部位表',
298
+ '1D12',
299
+ [
300
+ [1, '異形'],
301
+ [2, '武器'],
302
+ [3, '右腕部'],
303
+ [4, '左腕部'],
304
+ [5..6, '右脚部'],
305
+ [7..8, '左脚部'],
306
+ [9..11, '胴部'],
307
+ [12, '頭部'],
308
+ ]
309
+ ),
310
+ 'BPT' => DiceTable::RangeTable.new(
311
+ '鳥部位表',
312
+ '1D12',
313
+ [
314
+ [1, '異形'],
315
+ [2, '武器'],
316
+ [3..4, '右翼(右腕部)'],
317
+ [5..6, '左翼(左腕部)'],
318
+ [7, '右脚部'],
319
+ [8, '左脚部'],
320
+ [9..11, '胴部'],
321
+ [12, '頭部'],
322
+ ]
323
+ ),
324
+ 'CPT' => DiceTable::RangeTable.new(
325
+ '頭足動物部位表',
326
+ '1D12',
327
+ [
328
+ [1, '異形'],
329
+ [2, '武器'],
330
+ [3, '右腕部'],
331
+ [4, '左腕部'],
332
+ [5..7, '右脚部'],
333
+ [8..10, '左脚部'],
334
+ [11, '胴部'],
335
+ [12, '頭部'],
336
+ ]
337
+ ),
338
+ 'IPT' => DiceTable::RangeTable.new(
339
+ '昆虫部位表',
340
+ '1D12',
341
+ [
342
+ [1..2, '異形'],
343
+ [3, '武器'],
344
+ [4, '右前脚部'],
345
+ [5, '左前脚部'],
346
+ [6, '右中脚部'],
347
+ [7, '左中脚部'],
348
+ [8, '右後脚部'],
349
+ [9, '左後脚部'],
350
+ [10..11, '胴部'],
351
+ [12, '頭部'],
352
+ ]
353
+ ),
354
+ 'SPT' => DiceTable::RangeTable.new(
355
+ '蜘蛛部位表',
356
+ '1D12',
357
+ [
358
+ [1, '異形'],
359
+ [2, '武器'],
360
+ [3, '右第一脚部'],
361
+ [4, '左第一脚部'],
362
+ [5, '右第二脚部'],
363
+ [6, '左第二脚部'],
364
+ [7, '右第三脚部'],
365
+ [8, '左第三脚部'],
366
+ [9, '右第四脚部'],
367
+ [10, '左第四脚部'],
368
+ [11, '胴部'],
369
+ [12, '頭部'],
370
+ ]
371
+ ),
240
372
  }.freeze
241
373
 
242
374
  register_prefix('K[AC]', 'CTR', TABLES.keys)
@@ -59,7 +59,7 @@ module BCDice
59
59
  private
60
60
 
61
61
  def check_roll(command)
62
- m = /^(\d+)D6([+\-\d]*)>=(\d+)(\[(\d+)?(,(\d+))?\])?$/i.match(command)
62
+ m = /^(\d+)D6([+\-\d]*)>=(\?|\d+)(\[(\d+)?(,(\d+))?\])?$/i.match(command)
63
63
  unless m
64
64
  return nil
65
65
  end
@@ -80,6 +80,8 @@ module BCDice
80
80
  Result.fumble(translate("MonotoneMuseum.automatic_failure"))
81
81
  elsif dice_value >= critical
82
82
  Result.critical(translate("MonotoneMuseum.automatic_success"))
83
+ elsif target == 0
84
+ Result.success(nil)
83
85
  elsif total >= target
84
86
  Result.success(translate("success"))
85
87
  else
@@ -91,7 +93,7 @@ module BCDice
91
93
  "#{dice_value}[#{dice_str}]#{Format.modifier(modify_number)}",
92
94
  total.to_s,
93
95
  result.text,
94
- ]
96
+ ].compact
95
97
 
96
98
  result.text = sequence.join(" > ")
97
99
 
@@ -8,24 +8,26 @@ module BCDice
8
8
  SORT_KEY = "えすああるえすしやないせかいしゆのめいきゆうTRPG"
9
9
 
10
10
  HELP_MESSAGE = <<~MESSAGETEXT
11
- ■ 判定 (xSQ±y)
12
- xD6の判定。3つ以上振ったとき、出目の高い2つを表示します。クリティカル、ファンブルも計算します。
11
+ ■ 判定 (xSQ±y>=z)
12
+ xD6の判定。3つ以上振ったとき、出目の高い2つを表示します。絶対成功、絶対失敗も計算します。
13
+ 2つのサイコロを使用して出目に1があった場合は、FPの獲得も表示します。3つ以上使用した場合は表示しません。
13
14
  ±y: yに修正値を入力。±の計算に対応。省略可能。
15
+ z: 目標値。省略可能。
14
16
 
15
17
  ■ ダメージロール (xDR(C)(+)y)
16
- xD6のダメージロール。クリティカルの自動判定を行います。Cを付けるとクリティカルアップ状態で計算できます。+を付けるとクリティカル時のダイスが8個になります。
18
+ xD6のダメージロール。クリティカルヒットの自動判定を行います。Cを付けるとクリティカルアップ状態で計算できます。+を付けるとクリティカルヒット時のダイスが8個になります。
17
19
  x: xに振るダイス数を入力。
18
20
  y: yに耐性を入力。
19
21
  例) 5DR3 5DRC4 5DRC+4
20
22
 
21
23
  ■ 回復ロール (xHRy)
22
- xD6の回復ロール。クリティカルが発生しません。
24
+ xD6の回復ロール。クリティカルヒットが発生しません。
23
25
  x: xに振るダイス数を入力。
24
26
  y: yに耐性を入力。省略した場合3。
25
27
  例) 2HR 10HR2
26
28
 
27
- 採取ロール (TC±z,SC±z,GC±z)
28
- ちょっと(T)、そこそこ(S)、がっつり(G)採取採掘伐採を行う。
29
+ 採集ロール (TC±z,SC±z,GC±z)
30
+ 少しだけ(T)、そこそこ(S)、ガッツリ(G)採取採掘伐採を行います。
29
31
  z: zに追加でロールする回数を入力。省略可能。
30
32
  例) TC SC+1 GC-1
31
33
  MESSAGETEXT
@@ -40,27 +42,38 @@ module BCDice
40
42
 
41
43
  # 判定
42
44
  def roll_sq(command)
43
- m = /(\d+)SQ([+\-\d]+)?/i.match(command)
45
+ m = /(\d+)SQ([+\-\d]+)?(([>=]+)(\d+))?/i.match(command)
44
46
  return nil unless m
45
47
 
46
48
  dice_count = m[1].to_i
47
49
  modifier = ArithmeticEvaluator.eval(m[2])
50
+ target = m[5].nil? ? nil : m[5].to_i
48
51
 
49
52
  dice_list = @randomizer.roll_barabara(dice_count, 6)
50
53
  largest_two = dice_list.sort.reverse.take(2)
51
54
  total = largest_two.sum + modifier
55
+ num_1 = dice_list.count(1)
52
56
 
53
57
  additional_result =
54
58
  if largest_two == [6, 6]
55
- " クリティカル!"
59
+ Result.critical(" > 絶対成功!")
56
60
  elsif largest_two == [1, 1]
57
- " ファンブル!"
61
+ Result.fumble(" > 絶対失敗!")
62
+ elsif target && total >= target
63
+ Result.success(" > 成功")
64
+ elsif target && total < target
65
+ Result.failure(" > 失敗")
66
+ else
67
+ Result.new
58
68
  end
59
69
 
70
+ # ダイス数が2個の場合は1の出目の数だけ【FP】を獲得できる
71
+ fp_result = dice_count == 2 && num_1 >= 1 ? " (【FP】#{num_1}獲得)" : ""
72
+
60
73
  sequence = [
61
74
  "(#{command})",
62
75
  "[#{dice_list.join(',')}]#{Format.modifier(modifier)}",
63
- "#{total}[#{largest_two.join(',')}]#{additional_result}",
76
+ "#{total}[#{largest_two.join(',')}]#{additional_result.text}#{fp_result}",
64
77
  ]
65
78
 
66
79
  return sequence.join(" > ")
@@ -83,7 +96,7 @@ module BCDice
83
96
  critical_target = critical_up ? 1 : 2
84
97
 
85
98
  if dice_list.count(6) - dice_list.count(1) >= critical_target
86
- result += " クリティカル!\n"
99
+ result += " クリティカルヒット!\n"
87
100
  result += additional_damage_roll(increase_critical_dice, resist)
88
101
  end
89
102
 
@@ -33,10 +33,13 @@ module BCDice
33
33
   ファンブル表 FT、変調表 WT、戦国変調表 GWT、戦場表 BT、感情表 ET
34
34
   妖魔化(異形表、妖魔忍法表一括) MT
35
35
   異形表 MTR、妖魔忍法表(x:A,B,C) DSx
36
+  プライズ効果表 PT
36
37
 
37
38
  >流派ブック以降
38
-  新戦場表 BNT、【数奇】OTS、妖術変調対応表(現代/戦国)YWT
39
+  新戦場表 BNT、【数奇】OTS、妖術変調対応表(x:なし-現代/戦国、1-現代、2-戦国)YWTx
39
40
   妖魔化(新異形表利用) NMT、新異形表 NMTR、妖魔忍法表(x:1-異霊 2-凶身 3-神化 4-攻激)DSNx
41
+  覚醒表 OTAT、忍法授業シーン表(x:1-攻撃系 2-防御系 3-戦略系)NCTx
42
+  パニック表 HRPT、出物表 ONDT
40
43
 
41
44
  (基本ルールブック改訂版以前)
42
45
  ・(無印)旧ファンブル表 OFT 、旧変調表 OWT、旧戦場表 OBT、異形表 MT
@@ -51,7 +54,9 @@ module BCDice
51
54
   (死)東京 TKST、(リプレイ戦1〜2巻)京都 KYST、神社仏閣 JBST
52
55
   (その他シーン表)秋空に雪舞えば AKST、災厄 CLST、出島EX DXST、斜歯ラボ HLST、夏の終わり NTST、培養プラント PLST
53
56
  >正忍記
54
- カジノ TC、ロードムービ TR、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
57
+ カジノ TC、ロードムービ TRM、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
58
+ >流派ブック以降
59
+ 不良高校 OTFK
55
60
  ・D66ダイスあり
56
61
  INFO_MESSAGE_TEXT
57
62
 
@@ -204,12 +209,12 @@ module BCDice
204
209
  '妖魔忍法表・異霊',
205
210
  '1D6',
206
211
  [
207
- '【荒吐】(基本 p173)/【赤舌】(隠忍 p29)',
208
- '【鬼火】(基本 p173)/【大太郎】(隠忍 p29)',
209
- '【怨霊】(基本 p173)/【白面】(隠忍 p29)',
210
- '【呑口】(基本 p173)/【邪魅】(隠忍 p29)',
211
- '【百眼】(基本 p173)/【鬼胎】(隠忍 p29)',
212
- '【蛭子】(基本 p173)/【岩肌】(隠忍 p29)',
212
+ '【逢魔時】(基本 p173)/【虚舟】(隠忍 p28)',
213
+ '【神隠】(基本 p173)/【夢喰】(隠忍 p28)',
214
+ '【狂骨】(基本 p173)/【金毛】(隠忍 p28)',
215
+ '【木魂】(基本 p173)/【朽縄】(隠忍 p28)',
216
+ '【付喪神】(基本 p173)/【香魂】(隠忍 p28)',
217
+ '【生剥】(基本 p173)/【三尸】(隠忍 p28)',
213
218
  ]
214
219
  ),
215
220
  'DSN2' => DiceTable::Table.new(
@@ -401,6 +406,23 @@ module BCDice
401
406
  '妖魔化している間、【接近戦攻撃】によって与える接近戦ダメージが2点になる。',
402
407
  '妖魔化している間、このキャラクターの攻撃に対する回避判定と、このキャラクターの奥義に対する奥義破り判定にマイナス1の修正がつく。']
403
408
  ),
409
+ 'PT' => DiceTable::Table.new(
410
+ 'プライズ効果表',
411
+ '2D6',
412
+ [
413
+ '爆弾。このプライズの所持者は、行為判定にファンブルすると、1D6点の射撃戦ダメージを受ける。その後、このプライズは破壊される。ゲーム終了時に、このプライズを持っていると、功績点を1点獲得する。',
414
+ '集中。そのプライズの所持者は、戦闘シーンのとき、1ラウンドに使用できる忍法のコストが1点上昇する。',
415
+ '再生。そのプライズの所持者は、サイクルの終了時に、【生命力】が1点回復する。',
416
+ '障壁。そのプライズの所持者は、目標値が10以上の回避判定にプラス1の修正を得る。',
417
+ '加速。そのプライズの所持者は、自分が攻撃忍法を使用した時、その回避判定にマイナス1の修正を与えることができる。',
418
+ '治癒。そのプライズの所持者は、ドラマシーンで回復判定を行った際、さらに【生命力】を1点回復するか、変調を1つ回復することができる。',
419
+ '断絶。そのプライズの所持者は、誰かが自分を対象とした情報判定や感情判定を行おうとした時、マイナス1の修正を与えることができる。',
420
+ '加護。そのプライズの所持者は、自分が集団戦ダメージを受けた時、それを射撃戦ダメージに変更することができる。',
421
+ '記憶。そのプライズの所持者は、ランダムに選んだ特技1種を所持しているものとして扱う。',
422
+ '業物。そのプライズの所持者は、もう1つ【接近戦攻撃】の忍法を特例修得する。その指定特技は、プライズを獲得した時に、獲得したキャラクターが設定することができる。',
423
+ '呪詛。さらに2回「プライズ効果表」を振り、その2つの効果をあわせ持つ。このプライズの所持者は、サイクルの終了時に、1点の接近戦ダメージを受ける。'
424
+ ]
425
+ ),
404
426
  ## 以下流派ブック
405
427
  'BNT' => DiceTable::Table.new(
406
428
  '戦場新効果表',
@@ -426,12 +448,37 @@ module BCDice
426
448
  '妖術:呪い(現代)/野望(戦国)'
427
449
  ]
428
450
  ),
451
+ 'YWT1' => DiceTable::Table.new(
452
+ '妖術変調対応表(現代)',
453
+ '1D6',
454
+ [
455
+ '器術:故障',
456
+ '体術:マヒ',
457
+ '忍術:重傷',
458
+ '謀術:行方不明',
459
+ '戦術:忘却',
460
+ '妖術:呪い'
461
+ ]
462
+ ),
463
+ 'YWT2' => DiceTable::Table.new(
464
+ '妖術変調対応表(戦国)',
465
+ '1D6',
466
+ [
467
+ '器術:催眠',
468
+ '体術:火達磨',
469
+ '忍術:猛毒',
470
+ '謀術:飢餓',
471
+ '戦術:残刃',
472
+ '妖術:野望'
473
+ ]
474
+ ),
475
+ ## 誤字修正(異形態→異霊態)
429
476
  'NMT' => DiceTable::ChainTable.new(
430
477
  "新異形表",
431
478
  '1D6',
432
479
  [
433
480
  DemonSkillTableForMetamorphose.new(
434
- '異形態。「妖魔忍法表・異霊」を使用し、妖魔化している間、その妖魔忍法を修得する。', DEMON_SKILL_TABLES_NEW['DSN1']
481
+ '異霊態。「妖魔忍法表・異霊」を使用し、妖魔化している間、その妖魔忍法を修得する。', DEMON_SKILL_TABLES_NEW['DSN1']
435
482
  ),
436
483
  DemonSkillTableForMetamorphose.new(
437
484
  '凶身態。「妖魔忍法表・凶身」を使用し、妖魔化している間、その妖魔忍法を修得する。', DEMON_SKILL_TABLES_NEW['DSN2']
@@ -450,7 +497,7 @@ module BCDice
450
497
  "新異形表",
451
498
  '1D6',
452
499
  [
453
- '異形態。「妖魔忍法表・異霊」を使用し、妖魔化している間、その妖魔忍法を修得する。',
500
+ '異霊態。「妖魔忍法表・異霊」を使用し、妖魔化している間、その妖魔忍法を修得する。',
454
501
  '凶身態。「妖魔忍法表・凶身」を使用し、妖魔化している間、その妖魔忍法を修得する。',
455
502
  '神化態。「妖魔忍法表・神化」を使用し、妖魔化している間、その妖魔忍法を修得する。',
456
503
  '攻激態。「妖魔忍法表・攻激」を使用し、妖魔化している間、その妖魔忍法を修得する。',
@@ -470,25 +517,89 @@ module BCDice
470
517
  'その戦闘の間、あらゆる判定のスペシャル値が1減少する。この効果は累積しない。'
471
518
  ]
472
519
  ),
473
-
474
- 'PT' => DiceTable::Table.new(
475
- 'プライズ効果表',
520
+ 'HRPT' => DiceTable::Table.new(
521
+ 'パニック表',
476
522
  '2D6',
477
523
  [
478
- '爆弾。このプライズの所持者は、行為判定にファンブルすると、1D6点の射撃戦ダメージを受ける。その後、このプライズは破壊される。ゲーム終了時に、このプライズを持っていると、功績点を1点獲得する。',
479
- '集中。そのプライズの所持者は、戦闘シーンのとき、1ラウンドに使用できる忍法のコストが1点上昇する。',
480
- '再生。そのプライズの所持者は、サイクルの終了時に、【生命力】が1点回復する。',
481
- '障壁。そのプライズの所持者は、目標値が10以上の回避判定にプラス1の修正を得る。',
482
- '加速。そのプライズの所持者は、自分が攻撃忍法を使用した時、その回避判定にマイナス1の修正を与えることができる。',
483
- '治癒。そのプライズの所持者は、ドラマシーンで回復判定を行った際、さらに【生命力】を1点回復するか、変調を1つ回復することができる。',
484
- '断絶。そのプライズの所持者は、誰かが自分を対象とした情報判定や感情判定を行おうとした時、マイナス1の修正を与えることができる。',
485
- '加護。そのプライズの所持者は、自分が集団戦ダメージを受けた時、それを射撃戦ダメージに変更することができる。',
486
- '記憶。そのプライズの所持者は、ランダムに選んだ特技1種を所持しているものとして扱う。',
487
- '業物。そのプライズの所持者は、もう1つ【接近戦攻撃】の忍法を特例修得する。その指定特技は、プライズを獲得した時に、獲得したキャラクターが設定することができる。',
488
- '呪詛。さらに2回「プライズ効果表」を振り、その2つの効果をあわせ持つ。このプライズの所持者は、サイクルの終了時に、1点の接近戦ダメージを受ける。'
524
+ 'この混乱に乗じて、勢力を拡大する者が現れる。GMは、シナリオに設定されているNPCの中から、この忍災を引き起こした者に敵対する者を一人選ぶ。そのNPCは、そのセッションの間、追加の【生命力】とそのスロットを1点獲得する。シナリオにそうしたNPCな設定されていなかった場合、この忍災を引き起こした者以外のPCの中から、ランダムにPC一人を選ぶ。そのPCはそのセッションの間、追加の【生命力】とそのスロットを1点獲得する。この効果は累積する。',
525
+ 'パニックは拡大し、国際問題に発展する。日本の国益が大きく損なわれる。比良坂機関か、その下位流派に所属するPCは「功績点の獲得」のタイミングで自動的に流儀の達成に失敗したものとする。',
526
+ '忍災の影響が忍びの世にも及び、この事態を引き起こした人物の責任問題に発展する。今回のセッションで【使命】(【本当の使命】がある場合はそちら)を達成出来なかったPCは「忍務失敗表」(基本 p71)を一回使用する。',
527
+ '人々の間で根も葉もない噂が蔓延し、世相が暗くなる。そのセッションのドラマシーンの間、PC全員はあらゆる判定にマイナス1の修正がつく。',
528
+ '忍災やパニックの犠牲者が復讐者に変わる。そのセッションのドラマシーンの間、PC全員は判定に失敗すると1点の接近戦ダメージを受ける。',
529
+ '人々のパニックは暴動に発展する。そのセッションのドラマシーンの間、PC全員は判定に失敗すると1点の射撃戦ダメージを受ける。',
530
+ '多くの犠牲が生まれ、人々の怒りが政府や忍者に向かう。そのセッションのドラマシーンの間、PC全員は判定に失敗すると1点の集団戦ダメージを受ける。',
531
+ '人々は忍者の実在を信じ始め、その正体を探ろうとする者が現れる。そのサイクルの間、PC全員はあらゆる判定のファンブル値が1上昇する。',
532
+ '上層部からしばらく大人しくしているよう厳命がくだる。そのサイクルの間、修得している攻撃忍法とサポート忍法のコストが1点上昇する(コストが「なし」のものは1になる)。',
533
+ 'パニックが波及し、忍者たちは家族、友情、自信、存在意義など、それぞれ大切なものを喪失する。そのセッションの間、PC全員は、判定の結果スペシャルになっても【生命力】1点か変調を回復する効果が発生しなくなる。',
534
+ '忍災の結果、PCたちに不信の目が向けられる。そのセッションに登場するキャラクターのうち、忍災を引き起こしたPCに対してプラスの【感情】を獲得している者は、その【感情】をマイナスの何かに変化する(この効果が無効化されると、元の【感情】の種類に戻る)。'
489
535
  ]
490
536
  ),
491
-
537
+ 'OTAT' => DiceTable::Table.new(
538
+ '覚醒表',
539
+ '1D6',
540
+ [
541
+ '自分の力が急に恐ろしくなる。好きな『覚醒済みデータ』を一つ選び、それを『未覚醒データ』に変更する。',
542
+ '自分の力が暴走し、周囲に被害を与える。そのシーンに登場しているキャラクター全員(自分含む)に射撃戦ダメージを1点与える。',
543
+ '覚醒に伴い、身体の形が変化する。未覚醒忍法の中からランダムに一つ選び、それを覚醒済み忍法にする。',
544
+ '忍者の血に目覚め、力の制御方法が理解出来るようになる。好きな未覚醒忍法を一つを選び、それを覚醒済み忍法にする。',
545
+ '自分だけが操ることが出来る独自の力に目覚める。好きな未覚醒奥義一つを選び、それを覚醒済みの奥義にする。',
546
+ '自分の脳に直接何かが囁きかける。集団戦ダメージを1点受ける(退魔編なら代わりに妖魔化する)と、好きな未覚醒データの中からひとつ選び、それを覚醒済みデータにする。'
547
+ ]
548
+ ),
549
+ 'ONDT' => DiceTable::Table.new(
550
+ '出物表',
551
+ '2D6',
552
+ [
553
+ '翼手 (基本 p175)/解剖刀 (隠忍 p31)',
554
+ '幽命丹 (基本 p174)/魔界樹 (隠忍 p30)',
555
+ '顔無の面 (基本 p174)/龍鱗 (隠忍 p30)',
556
+ '落仔 (基本 p174)/蟲獲箱 (隠忍 p30)',
557
+ '骨刃 (基本 p174)/魔血図 (隠忍 p30)',
558
+ '死霊粉 (基本 p174)/蒼角 (隠忍 p30)',
559
+ '潮満珠 (基本 p174)/屍人形 (隠忍 p30)',
560
+ '生体銃 (基本 p174)/投幻香 (隠忍 p30)',
561
+ '妖皮紙 (基本 p174)/渡来の干首 (隠忍 p30)',
562
+ '神面瘡 (基本 p174)/眠り砂 (隠忍 p30)',
563
+ '外法炉 (基本 p175)/餓鬼魂 (隠忍 p31)'
564
+ ]
565
+ ),
566
+ ## 忍法授業シーン表(シナリオとは無関係なためこちらに記載)
567
+ 'NCT1' => DiceTable::Table.new(
568
+ '攻撃系忍法授業シーン表',
569
+ '1D6',
570
+ [
571
+ "\n接近戦闘学:《刀術》《野戦術》\n【笹貫】(基本 p78)/【天道】(基本 p102)/【新理】(御斎 p34)/好きな体術\n\n御斎学園の敷地内にある森林、御斎林での授業。刃のついた近接武器のみを使って、ターゲットのベテラン教師を倒さなければならない。有利な地形で戦うこと、ターゲットの使う伝統的な技を理解することなどが重要。",
572
+ "\n射撃戦闘学:《砲術》《見敵術》\n【必中】(基本 p79)/【文曲】(基本 p103)/【魔弓】(御斎 p33)/好きな器術\n\n地上十階建てから平屋まで、様々な高さの建物が並ぶ部室棟周囲で行われる。弓やスリング、拳銃、ライフルなどあらゆる武器を使って、潜伏している標的を発見、撃破を目指す。相手の移動先を予測する方法や、移動を妨げる方法なども学ぶ。",
573
+ "\n集団戦闘学:《野戦術》《用兵術》\n【追撃】(基本 p80)/【伏兵】(基本 p102)/【武曲】(基本 p103)/好きな戦術\n\n御斎学園で最も高い場所のひとつ、大時計台の上で行う。地上にいる下級生に指示を出してターゲットを妨害させる。不意打ちさせる、毒を盛らせる、悪い噂を流させるなど、下級生たちを通して配下の効果的運用を知る授業。",
574
+ "\n高速戦闘学:《骨法術》《意気》\n【連撃】(基本 p81)/【風饗】(基本 p81)/【噴足】(御斎 p33)/好きな忍術\n\n地下武道場での授業。一対一での素手による組み手を中心に、攻撃を当てるためにはどうすればいいのか、攻撃を仕掛けた後にどう動くことが効果的なのかなどを教わっていく。また長時間行うことで気力も試される。",
575
+ "\n戦闘物理学:《仕込み》《記憶術》\n【痛打】(基本 p83)/【飢渇】(基本 p84)/【早乙女】(基本 p102)/好きな器術\n\n自身が持つ攻撃方法をより確実にする手段について学ぶ。座学を中心とした授業。武器の威力を高める、時間をかけることで標的を焦らせる、どこにいるかを把握するなどの方法を知ることができる。",
576
+ "\n殺戮力学:《野戦術》《言霊術》\n【蛮歌】(基本 p82)/【共闘】(御斎 p33)/【天槍】(御斎 p33)/好きな妖術\n\n複数の班に別れて、別の班を敵対者と見なして行うグループ学習。協力しての戦い方、対象の負の感情をあおる話術に加え、地形と妖術を利用した相手を害する呪文などが講義内容に含まれる。"
577
+ ]
578
+ ),
579
+ 'NCT2' => DiceTable::Table.new(
580
+ '防御系忍法授業シーン表',
581
+ '1D6',
582
+ [
583
+ "\n人体護身学:《衣装術》《地の利》\n【御斎魂】(基本 p102)/【衣換】(御斎 p34)/【自警】(御斎 p36)/好きな体術\n\n通常授業中に、指導教諭から攻撃を受ける。一般生徒に気付かれてはいけないため耐える方法、受け流す方法を学ぶことができる。単なる身体能力ではなく、地形や装備の利用方法を学ぶことを重視して評価される。",
584
+ "\n警備防衛学:《分身の術》《暗号術》\n【かばう】(基本 p81)/【護衛】(基本 p81)/【陽動】(基本 p102)/好きな忍術\n\n広大な御斎学園の敷地全体を使った授業。指定されたターゲットの元にすぐさま赴き、授業終了時まで、護衛しなければならない。自分の動きだけでなく、護衛対象に的確な指示を出すこと、その指示を襲撃者に読み取らせないようにする方法も学習できる。",
585
+ "\n特殊回避学:《手練》《地の利》\n【矢止めの術】(基本 p82)/【返し技】(基本 p82)/【身かわしの術】(基本 p83)/好きな戦術\n\n広大な大グラウンドでの授業。目隠し状態で、手裏剣、苦無、弓、拳銃やライフルといった中距離遠距離からの攻撃を受ける。単にかわすだけではなく、攻撃そのものを失敗させる、飛来物を打ち返すなど、攻撃者に対処する方法を学ぶ。",
586
+ "\n忍法療法学:《対人術》《兵糧術》\n【毒飼】(基本 p81)/【仙食】(基本 p102)/【説教】(基本 p104)/好きな謀術\n\n学生寮の談話室、食堂などを使用して行う。コミュニケーションによって仲間の気力やモチベーションを回復する方法を学ぶ授業。会話のみならず、飲食物や金銭といった報酬の利用方法なども学習内容に含まれている。",
587
+ "\n生存訓練学:《生存術》《意気》\n【頑健】(基本 p84)/【達人】(基本 p84)/【鋭気】(御斎 p33)/好きな体術\n\n御斎学園の所有する樹海、御斎樹海での実地授業。樹海には様々な罠が張り巡らされ、忍獣が解き放たれている。生徒たちはランダムな場所に投下され、ゴール地点を目指す。",
588
+ "\n対抗忍法学:《騎乗術》《暗号術》\n【騎馬】(基本p81)/【破術】(基本p82)/【作戦指揮】(基本p83)/好きな忍術\n\n学園一の蔵書数を誇る御斎第五図書館を利用する、二人一組でチームを組み、それぞれの忍法の利用方法、対処方法を図書館で調べた後に、移動して実践を行う。相手の有利な場所をいかに避けるかも重要。"
589
+ ]
590
+ ),
591
+ 'NCT3' => DiceTable::Table.new(
592
+ '戦略系忍法授業シーン表',
593
+ '1D6',
594
+ [
595
+ "\n情報戦略学:《記憶術》《千里眼の術》\n【占術】(基本 p82)/【暗業】(御斎 p34)/【分析】(御斎 p36)/好きな謀術\n\n生徒たちが制作した絵画が飾られた、旧校舎美術室での実習授業。絵画には怪異が関係した忍務で命を落とした生徒の伝言をはじめ、様々なメッセージが残されている。見つけだす方法、読み解く方法、その上でどう利用するかについて学習する。",
596
+ "\n諜報心理学:《対人術》《伝達術》\n【感情操作】(基本p83)/【伝心】(御斎p33)/【柔気】(御斎p33)/好きな謀術\n\nコンサートなどにも利用される御斎記念音楽ホールを使用する。音楽鑑賞中の一般生徒たちの中から一人を指名され、その人物に好意を持たせたり指示を伝えたり物品を受け渡したりする実習を行う。",
597
+ "\n高速機動学:《盗聴術》《異形化》\n【無拍子】(基本 p81)/【覚悟】(基本 p82)/【武曲】(基本 p104)/好きな戦術\n\n遠心力を利用した高負荷の過重力環境室において、高速機動を自分のものにするための授業を受ける。反復訓練により身体能力を拡張し、高速機動中に発生する光の屈折・分散によるプリズム効果に脳を適応させる。",
598
+ "\n戦場構築学:《騎乗術》《地の利》\n【誘導】(基本 p82)/【戦場の極意】(基本 p102)/【安地】(御斎 p33)/好きな戦術\n\n自身にとって有利な地形や状況を見つけだし、戦いの場をそこに導くための方法を学ぶ。自転車、バイク、自動車、騎馬の使用をはじめ、学園内のヘリポートや輸送用列車、秘密地下通路の利用も許可されている。",
599
+ "\n妨害環境学:《地の利》《封術》\n【霾天】(基本 p103)/【大火】(御斎 p34)/【氷楔】(御斎 p34)/好きな妖術\n\n大サウナ室、大食堂付属の冷凍室、強風で知られる御斎砂丘を利用して、高温や低温環境、視界を妨げる場所など、悪環境での戦い方を学ぶ授業。単なる地形や天候に留まらず、学園所属の半妖により、妖力で発生する状況も体験する。",
600
+ "\n業子力学:《鳥獣術》《呪術》\n【神通力】(基本 p82)/【数奇】(御斎 p33)/【三星】(御斎 p33)/好きな妖術\n\n御斎学園専用ネットワークを使用したオンライン授業。巫女や呪術師を講師とし、人ならざるものの力を借りる、呪術を使うなどして、運命に介入し、自分にとって都合のよい方向に引き寄せる理論を学び尽くす。"
601
+ ]
602
+ )
492
603
  }.freeze
493
604
  # シーン表
494
605
  SCENE_TABLES = {
@@ -920,6 +1031,7 @@ module BCDice
920
1031
  '美少年改造プラント。このシーンに登場した者は《変装術》で判定すること。成功した場合、美少年になることができる。',
921
1032
  ]
922
1033
  ),
1034
+ ## 以下正忍記
923
1035
  'TMT' => DiceTable::Table.new(
924
1036
  '魔都東京シーン表',
925
1037
  '2D6',
@@ -1056,8 +1168,25 @@ module BCDice
1056
1168
  'あなたの部屋にやってきた。 あなたが忍者であることを感づかれないように、その足跡を覆い隠す。ついでに彼女に見てほしくないものも。',
1057
1169
  ]
1058
1170
  ),
1171
+ ## 以下流派ブック
1172
+ 'OTFK' => DiceTable::Table.new(
1173
+ '不良高校シーン表',
1174
+ '2D6',
1175
+ [
1176
+ '誰かが教室に猫を連れてきた!泣く子も黙るC組の生徒といえど、猫の愛らしい表情には釘付けだ。',
1177
+ '校庭の端にある体育倉庫は、どんなことをするにもぴったりの場所だ。誰かを呼び出して締め上げるにしろ、忍者同士の秘密の会話に勤しむにしろ。',
1178
+ '夜の倉庫街。すでに人通りはなく、明かりといえばオレンジ色にちらつく街灯だけだ。',
1179
+ '下校時間の校庭。不良生徒たちを見ては、ひそひそと話す生徒たちの姿がちらりと見える。教職員ですら、こちらを見ても眉をひそめてただ通り過ぎるだけだ。',
1180
+ '夕方の校舎裏は昼間の教室では味わえない静寂に包まれている。湿ったコンクリート越しに聞こえるものといったら、カラスの鳴き声と、サッカー部の練習の掛け声ぐらいだ。',
1181
+ '荒れ放題の教室。キャッチボールに興じる生徒に喧嘩を始める生徒まで。騒ぎ声は一日中止むことはない。',
1182
+ '教室の前の廊下に、割れた窓ガラスが散乱している。吹きざらしになった窓の外からは冷たい風が吹き付けていた。',
1183
+ '通学路沿いにある橋の下。橋の上を電車が通るたびに、けたたましい線路の音が響き渡る。',
1184
+ '昼休みの食堂。人混みにまみれるここだけは、C組も他の生徒も関係ない。',
1185
+ '高校近くにある河原の土手で、草の上に寝転がって雲を眺める。どこかで響く吹奏楽の練習の音と、風の音とともに、穏やかな時間が流れていく。',
1186
+ '他校の不良生徒からの襲撃だ!校庭に集まった奴らは、釘バットを手に、C組の生徒を出せと騒ぎ立てている。'
1187
+ ]
1188
+ ),
1059
1189
  }.freeze
1060
-
1061
1190
  register_prefix(RTT.prefixes, TABLES.keys, SCENE_TABLES.keys, DEMON_SKILL_TABLES.keys, DEMON_SKILL_TABLES_NEW.keys)
1062
1191
  end
1063
1192
  end
@@ -14,49 +14,63 @@ module BCDice
14
14
 
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = <<~MESSAGETEXT
17
- ・判定コマンド(nVMFx+x)
18
- 注意:Hungerダイスは内数として処理する。
19
- 例:9ダイスプールでHungerダイス3個ならば、通常ダイス6個、Hungerダイス3個となる。
20
- また、難易度は必要成功数を表す。
17
+ ・判定コマンド(nVMFx+x または nVMIxHx)
18
+ VMFコマンドはHungerダイスとダイスプールを個別に指定する。
19
+ VMIコマンドはHungerダイスをダイスプールの内数として指定する。
20
+
21
+ 例:難易度2、9ダイスプールでHungerダイス3個の場合、それぞれ以下のようなコマンドとなる。
22
+ 2VMF6+3
23
+ 2VMI9H3
21
24
 
22
25
  難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Winのチェックを行う
23
26
  (Hungerダイスがある場合)Messy CriticalとBestial Failureチェックを行う
24
27
  例) (難易度)VMF(通常ダイス)+(Hungerダイス)
25
28
  (難易度)VMF(通常ダイス)
29
+ (難易度)VMI(通常ダイス)H(Hungerダイス)
30
+ (難易度)VMI(通常ダイス)
26
31
 
27
32
  難易度省略:成功数のカウント、判定失敗、Critical処理、(Hungerダイスがある場合)Bestial Failureチェックを行う
28
33
  判定成功、Messy Criticalのチェックを行わない
29
34
  Critical Win、(Hungerダイスがある場合)Bestial Failure、Messy Criticalのヒントを出力
30
35
  例) VMF(通常ダイス)+(Hungerダイス)
31
36
  VMF(通常ダイス)
37
+ VMI(通常ダイス)H(Hungerダイス)
38
+ VMI(通常ダイス)
32
39
 
33
40
  難易度0指定:Critical処理と成功数のカウントを行い、全てのチェックを行わない
34
41
  例) 0VMF(通常ダイス)+(Hungerダイス)
35
42
  0VMF(通常ダイス)
43
+ 0VMI(通常ダイス)+(Hungerダイス)
44
+ 0VMI(通常ダイス)
36
45
 
37
46
  MESSAGETEXT
38
47
 
39
- DIFFICULTY_INDEX = 1
40
- DICE_POOL_INDEX = 3
41
- HUNGER_DICE_INDEX = 5
48
+ DIFFICULTY_INDEX = 1
49
+ DICE_POOL_HUNGER_DICE_NO_INCLUDED_INDEX = 5
50
+ HUNGER_DICE_NO_INCLUDED_INDEX = 7
51
+ COMMAND_HUNGER_DICE_INCLUDED_INDEX = 9
52
+ DICE_POOL_HUNGER_DICE_INCLUDED_INDEX = 10
53
+ HUNGER_DICE_INCLUDED_INDEX = 12
42
54
 
43
55
  # 難易度に指定可能な特殊値
44
56
  NOT_CHECK_SUCCESS = -1 # 判定成功にかかわるチェックを行わない(判定失敗に関わるチェックは行う)
45
57
 
46
- # ダイスボットで使用するコマンドを配列で列挙する
47
- register_prefix('\d*VMF')
58
+ register_prefix('\d*(VMF|(VMI\d*(H\d?)?))')
48
59
 
49
60
  def eval_game_system_specific_command(command)
50
- m = /\A(\d+)?(VMF)(\d+)(\+(\d+))?$/.match(command)
61
+ m = /\A(\d+)?(((VMF)(\d)(\+(\d+))?)|((VMI)(\d)(H(\d+))?))$/.match(command)
51
62
  unless m
52
63
  return ''
53
64
  end
54
65
 
55
- dice_pool = m[DICE_POOL_INDEX].to_i
66
+ dice_pool, hunger_dice_pool = get_dice_pools(m)
67
+ if dice_pool < 0
68
+ return "ダイスプールより多いHungerダイスは指定できません。"
69
+ end
70
+
56
71
  dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
57
72
  result_text = "(#{dice_pool}D10"
58
73
 
59
- hunger_dice_pool = m[HUNGER_DICE_INDEX]&.to_i
60
74
  if hunger_dice_pool
61
75
  hunger_dice_text, hunger_success_dice, hunger_ten_dice, hunger_botch_dice = make_dice_roll(hunger_dice_pool)
62
76
 
@@ -79,6 +93,20 @@ module BCDice
79
93
 
80
94
  private
81
95
 
96
+ def get_dice_pools(m)
97
+ hunger_dice_included_command = m[COMMAND_HUNGER_DICE_INCLUDED_INDEX]
98
+ if hunger_dice_included_command && hunger_dice_included_command == "VMI"
99
+ # Hunger Diceを内数処理するの場合
100
+ hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX]&.to_i
101
+ dice_pool = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i - (hunger_dice_pool || 0)
102
+ else
103
+ # Hunger DiceがPLによる内数指定の場合
104
+ hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX]&.to_i
105
+ dice_pool = m[DICE_POOL_HUNGER_DICE_NO_INCLUDED_INDEX].to_i
106
+ end
107
+ return dice_pool, hunger_dice_pool
108
+ end
109
+
82
110
  def get_roll_result(result_text, success_dice, ten_dice, hunger_ten_dice, hunger_botch_dice, difficulty)
83
111
  result_text = "#{result_text} 成功数=#{success_dice}"
84
112
  is_critical = ten_dice >= 2