bcdice 3.12.0 → 3.14.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  6. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  7. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  8. data/i18n/FutariSousa/ja_jp.yml +158 -1
  9. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  10. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  11. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  12. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  13. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  14. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  15. data/i18n/en_us.yml +5 -0
  16. data/lib/bcdice/arithmetic/parser.rb +4 -2
  17. data/lib/bcdice/base.rb +1 -1
  18. data/lib/bcdice/command/parser.rb +4 -2
  19. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  20. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  21. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  22. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  23. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  24. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  25. data/lib/bcdice/dice_table/range_table.rb +24 -0
  26. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  27. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  28. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  29. data/lib/bcdice/game_system/AniMalus.rb +261 -0
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  32. data/lib/bcdice/game_system/Avandner.rb +1 -1
  33. data/lib/bcdice/game_system/BBN.rb +1 -1
  34. data/lib/bcdice/game_system/BadLife.rb +3 -3
  35. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  36. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  37. data/lib/bcdice/game_system/Chill3.rb +6 -6
  38. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  39. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  40. data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
  41. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  42. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  43. data/lib/bcdice/game_system/Elric.rb +1 -1
  44. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  45. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  46. data/lib/bcdice/game_system/FullFace.rb +121 -0
  47. data/lib/bcdice/game_system/FutariSousa.rb +88 -8
  48. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  49. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  50. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  51. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  52. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  53. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  54. data/lib/bcdice/game_system/KyokoShinshoku.rb +201 -0
  55. data/lib/bcdice/game_system/Liminal.rb +136 -0
  56. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  57. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  58. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  59. data/lib/bcdice/game_system/NRR.rb +122 -0
  60. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  61. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  62. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  63. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  64. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  65. data/lib/bcdice/game_system/Postman.rb +3 -3
  66. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +1 -1
  68. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/Siren.rb +97 -0
  71. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  72. data/lib/bcdice/game_system/SkynautsBouken.rb +45 -130
  73. data/lib/bcdice/game_system/Strave.rb +1 -1
  74. data/lib/bcdice/game_system/SwordWorld.rb +1 -1
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
  76. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  77. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  78. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  79. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  80. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  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/VampireTheMasquerade5th.rb +12 -6
  85. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  86. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
  87. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  88. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  89. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  90. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  91. data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
  92. data/lib/bcdice/game_system.rb +24 -0
  93. data/lib/bcdice/loader.rb +1 -1
  94. data/lib/bcdice/version.rb +1 -1
  95. metadata +55 -5
@@ -0,0 +1,248 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Agnostos < Base
6
+ # ゲームシステムの識別子
7
+ ID = "Agnostos"
8
+
9
+ # ゲームシステム名
10
+ NAME = "アグノストス"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "あくのすとす"
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ■ 行為判定
18
+ CDx>=t
19
+ x: コンディションレベル(A~E もしくは 5~1)
20
+ t: 目標値
21
+ の成否とコンディションの変動量を判定します。
22
+
23
+ ■ 心拍のコンディションチェック
24
+ HCDx
25
+ x: コンディションレベル(C+, B+, A, B-, C-, もしくは 5~1)
26
+ 酸素の消費量、コンディションの変動量、気絶したかを判定します。
27
+
28
+ ■ 必殺技
29
+ xSPy
30
+ x: メインコンディション(A~E もしくは 5~1)
31
+ y: サブコンディション(A~E もしくは 5~1)
32
+ 必殺技のダメージ量を判定します。
33
+ MESSAGETEXT
34
+
35
+ register_prefix('CD', 'HCD', '[A-E1-5]SP[A-E1-5]')
36
+
37
+ def eval_game_system_specific_command(command)
38
+ condition_roll(command) || heart_condition_roll(command) || special_roll(command)
39
+ end
40
+
41
+ private
42
+
43
+ # コンディションチェック
44
+ def condition_roll(command)
45
+ parser = Command::Parser.new(/CD[A-E1-5]/, round_type: @round_type).disable_modifier.restrict_cmp_op_to(:>=)
46
+ parsed = parser.parse(command)
47
+ unless parsed
48
+ return nil
49
+ end
50
+
51
+ condition_level = to_condition_level(parsed.command[-1])
52
+ sides = to_sides(condition_level)
53
+ value = @randomizer.roll_once(sides)
54
+
55
+ Result.new.tap do |r|
56
+ r.critical = critical?(sides, value)
57
+ r.fumble = fumble?(sides, value)
58
+ r.condition = value >= parsed.target_number
59
+
60
+ r.text = [
61
+ "(CD#{condition_level}>=#{parsed.target_number})",
62
+ "(1D#{sides}>=#{parsed.target_number})",
63
+ value.to_s(),
64
+ r.success? ? "成功" : "失敗",
65
+ condition_change(sides, value),
66
+ ].join(" > ")
67
+ end
68
+ end
69
+
70
+ def to_condition_level(char)
71
+ case char
72
+ when "5"
73
+ "A"
74
+ when "4"
75
+ "B"
76
+ when "3"
77
+ "C"
78
+ when "2"
79
+ "D"
80
+ when "1"
81
+ "E"
82
+ else
83
+ char
84
+ end
85
+ end
86
+
87
+ def to_sides(condition)
88
+ case condition
89
+ when "A"
90
+ 12
91
+ when "B"
92
+ 10
93
+ when "C"
94
+ 8
95
+ when "D"
96
+ 6
97
+ else # "E"
98
+ 4
99
+ end
100
+ end
101
+
102
+ def condition_change(sides, value)
103
+ if critical?(sides, value)
104
+ "コンディション:2段階上昇(クリティカル)"
105
+ elsif fumble?(sides, value)
106
+ "コンディション:2段階下降(ファンブル)"
107
+ elsif sides != 12 && sides - value <= 1
108
+ "コンディション:1段階上昇"
109
+ elsif sides == 12 && value <= 6
110
+ "コンディション:1段階下降"
111
+ elsif sides == 10 && value <= 3
112
+ "コンディション:1段階下降"
113
+ elsif sides == 8 && value <= 2
114
+ "コンディション:1段階下降"
115
+ else
116
+ "コンディション:変動なし"
117
+ end
118
+ end
119
+
120
+ def critical?(sides, value)
121
+ sides != 12 && sides == value
122
+ end
123
+
124
+ def fumble?(sides, value)
125
+ sides != 4 && value == 1
126
+ end
127
+
128
+ # 心拍のコンディションチェック
129
+ def heart_condition_roll(command)
130
+ m = /^HCD([A1-5]|[BC][+-])$/.match(command)
131
+ unless m
132
+ return nil
133
+ end
134
+
135
+ suffix = m[1]
136
+ condition_level = to_heart_condition_level(suffix)
137
+ sides = to_heart_sides(condition_level)
138
+ value = @randomizer.roll_once(sides)
139
+
140
+ Result.new.tap do |r|
141
+ r.critical = critical?(sides, value)
142
+ r.fumble = fumble?(sides, value)
143
+
144
+ r.text = [
145
+ "(HCD#{condition_level})",
146
+ "(1D#{sides})",
147
+ value.to_s(),
148
+ heart_condition_change(sides, value),
149
+ ].join(" > ")
150
+ end
151
+ end
152
+
153
+ def to_heart_condition_level(char)
154
+ case char
155
+ when "5"
156
+ "C+"
157
+ when "4"
158
+ "B+"
159
+ when "3"
160
+ "A"
161
+ when "2"
162
+ "B-"
163
+ when "1"
164
+ "C-"
165
+ else
166
+ char
167
+ end
168
+ end
169
+
170
+ def to_heart_sides(condition)
171
+ case condition
172
+ when "C+"
173
+ 12
174
+ when "B+"
175
+ 10
176
+ when "A"
177
+ 8
178
+ when "B-"
179
+ 6
180
+ else # "C-"
181
+ 4
182
+ end
183
+ end
184
+
185
+ def fainted?(sides, value)
186
+ case sides
187
+ when 12
188
+ value >= 7
189
+ when 10
190
+ value >= 10
191
+ when 8
192
+ false
193
+ when 6
194
+ value <= 1
195
+ else # 4
196
+ value <= 2
197
+ end
198
+ end
199
+
200
+ def heart_condition_change(sides, value)
201
+ if fainted?(sides, value)
202
+ "気絶"
203
+ else
204
+ condition_change(sides, value)
205
+ end
206
+ end
207
+
208
+ # 必殺技
209
+ def special_roll(command)
210
+ m = /^([A-E1-5])SP([A-E1-5])$/.match(command)
211
+ unless m
212
+ return nil
213
+ end
214
+
215
+ times_conditon_level = to_condition_level(m[1])
216
+ sides_conditon_level = to_condition_level(m[2])
217
+
218
+ times = to_times(times_conditon_level)
219
+ sides = to_sides(sides_conditon_level)
220
+
221
+ dice_list = @randomizer.roll_barabara(times, sides)
222
+ value = dice_list.sum()
223
+
224
+ return [
225
+ "(#{times_conditon_level}SP#{sides_conditon_level})",
226
+ "(#{times}D#{sides})",
227
+ "#{value}[#{dice_list.join(',')}]",
228
+ value.to_s(),
229
+ ].join(" > ")
230
+ end
231
+
232
+ def to_times(condition)
233
+ case condition
234
+ when "A"
235
+ 5
236
+ when "B"
237
+ 4
238
+ when "C"
239
+ 3
240
+ when "D"
241
+ 2
242
+ else # "E"
243
+ 1
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
@@ -102,7 +102,7 @@ module BCDice
102
102
  totalDamage = totalSuccessCount * damage + totalCriticalCount * criticalTrigger
103
103
 
104
104
  result += "(#{diceCount}D10\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage}"
105
- result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
105
+ result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
106
106
  result += " > #{totalDamage}ダメージ"
107
107
  else
108
108
  result += "(#{diceCount}D10\<\=#{target}) > #{text} > 成功数:#{totalSuccessCount}"
@@ -50,7 +50,7 @@ module BCDice
50
50
  if command =~ /(\d+)AL(C|G)?(\d+)?((x|\*)(\d+))?$/i
51
51
  rapid = Regexp.last_match(1).to_i
52
52
  isCritical = Regexp.last_match(2).nil?
53
- if isCritical
53
+ if isCritical
54
54
  criticalNumber = 1
55
55
  else
56
56
  if Regexp.last_match(2) == "G"
@@ -98,7 +98,7 @@ module BCDice
98
98
  text += "+" unless text.empty?
99
99
  text += "#{successCount}[#{diceText}]"
100
100
 
101
- break unless isCritical
101
+ break unless isCritical
102
102
 
103
103
  rollCount = criticalCount
104
104
  end
@@ -0,0 +1,261 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class AniMalus < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'AniMalus'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'アニマラス'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'あにまらす'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■ステータスのダイス判定 n[+-b]AM<=t,x n:能力値 b:修正値(省略可能) t:成功値 x:必要成功数
18
+ 例)3AM<=2,1: ダイスを3個振って、成功値2,必要成功数1で判定。その結果(成功数,成功・失敗,クリティカル,ファンブル)を表示
19
+
20
+ ■探索技能のダイス判定 [+-b]AI<=t,x t:探索技能レベル b:修正値(省略可能) x:必要成功数
21
+ 例)AI<=3,1: ダイスを3個振って、探索技能レベル3,必要成功数1で判定。その結果(成功数,成功・失敗,クリティカル,ファンブル)を表示
22
+
23
+ ■攻撃判定 [+-b]AA<=t t:戦闘技能レベル b:修正値(省略可能)
24
+ 例)AA<=3: ダイスを3個振って、戦闘技能レベル3で判定。その結果(成功・失敗,ダメージ,クリティカル,ファンブル)を表示
25
+
26
+ ■防御判定 [+-b]AG=t t:攻撃技能レベル b:修正値(省略可能)
27
+ 例)AG=2: ダイスを3個振って、攻撃技能レベル2で判定。その結果(成功・失敗,ダメージ軽減,クリティカル,ファンブル)を表示
28
+
29
+ ■回避判定 [+-b]AD=t t:攻撃技能レベル b:修正値(省略可能)
30
+ 例)AD=3: ダイスを1個振って、攻撃技能レベル3で判定。その結果(成功・失敗)を表示
31
+ INFO_MESSAGETEXT
32
+
33
+ register_prefix('[-+\d]*A[MIAGD]')
34
+
35
+ def initialize(command)
36
+ super(command)
37
+
38
+ @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
39
+ end
40
+
41
+ def eval_game_system_specific_command(command)
42
+ resolute_action(command) ||
43
+ resolute_investigation(command) ||
44
+ resolute_attacking(command) ||
45
+ resolute_guarding(command) ||
46
+ resolute_dodging(command)
47
+ end
48
+
49
+ private
50
+
51
+ def with_symbol(number)
52
+ if number == 0
53
+ return ""
54
+ elsif number > 0
55
+ return "+#{number}"
56
+ else
57
+ return number.to_s
58
+ end
59
+ end
60
+
61
+ # ステータスの判定
62
+ # @param [String] command
63
+ # @return [Result]
64
+ def resolute_action(command)
65
+ m = /^(\d+)([-+]\d+)?AM<=(\d+),(\d)$/.match(command)
66
+ return nil unless m
67
+
68
+ num_dice = m[1].to_i
69
+ num_bonus = m[2].to_i
70
+ num_target = m[3].to_i
71
+ num_success = m[4].to_i
72
+
73
+ dice = @randomizer.roll_barabara(num_dice + num_bonus, 6).sort
74
+ dice_text = dice.join(",")
75
+ success_num = dice.count { |val| val <= num_target }
76
+ is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
77
+ is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
78
+
79
+ return Result.new.tap do |result|
80
+ result.critical = is_critical
81
+ result.fumble = is_fumble
82
+ result.condition = (success_num >= num_success)
83
+
84
+ sequence = [
85
+ "(#{num_dice}#{with_symbol(num_bonus)}AM<=#{num_target},#{num_success})",
86
+ dice_text,
87
+ "成功数#{success_num}",
88
+ if result.success?
89
+ "成功"
90
+ else
91
+ "失敗"
92
+ end
93
+ ].compact
94
+ sequence.push("クリティカル") if result.critical?
95
+ sequence.push("ファンブル") if result.fumble?
96
+
97
+ result.text = sequence.join(" > ")
98
+ end
99
+ end
100
+
101
+ # 探索技能の判定
102
+ # @param [String] command
103
+ # @return [Result]
104
+ def resolute_investigation(command)
105
+ m = /^([-+]\d+)?AI<=(\d+),(\d)$/.match(command)
106
+ return nil unless m
107
+
108
+ num_bonus = m[1].to_i
109
+ num_target = m[2].to_i
110
+ num_success = m[3].to_i
111
+
112
+ dice = @randomizer.roll_barabara(3 + num_bonus, 6).sort
113
+ dice_text = dice.join(",")
114
+ success_num = dice.count { |val| val <= num_target }
115
+ is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
116
+ is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
117
+
118
+ return Result.new.tap do |result|
119
+ result.critical = is_critical
120
+ result.fumble = is_fumble
121
+ result.condition = (success_num >= num_success)
122
+
123
+ sequence = [
124
+ "(#{with_symbol(num_bonus)}AI<=#{num_target},#{num_success})",
125
+ dice_text,
126
+ "成功数#{success_num}",
127
+ if result.success?
128
+ "成功"
129
+ else
130
+ "失敗"
131
+ end
132
+ ].compact
133
+ sequence.push("クリティカル") if result.critical?
134
+ sequence.push("ファンブル") if result.fumble?
135
+
136
+ result.text = sequence.join(" > ")
137
+ end
138
+ end
139
+
140
+ # 攻撃技能の判定
141
+ # @param [String] command
142
+ # @return [Result]
143
+ def resolute_attacking(command)
144
+ m = /^([-+]\d+)?AA<=(\d+)$/.match(command)
145
+ return nil unless m
146
+
147
+ num_bonus = m[1].to_i
148
+ num_target = m[2].to_i
149
+
150
+ dice = @randomizer.roll_barabara(3 + num_bonus, 6).sort
151
+ dice_text = dice.join(",")
152
+ success_num = dice.count { |val| val <= num_target }
153
+ is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
154
+ is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
155
+
156
+ damage1 = dice.max
157
+ damage2 = dice.max
158
+ (1..num_target).each do |idx|
159
+ if dice.count(idx) > 1
160
+ now_damage = damage1 + 3 * (dice.count(idx) - 1)
161
+ damage2 = now_damage if damage2 < now_damage
162
+ end
163
+ end
164
+
165
+ return Result.new.tap do |result|
166
+ result.critical = is_critical
167
+ result.fumble = is_fumble
168
+ result.condition = (success_num > 0)
169
+
170
+ sequence = [
171
+ "(#{with_symbol(num_bonus)}AA<=#{num_target})",
172
+ dice_text,
173
+ "成功数#{success_num}",
174
+ if result.success?
175
+ "成功"
176
+ else
177
+ "失敗"
178
+ end
179
+ ].compact
180
+ if result.success?
181
+ sequence.push("最大ダメージ(#{damage2})")
182
+ end
183
+ sequence.push("クリティカル") if result.critical?
184
+ sequence.push("ファンブル") if result.fumble?
185
+
186
+ result.text = sequence.join(" > ")
187
+ end
188
+ end
189
+
190
+ # 防御技能の判定
191
+ # @param [String] command
192
+ # @return [Result]
193
+ def resolute_guarding(command)
194
+ m = /^([-+]\d+)?AG=(\d+)$/.match(command)
195
+ return nil unless m
196
+
197
+ num_bonus = m[1].to_i
198
+ num_target = m[2].to_i
199
+
200
+ dice = @randomizer.roll_barabara(3 + num_bonus, 6).sort
201
+ dice_text = dice.join(",")
202
+ success_num = dice.count(num_target)
203
+ is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
204
+ is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
205
+
206
+ return Result.new.tap do |result|
207
+ result.critical = is_critical
208
+ result.fumble = is_fumble
209
+ result.condition = (success_num > 0)
210
+
211
+ sequence = [
212
+ "(#{with_symbol(num_bonus)}AG=#{num_target})",
213
+ dice_text,
214
+ "成功数#{success_num}",
215
+ if result.success?
216
+ "成功 > ダメージ軽減(#{success_num * 2})"
217
+ else
218
+ "失敗"
219
+ end
220
+ ].compact
221
+ sequence.push("クリティカル") if result.critical?
222
+ sequence.push("ファンブル") if result.fumble?
223
+
224
+ result.text = sequence.join(" > ")
225
+ end
226
+ end
227
+
228
+ # 回避技能の判定
229
+ # @param [String] command
230
+ # @return [Result]
231
+ def resolute_dodging(command)
232
+ m = /^([-+]\d+)?AD=(\d+)$/.match(command)
233
+ return nil unless m
234
+
235
+ num_bonus = m[1].to_i
236
+ num_target = m[2].to_i
237
+
238
+ dice = @randomizer.roll_barabara(1 + num_bonus, 6)
239
+ dice_text = dice.join(",")
240
+ success_num = dice.count(num_target)
241
+
242
+ return Result.new.tap do |result|
243
+ result.condition = (success_num > 0)
244
+
245
+ sequence = [
246
+ "(#{with_symbol(num_bonus)}AD=#{num_target})",
247
+ dice_text,
248
+ "成功数#{success_num}",
249
+ if result.success?
250
+ "成功(ダメージ無効)"
251
+ else
252
+ "失敗"
253
+ end
254
+ ].compact
255
+
256
+ result.text = sequence.join(" > ")
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Arianrhod_Korean < Arianrhod
6
+ # ゲームシステムの識別子
7
+ ID = 'Arianrhod:Korean'
8
+
9
+ # ゲームシステム名
10
+ NAME = '아리안로드RPG'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = '国際化:Korean:아리안로드RPG'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・크리티컬, 펌블의 자동판정을 행합니다.(크리티컬 시의 추가 대미지도 표시됩니다)
18
+ ・D66 다이스 있음
19
+ INFO_MESSAGE_TEXT
20
+
21
+ def initialize(command)
22
+ super(command)
23
+
24
+ @locale = :ko_kr
25
+ end
26
+
27
+ register_prefix_from_super_class()
28
+ end
29
+ end
30
+ end