bcdice 3.13.0 → 3.15.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/Cthulhu/zh_hant.yml +1 -1
  6. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  7. data/i18n/CyberpunkRed/ko_kr.yml +389 -0
  8. data/i18n/DoubleCross/ja_jp.yml +53 -0
  9. data/i18n/DoubleCross/ko_kr.yml +52 -0
  10. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  11. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  12. data/i18n/FutariSousa/ja_jp.yml +284 -127
  13. data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
  14. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  15. data/i18n/MagicaLogia/ko_kr.yml +2 -2
  16. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  17. data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
  18. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  19. data/i18n/SkynautsBouken/ko_kr.yml +114 -0
  20. data/i18n/StratoShout/ko_kr.yml +102 -102
  21. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  22. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  23. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  24. data/i18n/en_us.yml +5 -0
  25. data/i18n/zh_hant.yml +5 -0
  26. data/lib/bcdice/dice_table/range_table.rb +24 -0
  27. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  28. data/lib/bcdice/game_system/Aionia.rb +131 -0
  29. data/lib/bcdice/game_system/AniMalus.rb +99 -59
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +32 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
  32. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  33. data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
  34. data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
  35. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  36. data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
  37. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
  38. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
  39. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
  40. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  41. data/lib/bcdice/game_system/CyberpunkRed.rb +15 -6
  42. data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
  43. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  44. data/lib/bcdice/game_system/DoubleCross.rb +18 -1
  45. data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
  46. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  47. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  48. data/lib/bcdice/game_system/FullFace.rb +63 -12
  49. data/lib/bcdice/game_system/FutariSousa.rb +105 -13
  50. data/lib/bcdice/game_system/Garactier.rb +479 -0
  51. data/lib/bcdice/game_system/GardenOrder.rb +390 -9
  52. data/lib/bcdice/game_system/GundogRevised.rb +8 -8
  53. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  54. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  55. data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
  56. data/lib/bcdice/game_system/KimitoYell.rb +568 -0
  57. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  58. data/lib/bcdice/game_system/KyokoShinshoku.rb +51 -8
  59. data/lib/bcdice/game_system/Magius.rb +125 -0
  60. data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
  61. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  62. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  63. data/lib/bcdice/game_system/NRR.rb +2 -2
  64. data/lib/bcdice/game_system/NSSQ.rb +17 -9
  65. data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
  66. data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
  68. data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/SkynautsBouken.rb +49 -134
  71. data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
  72. data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
  73. data/lib/bcdice/game_system/SwordWorld.rb +5 -1
  74. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +262 -0
  76. data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
  77. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  78. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  79. data/lib/bcdice/game_system/TorgEternity.rb +35 -6
  80. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  81. data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
  82. data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
  83. data/lib/bcdice/game_system/Utakaze.rb +55 -2
  84. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  85. data/lib/bcdice/game_system/WoW.rb +161 -0
  86. data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
  87. data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
  88. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  89. data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
  90. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  91. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  92. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
  93. data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
  94. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
  95. data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
  96. data/lib/bcdice/game_system.rb +31 -0
  97. data/lib/bcdice/version.rb +1 -1
  98. metadata +50 -6
@@ -27,6 +27,9 @@ module BCDice
27
27
    ポジティブとネガティブの両方を振って、表になっている側に○を付けて表示します。
28
28
    もちろん任意で選ぶ部分は変更して構いません。
29
29
 
30
+ ・ハプニングチャート(HC)
31
+ ・RWプロローグチャート ポジティブ (PCP)
32
+ ・RWプロローグチャート ネガティブ (PCN)
30
33
  ・D66ダイスあり
31
34
  INFO_MESSAGE_TEXT
32
35
 
@@ -213,6 +216,10 @@ module BCDice
213
216
  return dx.execute(@randomizer)
214
217
  end
215
218
 
219
+ if self.class::TABLES.key?(command)
220
+ return roll_tables(command, self.class::TABLES)
221
+ end
222
+
216
223
  if command == 'ET'
217
224
  return roll_emotion_table()
218
225
  end
@@ -356,13 +363,23 @@ module BCDice
356
363
  ]
357
364
  ).freeze
358
365
  end
359
- end
360
366
 
367
+ def translate_tables(locale)
368
+ {
369
+ "HC" => DiceTable::RangeTable.from_i18n("DoubleCross.HC", locale),
370
+ "PCP" => DiceTable::Table.from_i18n("DoubleCross.PCP", locale),
371
+ "PCN" => DiceTable::Table.from_i18n("DoubleCross.PCN", locale),
372
+ }
373
+ end
374
+ end
361
375
  # 感情表(ポジティブ)
362
376
  POSITIVE_EMOTION_TABLE = positive_emotion_table(:ja_jp).freeze
363
377
 
364
378
  # 感情表(ネガティブ)
365
379
  NEGATIVE_EMOTION_TABLE = negative_emotion_table(:ja_jp).freeze
380
+
381
+ TABLES = translate_tables(:ja_jp).freeze
382
+ register_prefix('\d+DX', TABLES.keys)
366
383
  end
367
384
  end
368
385
  end
@@ -24,6 +24,9 @@ module BCDice
24
24
   ・감정표(ET)
25
25
    포지티브와 네거티브 양쪽을 굴려, 겉으로 나타는 쪽에 O를 붙여 표시합니다.
26
26
    물론 임의로 정하는 부분을 변경해도 괜찮습니다.
27
+ ・해프닝차트(HC)
28
+ ・RW프롤로그차트 포지티브(PCP)
29
+ ・RW프롤로그차트 네거티브(PCN)
27
30
  ・D66다이스 있음
28
31
  INFO_MESSAGE_TEXT
29
32
 
@@ -46,9 +49,10 @@ module BCDice
46
49
 
47
50
  # 感情表(ポジティブ)
48
51
  POSITIVE_EMOTION_TABLE = positive_emotion_table(:ko_kr).freeze
49
-
50
52
  # 感情表(ネガティブ)
51
53
  NEGATIVE_EMOTION_TABLE = negative_emotion_table(:ko_kr).freeze
54
+ TABLES = translate_tables(:ko_kr).freeze
55
+ register_prefix('\d+DX', TABLES.keys)
52
56
  end
53
57
  end
54
58
  end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FinalFantasyXIV < Base
6
+ # ゲームシステムの識別子
7
+ ID = "FinalFantasyXIV"
8
+
9
+ # ゲームシステム名
10
+ NAME = "FINAL FANTSY XIV TTRPG"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "ふあいなるふあんたしい14TTRPG"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ ・アビリティ判定 nAB+m>=x
17
+ d20のアビリティ判定を行う。ダイス数が指定された場合、大きい出目1個を採用する。
18
+ n: ダイス数(省略時 1)
19
+ m: 修正値(省略可)
20
+ x: 目標値(省略可)
21
+ 基本効果のみ、ダイレクトヒット、クリティカルを自動判定。
22
+ 例)AB, AB+5, AB+5>=14, 2AB+5>=14
23
+ ・行為判定 nDC+m>=x
24
+ アビリティ判定と同様。
25
+ 失敗、成功を自動判定。
26
+ TEXT
27
+
28
+ register_prefix('\d*AB', '\d*DC')
29
+
30
+ def eval_game_system_specific_command(command)
31
+ return abirity_roll(command) || action_roll(command)
32
+ end
33
+
34
+ private
35
+
36
+ def abirity_roll(command)
37
+ parser = Command::Parser.new("AB", round_type: round_type)
38
+ .enable_prefix_number()
39
+ .restrict_cmp_op_to(:>=, nil)
40
+ cmd = parser.parse(command)
41
+ return nil unless cmd
42
+
43
+ times = cmd.prefix_number || 1
44
+
45
+ dice_list_full = @randomizer.roll_barabara(times, 20).sort
46
+ dice_list_full_str = "[#{dice_list_full.join(',')}]" if times > 1
47
+
48
+ dice_list = dice_list_full[-1, 1]
49
+ dice_result = dice_list[0]
50
+
51
+ total = dice_result + cmd.modify_number
52
+
53
+ result =
54
+ if dice_result == 20
55
+ Result.critical(translate("critical"))
56
+ elsif cmd.cmp_op.nil?
57
+ Result.new
58
+ elsif total >= cmd.target_number
59
+ Result.success(translate("FinalFantasyXIV.directhit"))
60
+ else
61
+ Result.failure(translate("FinalFantasyXIV.normalhit"))
62
+ end
63
+
64
+ sequence = [
65
+ "(#{cmd.to_s(:after_modify_number)})",
66
+ dice_list_full_str,
67
+ "#{dice_result}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
68
+ total,
69
+ result.text
70
+ ].compact
71
+
72
+ result.text = sequence.join(" > ")
73
+ result
74
+ end
75
+
76
+ def action_roll(command)
77
+ parser = Command::Parser.new("DC", round_type: round_type)
78
+ .enable_prefix_number()
79
+ .restrict_cmp_op_to(:>=, nil)
80
+ cmd = parser.parse(command)
81
+ return nil unless cmd
82
+
83
+ times = cmd.prefix_number || 1
84
+
85
+ dice_list_full = @randomizer.roll_barabara(times, 20).sort
86
+ dice_list_full_str = "[#{dice_list_full.join(',')}]" if times > 1
87
+
88
+ dice_list = dice_list_full[-1, 1]
89
+ dice_result = dice_list[0]
90
+
91
+ total = dice_result + cmd.modify_number
92
+
93
+ result =
94
+ if cmd.cmp_op.nil?
95
+ Result.new
96
+ elsif total >= cmd.target_number
97
+ Result.success(translate("success"))
98
+ else
99
+ Result.failure(translate("failure"))
100
+ end
101
+
102
+ sequence = [
103
+ "(#{cmd.to_s(:after_modify_number)})",
104
+ dice_list_full_str,
105
+ "#{dice_result}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
106
+ total,
107
+ result.text
108
+ ].compact
109
+
110
+ result.text = sequence.join(" > ")
111
+ result
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/FinalFantasyXIV"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class FinalFantasyXIV_English < FinalFantasyXIV
8
+ # ゲームシステムの識別子
9
+ ID = "FinalFantasyXIV:English"
10
+
11
+ # ゲームシステム名
12
+ NAME = "FINAL FANTSY XIV TTRPG(English)"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "国際化:English:FINAL FANTASY XIV TTRPG"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ Ability Checks nAB+m>=CR
19
+ Perform a d20 ability check. If a die count is specified, the highest roll is adopted.
20
+ n: die count(optional)
21
+ m: modifiy number(optional)
22
+ CR: Challenge Ratting(optional)
23
+ Base Effect only, Direct hit and Critical are automatically evaluated.
24
+ Example: AB, AB+5, AB+5>=14, 2AB+5>=14
25
+ Making checks nDC+m>=CR
26
+ Same as ability check.
27
+ Success and Failure ar automatically evaluated.
28
+ TEXT
29
+
30
+ register_prefix_from_super_class()
31
+
32
+ def initialize(command)
33
+ super(command)
34
+
35
+ @locale = :en_us
36
+ end
37
+ end
38
+ end
39
+ end
@@ -14,43 +14,55 @@ module BCDice
14
14
 
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
- ■判定 x+bFF<=t x:ヒート(省略時は3) b:判定修正 t:能力値
17
+ ■判定 x+bFF<=a[,t][&d] x:ヒート(省略時は3) b:判定修正 a:能力値 t:難易度(省略可) d:基本ダメージ(省略可)
18
+
19
+ 例)FF<=2: 能力値2で判定し、その結果(成功数,1の目の数,6の目の数,バースト)を表示。
20
+ 6FF<=3: ヒート6,能力値3で戦闘判定し、その結果( 〃 )を表示。
21
+ 8+2FF<=3: ヒート8,判定修正+2,能力値3で戦闘判定し、その結果( 〃 )を表示。
22
+ FF<=2,1: 能力値2,難易度1で判定し、その結果(成功数,1の目の数,6の目の数,成功・失敗,バースト)を表示。
23
+ 6FF<=3,2&1:ヒート6,能力値3,難易度2,基本ダメージ1で戦闘判定し、その結果(成功数,1の目の数,6の目の数,ダメージ,バースト)を表示。
24
+
25
+ ■ジャンク表 JKT
18
26
 
19
- 例)FF<=2: 能力値2で判定し、その結果(成功数,1の目の数,バースト)を表示。
20
- 6FF<=3: ヒート6,能力値3で戦闘判定し、その結果( 〃 )を表示。
21
- 8+2FF<=3:ヒート8,判定修正+2,能力値3で戦闘判定し、その結果( 〃 )を表示。
22
27
  INFO_MESSAGETEXT
23
28
 
24
- register_prefix('([+\d]+)*FF')
29
+ def initialize(command)
30
+ super(command)
31
+
32
+ @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
33
+ end
25
34
 
26
35
  def eval_game_system_specific_command(command)
27
- resolute_action(command)
36
+ resolute_action(command) ||
37
+ roll_tables(command, TABLES)
28
38
  end
29
39
 
30
40
  private
31
41
 
32
- # 技能判定
42
+ # 戦闘判定
33
43
  # @param [String] command
34
44
  # @return [Result]
35
45
  def resolute_action(command)
36
- m = /^(\d*)([+\d]+)*FF<=(\d)$/.match(command)
46
+ m = /^(\d*)([+\d]+)*FF<=(\d)(,(\d))?(&(\d))?$/.match(command)
37
47
  return nil unless m
38
48
 
39
49
  heat_level = m[1].to_i
40
50
  heat_level = 3 if heat_level == 0
41
51
  modify = Arithmetic.eval("0#{m[2]}", @round_type)
42
52
  status_no = m[3].to_i
53
+ target_no = m[5].to_i
54
+ damage_no = m[7].to_i
43
55
 
44
56
  dice_array = []
45
57
 
46
- dice = @randomizer.roll_barabara(heat_level, 6)
58
+ dice = @randomizer.roll_barabara(heat_level, 6).sort
47
59
  ones = dice.count(1)
48
60
  sixs = dice.count(6)
49
61
  success_num = dice.count { |val| val <= status_no }
50
62
  dice_array.push(dice.join(","))
51
63
 
52
64
  if modify > 0
53
- dice = @randomizer.roll_barabara(modify, 6)
65
+ dice = @randomizer.roll_barabara(modify, 6).sort
54
66
  ones += dice.count(1)
55
67
  success_num += dice.count { |val| val <= status_no }
56
68
  dice_array.push(dice.join(","))
@@ -58,7 +70,7 @@ module BCDice
58
70
  ones_total = ones
59
71
 
60
72
  while ones > 0
61
- dice = @randomizer.roll_barabara(ones, 6)
73
+ dice = @randomizer.roll_barabara(ones, 6).sort
62
74
  ones = dice.count(1)
63
75
  ones_total += ones
64
76
  success_num += dice.count { |val| val <= status_no }
@@ -66,6 +78,7 @@ module BCDice
66
78
  end
67
79
 
68
80
  return Result.new.tap do |result|
81
+ command_out = "(#{heat_level}#{Format.modifier(modify)}FF<=#{status_no}"
69
82
  if sixs >= 2
70
83
  result.fumble = true
71
84
  result.condition = false
@@ -76,10 +89,27 @@ module BCDice
76
89
  result_txt = []
77
90
  result_txt.push("成功度(#{success_num})")
78
91
  result_txt.push("1の目(#{ones_total})") if ones_total > 0
92
+ result_txt.push("6の目(#{sixs})") if sixs > 0
93
+ if target_no > 0
94
+ command_out += ",#{target_no}"
95
+ if success_num >= target_no
96
+ result_txt.push("成功")
97
+ result.condition = true
98
+ else
99
+ result_txt.push("失敗")
100
+ result.condition = false
101
+ end
102
+ end
103
+ if damage_no > 0
104
+ command_out += "&#{damage_no}"
105
+ damage = damage_no + ones_total
106
+ result_txt.push("ダメージ(#{damage})")
107
+ end
79
108
  result_txt.push("バースト") if result.fumble?
109
+ command_out += ")"
80
110
 
81
111
  sequence = [
82
- "(#{heat_level}#{Format.modifier(modify)}FF<=#{status_no})",
112
+ command_out,
83
113
  dice_array.join('+').to_s,
84
114
  result_txt.join(',').to_s,
85
115
  ].compact
@@ -87,6 +117,27 @@ module BCDice
87
117
  result.text = sequence.join(" > ")
88
118
  end
89
119
  end
120
+
121
+ TABLES = {
122
+ "JKT" => DiceTable::Table.new(
123
+ "ジャンク表",
124
+ "2D6",
125
+ [
126
+ "命欲しさに重要な情報を吐いた。セッションのボスに関する情報を得る。",
127
+ "ユニットの機密文書だ。この戦闘で獲得したユニットがあるなら、そのうち好きなユニット1つを経験点を消費せずに常備化できる。",
128
+ "違法アップロードされた個人情報のデータだ。このセッション中、エネミーと出会ったとき、詳細なデータが即座に公開される(GMはできるだけ拒否しないこと)。",
129
+ "鍵を持っていた。近くに施錠された扉や箱などがあるなら、そのうちの1つを開けることができる。",
130
+ "何も見つけられなかったが、敵を倒したことによって自信を得た。このセッション中のみ、1回だけ自身の判定で出た6の目を1つ消すことができる。",
131
+ "自爆装置だ。何も残らなかった。",
132
+ "使い捨ての武器を手に入れた。このセッション中のみ、1回だけ「近接攻撃5『本能』」の攻撃アクションを行える。",
133
+ "敵が改心した。倒されたキャラクターがまだ生きているなら、そのうちの一人が君たちに協力を申し込んでくる(このセッション限定の恩恵「人脈:協力者」を得る)。",
134
+ "金を手に入れた。キャラクター全員、アフターフェイズに配布される経験点が1増加する。",
135
+ "強力なユニットを隠し持っていた。好きな組織専用ユニットを1つ獲得する。",
136
+ "大金を手に入れた。キャラクター全員、アフターフェイズに配布される経験点が3増加する。",
137
+ ]
138
+ ),
139
+ }.freeze
140
+ register_prefix('([+\d]+)*FF', TABLES.keys)
90
141
  end
91
142
  end
92
143
  end
@@ -16,20 +16,24 @@ module BCDice
16
16
  HELP_MESSAGE = <<~MESSAGETEXT
17
17
  ・判定用コマンド
18
18
  探偵用:【DT】…10面ダイスを2つ振って判定します。『有利』なら【3DT】、『不利』なら【1DT】を使います。
19
+     【DT6】…6面ダイスを2つ振って判定します。『有利』なら【3DT6】、『不利』なら【1DT6】を使います。
19
20
  助手用:【AS】…6面ダイスを2つ振って判定します。『有利』なら【3AS】、『不利』なら【1AS】を使います。
21
+     【AS10】…10面ダイスを2つ振って判定します。『有利』なら【3AS10】、『不利』なら【1AS10】を使います。
20
22
  ・各種表
21
23
  【セッション時】
22
24
  異常な癖決定表      SHRD/新・異常な癖決定表   SHND
23
25
  普通の?・異常な癖決定表 SHAD/ケイジ異常な癖決定表  SHKD
26
+ 超探偵向け異常な癖表   SHLD
24
27
   口から出る表    SHFM/強引な捜査表      SHBT/すっとぼけ表       SHPI
25
-  事件に夢中表    SHEG/パートナーと……表   SHWP/何かしている表      SHDS
28
+  事件に夢中表    SHEG/パートナーと……表    SHWP/何かしている表      SHDS
26
29
   奇想天外表     SHFT/急なひらめき表     SHIN/喜怒哀楽表        SHEM
27
30
   人間エミュレート表 SHHE/人間エミュレート失敗表 SHHF/パートナーへのいたずら表 SHMP
28
31
   思わせぶり表    SHSB/もどかしい表      SHFR/突然どうした表      SHIS
29
32
   わがままを言う表  SHSE/普通に見える表     SHLM/嫉妬に狂う表       SHJS
30
33
   傲慢な態度表    SHAR/比較的軽度なもの表   SHRM/ノータイム表       SHNT
31
34
   捜査のやり方表   SHIM/貴族表         SHNO/説明しない表       SHNE
32
-  刑事としての癖表  SHHD
35
+  刑事としての癖表  SHHD/名誉ある探偵表     SHGD/超すごい表        SHSA
36
+  超事件に夢中表   SHEP/超パートナーと……表   SHXP
33
37
  イベント表
34
38
   現場にて  EVS/なぜ?  EVW/協力者と共に EVN
35
39
   向こうから EVC/VS容疑者 EVV
@@ -38,7 +42,8 @@ module BCDice
38
42
   思わぬヒント EVH/実験をしてみよう EVX/ゲスト捜査 EVG
39
43
   ケイジ聞き込み捜査    EVQ/ケイジ大規模捜査      EVM/こっそり情報の受け渡し EVP
40
44
   同僚たちと一緒に捜査する EVO/頻染みの店シチュエーション EVF/ハードBデカアクション EVB
41
-  探偵を大人しくさせる捜査 EVL/伝統的捜査 EVZ/原始的捜査 EVR
45
+  探偵を大人しくさせる捜査 EVL/伝統的捜査         EVZ/原始的捜査       EVR
46
+  超探偵調査       EV6S/神速捜査         EV6F
42
47
  感情表
43
48
   感情表A/B   FLT66・FLT10
44
49
   気に入っているところ  FLTL66 /気に入らないところ  FLTD66
@@ -64,13 +69,13 @@ module BCDice
64
69
  @d66_sort_type = D66SortType::ASC
65
70
  end
66
71
 
67
- register_prefix('(\d+)?DT', '(\d+)?AS')
72
+ register_prefix('(\d+)?DT(?:6)?', '(\d+)?AS(?:10)?')
68
73
 
69
74
  def eval_game_system_specific_command(command)
70
- if (m = /^(\d+)?DT$/i.match(command))
75
+ if (m = /^(\d+)?DT(?:6)?$/i.match(command))
71
76
  count = m[1]&.to_i || 2
72
77
  return roll_dt(command, count)
73
- elsif (m = /^(\d+)?AS$/i.match(command))
78
+ elsif (m = /^(\d+)?AS(?:10)?$/i.match(command))
74
79
  count = m[1]&.to_i || 2
75
80
  return roll_as(command, count)
76
81
  end
@@ -88,7 +93,12 @@ module BCDice
88
93
 
89
94
  # 探偵用判定コマンド DT
90
95
  def roll_dt(command, count)
91
- dice_list = @randomizer.roll_barabara(count, 10)
96
+ dice_list =
97
+ if command =~ /^(\d*)DT6$/i
98
+ @randomizer.roll_barabara(count, 6)
99
+ else
100
+ @randomizer.roll_barabara(count, 10)
101
+ end
92
102
  max = dice_list.max
93
103
 
94
104
  result =
@@ -108,7 +118,12 @@ module BCDice
108
118
 
109
119
  # 助手用判定コマンド AS
110
120
  def roll_as(command, count)
111
- dice_list = @randomizer.roll_barabara(count, 6)
121
+ dice_list =
122
+ if command =~ /^(\d*)AS10$/i
123
+ @randomizer.roll_barabara(count, 10)
124
+ else
125
+ @randomizer.roll_barabara(count, 6)
126
+ end
112
127
  max = dice_list.max
113
128
 
114
129
  result =
@@ -131,10 +146,70 @@ module BCDice
131
146
 
132
147
  def translate_tables(locale)
133
148
  {
134
- "SHRD" => DiceTable::Table.from_i18n("FutariSousa.table.SHRD", locale),
135
- "SHND" => DiceTable::Table.from_i18n("FutariSousa.table.SHND", locale),
136
- "SHAD" => DiceTable::Table.from_i18n("FutariSousa.table.SHAD", locale),
137
- "SHKD" => DiceTable::Table.from_i18n("FutariSousa.table.SHKD", locale),
149
+ "SHRD" => DiceTable::ChainTable.new(
150
+ I18n.translate("FutariSousa.table.SHRD.name", locale: locale),
151
+ "1D10",
152
+ [
153
+ DiceTable::Table.from_i18n("FutariSousa.table.SHFM", locale),
154
+ DiceTable::Table.from_i18n("FutariSousa.table.SHBT", locale),
155
+ DiceTable::Table.from_i18n("FutariSousa.table.SHPI", locale),
156
+ DiceTable::Table.from_i18n("FutariSousa.table.SHEG", locale),
157
+ DiceTable::Table.from_i18n("FutariSousa.table.SHWP", locale),
158
+ DiceTable::Table.from_i18n("FutariSousa.table.SHDS", locale),
159
+ DiceTable::Table.from_i18n("FutariSousa.table.SHIN", locale),
160
+ DiceTable::Table.from_i18n("FutariSousa.table.SHEM", locale),
161
+ DiceTable::Table.from_i18n("FutariSousa.table.SHFT", locale),
162
+ I18n.translate("FutariSousa.table.SHRD.items", locale: locale)[9],
163
+ ]
164
+ ),
165
+ "SHND" => DiceTable::ChainTable.new(
166
+ I18n.translate("FutariSousa.table.SHND.name", locale: locale),
167
+ "1D6",
168
+ [
169
+ DiceTable::Table.from_i18n("FutariSousa.table.SHHE", locale),
170
+ DiceTable::Table.from_i18n("FutariSousa.table.SHHF", locale),
171
+ DiceTable::Table.from_i18n("FutariSousa.table.SHMP", locale),
172
+ DiceTable::Table.from_i18n("FutariSousa.table.SHSB", locale),
173
+ DiceTable::Table.from_i18n("FutariSousa.table.SHFR", locale),
174
+ DiceTable::Table.from_i18n("FutariSousa.table.SHIS", locale),
175
+ ]
176
+ ),
177
+ "SHAD" => DiceTable::ChainTable.new(
178
+ I18n.translate("FutariSousa.table.SHAD.name", locale: locale),
179
+ "1D6",
180
+ [
181
+ DiceTable::Table.from_i18n("FutariSousa.table.SHSE", locale),
182
+ DiceTable::Table.from_i18n("FutariSousa.table.SHLM", locale),
183
+ DiceTable::Table.from_i18n("FutariSousa.table.SHJS", locale),
184
+ DiceTable::Table.from_i18n("FutariSousa.table.SHAR", locale),
185
+ DiceTable::Table.from_i18n("FutariSousa.table.SHRM", locale),
186
+ DiceTable::Table.from_i18n("FutariSousa.table.SHNT", locale),
187
+ ]
188
+ ),
189
+ "SHKD" => DiceTable::ChainTable.new(
190
+ I18n.translate("FutariSousa.table.SHKD.name", locale: locale),
191
+ "1D6",
192
+ [
193
+ DiceTable::Table.from_i18n("FutariSousa.table.SHIM", locale),
194
+ DiceTable::Table.from_i18n("FutariSousa.table.SHNO", locale),
195
+ DiceTable::Table.from_i18n("FutariSousa.table.SHNE", locale),
196
+ DiceTable::Table.from_i18n("FutariSousa.table.SHHD", locale),
197
+ I18n.translate("FutariSousa.table.SHKD.items", locale: locale)[4],
198
+ I18n.translate("FutariSousa.table.SHKD.items", locale: locale)[5],
199
+ ]
200
+ ),
201
+ "SHLD" => DiceTable::ChainTable.new(
202
+ I18n.translate("FutariSousa.table.SHLD.name", locale: locale),
203
+ "1D6",
204
+ [
205
+ DiceTable::Table.from_i18n("FutariSousa.table.SHGD", locale),
206
+ DiceTable::Table.from_i18n("FutariSousa.table.SHSA", locale),
207
+ DiceTable::Table.from_i18n("FutariSousa.table.SHEP", locale),
208
+ DiceTable::Table.from_i18n("FutariSousa.table.SHXP", locale),
209
+ I18n.translate("FutariSousa.table.SHLD.items", locale: locale)[4],
210
+ I18n.translate("FutariSousa.table.SHLD.items", locale: locale)[5],
211
+ ]
212
+ ),
138
213
  "SHFM" => DiceTable::Table.from_i18n("FutariSousa.table.SHFM", locale),
139
214
  "SHBT" => DiceTable::Table.from_i18n("FutariSousa.table.SHBT", locale),
140
215
  "SHPI" => DiceTable::Table.from_i18n("FutariSousa.table.SHPI", locale),
@@ -160,6 +235,10 @@ module BCDice
160
235
  "SHNO" => DiceTable::Table.from_i18n("FutariSousa.table.SHNO", locale),
161
236
  "SHNE" => DiceTable::Table.from_i18n("FutariSousa.table.SHNE", locale),
162
237
  "SHHD" => DiceTable::Table.from_i18n("FutariSousa.table.SHHD", locale),
238
+ "SHGD" => DiceTable::Table.from_i18n("FutariSousa.table.SHGD", locale),
239
+ "SHSA" => DiceTable::Table.from_i18n("FutariSousa.table.SHSA", locale),
240
+ "SHEP" => DiceTable::Table.from_i18n("FutariSousa.table.SHEP", locale),
241
+ "SHXP" => DiceTable::Table.from_i18n("FutariSousa.table.SHXP", locale),
163
242
  "EVS" => DiceTable::Table.from_i18n("FutariSousa.table.EVS", locale),
164
243
  "EVW" => DiceTable::Table.from_i18n("FutariSousa.table.EVW", locale),
165
244
  "EVN" => DiceTable::Table.from_i18n("FutariSousa.table.EVN", locale),
@@ -181,6 +260,8 @@ module BCDice
181
260
  "EVL" => DiceTable::Table.from_i18n("FutariSousa.table.EVL", locale),
182
261
  "EVZ" => DiceTable::Table.from_i18n("FutariSousa.table.EVZ", locale),
183
262
  "EVR" => DiceTable::Table.from_i18n("FutariSousa.table.EVR", locale),
263
+ "EV6S" => DiceTable::Table.from_i18n("FutariSousa.table.EV6S", locale),
264
+ "EV6F" => DiceTable::Table.from_i18n("FutariSousa.table.EV6F", locale),
184
265
  "OBT" => DiceTable::D66Table.from_i18n("FutariSousa.table.OBT", locale),
185
266
  "ACT" => DiceTable::Table.from_i18n("FutariSousa.table.ACT", locale),
186
267
  "EWT" => DiceTable::Table.from_i18n("FutariSousa.table.EWT", locale),
@@ -206,7 +287,18 @@ module BCDice
206
287
  "FLT10" => DiceTable::Table.from_i18n("FutariSousa.table.FLT10", locale),
207
288
  "FLTL66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTL66", locale),
208
289
  "FLTD66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTD66", locale),
209
- "FLTRA" => DiceTable::Table.from_i18n("FutariSousa.table.FLTRA", locale),
290
+ "FLTRA" => DiceTable::ChainTable.new(
291
+ I18n.translate("FutariSousa.table.FLTRA.name", locale: locale),
292
+ "1D6",
293
+ [
294
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTF66", locale),
295
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTB66", locale),
296
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTH66", locale),
297
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTS66", locale),
298
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTA66", locale),
299
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTW66", locale),
300
+ ]
301
+ ),
210
302
  "FLTF66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTF66", locale),
211
303
  "FLTB66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTB66", locale),
212
304
  "FLTH66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTH66", locale),