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
@@ -22,14 +22,14 @@ module BCDice
22
22
  2VMF6+3
23
23
  2VMI9H3
24
24
 
25
- 難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Winのチェックを行う
25
+ 難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Win、Total Failureのチェックを行う
26
26
  (Hungerダイスがある場合)Messy CriticalとBestial Failureチェックを行う
27
27
  例) (難易度)VMF(通常ダイス)+(Hungerダイス)
28
28
  (難易度)VMF(通常ダイス)
29
29
  (難易度)VMI(通常ダイス)H(Hungerダイス)
30
30
  (難易度)VMI(通常ダイス)
31
31
 
32
- 難易度省略:成功数のカウント、判定失敗、Critical処理、(Hungerダイスがある場合)Bestial Failureチェックを行う
32
+ 難易度省略:成功数のカウント、判定失敗、Critical処理、Total Failure、(Hungerダイスがある場合)Bestial Failureチェックを行う
33
33
  判定成功、Messy Criticalのチェックを行わない
34
34
  Critical Win、(Hungerダイスがある場合)Bestial Failure、Messy Criticalのヒントを出力
35
35
  例) VMF(通常ダイス)+(Hungerダイス)
@@ -58,20 +58,23 @@ module BCDice
58
58
  register_prefix('\d*(VMF|(VMI\d*(H\d?)?))')
59
59
 
60
60
  def eval_game_system_specific_command(command)
61
- m = /\A(\d+)?(((VMF)(\d)(\+(\d+))?)|((VMI)(\d)(H(\d+))?))$/.match(command)
61
+ m = /\A(\d+)?(((VMF)(\d+)(\+(\d+))?)|((VMI)(\d+)(H(\d+))?))$/.match(command)
62
62
  unless m
63
63
  return ''
64
64
  end
65
65
 
66
66
  dice_pool, hunger_dice_pool = get_dice_pools(m)
67
67
  if dice_pool < 0
68
- return "ダイスプールより多いHungerダイスは指定できません。"
68
+ return "ダイスプール0のときにHungerダイスは指定できません。"
69
+ end
70
+ if hunger_dice_pool > 5
71
+ return "Hungerダイス指定は5ダイスが最大です。"
69
72
  end
70
73
 
71
74
  dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
72
75
  result_text = "(#{dice_pool}D10"
73
76
 
74
- if hunger_dice_pool
77
+ if hunger_dice_pool >= 0
75
78
  hunger_dice_text, hunger_success_dice, hunger_ten_dice, hunger_botch_dice = make_dice_roll(hunger_dice_pool)
76
79
 
77
80
  ten_dice += hunger_ten_dice
@@ -97,11 +100,17 @@ module BCDice
97
100
  hunger_dice_included_command = m[COMMAND_HUNGER_DICE_INCLUDED_INDEX]
98
101
  if hunger_dice_included_command && hunger_dice_included_command == "VMI"
99
102
  # Hunger Diceを内数処理するの場合
100
- hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX]&.to_i
101
- dice_pool = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i - (hunger_dice_pool || 0)
103
+ hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_INCLUDED_INDEX].to_i
104
+ dice_pool_value = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i
105
+ dice_pool = dice_pool_value - (hunger_dice_pool < 0 ? 0 : hunger_dice_pool)
106
+ if dice_pool_value > 0 && hunger_dice_pool >= dice_pool_value
107
+ # 1 以上のダイスプール、かつ、Hungerダイスがダイスプール以上のとき、ダイスプールが全てHungerダイスになる。
108
+ dice_pool = 0
109
+ hunger_dice_pool = dice_pool_value
110
+ end
102
111
  else
103
112
  # Hunger DiceがPLによる内数指定の場合
104
- hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX]&.to_i
113
+ hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_NO_INCLUDED_INDEX].to_i
105
114
  dice_pool = m[DICE_POOL_HUNGER_DICE_NO_INCLUDED_INDEX].to_i
106
115
  end
107
116
  return dice_pool, hunger_dice_pool
@@ -128,6 +137,9 @@ module BCDice
128
137
  if hunger_botch_dice > 0
129
138
  return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
130
139
  end
140
+ if success_dice == 0
141
+ return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
142
+ end
131
143
 
132
144
  return Result.failure("#{result_text}:判定失敗!")
133
145
  end
@@ -137,7 +149,7 @@ module BCDice
137
149
  return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
138
150
  end
139
151
 
140
- return Result.failure("#{result_text}:判定失敗!")
152
+ return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
141
153
  else
142
154
  if hunger_botch_dice > 0
143
155
  result_text = "#{result_text}\n 判定失敗なら [Bestial Failure]"
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class WerewolfTheApocalypse5th < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'WerewolfTheApocalypse5th'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Werewolf: The Apocalypse 5th Edition'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'わあうふるしあほかりふす5'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定コマンド(nWAFx+x または nWAIxRx)
18
+ WAFコマンドはRageダイスとダイスプールを個別に指定する。
19
+ WAIコマンドはRageダイスをダイスプールの内数として指定する。
20
+
21
+ 例:難易度2、9ダイスプールでRageダイス3個の場合、それぞれ以下のようなコマンドとなる。
22
+ 2WAF6+3
23
+ 2WAI9R3
24
+
25
+ 難易度指定:成功数のカウント、判定成功と失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failure、Critical Winのチェックを行う
26
+ 例) (難易度)WAF(通常ダイス)+(Rageダイス)
27
+ (難易度)WAF(通常ダイス)
28
+ (難易度)WAI(通常ダイス)R(Rageダイス)
29
+ (難易度)WAI(通常ダイス)
30
+
31
+ 難易度省略:成功数のカウント、判定失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failureのチェックを行う
32
+ 判定成功チェックを行わない
33
+ Critical Winのヒントを出力
34
+ 例) WAF(通常ダイス)+(Rageダイス)
35
+ WAF(通常ダイス)
36
+ WAI(通常ダイス)R(Rageダイス)
37
+ WAI(通常ダイス)
38
+
39
+ 難易度0指定:Critical処理と成功数のカウントを行い、全てのチェックを行わない
40
+ 例) 0WAF(通常ダイス)+(Rageダイス)
41
+ 0WAF(通常ダイス)
42
+ 0WAI(通常ダイス)+(Rageダイス)
43
+ 0WAI(通常ダイス)
44
+
45
+ MESSAGETEXT
46
+
47
+ DIFFICULTY_INDEX = 1
48
+ DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX = 5
49
+ RAGE_DICE_NO_INCLUDED_INDEX = 7
50
+ COMMAND_RAGE_DICE_INCLUDED_INDEX = 9
51
+ DICE_POOL_RAGE_DICE_INCLUDED_INDEX = 10
52
+ RAGE_DICE_INCLUDED_INDEX = 12
53
+
54
+ # 難易度に指定可能な特殊値
55
+ NOT_CHECK_SUCCESS = -1 # 判定成功にかかわるチェックを行わない(判定失敗に関わるチェックは行う)
56
+
57
+ register_prefix('\d*(WAF|(WAI\d*(R\d?)?))')
58
+
59
+ def eval_game_system_specific_command(command)
60
+ m = /\A(\d+)?(((WAF)(\d+)(\+(\d+))?)|((WAI)(\d+)(R(\d+))?))$/.match(command)
61
+ unless m
62
+ return ''
63
+ end
64
+
65
+ dice_pool, rage_dice_pool = get_dice_pools(m)
66
+ if dice_pool < 0
67
+ return "ダイスプール0のときにRageダイスは指定できません。"
68
+ end
69
+ if rage_dice_pool > 5
70
+ return "5を超えるRageダイス指定はできません。"
71
+ end
72
+
73
+ dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
74
+ result_text = "(#{dice_pool}D10"
75
+
76
+ if rage_dice_pool >= 0
77
+ rage_dice_text, rage_success_dice, rage_ten_dice, brutal_result_dice = make_dice_roll(rage_dice_pool)
78
+
79
+ brutal_outcome = brutal_result_dice / 2
80
+ ten_dice += rage_ten_dice
81
+ success_dice += rage_success_dice
82
+
83
+ result_text = "#{result_text}+#{rage_dice_pool}D10) > [#{dice_text}]+[#{rage_dice_text}] "
84
+ else
85
+ rage_ten_dice = 0
86
+ brutal_outcome = 0
87
+ result_text = "#{result_text}) > [#{dice_text}] "
88
+ end
89
+
90
+ success_dice += get_critical_success(ten_dice)
91
+
92
+ difficulty = m[DIFFICULTY_INDEX] ? m[DIFFICULTY_INDEX].to_i : NOT_CHECK_SUCCESS
93
+
94
+ return get_roll_result(result_text, success_dice, ten_dice, rage_ten_dice, brutal_outcome, difficulty)
95
+ end
96
+
97
+ private
98
+
99
+ def get_dice_pools(m)
100
+ rage_dice_included_command = m[COMMAND_RAGE_DICE_INCLUDED_INDEX]
101
+ if rage_dice_included_command && rage_dice_included_command == "WAI"
102
+ # Rage Diceを内数処理するの場合
103
+ rage_dice_pool = m[RAGE_DICE_INCLUDED_INDEX].nil? ? -1 : m[RAGE_DICE_INCLUDED_INDEX].to_i
104
+ dice_pool_value = m[DICE_POOL_RAGE_DICE_INCLUDED_INDEX].to_i
105
+ dice_pool = dice_pool_value - (rage_dice_pool < 0 ? 0 : rage_dice_pool)
106
+ if dice_pool_value > 0 && rage_dice_pool >= dice_pool_value
107
+ # 1 以上のダイスプール、かつ、Rageダイスがダイスプール以上のとき、ダイスプールが全てRageダイスになる。
108
+ dice_pool = 0
109
+ rage_dice_pool = dice_pool_value
110
+ end
111
+ else
112
+ # Rage DiceがPLによる内数指定の場合
113
+ rage_dice_pool = m[RAGE_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[RAGE_DICE_NO_INCLUDED_INDEX].to_i
114
+ dice_pool = m[DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX].to_i
115
+ end
116
+ return dice_pool, rage_dice_pool
117
+ end
118
+
119
+ def get_roll_result(result_text, success_dice, ten_dice, _rage_ten_dice, brutal_outcome, difficulty)
120
+ is_critical = ten_dice >= 2
121
+
122
+ if brutal_outcome > 0 && difficulty != 0
123
+ success_dice += 4
124
+ result_text = "#{result_text} [Brutal outcome] 自動失敗、または 成功数=#{success_dice}"
125
+ else
126
+ result_text = "#{result_text} 成功数=#{success_dice}"
127
+ end
128
+
129
+ if difficulty > 0
130
+ result_text = "#{result_text} 難易度=#{difficulty}"
131
+ if success_dice >= difficulty
132
+ result_text = "#{result_text} 差分=#{success_dice - difficulty}"
133
+
134
+ if is_critical
135
+ result_data = Result.critical("#{result_text}:判定成功! [Critical Win]")
136
+ return brutal_outcome > 0 ? result_data.text : result_data
137
+ end
138
+ result_data = Result.success("#{result_text}:判定成功!")
139
+ return brutal_outcome > 0 ? result_data.text : result_data
140
+ else
141
+ if success_dice == 0
142
+ return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
143
+ else
144
+ return Result.failure("#{result_text}:判定失敗!")
145
+ end
146
+ end
147
+ elsif difficulty < 0
148
+ if success_dice == 0
149
+ return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
150
+ else
151
+ if is_critical
152
+ result_text = "#{result_text}\n 判定成功なら [Critical Win]"
153
+ end
154
+ return result_text.to_s
155
+ end
156
+ end
157
+
158
+ # 難易度0指定(=全ての判定チェックを行わない)
159
+ return result_text.to_s
160
+ end
161
+
162
+ def get_critical_success(ten_dice)
163
+ # 10の目が2個毎に追加2成功
164
+ return ((ten_dice / 2) * 2)
165
+ end
166
+
167
+ def make_dice_roll(dice_pool)
168
+ dice_list = @randomizer.roll_barabara(dice_pool, 10)
169
+
170
+ dice_text = dice_list.join(',')
171
+ success_dice = dice_list.count { |x| x >= 6 }
172
+ ten_dice = dice_list.count(10)
173
+ brutal_result_dice = dice_list.count(1) + dice_list.count(2)
174
+
175
+ return dice_text, success_dice, ten_dice, brutal_result_dice
176
+ end
177
+ end
178
+ end
179
+ end
@@ -41,7 +41,7 @@ module BCDice
41
41
  bullet_count = m[1].to_i
42
42
  diff = m[2].to_i
43
43
  broken_number = m[3].to_i
44
- bonus_dice_count = m[4]&.to_i || 0
44
+ bonus_dice_count = m[4].to_i
45
45
  stop_count = m[5]&.downcase || ""
46
46
  bullet_set_count_cap = m[6]&.to_i || diff / 10
47
47
 
@@ -34,6 +34,9 @@ module BCDice
34
34
  # @return [Integer, nil]
35
35
  attr_accessor :modifier_after_half
36
36
 
37
+ # @return [Integer, nil]
38
+ attr_accessor :modifier_after_one_and_a_half
39
+
37
40
  def settable_first_roll_adjust_option?
38
41
  return first_modify.nil? && first_to.nil?
39
42
  end
@@ -37,6 +37,9 @@ module BCDice
37
37
  # @return [Integer, nil]
38
38
  attr_accessor :modifier_after_half
39
39
 
40
+ # @return [Integer, nil]
41
+ attr_accessor :modifier_after_one_and_a_half
42
+
40
43
  def initialize(rate, modifier)
41
44
  @rate = rate
42
45
  @modifier = modifier
@@ -49,6 +52,7 @@ module BCDice
49
52
  @semi_fixed_val = 0
50
53
  @tmp_fixed_val = 0
51
54
  @modifier_after_half = nil
55
+ @modifier_after_one_and_a_half = nil
52
56
  end
53
57
 
54
58
  # @return [Boolean]
@@ -56,6 +60,11 @@ module BCDice
56
60
  return !@modifier_after_half.nil?
57
61
  end
58
62
 
63
+ # @return [Boolean]
64
+ def one_and_a_half
65
+ return !@modifier_after_one_and_a_half.nil?
66
+ end
67
+
59
68
  # @return [Integer]
60
69
  def min_critical
61
70
  if @semi_fixed_val <= 1