bcdice 3.11.0 → 3.13.0

Sign up to get free protection for your applications and to get access to all the features.
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