bcdice 3.3.0 → 3.6.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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +158 -74
  3. data/README.md +2 -1
  4. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  5. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  6. data/i18n/Cthulhu/zh_hans.yml +11 -0
  7. data/i18n/FutariSousa/ja_jp.yml +705 -9
  8. data/i18n/KillDeathBusiness/ja_jp.yml +2 -2
  9. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  10. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  11. data/i18n/SwordWorld/ja_jp.yml +6 -0
  12. data/i18n/SwordWorld2_0/ja_jp.yml +37 -0
  13. data/i18n/SwordWorld2_5/ja_jp.yml +57 -0
  14. data/lib/bcdice/common_command/add_dice/node.rb +28 -4
  15. data/lib/bcdice/common_command/add_dice/parser.rb +149 -85
  16. data/lib/bcdice/common_command/choice.rb +82 -7
  17. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  18. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  19. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  20. data/lib/bcdice/common_command.rb +2 -0
  21. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  22. data/lib/bcdice/dice_table/d66_parity_table.rb +8 -0
  23. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  24. data/lib/bcdice/dice_table.rb +1 -0
  25. data/lib/bcdice/game_system/AngelGear.rb +9 -4
  26. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  27. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  28. data/lib/bcdice/game_system/Avandner.rb +1 -2
  29. data/lib/bcdice/game_system/Ayabito.rb +229 -0
  30. data/lib/bcdice/game_system/BadLife.rb +264 -289
  31. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  32. data/lib/bcdice/game_system/BattleTech.rb +1 -1
  33. data/lib/bcdice/game_system/BeginningIdol.rb +116 -2390
  34. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  35. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  36. data/lib/bcdice/game_system/Cthulhu.rb +2 -2
  37. data/lib/bcdice/game_system/Cthulhu7th.rb +10 -10
  38. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  39. data/lib/bcdice/game_system/CyberpunkRed.rb +135 -0
  40. data/lib/bcdice/game_system/DarkDaysDrive.rb +76 -41
  41. data/lib/bcdice/game_system/DoubleCross.rb +5 -0
  42. data/lib/bcdice/game_system/Dracurouge.rb +2 -1
  43. data/lib/bcdice/game_system/Elysion.rb +36 -20
  44. data/lib/bcdice/game_system/Emoklore.rb +1 -1
  45. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  46. data/lib/bcdice/game_system/FutariSousa.rb +48 -4
  47. data/lib/bcdice/game_system/GranCrest.rb +171 -406
  48. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  49. data/lib/bcdice/game_system/Karukami.rb +84 -0
  50. data/lib/bcdice/game_system/KemonoNoMori.rb +17 -17
  51. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  52. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  53. data/lib/bcdice/game_system/NeverCloud.rb +19 -8
  54. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  55. data/lib/bcdice/game_system/Revulture.rb +2 -2
  56. data/lib/bcdice/game_system/Shiranui.rb +145 -0
  57. data/lib/bcdice/game_system/ShuumatsuKikou.rb +298 -0
  58. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  59. data/lib/bcdice/game_system/SteamPunkers.rb +14 -1
  60. data/lib/bcdice/game_system/StellarKnights.rb +1 -1
  61. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  62. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +18 -5
  63. data/lib/bcdice/game_system/SwordWorld.rb +11 -7
  64. data/lib/bcdice/game_system/SwordWorld2_0.rb +30 -38
  65. data/lib/bcdice/game_system/SwordWorld2_5.rb +9 -63
  66. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  67. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  68. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  69. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +29 -28
  70. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  71. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  72. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  73. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  74. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  75. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  76. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  77. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  78. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  79. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  80. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  81. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  82. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  83. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  84. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +530 -0
  85. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +1 -1
  86. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +1 -1
  87. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  88. data/lib/bcdice/game_system/satasupe/tables.rb +1 -1
  89. data/lib/bcdice/game_system/sword_world/rating_options.rb +47 -0
  90. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +40 -45
  91. data/lib/bcdice/game_system/sword_world/rating_parser.rb +172 -141
  92. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +14 -10
  93. data/lib/bcdice/game_system.rb +16 -1
  94. data/lib/bcdice/randomizer.rb +1 -1
  95. data/lib/bcdice/version.rb +1 -1
  96. metadata +45 -5
@@ -86,6 +86,7 @@ module BCDice
86
86
  return roll_tables(command, TABLES) if result.empty?
87
87
  end
88
88
 
89
+ return result if result.instance_of?(Result)
89
90
  return '' if result.empty?
90
91
 
91
92
  return "#{command} > #{result}"
@@ -158,16 +159,20 @@ module BCDice
158
159
  addTotal = base + modify
159
160
  total = diceTotal + addTotal
160
161
 
161
- result = ""
162
- result += "(2D6#{getValueString(base)}#{getValueString(modify)})"
163
- result += " #{diceTotal}[#{dice1},#{dice2}]#{getValueString(addTotal)} > #{total}"
162
+ result = Result.new
163
+ result.text = "EL"
164
+ result.text += base.to_s unless base.zero?
165
+ result.text += getValueString(modify) unless modify.zero?
166
+ result.text += " > "
167
+ result.text += "(2D6#{getValueString(base)}#{getValueString(modify)})"
168
+ result.text += " > #{diceTotal}[#{dice1},#{dice2}]#{getValueString(addTotal)} > #{total}"
164
169
 
165
170
  if dice1 == dice2
166
- result += getSpecialResult(dice1, total)
171
+ getSpecialResult(dice1, total, result)
167
172
  return result
168
173
  end
169
174
 
170
- result += getCheckResult(total)
175
+ result = getCheckResult(total, result)
171
176
 
172
177
  return result
173
178
  end
@@ -185,17 +190,25 @@ module BCDice
185
190
  return ""
186
191
  end
187
192
 
188
- def getCheckResult(total)
193
+ def getCheckResult(total, result)
189
194
  success = getSuccessRank(total)
190
195
 
191
- return " > 失敗" if success == 0
196
+ if success == 0
197
+ result.failure = true
198
+ result.text += " > 失敗"
199
+ return result
200
+ end
192
201
 
193
- return getSuccessResult(success)
202
+ return getSuccessResult(success, result)
194
203
  end
195
204
 
196
- def getSuccessResult(success)
197
- result = " > 成功度#{success}"
198
- result += " > 大成功 《アウル》2点獲得" if success >= SUCCESS_MAX
205
+ def getSuccessResult(success, result)
206
+ result.success = true
207
+ result.text += " > 成功度#{success}"
208
+ if success >= SUCCESS_MAX
209
+ result.critical = true
210
+ result.text += " > 大成功 《アウル》2点獲得"
211
+ end
199
212
 
200
213
  return result
201
214
  end
@@ -209,29 +222,32 @@ module BCDice
209
222
  return success
210
223
  end
211
224
 
212
- def getSpecialResult(number, total)
225
+ def getSpecialResult(number, total, result)
213
226
  debug("getSpecialResult", number)
214
227
 
215
228
  if number == 6
216
- return getCriticalResult
229
+ return getCriticalResult(result)
217
230
  end
218
231
 
219
- return getFambleResultText(number, total)
232
+ return getFambleResultText(number, total, result)
220
233
  end
221
234
 
222
- def getCriticalResult
223
- getSuccessResult(SUCCESS_MAX)
235
+ def getCriticalResult(result)
236
+ getSuccessResult(SUCCESS_MAX, result)
224
237
  end
225
238
 
226
- def getFambleResultText(number, total)
239
+ def getFambleResultText(number, total, result)
227
240
  debug("getFambleResultText number", number)
228
241
 
229
242
  if number == 1
230
- return " > 大失敗"
243
+ result.fumble = true
244
+ result.failure = true
245
+ result.text += " > 大失敗"
246
+ return result
231
247
  end
232
248
 
233
- result = getCheckResult(total)
234
- result += " / (#{number - 1}回目のアシストなら)大失敗"
249
+ result = getCheckResult(total, result)
250
+ result.text += " / (#{number - 1}回目のアシストなら)大失敗"
235
251
 
236
252
  debug("getFambleResultText result", result)
237
253
 
@@ -67,7 +67,7 @@ module BCDice
67
67
  success_value = 2 * critical + success - fumble
68
68
  result = compare_result(success_value)
69
69
 
70
- result.text = "#{values} > #{success_value} > #{result.text}"
70
+ result.text = "#{values} > #{success_value} > 成功数#{success_value} #{result.text}"
71
71
  return result
72
72
  end
73
73
 
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FateCoreSystem < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'FateCoreSystem'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Fate Core System'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふえいとこあしすてむ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ■ ファッジダイスによる判定 (xDF+y>=t)
18
+ ファッジダイスをx個ダイスロールし、結果を判定します。
19
+ x: ダイス数
20
+ y: 修正値(省略可)
21
+ t: 目標値値(省略可)
22
+ 例)4DF, 4DF>=3, 4DF+1>=3
23
+ MESSAGETEXT
24
+
25
+ register_prefix('\d+DF')
26
+
27
+ def eval_game_system_specific_command(command)
28
+ roll_df(command)
29
+ end
30
+
31
+ private
32
+
33
+ def roll_df(command)
34
+ parser = Command::Parser.new("DF", round_type: @round_type)
35
+ .enable_prefix_number()
36
+ .restrict_cmp_op_to(:>=, nil)
37
+
38
+ parsed = parser.parse(command)
39
+ unless parsed
40
+ return nil
41
+ end
42
+
43
+ dice_list = roll_fate_dice(parsed.prefix_number)
44
+ total = dice_list.sum() + parsed.modify_number
45
+
46
+ fate_dice_list = dice_list.map do |i|
47
+ if i.zero?
48
+ "[ ]"
49
+ elsif i.positive?
50
+ "[+]"
51
+ else
52
+ "[-]"
53
+ end
54
+ end
55
+
56
+ result = outcome(total, parsed.target_number)
57
+ sequence = [
58
+ "(#{parsed})",
59
+ "#{fate_dice_list.join()}#{Format.modifier(parsed.modify_number)}",
60
+ result_ladder(total),
61
+ result.text,
62
+ ]
63
+
64
+ result.text = sequence.compact.join(" > ")
65
+ return result
66
+ end
67
+
68
+ def roll_fate_dice(times)
69
+ @randomizer.roll_barabara(times, 3).map { |i| i - 2 }
70
+ end
71
+
72
+ def result_ladder(total)
73
+ ladder =
74
+ case total.clamp(-2, 8)
75
+ when 8
76
+ "Legendary"
77
+ when 7
78
+ "Epic"
79
+ when 6
80
+ "Fantastic"
81
+ when 5
82
+ "Superb"
83
+ when 4
84
+ "Great"
85
+ when 3
86
+ "Good"
87
+ when 2
88
+ "Fair"
89
+ when 1
90
+ "Average"
91
+ when 0
92
+ "Mediocre"
93
+ when -1
94
+ "Poor"
95
+ else
96
+ "Terrible"
97
+ end
98
+
99
+ return "#{ladder}(#{format('%+d', total)})"
100
+ end
101
+
102
+ def outcome(total, target)
103
+ if target.nil?
104
+ Result.new
105
+ elsif total == target
106
+ Result.success("Tie")
107
+ elsif total >= target + 3
108
+ Result.critical("Succeed with Style")
109
+ elsif total >= target
110
+ Result.success("Succeed")
111
+ else
112
+ Result.failure("Fail")
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -19,13 +19,25 @@ module BCDice
19
19
  助手用:【AS】…6面ダイスを2つ振って判定します。『有利』なら【3AS】、『不利』なら【1AS】を使います。
20
20
  ・各種表
21
21
  【調査時】
22
- 異常な癖決定表 SHRD
23
-  口から出る表 SHFM/強引な捜査表    SHBT/すっとぼけ表  SHPI
24
-  事件に夢中表 SHEG/パートナーと……表 SHWP/何かしている表 SHDS
25
-  奇想天外表  SHFT/急なひらめき表   SHIN/喜怒哀楽表   SHEM
22
+ 異常な癖決定表      SHRD/新・異常な癖決定表   SHND
23
+ 普通の?・異常な癖決定表 SHAD/ケイジ異常な癖決定表  SHKD
24
+  口から出る表    SHFM/強引な捜査表      SHBT/すっとぼけ表       SHPI
25
+  事件に夢中表    SHEG/パートナーと……表    SHWP/何かしている表      SHDS
26
+  奇想天外表     SHFT/急なひらめき表     SHIN/喜怒哀楽表        SHEM
27
+  人間エミュレート表 SHHE/人間エミュレート失敗表 SHHF/パートナーへのいたずら表 SHMP
28
+  思わせぶり表    SHSB/もどかしい表      SHFR/突然どうした表      SHIS
29
+  わがままを言う表  SHSE/普通に見える表     SHLM/嫉妬に狂う表       SHJS
30
+  傲慢な態度表    SHAR/比較的軽度なもの表   SHRM/ノータイム表       SHNT
31
+  捜査のやり方表   SHIM/貴族表         SHNO/説明しない表       SHNE
32
+  刑事としての癖表  SHHD
26
33
  イベント表
27
34
   現場にて  EVS/なぜ?  EVW/協力者と共に EVN
28
35
   向こうから EVC/VS容疑者 EVV
36
+  閉鎖空間  EVE
37
+  探偵のみ捜査 EVD/助手のみ捜査   EVA/観光捜査  EVT
38
+  思わぬヒント EVH/実験をしてみよう EVX/ゲスト捜査 EVG
39
+  ケイジ聞き込み捜査    EVQ/ケイジ大規模捜査      EVM/こっそり情報の受け渡し EVP
40
+  同僚たちと一緒に捜査する EVO/頻染みの店シチュエーション EVF/ハードBデカアクション EVB
29
41
  調査の障害表 OBT  変調表 ACT  目撃者表 EWT  迷宮入り表 WMT
30
42
  【設定時】
31
43
  背景表
@@ -111,6 +123,9 @@ module BCDice
111
123
  def translate_tables(locale)
112
124
  {
113
125
  "SHRD" => DiceTable::Table.from_i18n("FutariSousa.table.SHRD", locale),
126
+ "SHND" => DiceTable::Table.from_i18n("FutariSousa.table.SHND", locale),
127
+ "SHAD" => DiceTable::Table.from_i18n("FutariSousa.table.SHAD", locale),
128
+ "SHKD" => DiceTable::Table.from_i18n("FutariSousa.table.SHKD", locale),
114
129
  "SHFM" => DiceTable::Table.from_i18n("FutariSousa.table.SHFM", locale),
115
130
  "SHBT" => DiceTable::Table.from_i18n("FutariSousa.table.SHBT", locale),
116
131
  "SHPI" => DiceTable::Table.from_i18n("FutariSousa.table.SHPI", locale),
@@ -120,11 +135,40 @@ module BCDice
120
135
  "SHFT" => DiceTable::Table.from_i18n("FutariSousa.table.SHFT", locale),
121
136
  "SHIN" => DiceTable::Table.from_i18n("FutariSousa.table.SHIN", locale),
122
137
  "SHEM" => DiceTable::Table.from_i18n("FutariSousa.table.SHEM", locale),
138
+ "SHHE" => DiceTable::Table.from_i18n("FutariSousa.table.SHHE", locale),
139
+ "SHHF" => DiceTable::Table.from_i18n("FutariSousa.table.SHHF", locale),
140
+ "SHMP" => DiceTable::Table.from_i18n("FutariSousa.table.SHMP", locale),
141
+ "SHSB" => DiceTable::Table.from_i18n("FutariSousa.table.SHSB", locale),
142
+ "SHFR" => DiceTable::Table.from_i18n("FutariSousa.table.SHFR", locale),
143
+ "SHIS" => DiceTable::Table.from_i18n("FutariSousa.table.SHIS", locale),
144
+ "SHSE" => DiceTable::Table.from_i18n("FutariSousa.table.SHSE", locale),
145
+ "SHLM" => DiceTable::Table.from_i18n("FutariSousa.table.SHLM", locale),
146
+ "SHJS" => DiceTable::Table.from_i18n("FutariSousa.table.SHJS", locale),
147
+ "SHAR" => DiceTable::Table.from_i18n("FutariSousa.table.SHAR", locale),
148
+ "SHRM" => DiceTable::Table.from_i18n("FutariSousa.table.SHRM", locale),
149
+ "SHNT" => DiceTable::Table.from_i18n("FutariSousa.table.SHNT", locale),
150
+ "SHIM" => DiceTable::Table.from_i18n("FutariSousa.table.SHIM", locale),
151
+ "SHNO" => DiceTable::Table.from_i18n("FutariSousa.table.SHNO", locale),
152
+ "SHNE" => DiceTable::Table.from_i18n("FutariSousa.table.SHNE", locale),
153
+ "SHHD" => DiceTable::Table.from_i18n("FutariSousa.table.SHHD", locale),
123
154
  "EVS" => DiceTable::Table.from_i18n("FutariSousa.table.EVS", locale),
124
155
  "EVW" => DiceTable::Table.from_i18n("FutariSousa.table.EVW", locale),
125
156
  "EVN" => DiceTable::Table.from_i18n("FutariSousa.table.EVN", locale),
126
157
  "EVC" => DiceTable::Table.from_i18n("FutariSousa.table.EVC", locale),
127
158
  "EVV" => DiceTable::Table.from_i18n("FutariSousa.table.EVV", locale),
159
+ "EVE" => DiceTable::Table.from_i18n("FutariSousa.table.EVE", locale),
160
+ "EVD" => DiceTable::Table.from_i18n("FutariSousa.table.EVD", locale),
161
+ "EVA" => DiceTable::Table.from_i18n("FutariSousa.table.EVA", locale),
162
+ "EVT" => DiceTable::Table.from_i18n("FutariSousa.table.EVT", locale),
163
+ "EVH" => DiceTable::Table.from_i18n("FutariSousa.table.EVH", locale),
164
+ "EVX" => DiceTable::Table.from_i18n("FutariSousa.table.EVX", locale),
165
+ "EVG" => DiceTable::Table.from_i18n("FutariSousa.table.EVG", locale),
166
+ "EVQ" => DiceTable::Table.from_i18n("FutariSousa.table.EVQ", locale),
167
+ "EVM" => DiceTable::Table.from_i18n("FutariSousa.table.EVM", locale),
168
+ "EVP" => DiceTable::Table.from_i18n("FutariSousa.table.EVP", locale),
169
+ "EVO" => DiceTable::Table.from_i18n("FutariSousa.table.EVO", locale),
170
+ "EVF" => DiceTable::Table.from_i18n("FutariSousa.table.EVF", locale),
171
+ "EVB" => DiceTable::Table.from_i18n("FutariSousa.table.EVB", locale),
128
172
  "OBT" => DiceTable::D66Table.from_i18n("FutariSousa.table.OBT", locale),
129
173
  "ACT" => DiceTable::Table.from_i18n("FutariSousa.table.ACT", locale),
130
174
  "EWT" => DiceTable::Table.from_i18n("FutariSousa.table.EWT", locale),