bcdice 3.16.1 → 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 (149) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -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/Dracurouge/ko_kr.yml +1284 -205
  15. data/i18n/Emoklore/ja_jp.yml +1 -0
  16. data/i18n/Emoklore/ko_kr.yml +1 -0
  17. data/i18n/FutariSousa/ja_jp.yml +70 -0
  18. data/i18n/FutariSousa/ko_kr.yml +157 -0
  19. data/i18n/HatsuneMiku/ja_jp.yml +579 -0
  20. data/i18n/HatsuneMiku/ko_kr.yml +579 -0
  21. data/i18n/Irisbane/ja_jp.yml +27 -0
  22. data/i18n/Irisbane/ko_kr.yml +27 -0
  23. data/i18n/JuinKansen/ja_jp.yml +168 -0
  24. data/i18n/JuinKansen/ko_kr.yml +168 -0
  25. data/i18n/KemonoNoMori/ja_jp.yml +229 -0
  26. data/i18n/KemonoNoMori/ko_kr.yml +229 -0
  27. data/i18n/KizunaBullet/ko_kr.yml +653 -0
  28. data/i18n/MagicPunk/ja_jp.yml +5 -0
  29. data/i18n/MagicPunk/ko_kr.yml +5 -0
  30. data/i18n/MorkBorg/ja_jp.yml +34 -0
  31. data/i18n/MorkBorg/ko_kr.yml +34 -0
  32. data/i18n/Nechronica/ko_kr.yml +43 -0
  33. data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
  34. data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
  35. data/i18n/Nuekagami/ja_jp.yml +219 -0
  36. data/i18n/Nuekagami/ko_kr.yml +219 -0
  37. data/i18n/Revulture/ja_jp.yml +8 -0
  38. data/i18n/Revulture/ko_kr.yml +8 -0
  39. data/i18n/SRS/ja_jp.yml +4 -0
  40. data/i18n/SRS/ko_kr.yml +4 -0
  41. data/i18n/ShinobiGami/ja_jp.yml +879 -0
  42. data/i18n/ShinobiGami/ko_kr.yml +876 -0
  43. data/i18n/StarryDolls/ja_jp.yml +456 -0
  44. data/i18n/StarryDolls/ko_kr.yml +456 -0
  45. data/i18n/StratoShout/ja_jp.yml +8 -8
  46. data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
  47. data/i18n/Ventangle/ja_jp.yml +4 -0
  48. data/i18n/Ventangle/ko_kr.yml +4 -0
  49. data/i18n/YearZeroEngine/ja_jp.yml +12 -0
  50. data/i18n/YearZeroEngine/ko_kr.yml +12 -0
  51. data/i18n/ZombiLine/ja_jp.yml +27 -0
  52. data/i18n/ZombiLine/ko_kr.yml +27 -0
  53. data/i18n/ko_kr.yml +2 -0
  54. data/i18n/zh_hant.yml +2 -2
  55. data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
  56. data/lib/bcdice/game_system/Aionia.rb +68 -19
  57. data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
  58. data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
  59. data/lib/bcdice/game_system/Alsetto.rb +63 -50
  60. data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
  61. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
  62. data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
  63. data/lib/bcdice/game_system/BlackJacket.rb +57 -113
  64. data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
  65. data/lib/bcdice/game_system/Bloodorium.rb +1 -1
  66. data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
  67. data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
  68. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
  69. data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
  70. data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
  71. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
  72. data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
  73. data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
  74. data/lib/bcdice/game_system/Emoklore.rb +34 -9
  75. data/lib/bcdice/game_system/Emoklore_Korean.rb +10 -2
  76. data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
  77. data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
  78. data/lib/bcdice/game_system/FutariSousa.rb +37 -12
  79. data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
  80. data/lib/bcdice/game_system/GaiaCare.rb +40 -0
  81. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  82. data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
  83. data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
  84. data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
  85. data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
  86. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
  87. data/lib/bcdice/game_system/Irisbane.rb +17 -30
  88. data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
  89. data/lib/bcdice/game_system/JuinKansen.rb +41 -208
  90. data/lib/bcdice/game_system/JuinKansen_Korean.rb +8 -213
  91. data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
  92. data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
  93. data/lib/bcdice/game_system/KinAriel.rb +117 -0
  94. data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
  95. data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
  96. data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
  97. data/lib/bcdice/game_system/Lost.rb +89 -0
  98. data/lib/bcdice/game_system/MagicPunk.rb +85 -0
  99. data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
  100. data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
  101. data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
  102. data/lib/bcdice/game_system/MorkBorg.rb +170 -0
  103. data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
  104. data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
  105. data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
  106. data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
  107. data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
  108. data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
  109. data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
  110. data/lib/bcdice/game_system/Nuekagami.rb +19 -261
  111. data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
  112. data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
  113. data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
  114. data/lib/bcdice/game_system/PreciousDays.rb +170 -0
  115. data/lib/bcdice/game_system/Revulture.rb +8 -5
  116. data/lib/bcdice/game_system/Revulture_Korean.rb +7 -81
  117. data/lib/bcdice/game_system/Ryutama.rb +46 -46
  118. data/lib/bcdice/game_system/SRS.rb +4 -4
  119. data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
  120. data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
  121. data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
  122. data/lib/bcdice/game_system/StarryDolls.rb +70 -508
  123. data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
  124. data/lib/bcdice/game_system/StratoShout.rb +1 -1
  125. data/lib/bcdice/game_system/SwordWorld.rb +28 -2
  126. data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
  127. data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
  128. data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
  129. data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
  130. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
  131. data/lib/bcdice/game_system/Ventangle.rb +8 -7
  132. data/lib/bcdice/game_system/Ventangle_Korean.rb +6 -95
  133. data/lib/bcdice/game_system/Warhammer4.rb +202 -6
  134. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
  135. data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
  136. data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
  137. data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
  138. data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
  139. data/lib/bcdice/game_system/ZombiLine.rb +29 -36
  140. data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
  141. data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
  142. data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
  143. data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
  144. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
  145. data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
  146. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
  147. data/lib/bcdice/game_system.rb +42 -0
  148. data/lib/bcdice/version.rb +1 -1
  149. metadata +87 -2
@@ -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
@@ -0,0 +1,333 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class WorldEndScrapyard < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'WorldEndScrapyard'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'World End scrapyard'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'わあるとえんとすくらつふやあと'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 WES<=t t:成功率({能力値}+{悪運})
18
+ 能力値は(筋力・敏捷・器用・知識・魅力)のいずれか。
19
+ 成功・失敗・差分値を表示する。
20
+
21
+ 例)WES<=20+10:能力値20,悪運10で判定し、その結果を表示する。
22
+ WES<=30: 悪運30で判定し、その結果を表示する。
23
+
24
+ ■各種表
25
+ ・《変異表》 HEN HENC(任意選択,RoCのC)
26
+ ・《発掘表》 HAK HAKC( 同上 )
27
+ ・《PC/NPC関係性表》 KAN
28
+ ・《シナリオの目的表》 MOK
29
+ ・《シナリオの場所表》 BAS
30
+ ・《登場NPC表》 TOJ
31
+ ・《探索表》 TANx+b (x:レベル,1~5 b:修正+5)
32
+ INFO_MESSAGETEXT
33
+
34
+ register_prefix("WES", "HEN", "HAK", "KAN", "MOK", "BAS", "TOJ", "TAN")
35
+
36
+ def initialize(command)
37
+ super(command)
38
+
39
+ @round_type = RoundType::CEIL
40
+ end
41
+
42
+ def eval_game_system_specific_command(command)
43
+ resolute_action(command) ||
44
+ roll_roc_table(command) ||
45
+ roll_search_table(command) ||
46
+ roll_tables(command, TABLES)
47
+ end
48
+
49
+ private
50
+
51
+ # 技能判定
52
+ # @param [String] command
53
+ # @return [Result]
54
+ def resolute_action(command)
55
+ m = /^WES<=((\d+)([+]\d+)?)/.match(command)
56
+ return nil unless m
57
+
58
+ target =
59
+ if m[1].empty?
60
+ nil
61
+ else
62
+ Arithmetic.eval(m[1], @round_type)
63
+ end
64
+
65
+ if target.nil?
66
+ return nil
67
+ end
68
+
69
+ dice = @randomizer.roll_once(100)
70
+
71
+ return Result.new.tap do |result|
72
+ result.condition = (dice <= target)
73
+ diff = target - dice
74
+
75
+ sequence = [
76
+ "(WES<=#{target})",
77
+ dice.to_s,
78
+ result.success? ? "成功" : "失敗",
79
+ "差分値#{diff}"
80
+ ].compact
81
+
82
+ result.text = sequence.join(" > ")
83
+ end
84
+ end
85
+
86
+ # 変異表
87
+ VARIATION_TABLE = [
88
+ "0:[回復不能]状態になります。",
89
+ "1:[異形]状態になります。",
90
+ "2:[大型]状態になります([小柄]状態だった場合でも)",
91
+ "3: 特に効果はありませんが『外見』を自由に変更させても構いません。",
92
+ "4:《悪運》以外の《能力値》を【2つ】を『ランダム』で選んで、その《能力値》の数値を入れ替えます。",
93
+ "5:《悪運》以外の《能力値》を【2つ】を『任意』で選んで、その《能力値》の数値を入れ替えます。",
94
+ "6: 特に効果はありません。",
95
+ "7:[小柄]状態になります([大型]状態だった場合でも)",
96
+ "8:《悪運》以外の《能力値》【5つ】の数値を【10点単位】で再分配します。",
97
+ "9:[異形]状態を打ち消します。",
98
+ ].freeze
99
+
100
+ # 発掘表
101
+ EXCAVATION_TABLE = [
102
+ "0: なにも発見できなかった。",
103
+ "1:《悪運》を【レベル×3点】減少させる。",
104
+ "2: なにも発見できなかった。",
105
+ "3:《悪運》を【レベル×3点】上昇させる。",
106
+ "4: 何かの『物資・材料?』を発見する(内容はGM/PCで相談する)",
107
+ "5:《煙草》3本分、または《弾薬》3発分のどちらか【1つ】を得る。",
108
+ "6: 壊れた『日用品?』を発見する(内容はGM/PCの相談で決める)",
109
+ "7:《消費アイテム》をランダムで【1つ】を得る。",
110
+ "8: 壊れた『家具類?』を発見する(内容はGM/PCの相談で決める)",
111
+ "9:《装備アイテム》をランダムで【1つ】を得る。",
112
+ ].freeze
113
+
114
+ # 探索表
115
+ SEARCH_TABLE = [
116
+ "06:エネミー:レベル1『スカベンジャー』PC数×1体と遭遇する。",
117
+ "07:なにもなし。",
118
+ "08:エネミー:レベル1『下水ネズミの群れ』PC数×2体と遭遇する。",
119
+ "09:なにもなし。",
120
+ "10:《対抗判定:魅力/成功率35》を行い、勝利時に《発掘表》を1回振る。",
121
+ "11:なにもなし。",
122
+ "12:《行為判定:魅力》の成功時、次回《探索表》の結果に【+5】を加える。",
123
+ "13:なにもなし。",
124
+ "14:《悪運》を【PCのレベル×3点】上昇させる。",
125
+ "15:行商人から【1レベル】までの《消費/装備アイテム》を交換・購入できる。",
126
+ "16:エネミー:レベル2『粗暴な自警団』PC数×1体と遭遇する。",
127
+ "17:なにもなし。",
128
+ "18:エネミー:レベル2『バイオゾンビ』PC数×2体と遭遇する。",
129
+ "19:なにもなし。",
130
+ "20:《対抗判定:知識/成功率40》を行い、勝利時に《発掘表》を1回振る。",
131
+ "21:なにもなし。",
132
+ "22:《行為判定:知識》の成功時、次回《探索表》の結果に【+5】を加える。",
133
+ "23:なにもなし。",
134
+ "24:《悪運》を【PCのレベル×3点】上昇させる。",
135
+ "25:行商人から【3レベル】までの《消費/装備アイテム》を交換・購入できる。",
136
+ "26:エネミー:レベル3『ピットスパイダー』PC数×1体と遭遇する。",
137
+ "27:なにもなし。",
138
+ "28:エネミー:レベル3『バイオグール』PC数×2体と遭遇する。",
139
+ "29:なにもなし。",
140
+ "30:《対抗判定:器用/成功率45》を行い、勝利時に《発掘表》を1回振る。",
141
+ "31:なにもなし。",
142
+ "32:《行為判定:器用》の成功時、次回《探索表》の結果に【+5】を加える。",
143
+ "33:なにもなし。",
144
+ "34:《悪運》を【PCのレベル×3点】上昇させる。",
145
+ "35:行商人から【5レベル】までの《消費/装備アイテム》を交換・購入できる。",
146
+ "36:エネミー:レベル4『暴走オートマトン』PC数×1体と遭遇する。",
147
+ "37:なにもなし。",
148
+ "38:エネミー:レベル4『ネクロソルジャー』PC数×2体と遭遇する。",
149
+ "39:なにもなし。",
150
+ "40:《対抗判定:敏捷/成功率50》を行い、勝利時に《発掘表》を1回振る。",
151
+ ].freeze
152
+
153
+ def roll_roc_table(command)
154
+ m = /^(HEN|HAK)(C)?/.match(command)
155
+ return nil unless m
156
+
157
+ sequence = []
158
+ result_text = ""
159
+ cmd = m[1]
160
+
161
+ target_table = []
162
+ case cmd
163
+ when "HEN"
164
+ sequence.push("変異表")
165
+ target_table = VARIATION_TABLE
166
+ when "HAK"
167
+ sequence.push("発掘表")
168
+ target_table = EXCAVATION_TABLE
169
+ end
170
+
171
+ if m[2].nil?
172
+ result_text = target_table[@randomizer.roll_once(10) - 1]
173
+ else
174
+ roc_table_all = []
175
+ [0..9].each do |i|
176
+ roc_table_all.push(target_table[i])
177
+ end
178
+ result_text = roc_table_all.join("\n")
179
+ end
180
+
181
+ return Result.new.tap do |result|
182
+ sequence.push(result_text)
183
+ result.text = sequence.join(" > ")
184
+ end
185
+ end
186
+
187
+ def roll_search_table(command)
188
+ m = /^(TAN)([1-5])([+]5)?/.match(command)
189
+ return nil unless m
190
+
191
+ sequence = ["探索表"]
192
+ level = m[2].to_i
193
+ mod =
194
+ if m[3].nil?
195
+ 0
196
+ else
197
+ Arithmetic.eval(m[3], @round_type)
198
+ end
199
+ idx = level * 5 + @randomizer.roll_once(10) + mod
200
+ result_text = SEARCH_TABLE[idx - 6]
201
+
202
+ return Result.new.tap do |result|
203
+ sequence.push(result_text)
204
+ result.text = sequence.join(" > ")
205
+ end
206
+ end
207
+ TABLES = {
208
+ "KAN" => DiceTable::RangeTable.new(
209
+ "PC/NPC関係性表",
210
+ "1D10",
211
+ [
212
+ [1, '物心付いた時からの長い幼馴染'],
213
+ [2..3, '旅立った頃からの始まりの仲間'],
214
+ [4..5, 'なにかどうしようもない腐れ縁'],
215
+ [6..7, '既に互いの腕を信用できる同志'],
216
+ [8..9, '未だ相手を良く知らない同業者'],
217
+ [10, 'いま出会ったばかりの仕事相手'],
218
+ ]
219
+ ),
220
+ "MOK" => DiceTable::RangeTable.new(
221
+ "シナリオの目的表",
222
+ "1D100",
223
+ [
224
+ [1..6, '目的の物品を入手する'],
225
+ [7..12, '目的の情報を入手する'],
226
+ [13..18, '目的の人物と接触する'],
227
+ [19..24, '目的の人物を防衛する'],
228
+ [25..30, '目的の人物を救出する'],
229
+ [31..37, '場所を調査・探索する'],
230
+ [38..44, '場所を通過・突破する'],
231
+ [45..51, '場所を制圧・破壊する'],
232
+ [52..58, '場所から脱出する'],
233
+ [59..65, '場所を防衛する'],
234
+ [66..73, '敵目標を討伐する'],
235
+ [74..80, '敵目標を捕獲する'],
236
+ [81..87, '敵目標と和解する'],
237
+ [88..94, '敵目標を追跡する'],
238
+ [95..99, '敵目標から逃走する'],
239
+ [100, 'その他(GMの裁量で決めて良い)'],
240
+ ]
241
+ ),
242
+ "BAS" => DiceTable::RangeTable.new(
243
+ "シナリオの場所表",
244
+ "1D100",
245
+ [
246
+ [1..7, '小規模コミュニティ〈シヴィラツィオ〉が主体。'],
247
+ [8..9, '小規模コミュニティ〈ペルディトゥス〉小種族区分が混在している。'],
248
+ [10, '小規模コミュニティ〈ペルディトゥス:トロウル〉が主体。'],
249
+ [11, '小規模コミュニティ〈ペルディトゥス:オーガ〉が主体。'],
250
+ [12, '小規模コミュニティ〈ペルディトゥス:ゴブ〉が主体。'],
251
+ [13, '小規模コミュニティ〈ペルディトゥス:アドラー〉が主体。'],
252
+ [14, '小規模コミュニティ〈ペルディトゥス:ドヴェルク〉が主体。'],
253
+ [15..19, '小規模コミュニティ〈フラグメンテ・マキナ〉が主体。'],
254
+ [20..24, '小規模コミュニティ〈サバイバーズ〉が主体。'],
255
+ [25..29, '小規模コミュニティ〈チルドレンズ〉が主体。'],
256
+ [30..35, '大規模コミュニティ(すべての種族が混在している)'],
257
+ [36..38, '廃墟〈シヴィラツィオ〉の住居跡など。'],
258
+ [39..41, '廃墟〈ペルディトゥス〉の森林や洞窟。'],
259
+ [42..44, '廃墟〈フラグメンテ・マキナ〉の機械施設。'],
260
+ [45..47, '廃墟〈サバイバーズ〉のバラックやキャンプ跡。'],
261
+ [48..50, '廃墟〈チルドレンズ〉のスラム跡や下水道など。'],
262
+ [51, '遺跡《テックレベル》2(神域の神殿など)'],
263
+ [52..56, '遺跡《テックレベル》3(古代の城塞など)'],
264
+ [57..64, '遺跡《テックレベル》5(廃ビルや研究所など)'],
265
+ [65..69, '遺跡《テックレベル》7(壊れた軌道エレベータなど)'],
266
+ [70, '遺跡《テックレベル》8(墜された恒星間宇宙艦など)'],
267
+ [71..80, '荒野'],
268
+ [81..86, '森林'],
269
+ [87..92, '沼沢'],
270
+ [93..99, '汚染領域(放射能や高密度魔力や生物汚染で汚染されている)'],
271
+ [100, 'その他(GMの裁量で決めて良い)'],
272
+ ]
273
+ ),
274
+ "TOJ" => DiceTable::RangeTable.new(
275
+ "登場NPC表",
276
+ "1D100",
277
+ [
278
+ [1..2, '勇敢な小動物(子犬など)'],
279
+ [3..4, '温厚な乗輓用生物(ロバなど)'],
280
+ [5..6, '何もかも諦めた無気力な孤児'],
281
+ [7..8, '汚染で奇病を抱える賢い子供'],
282
+ [9..10, 'トラウマで言葉を失った無口な子供'],
283
+ [11..12, '暴力しか知らない戦闘狂の野生少年'],
284
+ [13..14, '昔の歌を歌い続ける夢見がちな少女'],
285
+ [15..16, '仲間を守るために戦う熱血漢の少年'],
286
+ [17..18, '物資を溜め込む利己主義な銭ゲバ少女'],
287
+ [19..20, '盗みが得意で小生意気なスラムの少年'],
288
+ [21..22, '人を裏切ることに躊躇しない狡猾な少女'],
289
+ [23..24, '機械いじりが得意な天才メカニック少年'],
290
+ [25..26, '大人を信用せず一人で生き延びる孤独な少女'],
291
+ [27..28, '早く大人にならざるを得なかった冷徹な少年兵'],
292
+ [29..30, '過去の文明に憧れ、古い本を読み漁る知識少女'],
293
+ [31..32, '復讐に燃える元軍人'],
294
+ [33..34, '薬物中毒の荒くれ戦士'],
295
+ [35..36, '冷酷だが仲間思いの傭兵'],
296
+ [37..38, '汚染地帯に潜む孤独な狩人'],
297
+ [39..40, 'カルト教団の狂信な宣教師'],
298
+ [41..42, '医術を独学で身につけた流れ者'],
299
+ [43..44, '金儲けと裏切りが得意な詐欺師'],
300
+ [45..46, '植物栽培に没頭する農業主義者'],
301
+ [47..48, '家族を探し続ける高潔な放浪者'],
302
+ [49..50, '話題を売りさばく胡散臭い情報屋'],
303
+ [51..52, 'コミュニティを守る厳格すぎる保安官'],
304
+ [53..54, '機械やロボットを操る天才エンジニア'],
305
+ [55..56, '奴隷売買を生業とする冷血な奴隷商人'],
306
+ [57..58, '倫理を失ったマッドサイエンティスト'],
307
+ [59..60, 'ロックで人々を鼓舞する放浪の演奏者'],
308
+ [61..62, '酒とギャンブルに溺れる自暴自棄な中年'],
309
+ [63..64, '汚染地帯を探索するトレジャーハンター'],
310
+ [65..66, '美しい外見で人を操るサイコパスな美女'],
311
+ [67..68, '過去の罪に苛まれる贖罪意識の強い戦士'],
312
+ [69..70, 'コミュニティ周辺を操る豪腕フィクサー'],
313
+ [71..72, '戦争の記憶を引きずる老兵'],
314
+ [73..74, '何も信じず虚無的な哲学者'],
315
+ [75..76, '権力欲が強く独裁的な集落支配者'],
316
+ [77..78, '過去の文明の知識を伝える語り部'],
317
+ [79..80, '薬草や民間療法に詳しい薬師の老婆'],
318
+ [81..82, '隠し物資を山ほど持つ強欲な蓄財家'],
319
+ [83..84, '落ちぶれたかつてのカリスマ的預言者'],
320
+ [85..86, '最後の正義を信じる老いた保安官代理'],
321
+ [87..88, 'コミュニティの厳しくも公正な指導者'],
322
+ [89..90, '疲れ果てたが諦めきれない不屈の老婆'],
323
+ [91..92, '汚染に体を蝕まれながらも戦う頑固親父'],
324
+ [93..94, '最高の銃を作る頑固なガンスミスの職人'],
325
+ [95..96, '交易路を熟知した熟練のキャラバン隊長'],
326
+ [97..98, '情報データベースの無機質な対話型AI'],
327
+ [99..100, '古い時空に存在していた高慢な魔法知性'],
328
+ ]
329
+ ),
330
+ }.freeze
331
+ end
332
+ end
333
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/WorldsEndFrontline'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class WorldsEndFrontline_Korean < WorldsEndFrontline
8
+ # ゲームシステムの識別子
9
+ ID = 'WorldsEndFrontline:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '월드 엔드 프론트라인'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:월드 엔드 프론트라인'
16
+
17
+ register_prefix_from_super_class()
18
+
19
+ def initialize(command)
20
+ super(command)
21
+
22
+ @locale = :ko_kr
23
+ end
24
+ end
25
+ end
26
+ end
@@ -196,26 +196,26 @@ module BCDice
196
196
  end
197
197
 
198
198
  def make_result_with_yze(dice_count_text, dice_text)
199
- result_text = "#{dice_count_text} > #{dice_text} 成功数:#{@total_success_dice}"
199
+ result_text = "#{dice_count_text} > #{dice_text} #{translate('YearZeroEngine.success_count')}:#{@total_success_dice}"
200
200
  if @difficulty > 0
201
201
  if @total_success_dice >= @difficulty
202
- return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!")
202
+ return Result.success("#{result_text} #{translate('YearZeroEngine.difficulty')}=#{@difficulty}:#{translate('YearZeroEngine.success_msg')}")
203
203
  else
204
- return Result.failure("#{result_text} 難易度=#{@difficulty}:判定失敗!")
204
+ return Result.failure("#{result_text} #{translate('YearZeroEngine.difficulty')}=#{@difficulty}:#{translate('YearZeroEngine.failure_msg')}")
205
205
  end
206
206
  end
207
207
  return result_text
208
208
  end
209
209
 
210
210
  def make_result_with_myz(dice_count_text, dice_text)
211
- result_text = "#{dice_count_text} > #{dice_text} 成功数:#{@total_success_dice}"
212
- atter_text = "\n出目1:[能力:#{@base_botch_dice},技能:#{@skill_botch_dice},アイテム:#{@gear_botch_dice}) プッシュ可能=#{@push_dice}ダイス"
211
+ result_text = "#{dice_count_text} > #{dice_text} #{translate('YearZeroEngine.success_count')}:#{@total_success_dice}"
212
+ atter_text = "\n#{translate('YearZeroEngine.roll_one')}:[#{translate('YearZeroEngine.ability')}:#{@base_botch_dice},#{translate('YearZeroEngine.skill')}:#{@skill_botch_dice},#{translate('YearZeroEngine.item')}:#{@gear_botch_dice}) #{translate('YearZeroEngine.pushable')}=#{@push_dice}#{translate('YearZeroEngine.dice')}"
213
213
 
214
214
  if @difficulty > 0
215
215
  if @total_success_dice >= @difficulty
216
- return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!#{atter_text}")
216
+ return Result.success("#{result_text} #{translate('YearZeroEngine.difficulty')}=#{@difficulty}:#{translate('YearZeroEngine.success_msg')}#{atter_text}")
217
217
  else
218
- return Result.failure("#{result_text} 難易度=#{@difficulty}:判定失敗!#{atter_text}")
218
+ return Result.failure("#{result_text} #{translate('YearZeroEngine.difficulty')}=#{@difficulty}:#{translate('YearZeroEngine.failure_msg')}#{atter_text}")
219
219
  end
220
220
  end
221
221
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/YearZeroEngine'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class YearZeroEngine_Korean < YearZeroEngine
8
+ # ゲームシステムの識別
9
+ ID = 'YearZeroEngine:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '이어 제로 엔진(Year Zero Engine)'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:이어 제로 엔진(Year Zero Engine)'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・다이스 풀 판정 커맨드(nYZEx+x+x+m)
20
+ (난이도)YZE(능력 주사위 수)+(기능 주사위 수)+(아이템 주사위 수)+(수정치) # (6만 셈함)
21
+ (난이도)YZE(능력 주사위 수)+(기능 주사위 수)+(아이템 주사위 수)-(수정치) # (6만 셈함)
22
+
23
+ ・다이스 풀 판정 커맨드(nMYZx+x+x)
24
+ (난이도)MYZ(능력 주사위 수)+(기능 주사위 수)+(아이템 주사위 수) # (1과 6을 세어 푸시 가능 수 표시)
25
+ (난이도)MYZ(능력 주사위 수)-(기능 주사위 수)+(아이템 주사위 수) # (1과 6을 세어 푸시 가능 수 표시, 기능 마이너스 지정)
26
+
27
+ ※ 난이도, 기능 주사위 수, 아이템 주사위 수는 생략 가능
28
+
29
+ ・스텝 다이스 판정 커맨드(nYZSx+x+m+f)
30
+ (난이도)YZS(능력 주사위 면 수)+(기능 주사위 면 수)+(수정치) # (1, 6을 세어 푸시 가능 수 표시)
31
+ (난이도)YZS(능력 주사위 면 수)+(기능 주사위 면 수)-(수정치) # (1, 6을 세어 푸시 가능 수 표시)
32
+ (난이도)YZS(능력 주사위 면 수)+(기능 주사위 면 수)+(수정치)A # (1, 6을 세어 푸시 가능 수 표시, 유리)
33
+ (난이도)YZS(능력 주사위 면 수)+(기능 주사위 면 수)-(수정치)A # (1, 6을 세어 푸시 가능 수 표시, 유리)
34
+ (난이도)YZS(능력 주사위 면 수)+(기능 주사위 면 수)+(수정치)D # (1, 6을 세어 푸시 가능 수 표시, 불리)
35
+ (난이도)YZS(능력 주사위 면 수)+(기능 주사위 면 수)-(수정치)D # (1, 6을 세어 푸시 가능 수 표시, 불리)
36
+ INFO_MESSAGE_TEXT
37
+
38
+ register_prefix_from_super_class()
39
+
40
+ def initialize(command)
41
+ super(command)
42
+ @locale = :ko_kr
43
+ end
44
+ end
45
+ end
46
+ end
@@ -28,7 +28,7 @@ module BCDice
28
28
  end
29
29
 
30
30
  def eval_game_system_specific_command(command)
31
- return check_action(command) || roll_tables(command, TABLES)
31
+ return check_action(command) || roll_tables(command, self.class::TABLES)
32
32
  end
33
33
 
34
34
  def check_action(command)
@@ -37,9 +37,7 @@ module BCDice
37
37
  .disable_modifier
38
38
  .restrict_cmp_op_to(:<=)
39
39
  parsed = parser.parse(command)
40
- unless parsed
41
- return nil
42
- end
40
+ return nil unless parsed
43
41
 
44
42
  dice_count = parsed.prefix_number || 1
45
43
  target_num = parsed.target_number
@@ -50,6 +48,7 @@ module BCDice
50
48
  is_success = dice_list.any? { |i| i <= target_num }
51
49
  is_critical = dice_list.any? { |i| i <= 5 }
52
50
  is_fumble = dice_list.any? { |i| i >= 96 && i > target_num }
51
+
53
52
  if is_critical && is_fumble
54
53
  is_critical = false
55
54
  is_fumble = false
@@ -57,16 +56,17 @@ module BCDice
57
56
 
58
57
  success_message =
59
58
  if is_success && is_critical
60
- "成功(クリティカル)"
59
+ translate("ZombiLine.success_critical")
61
60
  elsif is_success && is_fumble
62
- "成功(ファンブル)"
61
+ translate("ZombiLine.success_fumble")
63
62
  elsif is_success
64
- "成功"
63
+ translate("ZombiLine.success")
65
64
  elsif is_fumble
66
- "失敗(ファンブル)"
65
+ translate("ZombiLine.failure_fumble")
67
66
  else
68
- "失敗"
67
+ translate("ZombiLine.failure")
69
68
  end
69
+
70
70
  sequence = [
71
71
  "(#{parsed})",
72
72
  "[#{dice_list.join(',')}]",
@@ -81,33 +81,26 @@ module BCDice
81
81
  end
82
82
  end
83
83
 
84
- TABLES = {
85
- 'SST' => DiceTable::Table.new(
86
- 'ストレス症状表',
87
- '1D10',
88
- [
89
- '憤怒:一番近い敵を攻撃(成功率+20%)しにいきます。近くに敵がいない場合、誰かのストレスを+1させます。 頭に血が上り、誰かに怒りをぶつけます。',
90
- '逃避:落下してでも敵から逃げるように移動します。周囲に敵が居ない場合、現実逃避します。 耐えられなくなり、逃げ出します。',
91
- '幻覚:戦闘中は、「行動放棄(全AP)」します。戦闘以外なら、幻覚を見て笑います。 自分が望む幻覚が見えます。',
92
- '絶叫:戦闘中は、「注目を集める(2AP)」をします。戦闘以外なら、無意味に叫びます。 思わず叫んでしまいます。',
93
- '自傷:自ら【怪我】を負います。戦闘中は「自傷行為(1AP)」をして自分が【怪我】します。 思わず自分を傷つけます。',
94
- '不安:誰かのストレスを1上げます。近くに誰も居ない場合、泣き出します。 不安にかられて余計なことを言います。',
95
- '忌避:その場から一番近い対象に「石(1AP)」を投げます。それができない場合、【転倒】してうずくまります。 嫌悪感から全てを拒みます。',
96
- '暴走:一番近い敵を攻撃しにいきます。近くに敵がいない場合、周りの意見も聞かずに安直な行動をします。 冷静でいられなくなり、直情的になります。',
97
- '混乱:近くにいるランダムな対象に格闘で攻撃しにいきます。それができない場合、「行動放棄(全 AP)」します。 世界全てが敵に見えて攻撃します。',
98
- '開眼:ストレスは0まで下がります。あなたは教祖となって教義をひとつつくって「布教」できます。次の症状が出るまで効果は続きます。 ゾンビだらけの世界の真理を見つけます。',
99
- ]
100
- ),
101
- 'IT' => DiceTable::RangeTable.new(
102
- '食材表',
103
- '1d100',
104
- [
105
- [1..50, '生モノ食材'],
106
- [51..80, '怪しい食材'],
107
- [81..100, '危ない食材']
108
- ]
109
- )
110
- }.freeze
84
+ class << self
85
+ private
86
+
87
+ def translate_tables(locale)
88
+ {
89
+ 'SST' => DiceTable::Table.from_i18n("ZombiLine.SST", locale),
90
+ 'IT' => DiceTable::RangeTable.new(
91
+ I18n.t("ZombiLine.IT.name", locale: locale),
92
+ '1d100',
93
+ [
94
+ [1..50, I18n.t("ZombiLine.IT.items.raw", locale: locale)],
95
+ [51..80, I18n.t("ZombiLine.IT.items.suspicious", locale: locale)],
96
+ [81..100, I18n.t("ZombiLine.IT.items.dangerous", locale: locale)]
97
+ ]
98
+ )
99
+ }
100
+ end
101
+ end
102
+
103
+ TABLES = translate_tables(:ja_jp).freeze
111
104
 
112
105
  register_prefix('\d*ZL', TABLES.keys)
113
106
  end