bcdice 3.15.0 → 3.17.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +140 -0
  3. data/i18n/Airgetlamh/ja_jp.yml +5 -0
  4. data/i18n/Airgetlamh/ko_kr.yml +5 -0
  5. data/i18n/Alsetto/ja_jp.yml +5 -0
  6. data/i18n/Alsetto/ko_kr.yml +5 -0
  7. data/i18n/AnimaAnimus/ja_jp.yml +28 -0
  8. data/i18n/AnimaAnimus/ko_kr.yml +28 -0
  9. data/i18n/BlackJacket/ja_jp.yml +79 -0
  10. data/i18n/BlackJacket/ko_kr.yml +79 -0
  11. data/i18n/Bloodorium/ja_jp.yml +3 -0
  12. data/i18n/Bloodorium/ko_kr.yml +3 -0
  13. data/i18n/Cthulhu/ko_kr.yml +1 -1
  14. data/i18n/DoubleCross/ja_jp.yml +2 -2
  15. data/i18n/Dracurouge/ko_kr.yml +1284 -205
  16. data/i18n/Emoklore/ja_jp.yml +1 -0
  17. data/i18n/Emoklore/ko_kr.yml +8 -0
  18. data/i18n/FutariSousa/ja_jp.yml +70 -0
  19. data/i18n/FutariSousa/ko_kr.yml +157 -0
  20. data/i18n/HatsuneMiku/ja_jp.yml +579 -0
  21. data/i18n/HatsuneMiku/ko_kr.yml +579 -0
  22. data/i18n/Irisbane/ja_jp.yml +27 -0
  23. data/i18n/Irisbane/ko_kr.yml +27 -0
  24. data/i18n/JuinKansen/ja_jp.yml +168 -0
  25. data/i18n/JuinKansen/ko_kr.yml +168 -0
  26. data/i18n/KemonoNoMori/ja_jp.yml +229 -0
  27. data/i18n/KemonoNoMori/ko_kr.yml +229 -0
  28. data/i18n/KizunaBullet/ko_kr.yml +653 -0
  29. data/i18n/MagicPunk/ja_jp.yml +5 -0
  30. data/i18n/MagicPunk/ko_kr.yml +5 -0
  31. data/i18n/MorkBorg/ja_jp.yml +34 -0
  32. data/i18n/MorkBorg/ko_kr.yml +34 -0
  33. data/i18n/Nechronica/ko_kr.yml +43 -0
  34. data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
  35. data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
  36. data/i18n/Nuekagami/ja_jp.yml +219 -0
  37. data/i18n/Nuekagami/ko_kr.yml +219 -0
  38. data/i18n/Revulture/ja_jp.yml +8 -0
  39. data/i18n/Revulture/ko_kr.yml +8 -0
  40. data/i18n/SRS/ja_jp.yml +4 -0
  41. data/i18n/SRS/ko_kr.yml +4 -0
  42. data/i18n/ShinobiGami/ja_jp.yml +879 -0
  43. data/i18n/ShinobiGami/ko_kr.yml +876 -0
  44. data/i18n/SkynautsBouken/ja_jp.yml +28 -28
  45. data/i18n/StarryDolls/ja_jp.yml +456 -0
  46. data/i18n/StarryDolls/ko_kr.yml +456 -0
  47. data/i18n/StratoShout/ja_jp.yml +8 -8
  48. data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
  49. data/i18n/Ventangle/ja_jp.yml +4 -0
  50. data/i18n/Ventangle/ko_kr.yml +4 -0
  51. data/i18n/YearZeroEngine/ja_jp.yml +12 -0
  52. data/i18n/YearZeroEngine/ko_kr.yml +12 -0
  53. data/i18n/ZombiLine/ja_jp.yml +27 -0
  54. data/i18n/ZombiLine/ko_kr.yml +27 -0
  55. data/i18n/ko_kr.yml +2 -0
  56. data/i18n/zh_hant.yml +2 -2
  57. data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
  58. data/lib/bcdice/game_system/Aionia.rb +68 -19
  59. data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
  60. data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
  61. data/lib/bcdice/game_system/Alsetto.rb +63 -50
  62. data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
  63. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
  64. data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
  65. data/lib/bcdice/game_system/BlackJacket.rb +57 -113
  66. data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
  67. data/lib/bcdice/game_system/Bloodorium.rb +1 -1
  68. data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
  69. data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
  70. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
  71. data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
  72. data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
  73. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
  74. data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
  75. data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
  76. data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
  77. data/lib/bcdice/game_system/Emoklore.rb +34 -9
  78. data/lib/bcdice/game_system/Emoklore_Korean.rb +50 -0
  79. data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
  80. data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +37 -12
  82. data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
  83. data/lib/bcdice/game_system/GaiaCare.rb +40 -0
  84. data/lib/bcdice/game_system/Garactier.rb +1 -1
  85. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  86. data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
  87. data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
  88. data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
  89. data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
  90. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
  91. data/lib/bcdice/game_system/Irisbane.rb +17 -30
  92. data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
  93. data/lib/bcdice/game_system/JuinKansen.rb +41 -208
  94. data/lib/bcdice/game_system/JuinKansen_Korean.rb +46 -0
  95. data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
  96. data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
  97. data/lib/bcdice/game_system/KinAriel.rb +117 -0
  98. data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
  99. data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
  100. data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
  101. data/lib/bcdice/game_system/Lost.rb +89 -0
  102. data/lib/bcdice/game_system/MagicPunk.rb +85 -0
  103. data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
  104. data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
  105. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
  106. data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
  107. data/lib/bcdice/game_system/MorkBorg.rb +170 -0
  108. data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
  109. data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
  110. data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
  111. data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
  112. data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
  113. data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
  114. data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
  115. data/lib/bcdice/game_system/Nuekagami.rb +19 -261
  116. data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
  117. data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
  118. data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
  119. data/lib/bcdice/game_system/PreciousDays.rb +170 -0
  120. data/lib/bcdice/game_system/Revulture.rb +8 -5
  121. data/lib/bcdice/game_system/Revulture_Korean.rb +51 -0
  122. data/lib/bcdice/game_system/Ryutama.rb +46 -46
  123. data/lib/bcdice/game_system/SRS.rb +4 -4
  124. data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
  125. data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
  126. data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
  127. data/lib/bcdice/game_system/StarryDolls.rb +70 -508
  128. data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
  129. data/lib/bcdice/game_system/StratoShout.rb +1 -1
  130. data/lib/bcdice/game_system/SwordWorld.rb +28 -2
  131. data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
  132. data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
  133. data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
  134. data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
  135. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
  136. data/lib/bcdice/game_system/Ventangle.rb +8 -7
  137. data/lib/bcdice/game_system/Ventangle_Korean.rb +41 -0
  138. data/lib/bcdice/game_system/Warhammer4.rb +202 -6
  139. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
  140. data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
  141. data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
  142. data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
  143. data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
  144. data/lib/bcdice/game_system/ZombiLine.rb +29 -36
  145. data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
  146. data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
  147. data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
  148. data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
  149. data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
  150. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
  151. data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
  152. data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
  153. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
  154. data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
  155. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
  156. data/lib/bcdice/game_system.rb +47 -0
  157. data/lib/bcdice/version.rb +1 -1
  158. metadata +96 -2
@@ -7,7 +7,7 @@ module BCDice
7
7
  ID = 'VampireTheMasquerade5th'
8
8
 
9
9
  # ゲームシステム名
10
- NAME = 'Vampire: The Masquerade 5th Edition'
10
+ NAME = 'ヴァンパイア:ザ・マスカレード第5版'
11
11
 
12
12
  # ゲームシステム名の読みがな
13
13
  SORT_KEY = 'うあんはいあさますかれえと5'
@@ -15,32 +15,32 @@ module BCDice
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = <<~MESSAGETEXT
17
17
  ・判定コマンド(nVMFx+x または nVMIxHx)
18
- VMFコマンドはHungerダイスとダイスプールを個別に指定する。
19
- VMIコマンドはHungerダイスをダイスプールの内数として指定する。
18
+ VMFコマンドはハンガーダイスとダイスプールを個別に指定する。
19
+ VMIコマンドはハンガーダイスをダイスプールの内数として指定する。
20
20
 
21
- 例:難易度2、9ダイスプールでHungerダイス3個の場合、それぞれ以下のようなコマンドとなる。
21
+ 例:難易度2、9ダイスプールでハンガーダイス3個の場合、それぞれ以下のようなコマンドとなる。
22
22
  2VMF6+3
23
23
  2VMI9H3
24
24
 
25
- 難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Win、Total Failureのチェックを行う
26
- (Hungerダイスがある場合)Messy CriticalとBestial Failureチェックを行う
27
- 例) (難易度)VMF(通常ダイス)+(Hungerダイス)
25
+ 難易度指定:達成数のカウント、判定成功と失敗、クリティカル処理、クリティカル成功、完全失敗のチェックを行う
26
+ (ハンガーダイスがある場合)凄惨なるクリティカルと獣の過ちチェックを行う
27
+ 例) (難易度)VMF(通常ダイス)+(ハンガーダイス)
28
28
  (難易度)VMF(通常ダイス)
29
- (難易度)VMI(通常ダイス)H(Hungerダイス)
29
+ (難易度)VMI(通常ダイス)H(ハンガーダイス)
30
30
  (難易度)VMI(通常ダイス)
31
31
 
32
- 難易度省略:成功数のカウント、判定失敗、Critical処理、Total Failure、(Hungerダイスがある場合)Bestial Failureチェックを行う
33
- 判定成功、Messy Criticalのチェックを行わない
34
- Critical Win、(Hungerダイスがある場合)Bestial Failure、Messy Criticalのヒントを出力
35
- 例) VMF(通常ダイス)+(Hungerダイス)
32
+ 難易度省略:達成数のカウント、判定失敗、クリティカル処理、完全失敗、(ハンガーダイスがある場合)獣の過ちチェックを行う
33
+ 判定成功、凄惨なるクリティカルのチェックを行わない
34
+ クリティカル成功、(ハンガーダイスがある場合)獣の過ち、凄惨なるクリティカルのヒントを出力
35
+ 例) VMF(通常ダイス)+(ハンガーダイス)
36
36
  VMF(通常ダイス)
37
- VMI(通常ダイス)H(Hungerダイス)
37
+ VMI(通常ダイス)H(ハンガーダイス)
38
38
  VMI(通常ダイス)
39
39
 
40
- 難易度0指定:Critical処理と成功数のカウントを行い、全てのチェックを行わない
41
- 例) 0VMF(通常ダイス)+(Hungerダイス)
40
+ 難易度0指定:クリティカル処理と達成数のカウントを行い、全てのチェックを行わない
41
+ 例) 0VMF(通常ダイス)+(ハンガーダイス)
42
42
  0VMF(通常ダイス)
43
- 0VMI(通常ダイス)+(Hungerダイス)
43
+ 0VMI(通常ダイス)+(ハンガーダイス)
44
44
  0VMI(通常ダイス)
45
45
 
46
46
  MESSAGETEXT
@@ -58,17 +58,14 @@ 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
- if dice_pool < 0
68
- return "ダイスプール0のときにHungerダイスは指定できません。"
69
- end
70
67
  if hunger_dice_pool > 5
71
- return "Hungerダイス指定は5ダイスが最大です。"
68
+ return "ハンガーダイス指定は5ダイスが最大です。"
72
69
  end
73
70
 
74
71
  dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
@@ -102,9 +99,13 @@ module BCDice
102
99
  # Hunger Diceを内数処理するの場合
103
100
  hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_INCLUDED_INDEX].to_i
104
101
  dice_pool_value = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i
102
+ if dice_pool_value <= 0
103
+ # ダイスプールが0のとき、最低保証ダイスプールであるダイスプール1にする
104
+ dice_pool_value = 1
105
+ end
105
106
  dice_pool = dice_pool_value - (hunger_dice_pool < 0 ? 0 : hunger_dice_pool)
106
107
  if dice_pool_value > 0 && hunger_dice_pool >= dice_pool_value
107
- # 1 以上のダイスプール、かつ、Hungerダイスがダイスプール以上のとき、ダイスプールが全てHungerダイスになる。
108
+ # 1 以上のダイスプール、かつ、ハンガーダイスがダイスプール以上のとき、ダイスプールが全てハンガーダイスになる。
108
109
  dice_pool = 0
109
110
  hunger_dice_pool = dice_pool_value
110
111
  end
@@ -112,33 +113,37 @@ module BCDice
112
113
  # Hunger DiceがPLによる内数指定の場合
113
114
  hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_NO_INCLUDED_INDEX].to_i
114
115
  dice_pool = m[DICE_POOL_HUNGER_DICE_NO_INCLUDED_INDEX].to_i
116
+ if dice_pool <= 0 && hunger_dice_pool <= 0
117
+ # ダイスプールとハンガーダイスどちらも0指定のとき、最低保証ダイスプールである1ダイスプールにする
118
+ dice_pool = 1
119
+ end
115
120
  end
116
121
  return dice_pool, hunger_dice_pool
117
122
  end
118
123
 
119
124
  def get_roll_result(result_text, success_dice, ten_dice, hunger_ten_dice, hunger_botch_dice, difficulty)
120
- result_text = "#{result_text} 成功数=#{success_dice}"
125
+ result_text = "#{result_text} 達成数=#{success_dice}"
121
126
  is_critical = ten_dice >= 2
122
127
 
123
128
  if difficulty > 0
124
129
  result_text = "#{result_text} 難易度=#{difficulty}"
125
130
 
126
131
  if success_dice >= difficulty
127
- result_text = "#{result_text} 差分=#{success_dice - difficulty}"
132
+ result_text = "#{result_text} 上回り=#{success_dice - difficulty}"
128
133
 
129
134
  if hunger_ten_dice > 0 && is_critical
130
- return Result.critical("#{result_text}:判定成功! [Messy Critical]")
135
+ return Result.critical("#{result_text}:判定成功! [凄惨なるクリティカル/Messy Critical]")
131
136
  elsif is_critical
132
- return Result.critical("#{result_text}:判定成功! [Critical Win]")
137
+ return Result.critical("#{result_text}:判定成功! [クリティカル成功/Critical Win]")
133
138
  end
134
139
 
135
140
  return Result.success("#{result_text}:判定成功!")
136
141
  else
137
142
  if hunger_botch_dice > 0
138
- return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
143
+ return Result.fumble("#{result_text}:判定失敗! [獣の過ち/Bestial Failure]")
139
144
  end
140
145
  if success_dice == 0
141
- return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
146
+ return Result.fumble("#{result_text}:判定失敗! [完全失敗/Total Failure]")
142
147
  end
143
148
 
144
149
  return Result.failure("#{result_text}:判定失敗!")
@@ -146,18 +151,18 @@ module BCDice
146
151
  elsif difficulty < 0
147
152
  if success_dice == 0
148
153
  if hunger_botch_dice > 0
149
- return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
154
+ return Result.fumble("#{result_text}:判定失敗! [獣の過ち/Bestial Failure]")
150
155
  end
151
156
 
152
- return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
157
+ return Result.fumble("#{result_text}:判定失敗! [完全失敗/Total Failure]")
153
158
  else
154
159
  if hunger_botch_dice > 0
155
- result_text = "#{result_text}\n 判定失敗なら [Bestial Failure]"
160
+ result_text = "#{result_text}\n 判定失敗なら [獣の過ち/Bestial Failure]"
156
161
  end
157
162
  if hunger_ten_dice > 0 && is_critical
158
- result_text = "#{result_text}\n 判定成功なら [Messy Critical]"
163
+ result_text = "#{result_text}\n 判定成功なら [凄惨なるクリティカル/Messy Critical]"
159
164
  elsif is_critical
160
- result_text = "#{result_text}\n 判定成功なら [Critical Win]"
165
+ result_text = "#{result_text}\n 判定成功なら [クリティカル成功/Critical Win]"
161
166
  end
162
167
  return result_text.to_s
163
168
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bcdice/base'
4
+ require "bcdice/format"
4
5
 
5
6
  module BCDice
6
7
  module GameSystem
@@ -88,9 +89,9 @@ module BCDice
88
89
  "#{dice_total}#{Format.modifier(cmd.modify_number)}"
89
90
  end
90
91
 
91
- level_gap_str =
92
+ gap_bonus_str =
92
93
  if cmd.target_number && cmd.dollar && result.success? && (gap = total - cmd.target_number) >= cmd.dollar
93
- "ギャップボーナス(#{gap})"
94
+ translate("Ventangle.level_gap", gap: gap)
94
95
  end
95
96
 
96
97
  sequence = [
@@ -100,7 +101,7 @@ module BCDice
100
101
  modifier_str,
101
102
  total.to_s,
102
103
  result.text,
103
- level_gap_str,
104
+ gap_bonus_str,
104
105
  ].compact
105
106
 
106
107
  result.text = sequence.join(" > ")
@@ -113,16 +114,16 @@ module BCDice
113
114
  fumble = cmd.fumble || DEFAULT_FUMBLE_VALUE
114
115
 
115
116
  if dice_total <= fumble
116
- return Result.fumble('ファンブル')
117
+ return Result.fumble(translate("fumble"))
117
118
  elsif dice_total >= special
118
- return Result.critical('スペシャル')
119
+ return Result.critical(translate("Ventangle.special"))
119
120
  end
120
121
 
121
122
  if cmd.target_number
122
123
  if total.send(cmd.cmp_op, cmd.target_number)
123
- return Result.success('成功')
124
+ return Result.success(translate("success"))
124
125
  else
125
- return Result.failure('失敗')
126
+ return Result.failure(translate("failure"))
126
127
  end
127
128
  else
128
129
  return Result.new(nil)
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/Ventangle'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Ventangle_Korean < Ventangle
8
+ # ゲームシステムの識別子
9
+ ID = 'Ventangle:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '벤탱글'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:벤탱글'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~MESSAGETEXT
19
+ 기본 양식 VTn@s#f$g>=T n=주사위 개수(생략 시 2) s=스페셜치(생략 시 12) f=펌블치(생략 시 2) g=레벨 갭 판정치(생략 가능) T=목표치(생략 가능)
20
+
21
+ 예시:
22
+ VT 기본 스페셜치, 펌블치로 판정
23
+ VT@10#3 스페셜치 10, 펌블치 3으로 판정
24
+ VT3@10#3 어드밴티지 1점을 사용해 스페셜치 10, 펌블치 3 판정을 주사위 3개로 판정
25
+
26
+ VT>=5 기본 스페셜치, 펌블치로 목표치 5 판정
27
+ VT@10#3>=5 스페셜치 10, 펌블치 3으로 목표치 5 판정
28
+ VT@10#3$5>=5 스페셜치 10, 펌블치 3으로 목표치 5 판정. 이때 달성치가 목표치보다 5이상 큰 경우, 갭 보너스를 표시
29
+ VT3@10#3>=5 어드밴티지 1점을 사용해 스페셜치 10, 펌블치 3, 목표치 5 판정을 주사위 3개로 판정
30
+ VT3@10#3$4>=5 어드밴티지 1점을 사용해 스페셜치 10, 펌블치 3, 목표치 5 판정을 주사위 3개로 판정. 이때 달성치가 목표치보다 4이상 큰 경우, 갭 보너스를 표시
31
+ MESSAGETEXT
32
+
33
+ register_prefix_from_super_class()
34
+
35
+ def initialize(command)
36
+ super(command)
37
+ @locale = :ko_kr
38
+ end
39
+ end
40
+ end
41
+ end
@@ -20,6 +20,12 @@ module BCDice
20
20
  頑健ボーナスフラグは頑健ボーナス以下のダメージの時にUをつけます。
21
21
  例)whctH whctAU WHCTL
22
22
 
23
+ ■ 『武器を掲げよ!』版クリティカル表 (bkctH, bkctA, bkctB, bkctL, bkctHx, bkctAx, bkctBx, bkctLx)
24
+ "BK部位 超過ダメージ"の形で指定します。
25
+ 部位は「H(頭部)」「A(腕)」「B(胴体)」「L(足)」の4カ所です。
26
+ 超過ダメージは耐久値を0にして余剰ダメージがある場合の値を入力します(省略可)。
27
+ 例)bkctH bkctA4 BKCTL
28
+
23
29
  ■ 命中部位表 (WHLT)
24
30
  命中部位をランダムに決定します。(クリティカル用)
25
31
 
@@ -33,9 +39,11 @@ module BCDice
33
39
 
34
40
  ■ 小誤発動表 (WHMIT)
35
41
  小誤発動表をロールして、結果を表示します。
42
+ ※Winds of Magic版(WOMMIT)
36
43
 
37
44
  ■ 大誤発動表 (WHMAT)
38
45
  大誤発動表をロールして、結果を表示します。
46
+ ※Winds of Magic版(WOMMAT)
39
47
 
40
48
  ■ 命中判定 (WHx)
41
49
  "WH(命中値)"の形で指定します。
@@ -43,7 +51,7 @@ module BCDice
43
51
  例)wh60  wh(43-20)
44
52
  INFO_MESSAGE_TEXT
45
53
 
46
- register_prefix('WH')
54
+ register_prefix('WH', 'WOM', 'BK')
47
55
 
48
56
  def initialize(command)
49
57
  super(command)
@@ -130,14 +138,29 @@ module BCDice
130
138
  # クリティカル表
131
139
  def roll_critical_table(command)
132
140
  m = /^WHCT([HABTL])(U)?$/.match(command)
133
- return nil unless m
141
+ n = /^BKCT([HABTL])(\d*)?$/.match(command)
142
+ return nil unless m || n
134
143
 
135
- part = m[1]
136
- part = "B" if part == "T"
144
+ case command
145
+ when /^WHCT([HABTL])(U)?$/
146
+ part = m[1]
147
+ part = "B" if part == "T"
137
148
 
138
- under_ganken_bonus = !m[2].nil?
149
+ under_ganken_bonus = !m[2].nil?
139
150
 
140
- CRITICAL_TABLES[part].roll(@randomizer, under_ganken_bonus)
151
+ CRITICAL_TABLES[part].roll(@randomizer, under_ganken_bonus)
152
+ when /^BKCT([HABTL])(\d*)?$/
153
+ part = n[1]
154
+ part = "B" if part == "T"
155
+
156
+ if n[2].nil?
157
+ over_damage = 0
158
+ else
159
+ over_damage = n[2].to_i
160
+ end
161
+
162
+ CRITICAL_TABLES_UIA[part].roll(@randomizer, over_damage)
163
+ end
141
164
  end
142
165
 
143
166
  class CriticalTable
@@ -261,6 +284,127 @@ module BCDice
261
284
  ),
262
285
  }.freeze
263
286
 
287
+ class CriticalTable_UIA
288
+ def initialize(name, items)
289
+ @name = name
290
+ @items = items
291
+ end
292
+
293
+ def roll(randomizer, over_damage)
294
+ dice = randomizer.roll_once(100)
295
+ if over_damage
296
+ dice = (dice + (over_damage * 10)).clamp(1, 1000)
297
+ end
298
+
299
+ chosen = @items.find { |key, _| key >= dice }[1]
300
+
301
+ "#{@name}(#{dice}) > #{chosen}"
302
+ end
303
+ end
304
+
305
+ CRITICAL_TABLES_UIA = {
306
+ "H" => CriticalTable_UIA.new(
307
+ "頭部CT表(武器を掲げよ)",
308
+ [
309
+ [3, '勲章となる傷:浅手:「出血状態」1つを得る。社交系テストSL+1(累積なし)。'],
310
+ [6, '朦朧化打撃:耐久値-1:「朦朧状態」1つを得る。'],
311
+ [9, '眼窩の負傷:耐久値-1:「目がくらんだ状態」1つを得る。'],
312
+ [15, '耳朶への強打:耐久値-1:「耳鳴り状態」1つを得る。'],
313
+ [20, '小さな裂傷:耐久値-1:「出血状態」1つを得る。'],
314
+ [25, '眼の周りの青あざ:耐久値-2:「目がくらんだ状態」2つを得る。'],
315
+ [30, '耳朶の裂傷:耐久値-2:「出血状態」2つに加えて、「耳鳴り状態」1つを得る。'],
316
+ [35, '額への一打:耐久値-2:「出血状態」2つに加えて「目がくらんだ状態」1つを得る。なお後者は「出血状態」を取り除いた後でなければ取り除けない。'],
317
+ [40, '顎骨折:耐久値-2:「朦朧状態」2つを得る。さらに「骨折(軽度)」の負傷を得る。'],
318
+ [45, '眼窩の大怪我:耐久値-3:「出血状態」2つを得る。さらに「目がくらんだ状態」1つも得て、こちらは「治療行為」を受けない限り回復できない。'],
319
+ [50, '耳朶の大怪我:耐久値-3:片耳の聴力を失う。聴覚に関するテストに-20。この効果をもう一度受けた場合、永続的な聴覚喪失者となる。これは魔法でしか治療できない。'],
320
+ [55, '鼻砕き:耐久値-3:「出血状態」2つを得る。「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したら「朦朧状態」1つも得る。社交系テストに+1/-1。'],
321
+ [60, '顎粉砕:耐久値-3:「朦朧状態」3つを得る。「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したら「気絶状態」を得る。「骨折(重度)」の負傷を得る。'],
322
+ [65, '耳が屑肉に:耐久値-4:「耳鳴り状態」3つに加えて「出血状態」2つを得る。片耳の機能を失う。「身体欠損(普通)」を被る。'],
323
+ [75, '口粉砕:耐久値-4:「出血状態」2つを得る。1d10本の歯が失われる。「身体欠損(容易)」を被る。'],
324
+ [80, '脳震盪:耐久値-4:「出血状態」2つと「耳鳴り状態」1つに加えて1d10の「朦朧状態」を得る。さらに1d10日間継続する「疲労状態」1つも得る。この「疲労状態」継続中に頭部への「致命的負傷」を再度得たなら、「普通(+20)」の〈肉体抵抗〉テストを行い、失敗したなら追加で「気絶状態」になる。'],
325
+ [85, '眼球破裂:耐久値-5:「目がくらんだ状態」3つと、「出血状態」2つ、「朦朧状態」1つを得る。片目の機能を失う。「身体欠損(難しい)」を被る。'],
326
+ [94, '顔が化け物のように:耐久値-5:「出血状態」3つ「目がくらんだ状態」3つ、「朦朧状態」2つを得る。片目の機能を失い、鼻梁も失う。「身体欠損(多難)」を被る。'],
327
+ [99, '顎が屑肉に:耐久値-5:「出血状態」4つと「朦朧状態」3つを得る。「超多難(-30)」な〈肉体抵抗〉テストを行い、失敗したら「気絶状態」になる。「骨折(重度)」の負傷を得て、舌と1d10本の歯を失う。「身体欠損(多難)」を被る。'],
328
+ [1000, '頭蓋骨粉砕:即死:'],
329
+ ]
330
+ ),
331
+ "A" => CriticalTable_UIA.new(
332
+ "腕部CT表(武器を掲げよ)",
333
+ [
334
+ [10, '手首が揺さぶられる:浅手:手に持っているものを落としてしまう。'],
335
+ [20, '腕痺れ:浅手:手に持っているものを落としてしまう。その腕は1d10-【頑健力】ボーナスのラウンド(最低1)に渡り使えない。その期間中、その手は失われたものとして扱う。'],
336
+ [25, '小さな裂傷:耐久値-1:「出血状態」1つを得る。'],
337
+ [40, '捻挫:耐久値-1:「筋断裂(軽度)」の負傷を得る。'],
338
+ [45, '筋断裂:耐久値-1:「出血状態」1つと、「筋断裂(軽度)」の負傷を得る。'],
339
+ [50, '手の出血:耐久値-1:「出血状態」1つを得る。その手で何かを握る「アクション」を行う場合、先立って「普通(+20)」の【器用度】テストを行い、失敗したら取り落としてしまう。'],
340
+ [55, '肩の捻挫:耐久値-2:手に持っているものを落としてしまい、その腕は1d10ラウンドに渡って使えなくなる。'],
341
+ [60, '大きな傷口:耐久値-2:「出血状態」2つを得る。傷口を縫う「手術」を受ける前に同じ腕にダメージを受けた場合、傷口が開き「出血状態」1つを追加で得る。'],
342
+ [75, '単純骨折:耐久値-2:手に持っているものを落としてしまい、「骨折(軽度)」の負傷を得る。「難しい(-10)」〈肉体抵抗〉テストを行い、失敗したなら「朦朧状態」1つを得る。'],
343
+ [80, '靱帯断裂:耐久値-2:手に持っているものを落としてしまい、「筋断裂(重度)」の負傷を得る。'],
344
+ [85, '深手:耐久値-3:「出血状態」2つを得る。「朦朧状態」1つを得て、「筋断裂(軽度)」の負傷を得る。「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「気絶状態」になる。'],
345
+ [90, '肘粉砕:耐久値-3:手に持っているものを落としてしまい、「筋断裂(重度)」の負傷を得る。'],
346
+ [95, '動脈破損:耐久値-3:「出血状態」4つを得る。「手術」を受ける前に同じ腕にダメージを受けるたびに「出血状態」2つを得る。'],
347
+ [109, '肩の脱臼:耐久値-4:「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「朦朧状態」1つを得て「伏せ状態」になる。手に持っているものを落としてしまう。その腕を使うことはできず、欠損したものとして扱う。さらに「治療行為」を受けるまでの間「朦朧状態」1つを得る。'],
348
+ [115, '指切断:耐久値-4:「身体欠損(普通)」を被る。「出血状態」1つを得る。'],
349
+ [120, '手の半切断:耐久値-4:指一本を失い、「身体欠損(多難)」を被る。「出血状態」2つと「朦朧状態」1つを得る。君が「治療行為」を受けるまでの以降の各ラウンドに指を一本ずつ失う。すべての指を失ったら、その手の機能を失い「身体欠損(難しい)」を得る。'],
350
+ [125, '力こぶがズタズタに:耐久値-5:手に持っていたものを落とすとともに「筋断裂(重度)」の負傷を得て、「出血状態」2つと「朦朧状態」1つを得る。'],
351
+ [130, '片手が屑肉同然に:耐久値-5:その手の機能を失い、「身体欠損(多難)」を被る。「出血状態」2つを得る。「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「気絶状態」になる。'],
352
+ [135, '靱帯断裂:耐久値-5:腕は無用の長物と化す―「身体欠損(超多難)」を被る。「出血状態」3つ、「朦朧状態」1つを得て、「伏せ状態」になる。「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「気絶状態」になる。'],
353
+ [1000, '残酷な腕の喪失:即死:'],
354
+ ]
355
+ ),
356
+ "B" => CriticalTable_UIA.new(
357
+ "胴体CT表(武器を掲げよ)",
358
+ [
359
+ [10, '息ができない:浅手:「朦朧状態」1つを得る。「普通(+20)」の〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」になる。また、1d10ラウンドに渡って「移動力」が半分になる。'],
360
+ [20, 'ただのかすり傷だって!:耐久値-1:「出血状態」1つを得る。'],
361
+ [25, 'みぞおちへの一打:耐久値-1:「朦朧状態」1つを得る。「容易(+40)」な〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」になる。'],
362
+ [30, '下腹部に直撃!:耐久値-1:「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「朦朧状態」3つを得る。'],
363
+ [35, '背中を捻じる:耐久値-1:「筋断裂(軽度)」の負傷を得る。'],
364
+ [40, '肋骨に青あざ:耐久値-2:1d10日間に渡って【敏捷力】に関連するテストに-10。'],
365
+ [45, '鎖骨捻じれ:耐久値-2:左右どちらの鎖骨かランダムに決定する。そちらの手に持っている物を落としてしまい、1d10ラウンドに渡ってその腕は使用できない。'],
366
+ [50, '裂傷:耐久値-2:「出血状態」2つを得る。'],
367
+ [55, '肋骨にひびが:耐久値-3:「朦朧状態」1つを得る。また、「骨折(軽度)」の負傷を得る。'],
368
+ [60, '大きな傷口:耐久値-3:「出血状態」3つを得る。「手術」を受けるまでの間、胴体に命中を受けるたびに追加で1つの「出血状態」を得る。'],
369
+ [65, '激痛を伴う裂傷:耐久値-3:「出血状態」2つと「朦朧状態」1つを得る。「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「気絶状態」になる。またSL+4以上でテストに成功していない限り、金切り声を上げてしまう。'],
370
+ [70, '動脈損傷:耐久値-3:「出血状態」4つを得る。「手術」を受けるまでの間、胴体に攻撃を受けるたびに追加で2つの「出血状態」を得る。'],
371
+ [75, '背筋断裂:耐久値-4:「筋断裂(重度)」の負傷を得る。'],
372
+ [80, '股関節骨折:耐久値-4:「朦朧状態」1つを得る。「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」にもなる。「骨折(軽度)」の負傷を得る。'],
373
+ [85, '胸郭の大怪我:耐久値-4:「出血状態」4つを得る。「手術」を受けるまでの間、胴体に命中を受けるたびに追加で2つの「出血状態」を得る。'],
374
+ [90, '内臓の損傷:耐久値-4:「膿み傷」に罹患し、「出血状態」2つを得る。'],
375
+ [95, '胸郭粉砕:耐久値-5:「朦朧状態」1つを得る。これは「治療行為」を受けない限り取り除くことは出来ない。さらに「骨折(重度)」の負傷を得る。'],
376
+ [110, '鎖骨粉砕:耐久値-5:「気絶状態」になる。これは「治療行為」を受けない限り取り除くことは出来ない。さらに「骨折(重度)」の負傷を得る。'],
377
+ [115, '内臓出血:耐久値-5:「出血状態」1つを得る。これは「手術」を受けない限り取り除くことは出来ない。さらに「血液腐れ病」に罹患する。'],
378
+ [1000, '胴部両断:即死:'],
379
+ ]
380
+ ),
381
+ "L" => CriticalTable_UIA.new(
382
+ "脚部CT表(武器を掲げよ)",
383
+ [
384
+ [10, '爪先をぶつける:浅手:「普通(+20)」の〈肉体抵抗〉テストを行い、失敗したなら次のターンの終了時まで【敏捷力】に関するテストに-10。'],
385
+ [20, '足がかりを失う:浅手:「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」になる。'],
386
+ [25, '足首の捻挫:耐久値-1:以降1d10ラウンドに渡って【敏捷力】に関連するテストに-10。'],
387
+ [40, '小さな裂傷:耐久値-1:「出血状態」1つを得る。'],
388
+ [45, '太腿への打撃:耐久値-1:「出血状態」1つを得て「普通(+20)」の〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」になる。'],
389
+ [50, '足首の筋断裂:耐久値-1:「筋断裂(軽度)」の負傷を得る。'],
390
+ [55, '膝の捻挫:耐久値-2:以降1d10ラウンドに渡って【敏捷力】に関連するテストに-20。'],
391
+ [60, '爪先のひどい裂傷:耐久値-2:「出血状態」1つを得る。「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したなら片方の爪先を失う―「身体欠損(普通)」を被る。'],
392
+ [65, 'ひどい裂傷:耐久値-2:「出血状態」2つを得る。「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」になる。'],
393
+ [70, '膝のひどい捻挫:耐久値-3:「筋断裂(重度)」の負傷を得る。'],
394
+ [80, '太腿への深手:耐久値-3:「出血状態」3つを得る。「手強い(+0)」〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」になる。「手術」を受けるまでの間、この脚に命中を受けるたびに、追加で1つの「出血状態」を得る。'],
395
+ [75, '脚への痛打:耐久値-3:「伏せ状態」に加えて「出血状態」2つを得て、「骨折(軽度)」の負傷を得る。さらに「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「朦朧状態」1つを追加で得る。'],
396
+ [85, '靱帯断裂:耐久値-3:「伏せ状態」に加えて「朦朧状態」1つを得る。「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「気絶状態」になる。君のその脚は使えなくなる。'],
397
+ [90, '脛への深手:耐久値-4:敵の武器が君の膝下に当たり、骨に食い込んで腱を切断する。「朦朧状態」1つを得て、「伏せ状態」になる。さらに「筋断裂(重度)」と「骨折(軽度)」の負傷を得る。'],
398
+ [95, '膝粉砕:耐久値-4:「出血状態」1つと「朦朧状態」1つを得ることに加えて、「伏せ状態」になる。「骨折(重度)」の負傷を得る。'],
399
+ [105, '膝関節脱臼:耐久値-4:「伏せ状態」になる。「多難(-20)」な〈肉体抵抗〉テストを行い、失敗したなら「朦朧状態」1つを得る。これは「治療行為」を受けない限り取り除くことができない。'],
400
+ [115, '脚粉砕:耐久値-4:「普通(+20)」の〈肉体抵抗〉テストを行い、失敗したなら「伏せ状態」を得て、足の指1本を失う。さら、SLが-1あるごとに追加で1つの足指を失う―「身体欠損(普通)」を被る。「出血状態」2つを得る。'],
401
+ [120, '足切断:耐久値-5:「身体欠損(多難)」を被る。「出血状態」3つと「朦朧状態」2つを得て「伏せ状態」になる。'],
402
+ [125, 'アキレス腱切断:耐久値-5:苦痛に金切り声を上げながら倒れる。「出血状態」2つと「朦朧状態」2つを得て「伏せ状態」になる。「身体欠損(超多難)」を被る。'],
403
+ [1000, '骨盤粉砕:即死:'],
404
+ ]
405
+ ),
406
+ }.freeze
407
+
264
408
  # 命中判定
265
409
  def roll_attack(command)
266
410
  m = /^WH(\d+)$/.match(command)
@@ -449,6 +593,58 @@ module BCDice
449
593
  [96..100, 'エーテルの逆流:君の【意志力】ボーナス×1ヤード以内にいるすべての者は──敵も味方も同様に──(【頑健力】ボーナスとアーマー・ポイント〔AP〕を無視して)1d10点の「耐久値」を失い、さらに「伏せ状態」になる。射程内に目標が存在しなければ、魔法は行き場を失い、君の頭は爆発し、君は即死する。'],
450
594
  ]
451
595
  ),
596
+ "WOMMIT" => DiceTable::RangeTable.new(
597
+ "小誤発動表(Winds of Magic)",
598
+ "1D100",
599
+ [
600
+ [1..5, '魔女の印:1マイル以内で次に新たに生まれたクリーチャー1体が混沌変異する。'],
601
+ [6..10, '酸っぱいミルク:1d100ヤード以内のすべてのミルクが即座に酸っぱくなる。'],
602
+ [11..15, '立ち枯れ:君の【意志力】ボーナス×1 マイル以内の農場が立ち枯れの病にかかり、すべての穀物が一夜のうちに腐れてしまう。'],
603
+ [16..20, '耳垢閉塞:君の耳が即座に分厚い耳垢で詰まってしまう。「耳鳴り状態」1つを得る。誰かが君に耳掃除してくれない限りこれを取り除くことはできない(〈治療〉技能を用いてテストに成功しなければならない)。'],
604
+ [21..25, '凍える吐息:君の周囲の気温が急降下し、人の吐息が白くなる。君から【意志力】ボーナス×1 マイル以内の者は全員手強い (+0) 〈肉体抵抗〉テストに成功しなければ急激な寒さにより、その場を離れない限り【射撃技術度】、【敏捷力】、【器用度】テストに–10の修正を受ける。この効果は1分間継続する。'],
605
+ [26..30, '結び目ほどき:君の「所持品」のあらゆる留め金が外れ、あらゆる紐の結び目がほどけてしまう。ベルトはずり落ち、ポーチは開き、バッグは落ち、鎧も外れてしまうのだ。'],
606
+ [31..35, '気まぐれな装い:君の衣服が自分の意志を持っているかのように振る舞う。「組み付かれた状態」1つを得る。これに抵抗するための【筋力】は1d10×5となる。'],
607
+ [36..40, '節制の呪い:1d100ヤード以内のすべての酒が苦くて臭いひどい味になる。オールド・ワールドの酒場の多くでなぜ呪文詠唱が好まれないのか、その理由の一助である。'],
608
+ [41..45, '鼻につく言葉:1d10ラウンドにわたって、すべての〈言語〉テスト(発動テストも含む)に-10のペナルティを被る。'],
609
+ [46..50, '困惑する:戦闘に参加しているなら、「不意を討たれた状態」になる。それ以外の場合、君は完全にびくついてしまい、心はあたふたとし、ほんの片時も集中することができなくなる。'],
610
+ [51..55, '不浄なる幻視:穢らわしく不浄な行為の幻視が浮かび上がり君を悩ませる。「目がくらんだ状態」1つを得る。「手強い」(+0)〈冷静さ〉テストを行ない、失敗したなら、さらに1つの同「状態」を得る。'],
611
+ [56..60, '魔女の目:君の目が1d10時間にわたって、自分の「魔法体系」に関連した不自然な色に変わる。目の色が変わっている間、君はいかなる手段でも取り除くことができない「目がくらんだ状態」1つを得る。君はこの期間、《魔法感知》と《第二の視覚》異能を使用できなくなる。'],
612
+ [61..65, '破裂:君の鼻、目、耳からおびただしく出血する。1d10個の「出血状態」を得る。'],
613
+ [66..70, '地獄の囁き:GMは印表(p.45)から反転の印を二つ選んでもよい。「普通」(+20)の【意志力】テストを行ない、失敗したなら「堕落ポイント」1点を得る。'],
614
+ [71..75, '恐怖!:君は混沌の領域を忌まわしき瞬く間にいくつも幻視し、それに苛まれる。GMは反転の印を「印表」(p.45)から1つ選んでもよい。「多難」(-20)な〈冷静さ〉テストを行ない、失敗したなら「戦意喪失状態」1つを得る。'],
615
+ [76..80, '堕落の呪い:「堕落ポイント」1点を得る。'],
616
+ [81..85, '腸内大暴動:君はお腹の不調を抑えきれず、粗相してしまう。「疲労状態」1つを得るが、これは君が衣服を取り替え、身体を綺麗にするまで取り除くことができない。'],
617
+ [86..90, '魔法の刻印:君は自身が扱う魔力の風の物理的な印を具現する。ハイシュの印ならp.58、シャモンの印ならp.70、グューランの印ならp.82、アズィルの印ならp.94、ウルグの印ならp.106、シャイシュの印ならp.118、アキュシーの印ならp.130、ガウルの印ならp.142を参照せよ。魔法印表のいずれも君の魔法的な背景に合わないか、すでに具現した印を得るなら、『大誤発動表』でもう一度ロールすること。'],
618
+ [91..95, '倍増する不幸:この表を2回ロールする。91〜100が出た場合には再ロールをすること。'],
619
+ [96..100, 'ほとばしる混沌:『大誤発動表』でもう一度ロールすること。'],
620
+ ]
621
+ ),
622
+ "WOMMAT" => DiceTable::RangeTable.new(
623
+ "大誤発動表(Winds of Magic)",
624
+ "1D100",
625
+ [
626
+ [1..5, '亡霊の声:【意志力】×1ヤード以内のすべての者が“混沌の領域”から現れた暗く誘惑的な囁き声を耳にする。知性のあるクリーチャーは皆、「普通」(+20)の〈冷静さ〉テストを行ない、失敗したなら、「堕落ポイント」1点を得る。'],
627
+ [6..10, 'エーテルの衝撃:君は、【頑健力】ボーナスとアーマー・ポイント〔AP〕による修正値を無視して、1d10点の「耐久値」を失う。さらに、「普通」(+20)の〈肉体抵抗〉テストを行ない、失敗したなら、「朦朧状態」1つも得る。'],
628
+ [11..15, '死の歩み:君の足跡はその行く手に死を残していく。次の1d10時間にわたって、君の周囲のあらゆる植物は枯れ死に果てる。'],
629
+ [16..20, '二重の災難:君が発動した呪文の効果は1d10マイル以内の他の場所で発生する。そこでどのような結果が起こるかはGMの裁定によるが、可能な限り影響があるべきだ。'],
630
+ [21..25, '魂の火:君は自分の「魔法体系」に関連した色の不浄な炎に取り巻かれ、「炎上状態」1つを得る。'],
631
+ [26..30, '抑えの効かぬ舌:君は1d10ラウンドにわたって、わけのわからないことを喋りまくる。この間、君は言葉による意思疏通ができず、あらゆる発動テストを行なうこともできないが、それ以外は通常通り行動してもよい。'],
632
+ [31..35, '群れの襲撃:君はエーテル体のラット、ジャイアント・スパイダー、スネーク、その他(GM の任意)の群れに囲まれる。関連するクリーチャー種別の通常プロフィールに「群れ」の「クリーチャー特徴」を加えて用いること。1d10ラウンドの終了後に、まだ倒されていなければその群れは撤退する。'],
633
+ [36..40, '布人形:君はランダムな方向に1d10ヤード空中に投げ飛ばされ、地面に落ちて1d10点の「耐久値」を失い(アーマー・ポイント〔AP〕は無視する)、さらに「伏せ状態」になる。'],
634
+ [41..45, '凍りつく四肢:四肢のひとつ(ランダムに決定する)が1d10ラウンドにわたって動かなくなる。この四肢はまるで「身体欠損」(P.180を参照)になったかのように使い物にならない。'],
635
+ [46..50, '闇の目:君は1d10時間にわたって、《第二の視覚》の異能の利益を失う。この時間中、君は〈魔風交信〉テストにも-20のペナルティを被る。'],
636
+ [51..55, '混沌の先見:1d10点ぶんの「幸運ポイント」の余剰プールを得る(これは通常の上限を超えても構わない)。君が「幸運ポイント」を1点消費するたびに、「堕落ポイント」を1点獲得する。なお、セッションの終了時に残存している追加で得たポイントはすべて失われる。GMは君の【意志力】ボーナスと等しい数の反転の印(p.45)を君に与える。'],
637
+ [56..60, '浮遊:君は“魔力の風”に乗り、1d10分にわたって地上から1d10ヤードの高さに浮かび上がる。他のキャラクターたちが君を無理やり動かすこともできるし、君も呪文や翼などを使って移動することもできるが、そのままにしておくと君が浮かんだ位置に常に戻ってくる。「浮遊」が終了した後に何が起こるかについては、「落下」(P.166)を参照のこと。'],
638
+ [61..65, '吐き気:君は吐き気が抑えきれなくなり、君の体内にあった量以上の、悪臭を放つ汚物を吐きちらす。「朦朧状態」1つを得る。これは1d10ラウンドにわたって持続する。'],
639
+ [66..70, '混沌の地震:1d100ヤード以内にいるすべてのクリーチャーは「普通」(+20)の〈運動〉テストを行ない、失敗したなら、「伏せ状態」になる。'],
640
+ [71..75, '忘却:発動しようとした呪文が君の記憶から喪失する。君がもしその呪文を記憶していたなら、思い出すことができず、再度記憶せねばならない。魔導書から発動していたなら、呪文が書かれていたページが発火する。呪文は失われ、適切な処置をすぐに行わなければ、魔導書が「炎上状態」1つを得る。'],
641
+ [76..80, '裏切り:暗黒の神々が恐るべき背信を行なうよう君を誘惑する。君が味方の1人に対する攻撃か、その他何らかの裏切り行為に全力を尽くしたなら、「幸運ポイント」をすべて回復できる。君が他のキャラクターに「運命点」1点を失わせたなら、君がその1点の「運命点」を得る。'],
642
+ [81..85, '穢らわしい弱体化:1点の「堕落ポイント」に加えて、「疲労状態」1つを獲得し、さらに「伏せ状態」にもなる。'],
643
+ [86..90, '凄まじき悪臭:いまや君は鼻が曲がりそうなまでに臭い!君は「攪乱」の「クリーチャー特徴」(P.338)を獲得し、おそらく嗅覚を持つ誰彼すべてからの敵意にさらされる。この効果は1d10時間持続する。'],
644
+ [91..95, '力の流出:君は1d10分にわたって、呪文を発動するために使う異能を使用することができない(通常は《秘術魔術》だが、《混沌魔術》や同種の異能ということもありえる)。'],
645
+ [96..100, 'エーテルの逆流:君の【意志力】ボーナス×1ヤード以内にいるすべての者は──敵も味方も同様に──(【頑健力】ボーナスとアーマー・ポイント〔AP〕を無視して)1d10点の「耐久値」を失い、さらに「伏せ状態」になる。射程内に目標が存在しなければ、魔法は行き場を失い、君の頭は爆発し、君は即死する。'],
646
+ ]
647
+ ),
452
648
  }.freeze
453
649
  end
454
650
  end
@@ -22,21 +22,21 @@ module BCDice
22
22
  2WAF6+3
23
23
  2WAI9R3
24
24
 
25
- 難易度指定:成功数のカウント、判定成功と失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failure、Critical Winのチェックを行う
25
+ 難易度指定:達成数のカウント、判定成功と失敗、(Rageダイスがある場合)Brutal outcome、クリティカル処理、完全失敗/Total Failure、クリティカル成功のチェックを行う
26
26
  例) (難易度)WAF(通常ダイス)+(Rageダイス)
27
27
  (難易度)WAF(通常ダイス)
28
28
  (難易度)WAI(通常ダイス)R(Rageダイス)
29
29
  (難易度)WAI(通常ダイス)
30
30
 
31
- 難易度省略:成功数のカウント、判定失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failureのチェックを行う
31
+ 難易度省略:達成数のカウント、判定失敗、(Rageダイスがある場合)Brutal outcome、クリティカル処理、完全失敗のチェックを行う
32
32
  判定成功チェックを行わない
33
- Critical Winのヒントを出力
33
+ クリティカル成功/Critical Winのヒントを出力
34
34
  例) WAF(通常ダイス)+(Rageダイス)
35
35
  WAF(通常ダイス)
36
36
  WAI(通常ダイス)R(Rageダイス)
37
37
  WAI(通常ダイス)
38
38
 
39
- 難易度0指定:Critical処理と成功数のカウントを行い、全てのチェックを行わない
39
+ 難易度0指定:クリティカル処理と達成数のカウントを行い、全てのチェックを行わない
40
40
  例) 0WAF(通常ダイス)+(Rageダイス)
41
41
  0WAF(通常ダイス)
42
42
  0WAI(通常ダイス)+(Rageダイス)
@@ -57,15 +57,12 @@ module BCDice
57
57
  register_prefix('\d*(WAF|(WAI\d*(R\d?)?))')
58
58
 
59
59
  def eval_game_system_specific_command(command)
60
- m = /\A(\d+)?(((WAF)(\d+)(\+(\d+))?)|((WAI)(\d+)(R(\d+))?))$/.match(command)
60
+ m = /\A(\d+)?(((WAF)(-?\d+)(\+(\d+))?)|((WAI)(-?\d+)(R(\d+))?))$/.match(command)
61
61
  unless m
62
62
  return ''
63
63
  end
64
64
 
65
65
  dice_pool, rage_dice_pool = get_dice_pools(m)
66
- if dice_pool < 0
67
- return "ダイスプール0のときにRageダイスは指定できません。"
68
- end
69
66
  if rage_dice_pool > 5
70
67
  return "5を超えるRageダイス指定はできません。"
71
68
  end
@@ -102,6 +99,10 @@ module BCDice
102
99
  # Rage Diceを内数処理するの場合
103
100
  rage_dice_pool = m[RAGE_DICE_INCLUDED_INDEX].nil? ? -1 : m[RAGE_DICE_INCLUDED_INDEX].to_i
104
101
  dice_pool_value = m[DICE_POOL_RAGE_DICE_INCLUDED_INDEX].to_i
102
+ if dice_pool_value <= 0
103
+ # ダイスプールが0のとき、最低保証ダイスプールであるダイスプール1にする
104
+ dice_pool_value = 1
105
+ end
105
106
  dice_pool = dice_pool_value - (rage_dice_pool < 0 ? 0 : rage_dice_pool)
106
107
  if dice_pool_value > 0 && rage_dice_pool >= dice_pool_value
107
108
  # 1 以上のダイスプール、かつ、Rageダイスがダイスプール以上のとき、ダイスプールが全てRageダイスになる。
@@ -112,6 +113,10 @@ module BCDice
112
113
  # Rage DiceがPLによる内数指定の場合
113
114
  rage_dice_pool = m[RAGE_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[RAGE_DICE_NO_INCLUDED_INDEX].to_i
114
115
  dice_pool = m[DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX].to_i
116
+ if dice_pool <= 0 && rage_dice_pool <= 0
117
+ # ダイスプールとrageダイスどちらも0指定のとき、最低保証ダイスプールである1ダイスプールにする
118
+ dice_pool = 1
119
+ end
115
120
  end
116
121
  return dice_pool, rage_dice_pool
117
122
  end
@@ -121,35 +126,35 @@ module BCDice
121
126
 
122
127
  if brutal_outcome > 0 && difficulty != 0
123
128
  success_dice += 4
124
- result_text = "#{result_text} [Brutal outcome] 自動失敗、または 成功数=#{success_dice}"
129
+ result_text = "#{result_text} [Brutal outcome] 自動失敗、または 達成数=#{success_dice}"
125
130
  else
126
- result_text = "#{result_text} 成功数=#{success_dice}"
131
+ result_text = "#{result_text} 達成数=#{success_dice}"
127
132
  end
128
133
 
129
134
  if difficulty > 0
130
135
  result_text = "#{result_text} 難易度=#{difficulty}"
131
136
  if success_dice >= difficulty
132
- result_text = "#{result_text} 差分=#{success_dice - difficulty}"
137
+ result_text = "#{result_text} 上回り=#{success_dice - difficulty}"
133
138
 
134
139
  if is_critical
135
- result_data = Result.critical("#{result_text}:判定成功! [Critical Win]")
140
+ result_data = Result.critical("#{result_text}:判定成功! [クリティカル成功/Critical Win]")
136
141
  return brutal_outcome > 0 ? result_data.text : result_data
137
142
  end
138
143
  result_data = Result.success("#{result_text}:判定成功!")
139
144
  return brutal_outcome > 0 ? result_data.text : result_data
140
145
  else
141
146
  if success_dice == 0
142
- return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
147
+ return Result.fumble("#{result_text}:判定失敗! [完全失敗/Total Failure]")
143
148
  else
144
149
  return Result.failure("#{result_text}:判定失敗!")
145
150
  end
146
151
  end
147
152
  elsif difficulty < 0
148
153
  if success_dice == 0
149
- return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
154
+ return Result.fumble("#{result_text}:判定失敗! [完全失敗/Total Failure]")
150
155
  else
151
156
  if is_critical
152
- result_text = "#{result_text}\n 判定成功なら [Critical Win]"
157
+ result_text = "#{result_text}\n 判定成功なら [クリティカル成功/Critical Win]"
153
158
  end
154
159
  return result_text.to_s
155
160
  end