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
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class NervWhitePaper < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'NervWhitePaper'
8
+
9
+ # ゲームシステム名
10
+ NAME = '新世紀エヴァンゲリオンRPG NERV白書/使徒降臨'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'しんせいきえうあんけりおんああるひいしいねるふはくしよしとこおりん'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■通常ロール(NR):成功、失敗、絶対成功、絶対失敗を表示します。
18
+ 例) NR
19
+
20
+ ■長所ロール(NA):成功、失敗、絶対成功、絶対失敗を表示します。
21
+ 例) NA
22
+
23
+ ■短所ロール(ND):成功、失敗、絶対成功、絶対失敗を表示します。
24
+ 例) ND
25
+
26
+ INFO_MESSAGETEXT
27
+
28
+ register_prefix('N[RAD]')
29
+
30
+ def eval_game_system_specific_command(command)
31
+ resolute_regular_action(command) ||
32
+ resolute_advantage_action(command) ||
33
+ resolute_disadvantage_action(command)
34
+ end
35
+
36
+ private
37
+
38
+ # 通常ロールによる判定
39
+ # @param [String] command
40
+ # @return [Result]
41
+ def resolute_regular_action(command)
42
+ m = /NR/.match(command)
43
+ return nil unless m
44
+
45
+ dices = @randomizer.roll_barabara(2, 6)
46
+ dice_text = dices.join(",")
47
+ dice_add = dices.sum
48
+
49
+ output = "(NR) > #{dice_text}"
50
+
51
+ if dice_add == 7
52
+ output += " > 絶対成功"
53
+ return Result.critical(output)
54
+ elsif dice_add == 2
55
+ output += " > 絶対失敗"
56
+ return Result.fumble(output)
57
+ elsif dice_add == 12
58
+ output += " > 絶対失敗"
59
+ return Result.fumble(output)
60
+ elsif dice_add.modulo(2) == 0
61
+ output += " > 失敗"
62
+ return Result.failure(output)
63
+ else
64
+ output += " > 成功"
65
+ return Result.success(output)
66
+ end
67
+ end
68
+
69
+ # 長所ロールによる判定
70
+ # @param [String] command
71
+ # @return [Result]
72
+ def resolute_advantage_action(command)
73
+ m = /NA/.match(command)
74
+ return nil unless m
75
+
76
+ dices = @randomizer.roll_barabara(2, 6)
77
+ dice_text = dices.join(",")
78
+ dice_add = dices.sum
79
+
80
+ output = "(NA) > #{dice_text}"
81
+
82
+ if dice_add == 7
83
+ output += " > 絶対成功"
84
+ return Result.critical(output)
85
+ elsif dice_add == 2
86
+ output += " > 絶対失敗"
87
+ return Result.fumble(output)
88
+ elsif dice_add == 12
89
+ output += " > 絶対失敗"
90
+ return Result.fumble(output)
91
+ elsif dices[0] == dices[1]
92
+ output += " > 失敗"
93
+ return Result.failure(output)
94
+ else
95
+ output += " > 成功"
96
+ return Result.success(output)
97
+ end
98
+ end
99
+
100
+ # 短所ロールによる判定
101
+ # @param [String] command
102
+ # @return [Result]
103
+ def resolute_disadvantage_action(command)
104
+ m = /ND/.match(command)
105
+ return nil unless m
106
+
107
+ dices = @randomizer.roll_barabara(2, 6)
108
+ dice_text = dices.join(",")
109
+ dice_add = dices.sum
110
+
111
+ output = "(ND) > #{dice_text}"
112
+
113
+ if dice_add == 7
114
+ output += " > 絶対成功"
115
+ return Result.critical(output)
116
+ elsif dice_add == 2
117
+ output += " > 絶対失敗"
118
+ return Result.fumble(output)
119
+ elsif dice_add == 12
120
+ output += " > 絶対失敗"
121
+ return Result.fumble(output)
122
+ elsif dice_add != 7
123
+ output += " > 失敗"
124
+ return Result.failure(output)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,198 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class RogueLikeHalf < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'RogueLikeHalf'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ローグライクハーフ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ろおくらいくはあふ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 RH+x>=t x:技量点 t:達成値(威力)
18
+
19
+ 例)RH+1>=5: ダイスを1個振って、技量点1,達成値5の結果を表示(クリティカル・ファンブルも表示)
20
+
21
+ ■D33 D33+x x:修正値
22
+
23
+ 例)D33: 3面ダイスを2個振って、その結果を表示。
24
+
25
+ ■宝物表 NTT+x x:修正値
26
+ INFO_MESSAGETEXT
27
+
28
+ def initialize(command)
29
+ super(command)
30
+
31
+ @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
32
+ end
33
+
34
+ def eval_game_system_specific_command(command)
35
+ resolute_action(command) ||
36
+ resolute_d33(command) ||
37
+ roll_table_command(command)
38
+ end
39
+
40
+ private
41
+
42
+ def with_symbol(number)
43
+ if number == 0
44
+ return "+0"
45
+ elsif number > 0
46
+ return "+#{number}"
47
+ else
48
+ return number.to_s
49
+ end
50
+ end
51
+
52
+ # 判定ロール
53
+ # @param [String] command
54
+ # @return [Result]
55
+ def get_result_of_action(total, die, target)
56
+ if die == 6
57
+ return Result.critical("クリティカル")
58
+ elsif die == 1
59
+ return Result.fumble("ファンブル")
60
+ elsif total >= target
61
+ return Result.success("成功")
62
+ else
63
+ return Result.failure("失敗")
64
+ end
65
+ end
66
+
67
+ def resolute_action(command)
68
+ m = /RH([+-]\d)*(>=(\d+))?/.match(command)
69
+ return nil unless m
70
+
71
+ modify = m[1] ? Arithmetic.eval(m[1], @round_type) : 0
72
+ target = m[3].to_i
73
+ target = 4 if target == 0
74
+
75
+ die = @randomizer.roll_once(6)
76
+ die_text = die.to_s
77
+ total = die + modify
78
+
79
+ result = get_result_of_action(total, die, target)
80
+
81
+ command_text = "(RH#{with_symbol(modify)}>=#{target})"
82
+ sequence = [
83
+ command_text,
84
+ "[#{die_text}]#{with_symbol(modify)}",
85
+ total,
86
+ result.text,
87
+ ].compact
88
+
89
+ result.text = sequence.join(" > ")
90
+
91
+ return result
92
+ end
93
+
94
+ # D33ロール
95
+ # @param [String] command
96
+ # @return [Result]
97
+ def resolute_d33(command)
98
+ m = /D33([+-]\d+)*/.match(command)
99
+ return nil unless m
100
+
101
+ modify = m[1] ? Arithmetic.eval(m[1], @round_type) : 0
102
+
103
+ dice = @randomizer.roll_barabara(2, 3)
104
+ dice_text = dice.join("")
105
+ dice_total = dice[0] * 3 + dice[1] + modify
106
+ dice_total = 12 if dice_total > 12
107
+ dice_total = 4 if dice_total < 4
108
+ p = dice_total.divmod(3)
109
+ if p[1] == 0
110
+ p[0] = p[0] - 1
111
+ p[1] = 3
112
+ end
113
+ total = p[0] * 10 + p[1]
114
+
115
+ sequence = [
116
+ "(#{command})",
117
+ dice_text,
118
+ ].compact
119
+
120
+ if modify != 0
121
+ sequence = [
122
+ "(#{command})",
123
+ "#{dice_text}#{with_symbol(modify)}",
124
+ total,
125
+ ].compact
126
+ end
127
+
128
+ return Result.new(sequence.join(" > "))
129
+ end
130
+
131
+ def roll_table_command(command)
132
+ command = command.upcase
133
+ result = []
134
+
135
+ m = /([A-Z]+)(([+]|-)(\d+))?/.match(command)
136
+ return result unless m
137
+
138
+ command = m[1]
139
+ operator = m[3]
140
+ value = m[4].to_i
141
+
142
+ return get_another_table_result(command, operator, value)
143
+ end
144
+
145
+ def get_another_table_result(command, operator, value)
146
+ result = ""
147
+
148
+ table_name = command
149
+ table = TABLES[table_name]
150
+ return result if table.nil?
151
+
152
+ index = get_table_index(operator, value, 1, 6)
153
+
154
+ info = table.choice(index)
155
+ result = "#{info.table_name}:#{info.value}:#{info.body}"
156
+
157
+ return result
158
+ end
159
+
160
+ def get_table_index(operator, value, dice_count, dice_type)
161
+ modify = 0
162
+
163
+ case operator
164
+ when "+"
165
+ modify = value
166
+ when "-"
167
+ modify = value * -1
168
+ end
169
+
170
+ index = @randomizer.roll_sum(dice_count, dice_type)
171
+ index += modify
172
+
173
+ index = [index, dice_count * 1].max
174
+ index = [index, dice_count * dice_type + 1].min
175
+
176
+ return index
177
+ end
178
+
179
+ TABLES = {
180
+ "NTT" => DiceTable::Table.new(
181
+ "宝物表",
182
+ "1D6",
183
+ [
184
+ "金貨1枚",
185
+ "1d6枚の金貨",
186
+ "2d6枚の金貨(下限は金貨5枚)",
187
+ "1個のアクセサリー(1d6×1d6枚の金貨と同等の価値)",
188
+ "1個の宝石・小(1d6×5枚の金貨と同等の価値。下限は金貨15枚の価値)",
189
+ "1個の宝石・大(2d6×5枚の金貨と同等の価値。下限は金貨30枚の価値)",
190
+ "【魔法の宝物表】でダイスロールを行うこと。",
191
+ ]
192
+ )
193
+ }.freeze
194
+
195
+ register_prefix('RH', 'D33', TABLES.keys)
196
+ end
197
+ end
198
+ end
@@ -14,13 +14,16 @@ module BCDice
14
14
 
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = <<~MESSAGETEXT
17
- ・判定コマンド クリティカル、スペシャル、ファンブルを含めた判定を行う。
18
- RQG<=成功率
17
+ ・判定コマンド 決定的成功、効果的成功、ファンブルを含めた判定を行う。
18
+ RQG<=成功率 (基本書式)
19
+ RQG成功率 (省略記法)
19
20
 
20
- 例1:RQG<=80 (技能値80で判定)
21
+ 例1:RQG<=80 (技能値80で判定)
21
22
  例2:RQG<=80+20 (技能値100で判定)
23
+ 例3:RQG80 (省略書式で技能値80の判定)
24
+ 例4:RQG80+20 (省略書式で技能値100の判定)
22
25
 
23
- ・抵抗判定コマンド(能動-受動) クリティカル、スペシャル、ファンブルを含めた判定を行う。
26
+ ・抵抗判定コマンド(能動-受動) 決定的成功、効果的成功、ファンブルを含めた判定を行う。
24
27
  RES(能動能力-受動能力)m増強値
25
28
  増強値は省略可能。
26
29
 
@@ -28,7 +31,7 @@ module BCDice
28
31
  例2:RES(9-11)m20 (能動能力9 vs 受動能力11、+20%の増強が能動側に入る判定)
29
32
  例3:RES(9)m50 (能動能力と受動能力の差が9で、+50%の増強が能動側に入る判定)
30
33
 
31
- ・抵抗判定コマンド(能動側のみ) クリティカル、スペシャル、ファンブルは含めず判定を行う。
34
+ ・抵抗判定コマンド(能動側のみ) 決定的成功、効果的成功、ファンブルは含めず判定を行う。
32
35
  RSA(能動能力)m増強値
33
36
  増強値は省略可能。
34
37
 
@@ -55,18 +58,18 @@ module BCDice
55
58
 
56
59
  # 技能などの一般判定
57
60
  def do_ability_roll(command)
58
- m = %r{\A(RQG)(<=([+-/*\d]+))?$}.match(command)
61
+ m = %r{\A(RQG)((<=)?([+-/*\d]+))?$}.match(command)
59
62
  unless m
60
63
  return nil
61
64
  end
62
65
 
63
66
  roll_value = @randomizer.roll_once(100)
64
- unless m[3]
67
+ unless m[4]
65
68
  # RQGのみ指定された場合は1d100を振ったのと同じ挙動
66
69
  return "(1D100) > #{roll_value}"
67
70
  end
68
71
 
69
- ability_value = Arithmetic.eval(m[3], RoundType::ROUND)
72
+ ability_value = Arithmetic.eval(m[4], RoundType::ROUND)
70
73
  result_prefix_str = "(1D100<=#{ability_value}) >"
71
74
 
72
75
  if ability_value == 0
@@ -125,7 +128,7 @@ module BCDice
125
128
  active_value = active_ability_value * 5 + modifiy_value
126
129
  result_prefix_str = "(1D100<=#{active_value}) > #{roll_value} >"
127
130
 
128
- note_str = "クリティカル/スペシャル、ファンブルは未処理。必要なら確認すること。"
131
+ note_str = "決定的成功、効果的成功、ファンブルは未処理。必要なら確認すること。"
129
132
 
130
133
  if roll_value >= 96
131
134
  # 96以上は無条件で失敗
@@ -146,8 +149,8 @@ module BCDice
146
149
  funmble_value = ((100 - success_value.to_f) / 20).round
147
150
 
148
151
  if (roll_value == 1) || (roll_value <= critical_value)
149
- # クリティカル(01は必ずクリティカル)
150
- Result.critical("#{result_str} クリティカル/スペシャル")
152
+ # 決定的成功(01は必ず決定的成功)
153
+ Result.critical("#{result_str} 決定的成功")
151
154
  elsif (roll_value == 100) || (roll_value >= (100 - funmble_value + 1))
152
155
  # ファンブル(00は必ずファンブル)
153
156
  Result.fumble("#{result_str} ファンブル")
@@ -155,8 +158,8 @@ module BCDice
155
158
  # 失敗(96以上は必ず失敗、出目が01-05ではなく技能値より上なら失敗)
156
159
  Result.failure("#{result_str} 失敗")
157
160
  elsif roll_value <= special_value
158
- # スペシャル
159
- Result.success("#{result_str} スペシャル")
161
+ # 効果的成功
162
+ Result.success("#{result_str} 効果的成功")
160
163
  elsif (roll_value <= 5) || (roll_value <= success_value)
161
164
  # 成功(05以下は必ず成功)
162
165
  Result.success("#{result_str} 成功")
@@ -15,48 +15,67 @@ module BCDice
15
15
  SORT_KEY = 'しのひかみ'
16
16
 
17
17
  # ダイスボットの使い方
18
+ # 25/01/17:書式成形(半角スペース×2に統一、同じ書籍のシーン表は改行なしで列挙)
18
19
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
20
  ・行為判定 nSG@s#f>=x
20
-  2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
21
-  n: ダイス数 (省略時 2)
22
-  s: スペシャル値 (省略時 12)
23
-  f: ファンブル値 (省略時 2)
24
-  x: 目標値 (省略可)
25
-  例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
21
+ 2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
22
+ n: ダイス数 (省略時 2)
23
+ s: スペシャル値 (省略時 12)
24
+ f: ファンブル値 (省略時 2)
25
+ x: 目標値 (省略可)
26
+ 例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
27
+
28
+ ・行為判定以外の表
29
+ 以下の表は「回数+コマンド」で複数回振れる
30
+ 例)3RCT, 2WT
26
31
 
27
32
  ・ランダム特技決定表 RTTn (n:分野番号、省略可能)
28
-  1器術 2体術 3忍術 4謀術 5戦術 6妖術
33
+ 1器術 2体術 3忍術 4謀術 5戦術 6妖術
29
34
 
30
35
  ・ランダム分野表 RCT
31
36
 
32
- ・各種表(基本ルールブック以降)
33
-  ファンブル表 FT、変調表 WT、戦国変調表 GWT、戦場表 BT、感情表 ET
34
-  妖魔化(異形表、妖魔忍法表一括) MT
35
-  異形表 MTR、妖魔忍法表(x:A,B,C) DSx
36
-  プライズ効果表 PT
37
+ ・各種表:基本ルールブック以降
38
+ ファンブル表 FT、戦場表 BT、感情表 ET、変調表 WT、戦国変調表 GWT、プライズ効果表 PT
39
+ 妖魔化(異形表、妖魔忍法表一括) MT、異形表 MTR、妖魔忍法表(x:A,B,C) DSx
37
40
 
38
- >流派ブック以降
39
-  新戦場表 BNT、【数奇】OTS、妖術変調対応表(x:なし-現代/戦国、1-現代、2-戦国)YWTx
40
-  妖魔化(新異形表利用) NMT、新異形表 NMTR、妖魔忍法表(x:1-異霊 2-凶身 3-神化 4-攻激)DSNx
41
-  覚醒表 OTAT、忍法授業シーン表(x:1-攻撃系 2-防御系 3-戦略系)NCTx
42
-  パニック表 HRPT、出物表 ONDT
41
+ ・各種表:流派ブック以降
42
+ 比良坂流派ブック
43
+ パニック表 HRPT
44
+ 鞍馬流派ブック
45
+ 新戦場表 BNT
46
+ 御斎流派ブック
47
+ 覚醒表 OTAT
48
+ 忍法授業シーン表(x:1-攻撃系 2-防御系 3-戦略系)NCTx
49
+ 【数奇】OTS
50
+ 隠忍流派ブック
51
+ 妖術変調対応表(x:なし-現代/戦国、1-現代、2-戦国)YWTx
52
+ 妖魔化(新異形表利用) NMT、新異形表 NMTR、妖魔忍法表(x:1-異霊 2-凶身 3-神化 4-攻激)DSNx
53
+ 出物表 ONDT
43
54
 
44
- (基本ルールブック改訂版以前)
45
- ・(無印)旧ファンブル表 OFT 、旧変調表 OWT、旧戦場表 OBT、異形表 MT
46
- ・(怪)怪ファンブル表 KFT、怪変調表 KWT (基本ルールブックと同一)
55
+ ・各種表:基本ルールブック改訂版以前
56
+ 無印
57
+ 旧ファンブル表 OFT 、旧変調表 OWT、旧戦場表 OBT、異形表 MT
58
+
59
+ 怪ファンブル表 KFT、怪変調表 KWT (基本ルールブックと同一)
47
60
 
48
61
  ・シーン表
49
- >基本ルールブック
50
-  通常 ST、出島 DST、都市 CST、館 MST、トラブル TST、回想 KST、日常 NST、学校 GAST、戦国 GST
51
- >忍秘伝
52
-  中忍試験 HC、滅びの塔 HT、影の街 HK、夜行列車 HY、病院 HO、龍動 HR、密室 HM、催眠 HS
53
- >基本ルールブック改訂版以前
54
-  (死)東京 TKST、(リプレイ戦1〜2巻)京都 KYST、神社仏閣 JBST
55
-  (その他シーン表)秋空に雪舞えば AKST、災厄 CLST、出島EX DXST、斜歯ラボ HLST、夏の終わり NTST、培養プラント PLST
56
- >正忍記
57
- カジノ TC、ロードムービ TRM、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
58
- >流派ブック以降
59
- 不良高校 OTFK
62
+ 基本ルールブック
63
+ 通常 ST、出島 DST、都市 CST、館 MST、トラブル TST、回想 KST、日常 NST、学校 GAST、戦国 GST
64
+ 忍秘伝
65
+ 中忍試験 HC、滅びの塔 HT、影の街 HK、夜行列車 HY、病院 HO、龍動 HR、密室 HM、催眠 HS
66
+ 正忍記
67
+ カジノ TC、ロードムービー TRM、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
68
+ 流派ブック以降
69
+ 御斎流派ブック
70
+ 不良高校 OTFK
71
+ 基本ルールブック改訂版以前
72
+
73
+ 東京 TKST
74
+ リプレイ戦1〜2巻
75
+ 京都 KYST、神社仏閣 JBST
76
+ その他
77
+ 秋空に雪舞えば AKST、夏の終わり NTST、出島EX DXST、災厄 CLST、斜歯ラボ HLST、培養プラント PLST
78
+
60
79
  ・D66ダイスあり
61
80
  INFO_MESSAGE_TEXT
62
81
 
@@ -99,8 +118,19 @@ module BCDice
99
118
  register_prefix('\d*SG')
100
119
 
101
120
  def eval_game_system_specific_command(command)
102
- return action_roll(command) || roll_tables(command, TABLES) || roll_tables(command, SCENE_TABLES) ||
103
- roll_tables(command, DEMON_SKILL_TABLES) || roll_tables(command, DEMON_SKILL_TABLES_NEW) || RTT.roll_command(@randomizer, command)
121
+ return action_roll(command) || repeat_table(command)
122
+ end
123
+
124
+ def repeat_table(command)
125
+ times = command.start_with?(/\d/) ? command.to_i : 1
126
+ key = command.sub(/^\d+/, '')
127
+ results = [*0...times].map do |_|
128
+ roll_tables(key, TABLES) || roll_tables(key, SCENE_TABLES) ||
129
+ roll_tables(key, DEMON_SKILL_TABLES) || roll_tables(key, DEMON_SKILL_TABLES_NEW) || RTT.roll_command(@randomizer, key)
130
+ end.compact
131
+ return nil if results.empty?
132
+
133
+ return results.join("\n")
104
134
  end
105
135
 
106
136
  RTT = DiceTable::SaiFicSkillTable.new(
@@ -209,12 +239,12 @@ module BCDice
209
239
  '妖魔忍法表・異霊',
210
240
  '1D6',
211
241
  [
212
- '【逢魔時】(基本 p173)/【虚舟】(隠忍 p28)',
213
- '【神隠】(基本 p173)/【夢喰】(隠忍 p28)',
214
- '【狂骨】(基本 p173)/【金毛】(隠忍 p28)',
215
- '【木魂】(基本 p173)/【朽縄】(隠忍 p28)',
216
- '【付喪神】(基本 p173)/【香魂】(隠忍 p28)',
217
- '【生剥】(基本 p173)/【三尸】(隠忍 p28)',
242
+ '【逢魔時】(基本 p172)/【虚舟】(隠忍 p28)',
243
+ '【神隠】(基本 p172)/【夢喰】(隠忍 p28)',
244
+ '【狂骨】(基本 p172)/【金毛】(隠忍 p28)',
245
+ '【木魂】(基本 p172)/【朽縄】(隠忍 p28)',
246
+ '【付喪神】(基本 p172)/【香魂】(隠忍 p28)',
247
+ '【生剥】(基本 p172)/【三尸】(隠忍 p28)',
218
248
  ]
219
249
  ),
220
250
  'DSN2' => DiceTable::Table.new(
@@ -538,12 +568,12 @@ module BCDice
538
568
  '覚醒表',
539
569
  '1D6',
540
570
  [
541
- '自分の力が急に恐ろしくなる。好きな『覚醒済みデータ』を一つ選び、それを『未覚醒データ』に変更する。',
571
+ '自分の力が急に恐ろしくなる。好きな覚醒済みデータを一つ選び、それを未覚醒データに変更する。',
542
572
  '自分の力が暴走し、周囲に被害を与える。そのシーンに登場しているキャラクター全員(自分含む)に射撃戦ダメージを1点与える。',
543
- '覚醒に伴い、身体の形が変化する。未覚醒忍法の中からランダムに一つ選び、それを覚醒済み忍法にする。',
573
+ '覚醒に伴い、身体の形が変化する。未覚醒忍法の中からランダムに一つを選び、それを覚醒済み忍法にする。',
544
574
  '忍者の血に目覚め、力の制御方法が理解出来るようになる。好きな未覚醒忍法を一つを選び、それを覚醒済み忍法にする。',
545
575
  '自分だけが操ることが出来る独自の力に目覚める。好きな未覚醒奥義一つを選び、それを覚醒済みの奥義にする。',
546
- '自分の脳に直接何かが囁きかける。集団戦ダメージを1点受ける(退魔編なら代わりに妖魔化する)と、好きな未覚醒データの中からひとつ選び、それを覚醒済みデータにする。'
576
+ '自分の脳に直接何かが囁きかける。集団戦ダメージを1点受けると、好きな未覚醒データの中から一つ選び、それを覚醒済みデータに変更することができる。退魔編であれば、集団戦ダメージを受ける代わりに妖魔化することで、好きな未覚醒データの中から一つ選び、それを覚醒済みデータに変更することができる。'
547
577
  ]
548
578
  ),
549
579
  'ONDT' => DiceTable::Table.new(
@@ -1187,7 +1217,7 @@ module BCDice
1187
1217
  ]
1188
1218
  ),
1189
1219
  }.freeze
1190
- register_prefix(RTT.prefixes, TABLES.keys, SCENE_TABLES.keys, DEMON_SKILL_TABLES.keys, DEMON_SKILL_TABLES_NEW.keys)
1220
+ register_prefix(RTT.prefixes.map { |k| "\\d*#{k}" }, TABLES.keys.map { |k| "\\d*#{k}" }, SCENE_TABLES.keys.map { |k| "\\d*#{k}" }, DEMON_SKILL_TABLES.keys.map { |k| "\\d*#{k}" }, DEMON_SKILL_TABLES_NEW.keys.map { |k| "\\d*#{k}" })
1191
1221
  end
1192
1222
  end
1193
1223
  end