bcdice 3.11.0 → 3.13.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/i18n/FutariSousa/ko_kr.yml +1625 -529
  4. data/i18n/Insane/ko_kr.yml +393 -258
  5. data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
  6. data/lib/bcdice/arithmetic/parser.rb +4 -2
  7. data/lib/bcdice/base.rb +1 -1
  8. data/lib/bcdice/command/parser.rb +4 -2
  9. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  10. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  11. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  12. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  13. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  14. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  15. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  16. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  17. data/lib/bcdice/game_system/AniMalus.rb +221 -0
  18. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  19. data/lib/bcdice/game_system/Avandner.rb +1 -1
  20. data/lib/bcdice/game_system/BBN.rb +1 -1
  21. data/lib/bcdice/game_system/BadLife.rb +3 -3
  22. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  23. data/lib/bcdice/game_system/Chill3.rb +6 -6
  24. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  25. data/lib/bcdice/game_system/Elric.rb +1 -1
  26. data/lib/bcdice/game_system/Emoklore.rb +4 -6
  27. data/lib/bcdice/game_system/FullFace.rb +92 -0
  28. data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
  29. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
  30. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  31. data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
  32. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  33. data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
  34. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  35. data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
  36. data/lib/bcdice/game_system/Liminal.rb +136 -0
  37. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  38. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  39. data/lib/bcdice/game_system/NRR.rb +122 -0
  40. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  41. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  42. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  43. data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
  44. data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
  45. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  46. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  47. data/lib/bcdice/game_system/Postman.rb +3 -3
  48. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  49. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +10 -7
  50. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  51. data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
  52. data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
  53. data/lib/bcdice/game_system/Siren.rb +97 -0
  54. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  55. data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
  56. data/lib/bcdice/game_system/Strave.rb +1 -1
  57. data/lib/bcdice/game_system/SwordWorld.rb +16 -0
  58. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
  59. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  60. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  61. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +21 -9
  62. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +179 -0
  63. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  64. data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
  65. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
  66. data/lib/bcdice/game_system/sword_world/rating_parser.rb +177 -130
  67. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
  68. data/lib/bcdice/game_system.rb +12 -0
  69. data/lib/bcdice/loader.rb +1 -1
  70. data/lib/bcdice/version.rb +1 -1
  71. metadata +32 -5
@@ -47,7 +47,7 @@ module BCDice
47
47
 
48
48
  dice_count = m[1].to_i
49
49
  modifier = ArithmeticEvaluator.eval(m[2])
50
- target = m[5].nil? ? nil : m[5].to_i
50
+ target = m[5]&.to_i
51
51
 
52
52
  dice_list = @randomizer.roll_barabara(dice_count, 6)
53
53
  largest_two = dice_list.sort.reverse.take(2)
@@ -123,7 +123,7 @@ module BCDice
123
123
 
124
124
  # @return [ParsedNW, nil]
125
125
  def parse_nw(string)
126
- m = /^([-+]?\d+)?#{@nw_command}((?:[-+]\d+)+)?(?:@(\d+(?:,\d+)*))?(?:#(\d+(?:,\d+)*))?(?:\$(\d+(?:,\d+)*))?((?:[-+]\d+)+)?(?:([>=]+)(\d+))?$/.match(string)
126
+ m = /^([-+]?\d+)?#{@nw_command}((?:[-+]\d+)+)?(?:@(\d+(?:,\d+)*))?(?:#(\d+(?:,\d+)*))?(?:\$(\d+))?((?:[-+]\d+)+)?(?:([>=]+)(\d+))?$/.match(string)
127
127
  unless m
128
128
  return nil
129
129
  end
@@ -5,14 +5,27 @@ require 'bcdice/game_system/NightWizard'
5
5
  module BCDice
6
6
  module GameSystem
7
7
  class NightWizard3rd < NightWizard
8
+ # ゲームシステムの識別子
9
+ ID = 'NightWizard3rd'
10
+
8
11
  # ゲームシステム名
9
12
  NAME = 'ナイトウィザード The 3rd Edition'
10
13
 
11
14
  # ゲームシステム名の読みがな
12
15
  SORT_KEY = 'ないとういさあと3'
13
16
 
14
- # ゲームシステムの識別子
15
- ID = 'NightWizard3rd'
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・判定用コマンド (aNW+b@x#y$z+c)
20
+   a : 基本値
21
+   b : 常時に準じる特技による補正
22
+   c : 常時以外の特技、および支援効果による補正
23
+   x : クリティカル値のカンマ区切り(省略時 10)
24
+   y : ファンブル値のカンマ区切り(省略時 5)
25
+   z : プラーナによる達成値補正のプラーナ消費数(ファンブル時には適用されない)
26
+  クリティカル値、ファンブル値が無い場合は1や13などのあり得ない数値を入れてください。
27
+  例)12NW-5@7#2$3 1NW 50nw+5@7,10#2,5 50nw-5+10@7,10#2,5+15+25
28
+ INFO_MESSAGE_TEXT
16
29
 
17
30
  register_prefix('([-+]?\d+)?NW', '2R6')
18
31
 
@@ -13,7 +13,7 @@ module BCDice
13
13
  NAME = 'ニンジャスレイヤーTRPG'
14
14
 
15
15
  # ゲームシステム名の読みがな
16
- SORT_KEY = 'にんしやすれいやあRPG'
16
+ SORT_KEY = 'にんしやすれいやあTRPG'
17
17
 
18
18
  # ダイスボットの使い方
19
19
  HELP_MESSAGE = <<~MESSAGETEXT
@@ -38,6 +38,8 @@ module BCDice
38
38
 
39
39
  ・難易度
40
40
   KIDS=K,EASY=E,NORMAL=N,HARD=H,ULTRA HARD=UH 数字にも対応
41
+
42
+ ※上記コマンド群は『ニンジャスレイヤーTRPG コア・ルールブック』に対応していません。コア・ルールブックで遊ぶ場合には『ニンジャスレイヤーTRPG 2版』のコマンドを利用してください。
41
43
  MESSAGETEXT
42
44
 
43
45
  def initialize(command)
@@ -0,0 +1,299 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class NinjaSlayer2 < Base
6
+ # ゲームシステムの識別子
7
+ ID = "NinjaSlayer2"
8
+
9
+ # ゲームシステム名
10
+ NAME = "ニンジャスレイヤーTRPG 2版"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "にんしやすれいやあTRPG2"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ - K{x1},{x2},...,{xn}
17
+ 難易度K([K]ids)の成功判定({x1}B6>=2)を、ダイス{x1}個({x2}~を指定した場合はそれぞれ個々に)で実行します。
18
+ 先頭の文字を変えることで、難易度E([E]asy),N([N]ormal),H([H]ard),U([U]ltra-hard)もしくはUH([U]ltra-[H]ard)でも実行可能です。(以下も同様)
19
+
20
+ - K{x1},{x2},...,{xn}[>={y}]
21
+ K{x1}のロールの結果を使って、[]内で指定された条件を満たすダイスの個数を追加で出力します。
22
+ 判定式は「>=」の他に「>」「<=」「<」「=」「!=」が利用可能です。
23
+ [=5][=6]のように複数記述することで、それぞれで追加判定が可能です。
24
+
25
+ - K{x1},{x2},...,{xn}[S] or K{x1},{x2},...,{xn}[S{y}]
26
+ - K{x1},{x2},...,{xn}[C] or K{x1},{x2},...,{xn}[C{y}]
27
+ いずれもK{x1},{x2},...,{xn}[>={y}]のショートカットです。({y}省略時は固定値6で処理します。)
28
+ 出力時のテキストが、Sの場合は「サツバツ!」に、Cの場合は「クリティカル!」になります。
29
+ こちらも複数記述することで、それぞれで追加判定が可能です。
30
+
31
+ - SB or SB@{x}
32
+ {x}(1-6/省略時はd6)に対応したサツバツ([S]atz-[B]atz)・クリティカル表の内容を返します。
33
+
34
+ - WS{x}
35
+ {x}(1-12/省略不可)に対応する[W]as[s]hoi!判定(2d6<={x})を行います
36
+
37
+ - WSE or WSE@{x}
38
+ {x}(1-6/省略時はd6)に対応する死神のエントリー決定表([W]as[s]hoi! [E]ntry)の内容を返します。
39
+
40
+ - NRS_E{x} or NRS_E{x}@{y} or NRS@{y}
41
+ ダイス{x}個で難易度[E]asy(>=3)のNRS判定({x}省略時はスキップ)を行い、失敗した場合は{y}(1~7/省略時は難易度に応じたダイス目)に対応するNRS発狂表を返します。
42
+ 「_E」部分を変更することで、難易度N,H,U,UHでも利用可能です。(Kはありません)
43
+ TEXT
44
+
45
+ # Base::eval_game_system_specific_commandの実装
46
+ # @param command [String]
47
+ # @return [String, nil]
48
+ def eval_game_system_specific_command(command)
49
+ # @debug = true
50
+ debug("input: #{command}")
51
+
52
+ begin
53
+ case command
54
+ when RE_JUDGE_DICEROLL
55
+ # 2版用のダイス判定
56
+ proc_result = proc_dice_2nd(Regexp.last_match)
57
+
58
+ # 結果は文字列と達成値という形で受け取る
59
+ if proc_result[1] > 0
60
+ return Result.success(proc_result[0])
61
+ else
62
+ return Result.failure(proc_result[0])
63
+ end
64
+ else
65
+ # ダイスでなければ定型文処理
66
+ return proc_text(command)
67
+ end
68
+ rescue StandardError => e
69
+ # 解析できずにエラーが出たら構文ミスと皆してnilを返す
70
+ debug("#{e.message} \n#{e.backtrace}")
71
+ return nil
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ # 文字列stringを数値化する。nilの場合はdefaultで指定された値を返す
78
+ # @param string [String]
79
+ # @param default [Integer]
80
+ # @return [Integer]
81
+ def s_to_i(string, default)
82
+ return string.nil? ? default : string.to_i
83
+ end
84
+
85
+ # 判定結果の出力テキストと成功数のカウントを返す。
86
+ # @param dice_array [Array<Integer>]
87
+ # @param difficulty [Integer]
88
+ # @param cmp_op [String]
89
+ # @param title_text [String]
90
+ # @return [String, Integer]
91
+ def check_difficulty(dice_array, difficulty, cmp_op, title_text)
92
+ success_num = 0
93
+ success_dice = []
94
+ dice_array.each do |dice_value|
95
+ if dice_value.send(Normalize.comparison_operator(cmp_op), difficulty)
96
+ success_num += 1
97
+ success_dice.push(dice_value)
98
+ end
99
+ end
100
+
101
+ success_dice_s = success_dice.empty? ? "" : "[#{success_dice.sort.reverse.join(',')}]"
102
+ return "#{title_text}:#{success_num}#{success_dice_s}", success_num
103
+ end
104
+
105
+ # ダイス処理(2版用)
106
+ # @param command [String]
107
+ # @return [String, Integer]
108
+ def proc_dice_2nd(match)
109
+ output_text = ''
110
+ total_success_num = 0
111
+
112
+ difficulty = DIFFICULTY_SYMBOL_TO_INTEGER.fetch(match[1])
113
+ appendix = match[3]
114
+
115
+ match[2].split(",").each do |sub_command|
116
+ dice_num = sub_command.to_i
117
+
118
+ # D6バラバラロール
119
+ roll_command = "#{dice_num}B6>=#{difficulty}"
120
+ roll_result = BCDice::CommonCommand::BarabaraDice.eval(roll_command, self, @randomizer)
121
+
122
+ output_text += "(#{roll_command}) > #{roll_result.last_dice_list.join(',')} > 成功数:#{roll_result.success_num}"
123
+ success_num = roll_result.success_num
124
+
125
+ # Appendix部分の処理
126
+ unless appendix.nil?
127
+ debug("---- appendix: [#{appendix}]")
128
+ ap_command_array = appendix.split("\]\[")
129
+ ap_command_array.each do |ap_command|
130
+ debug("----- ap_command: #{ap_command}")
131
+ case ap_command
132
+ when RE_COUNT_SATZ_BATZ
133
+ # サツバツ!カウント
134
+ check_result = check_difficulty(roll_result.last_dice_list, s_to_i(Regexp.last_match[1], 6), ">=", "サツバツ!")
135
+ output_text += ", #{check_result[0]}"
136
+ success_num += check_result[1]
137
+ when RE_COUNT_CRITICAL
138
+ # クリティカル!カウント
139
+ check_result = check_difficulty(roll_result.last_dice_list, s_to_i(Regexp.last_match[1], 6), ">=", "クリティカル!")
140
+ output_text += ", #{check_result[0]}"
141
+ success_num += check_result[1]
142
+ when RE_COUNT_JUDGE
143
+ # 追加判定カウント
144
+ check_result = check_difficulty(roll_result.last_dice_list, Regexp.last_match[2].to_i, Regexp.last_match[1], "追加判定")
145
+ output_text += ", #{check_result[0]}"
146
+ success_num += check_result[1]
147
+ end
148
+ end
149
+ end
150
+ output_text += " \n"
151
+
152
+ total_success_num += success_num
153
+ end
154
+
155
+ return output_text, total_success_num
156
+ end
157
+
158
+ # サツバツ!の処理を実行する
159
+ # @param type [Integer]
160
+ # @return [Result]
161
+ def proc_satz_batz(type)
162
+ # サツバツ判定(d6)
163
+ if type > 0
164
+ return "サツバツ!!(#{type}) > #{translate('NinjaSlayer2.table.SATSUBATSU.items')[type - 1]}"
165
+ else
166
+ return DiceTable::Table.from_i18n("NinjaSlayer2.table.SATSUBATSU", @locale).roll(@randomizer)
167
+ end
168
+ end
169
+
170
+ # Wasshoi!判定の処理を実行する
171
+ # @param dkk [Integer]
172
+ # @return [Result]
173
+ def proc_wasshoi(dkk)
174
+ dice_array = @randomizer.roll_barabara(2, 6)
175
+ output_text = "Wasshoi!判定(2D6) > (#{dice_array.join('+')}) > #{dice_array.sum()}"
176
+
177
+ if dice_array.sum() > dkk
178
+ output_text += "(>#{dkk}) 判定失敗"
179
+ return Result.success(output_text)
180
+ else
181
+ output_text += "(<=#{dkk}) 判定成功!! \nニンジャスレイヤー=サンのエントリーだ!!"
182
+ return Result.failure(output_text)
183
+ end
184
+ end
185
+
186
+ # Wasshoi!の処理を実行する
187
+ # @param type [Integer]
188
+ # @return [Result]
189
+ def proc_wasshoi_entry(type)
190
+ # Wasshoi!判定
191
+ output_text = ""
192
+ if type > 0
193
+ output_text += "ニンジャスレイヤー=サンのエントリー!!(#{type}) > #{translate('NinjaSlayer2.table.WASSHOI.items')[type - 1]}"
194
+ else
195
+ # DKKの指定無し、もしくはロール結果がDKKを超えたら死神のエントリー決定表(d6)
196
+ table = DiceTable::Table.from_i18n("NinjaSlayer2.table.WASSHOI", @locale)
197
+ output_text += table.roll(@randomizer).to_s
198
+ end
199
+ return output_text
200
+ end
201
+
202
+ # NRS判定の処理を実行する
203
+ # @param dice_num [Integer]
204
+ # @param dificulty_s [String]
205
+ # @param type [Integer]
206
+ # @return [Result]
207
+ def proc_nrs(dice_num, dificulty_s, type)
208
+ # 難易度も乱数表の番号も指定が無ければコマンドミス
209
+ dificulty_i = dificulty_s.nil? ? 0 : DIFFICULTY_SYMBOL_TO_INTEGER.fetch(dificulty_s)
210
+ if dificulty_i == 0 && type == 0
211
+ return nil
212
+ end
213
+
214
+ # NRS判定
215
+ output_text = ""
216
+ if dificulty_i > 0
217
+ roll_command = "#{dice_num}B6>=#{dificulty_i}"
218
+ roll_result = BCDice::CommonCommand::BarabaraDice.eval(roll_command, self, @randomizer)
219
+ output_text += "NRS判定(#{roll_command}) > #{roll_result.last_dice_list.join(',')} > 成功数:#{roll_result.success_num}"
220
+ if roll_result.success_num > 0
221
+ output_text += " NRS克服!!"
222
+ return Result.success(output_text)
223
+ else
224
+ output_text += " NRS発症!! \n"
225
+ end
226
+ end
227
+
228
+ # NRS発狂表の決定
229
+ dice_face = 0
230
+ additional = 0
231
+ if type == 0
232
+ case dificulty_s
233
+ when "E"
234
+ dice_face = 3
235
+ when "N"
236
+ dice_face = 6
237
+ when "H", "U"
238
+ dice_face = 6
239
+ additional = 1
240
+ end
241
+ type = @randomizer.roll_once(dice_face) + additional
242
+ end
243
+ roll_command = "1D#{dice_face}#{additional > 0 ? '+' + additional.to_s : ''}"
244
+ output_text += "NRS発狂#{dice_face > 0 ? "(#{roll_command}) > " : ''}(#{type}) > #{translate('NinjaSlayer2.table.NRS.items')[type - 1]}"
245
+ return Result.failure(output_text)
246
+ end
247
+
248
+ # テキスト系処理
249
+ # @param command [String]
250
+ # @return [String, Integer]
251
+ def proc_text(command)
252
+ debug("text: #{command}")
253
+ case command
254
+ when RE_JUDGE_SATZ_BATZ
255
+ # サツバツ判定(d6)
256
+ return proc_satz_batz(Regexp.last_match[1].to_i)
257
+ when RE_JUDGE_WASSHOI
258
+ # Wasshoi!判定
259
+ return proc_wasshoi(Regexp.last_match[1].to_i)
260
+ when RE_JUDGE_WASSHOI_ENTRY
261
+ # Wasshoi!判定
262
+ return proc_wasshoi_entry(Regexp.last_match[1].to_i)
263
+ when RE_JUDGE_NRS
264
+ # NRS判定
265
+ return proc_nrs(Regexp.last_match[2].to_i, Regexp.last_match[1], Regexp.last_match[3].to_i)
266
+ end
267
+ end
268
+
269
+ RE_COUNT_SATZ_BATZ = /S([1-6])?/i.freeze
270
+ RE_COUNT_CRITICAL = /C([1-6])?/i.freeze
271
+ RE_COUNT_JUDGE = /(=|!=|>=|>|<=|<)([1-6])/.freeze
272
+
273
+ RE_JUDGE_DICEROLL = /^(UH|[KENHU])([\d,]+)(?:\[((?:(?:S([1-6])?|C([1-6])?|(=|!=|>=|>|<=|<)([1-6]))(?:\]\[)?)+)\])?$/i.freeze
274
+ RE_JUDGE_SATZ_BATZ = /^SB(?:@([1-6]))?$/i.freeze
275
+ RE_JUDGE_WASSHOI = /^WS([1-9]|10|11|12)$/i.freeze
276
+ RE_JUDGE_WASSHOI_ENTRY = /^WSE(?:@([1-6]))?$/i.freeze
277
+ RE_JUDGE_NRS = /^NRS(?:_(E|N|H|U|UH)(\d+))?(?:@([1-7]))?$/i.freeze
278
+
279
+ # 難易度の文字表現から整数値への対応
280
+ DIFFICULTY_SYMBOL_TO_INTEGER = {
281
+ 'K' => 2,
282
+ 'E' => 3,
283
+ 'N' => 4,
284
+ 'H' => 5,
285
+ 'U' => 6,
286
+ 'UH' => 6
287
+ }.freeze
288
+
289
+ register_prefix(
290
+ "UH",
291
+ "[KENHU]",
292
+ "SB",
293
+ "WS",
294
+ "WSE",
295
+ "NRS"
296
+ )
297
+ end
298
+ end
299
+ end
@@ -81,7 +81,7 @@ module BCDice
81
81
  target = Regexp.last_match(6)
82
82
  target = target.to_i unless target.nil?
83
83
 
84
- modifyText = (Regexp.last_match(3) || "")
84
+ modifyText = Regexp.last_match(3) || ""
85
85
  modifyText = "+1" if modifyText == "+"
86
86
  modifyValue = modifyText.to_i
87
87