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
@@ -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