bcdice 3.14.0 → 3.16.1

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +88 -0
  3. data/i18n/Cthulhu/zh_hant.yml +1 -1
  4. data/i18n/CyberpunkRed/ko_kr.yml +389 -0
  5. data/i18n/DoubleCross/ja_jp.yml +53 -0
  6. data/i18n/DoubleCross/ko_kr.yml +52 -0
  7. data/i18n/Emoklore/ko_kr.yml +7 -0
  8. data/i18n/FutariSousa/ja_jp.yml +138 -138
  9. data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
  10. data/i18n/MagicaLogia/ko_kr.yml +2 -2
  11. data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
  12. data/i18n/SkynautsBouken/ja_jp.yml +28 -28
  13. data/i18n/SkynautsBouken/ko_kr.yml +114 -0
  14. data/i18n/StratoShout/ko_kr.yml +102 -102
  15. data/i18n/zh_hant.yml +5 -0
  16. data/lib/bcdice/game_system/Aionia.rb +131 -0
  17. data/lib/bcdice/game_system/Arianrhod_Korean.rb +2 -0
  18. data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
  19. data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
  20. data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
  21. data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
  22. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
  23. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
  24. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
  25. data/lib/bcdice/game_system/CyberpunkRed.rb +1 -2
  26. data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
  27. data/lib/bcdice/game_system/DoubleCross.rb +18 -1
  28. data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
  29. data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
  30. data/lib/bcdice/game_system/Emoklore_Korean.rb +42 -0
  31. data/lib/bcdice/game_system/FullFace.rb +25 -3
  32. data/lib/bcdice/game_system/FutariSousa.rb +17 -5
  33. data/lib/bcdice/game_system/Garactier.rb +479 -0
  34. data/lib/bcdice/game_system/GardenOrder.rb +390 -9
  35. data/lib/bcdice/game_system/GundogRevised.rb +8 -8
  36. data/lib/bcdice/game_system/JuinKansen_Korean.rb +251 -0
  37. data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
  38. data/lib/bcdice/game_system/KimitoYell.rb +568 -0
  39. data/lib/bcdice/game_system/Magius.rb +125 -0
  40. data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
  41. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
  42. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  43. data/lib/bcdice/game_system/NSSQ.rb +17 -9
  44. data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
  45. data/lib/bcdice/game_system/Revulture_Korean.rb +125 -0
  46. data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
  47. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
  48. data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
  49. data/lib/bcdice/game_system/SkynautsBouken.rb +4 -4
  50. data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
  51. data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
  52. data/lib/bcdice/game_system/SwordWorld.rb +4 -0
  53. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
  54. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +51 -17
  55. data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
  56. data/lib/bcdice/game_system/TorgEternity.rb +35 -6
  57. data/lib/bcdice/game_system/Ventangle_Korean.rb +130 -0
  58. data/lib/bcdice/game_system/WoW.rb +161 -0
  59. data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
  60. data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
  61. data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
  62. data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
  63. data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
  64. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
  65. data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
  66. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
  67. data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
  68. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
  69. data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
  70. data/lib/bcdice/game_system.rb +20 -0
  71. data/lib/bcdice/version.rb +1 -1
  72. metadata +31 -6
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/Revulture"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Revulture_Korean < Revulture
8
+ # ゲームシステムの識別子
9
+ ID = 'Revulture:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '광쇄의 리벌처'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:광쇄의 리벌처'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~HELP
19
+ ■공격 판정( xAT, xATK, xATTACK )
20
+ x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
21
+ 예시) 3AT, 4ATK, 5+6ATTACK, 15/2AT
22
+
23
+ □공격 판정 목표값 포함( xAT<=y, xATK<=y, xATTACK<=y )
24
+ x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
25
+ y: 목표값( 1 이상 6 이하. 덧셈 + 사용 가능)
26
+ 예시) 3AT<=4, 3AT<=2+1
27
+
28
+ □공격 판정 목표값&추가 대미지 포함( xAT<=y[>=a:+b], xATK<=y[>=a:+b], xATTACK<=y[z] )
29
+ x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
30
+ y: 목표값( 1 이상 6 이하. 덧셈 + 사용 가능)
31
+ z: 추가 대미지 규칙(자세한 내용은 후술)(※여러 개를 동시에 지정 가능)
32
+
33
+ ▽추가 대미지 규칙 [a:+b]
34
+ a: 히트 수가 a 라면
35
+  =a (히트 수가 a와 동일)
36
+  >=a (히트 수가 a 이상)
37
+ b: 대미지를 b 점 추가
38
+
39
+ 예시) 3AT<=4[>=2:+3] #ルールブックp056「グレングラントAR」
40
+ 예시) 2AT<=4[=1:+5][>=2:+8] #ルールブックp067「ファーボル・ドラゴンブレス」
41
+ HELP
42
+
43
+ ATTACK_ROLL_REG = %r{^(\d+([+/]\d+)*)?AT(TACK|K)?(<=([1-6](\+\d)*))?((\[>?=\d+:\+\d+\])+)?}i.freeze
44
+ register_prefix('\d+([+\/]\d+)*AT')
45
+
46
+ def eval_game_system_specific_command(command)
47
+ if (m = ATTACK_ROLL_REG.match(command))
48
+ roll_attack(m[1], m[5], m[7])
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def roll_attack(dice_count_expression, border_expression, additional_damage_rules)
55
+ dice_count = Arithmetic.eval(dice_count_expression, RoundType::FLOOR)
56
+ border = Arithmetic.eval(border_expression, RoundType::FLOOR).clamp(1, 6) if border_expression
57
+
58
+ command = make_command_text(dice_count, border, additional_damage_rules)
59
+
60
+ if dice_count <= 0
61
+ return "#{command} > 주사위가 0개 입니다."
62
+ elsif border.nil? && additional_damage_rules
63
+ return "#{command} > 목표값이 지정되지 않아 추가 대미지를 계산할 수 없습니다."
64
+ end
65
+
66
+ dices = @randomizer.roll_barabara(dice_count, 6).sort
67
+
68
+ critical_hit_count = dices.count(1)
69
+ hit_count = dices.count { |dice| dice <= border } + critical_hit_count if border
70
+ damage = calc_damage(hit_count, additional_damage_rules)
71
+
72
+ message_elements = []
73
+ message_elements << command
74
+ message_elements << dices.join(',')
75
+ message_elements << "크리티컬 #{critical_hit_count}" if critical_hit_count > 0
76
+ message_elements << "히트 수 #{hit_count}" if hit_count
77
+ message_elements << "대미지 #{damage}" if damage
78
+
79
+ Result.new(message_elements.join(' > ')).tap do |r|
80
+ r.condition = hit_count > 0 if hit_count
81
+ r.critical = critical_hit_count > 0
82
+ end
83
+ end
84
+
85
+ def make_command_text(dice_count, border, additional_damage_rules)
86
+ command = "#{dice_count}attack"
87
+ command += "<=#{border}" if border
88
+ command += additional_damage_rules if additional_damage_rules
89
+
90
+ "(#{command})"
91
+ end
92
+
93
+ def calc_damage(hit_count, additional_damage_rules)
94
+ return nil unless additional_damage_rules
95
+
96
+ damage = hit_count
97
+ parse_additional_damage_rules(additional_damage_rules).each do |rule|
98
+ if rule[:condition].call(hit_count)
99
+ damage += rule[:additinal_damage]
100
+ end
101
+ end
102
+
103
+ damage
104
+ end
105
+
106
+ def parse_additional_damage_rules(source)
107
+ source.scan(/\[(>?=)(\d+):\+(\d+)\]/).map do |matched|
108
+ {
109
+ condition: make_additional_damage_condition(matched[0], matched[1].to_i),
110
+ additinal_damage: matched[2].to_i,
111
+ }
112
+ end
113
+ end
114
+
115
+ def make_additional_damage_condition(comparer, comparing_target)
116
+ case comparer
117
+ when '='
118
+ lambda { |hit_count| hit_count == comparing_target }
119
+ when '>='
120
+ lambda { |hit_count| hit_count >= comparing_target }
121
+ end
122
+ end
123
+ end
124
+ end
125
+ 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
@@ -85,7 +85,7 @@ module BCDice
85
85
 
86
86
  def eval_game_system_specific_command(command)
87
87
  command_sn(command) || command_d(command) || command_avo(command) || command_snavo(command) ||
88
- command_snd(command) || roll_tables(command, TABLES)
88
+ command_snd(command) || roll_tables(command, self.class::TABLES)
89
89
  end
90
90
 
91
91
  private
@@ -145,7 +145,7 @@ module BCDice
145
145
  .sub("F/", "[#{translate('SkynautsBouken.fire')}]/").sub("S/", "[#{translate('SkynautsBouken.big_shake')}]/")
146
146
  result = ["(#{command})", get_points_text(points, 0, 0)]
147
147
  if ballistics != 0
148
- dir = DIRECTION_INFOS[ballistics]
148
+ dir = self.class::DIRECTION_INFOS[ballistics]
149
149
  diff_x, diff_y = dir[:position_diff]
150
150
  result[-1] += "\n"
151
151
  result << "《#{translate('SkynautsBouken.ballistics')}》#{dir[:name]}"
@@ -160,7 +160,7 @@ module BCDice
160
160
  dmg = command.match(/^AVO@([2468])(.*?)$/)
161
161
  return nil unless dmg
162
162
 
163
- dir = DIRECTION_INFOS[dmg[1].to_i]
163
+ dir = self.class::DIRECTION_INFOS[dmg[1].to_i]
164
164
  diff_x, diff_y = dir[:position_diff]
165
165
  "《#{translate('SkynautsBouken.avoidance')}》#{dir[:name]} > " + dmg[2].gsub(/\(?\[(\d),(\d{1,2})\]\)?/) do
166
166
  y = Regexp.last_match(1).to_i + diff_y
@@ -224,7 +224,7 @@ module BCDice
224
224
  x = @randomizer.roll_sum(2, 6) # 横
225
225
 
226
226
  [[x, y]] + range.map do |r|
227
- xdiff, ydiff = DIRECTION_INFOS[r][:position_diff]
227
+ xdiff, ydiff = self.class::DIRECTION_INFOS[r][:position_diff]
228
228
  [x + xdiff, y + ydiff]
229
229
  end
230
230
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/SkynautsBouken"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class SkynautsBouken_Korean < SkynautsBouken
8
+ # ゲームシステムの識別子
9
+ ID = 'SkynautsBouken:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '톱니바퀴 탑의 탐공사'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:톱니바퀴 탑의 탐공사'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~MESSAGETEXT
19
+ ・행위판정(nSNt#f) n:다이스 수(생략시 2), t:목표치(생략시 7), f:펌블치(생략시 1)
20
+ 예)SN6#2 3SN
21
+ ・대미지 체크 (Dx/y@m) x:대미지 범위、y:공격횟수
22
+   m:《탄도학》(생략 가능)상:8, 하:2, 좌:4, 우:6
23
+   예) D/4 D19/2 D/3@8 D[진동]/2
24
+ ・회피(AVO@m대미지)
25
+   m:회피 방향(상:8, 하:2, 좌:4, 우:6), 대미지: 대미지 체크 결과
26
+   예)AVO@8[1,4],[2,6],[3,8] AVO@2[6,4],[2,6]
27
+ ・FT 펌블표(p76)
28
+ ・NV 항행표
29
+ ・항행이벤트표
30
+  ・NEN 항행계
31
+  ・NEE 조우계
32
+  ・NEO 선내계
33
+  ・NEH 곤란계
34
+  ・NEL 장거리 여행계
35
+
36
+ ■ 판정 세트
37
+ ・《회피운동》판정+회피(nSNt#f/AVO@대미지)
38
+   nSNt#f → 성공하면 AVO@m
39
+   예)SN/AVO@8[1,4],[2,6],[3,8] 3SN#2/AVO@2[6,4],[2,6]
40
+ ・포격 판정+대미지 체크 (nSNt#f/Dx/y@m)
41
+   행위 판정의 출발(出目) 변경 타이밍을 놓치므로 GM의 허가 필요
42
+   nSNt#f → 성공하면 Dx/y@m
43
+   예)SN/D/4 3SN#2/D[진동]/2
44
+ MESSAGETEXT
45
+
46
+ def initialize(command)
47
+ super(command)
48
+ @locale = :ko_kr
49
+ end
50
+
51
+ register_prefix_from_super_class()
52
+
53
+ TABLES = translate_tables(:ko_kr).freeze
54
+ DIRECTION_INFOS = translate_direction_infos(:ko_kr).freeze
55
+ end
56
+ end
57
+ end
@@ -18,7 +18,7 @@ module BCDice
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
19
  VOT, GUT, BAT, KEYT, DRT: (보컬, 기타, 베이스, 키보드, 드럼)트러블표
20
20
  EMO: 감정표
21
- RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1: 주의 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
21
+ RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1: 가치관 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
22
22
  SCENE, MACHI, GAKKO, BAND: (범용, 거리, 학교, 밴드)장면표. 접근 장면에 사용
23
23
  TENKAI: 장면 전개표. 분주 장면, 연습 장면에 사용
24
24
  []내는 생략가능 D66는 변동있음