bcdice 3.13.0 → 3.15.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/Cthulhu/zh_hant.yml +1 -1
  6. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  7. data/i18n/CyberpunkRed/ko_kr.yml +389 -0
  8. data/i18n/DoubleCross/ja_jp.yml +53 -0
  9. data/i18n/DoubleCross/ko_kr.yml +52 -0
  10. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  11. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  12. data/i18n/FutariSousa/ja_jp.yml +284 -127
  13. data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
  14. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  15. data/i18n/MagicaLogia/ko_kr.yml +2 -2
  16. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  17. data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
  18. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  19. data/i18n/SkynautsBouken/ko_kr.yml +114 -0
  20. data/i18n/StratoShout/ko_kr.yml +102 -102
  21. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  22. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  23. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  24. data/i18n/en_us.yml +5 -0
  25. data/i18n/zh_hant.yml +5 -0
  26. data/lib/bcdice/dice_table/range_table.rb +24 -0
  27. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  28. data/lib/bcdice/game_system/Aionia.rb +131 -0
  29. data/lib/bcdice/game_system/AniMalus.rb +99 -59
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +32 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
  32. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  33. data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
  34. data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
  35. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  36. data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
  37. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
  38. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
  39. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
  40. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  41. data/lib/bcdice/game_system/CyberpunkRed.rb +15 -6
  42. data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
  43. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  44. data/lib/bcdice/game_system/DoubleCross.rb +18 -1
  45. data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
  46. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  47. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  48. data/lib/bcdice/game_system/FullFace.rb +63 -12
  49. data/lib/bcdice/game_system/FutariSousa.rb +105 -13
  50. data/lib/bcdice/game_system/Garactier.rb +479 -0
  51. data/lib/bcdice/game_system/GardenOrder.rb +390 -9
  52. data/lib/bcdice/game_system/GundogRevised.rb +8 -8
  53. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  54. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  55. data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
  56. data/lib/bcdice/game_system/KimitoYell.rb +568 -0
  57. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  58. data/lib/bcdice/game_system/KyokoShinshoku.rb +51 -8
  59. data/lib/bcdice/game_system/Magius.rb +125 -0
  60. data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
  61. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  62. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  63. data/lib/bcdice/game_system/NRR.rb +2 -2
  64. data/lib/bcdice/game_system/NSSQ.rb +17 -9
  65. data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
  66. data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
  68. data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/SkynautsBouken.rb +49 -134
  71. data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
  72. data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
  73. data/lib/bcdice/game_system/SwordWorld.rb +5 -1
  74. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +262 -0
  76. data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
  77. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  78. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  79. data/lib/bcdice/game_system/TorgEternity.rb +35 -6
  80. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  81. data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
  82. data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
  83. data/lib/bcdice/game_system/Utakaze.rb +55 -2
  84. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  85. data/lib/bcdice/game_system/WoW.rb +161 -0
  86. data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
  87. data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
  88. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  89. data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
  90. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  91. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  92. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
  93. data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
  94. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
  95. data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
  96. data/lib/bcdice/game_system.rb +31 -0
  97. data/lib/bcdice/version.rb +1 -1
  98. metadata +50 -6
@@ -0,0 +1,262 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TensaiGunshiNiNaro < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TensaiGunshiNiNaro'
8
+
9
+ # ゲームシステム名
10
+ NAME = '天才軍師になろう'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'てんさいくんしになろう'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・行為判定
18
+ TN6…「有利」を得ていない場合、6面ダイスを2つ振って判定します。
19
+ TN10…「有利」を得ている場合、10面ダイスを2つ振って判定します。
20
+ 不調 気づかぬうちの不満【C】…このセッションの間、「4」の出目を出しても判定は成功になりません。数字の後ろに【C】をつけます。
21
+  例)TN6C
22
+ 軍師スキル 〇〇サポート【S】…決戦フェイズの判定中「3」の出目を出しても判定に成功します。数字の後ろに【S】をつけます。
23
+  例)TN6S
24
+ 英傑スキル/武人 煌めく刃【B】…決戦フェイズの判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【B】をつけます。
25
+  例)TN6B
26
+ 英傑スキル/武人 力ずく…その判定のサイコロをすべて振った後、[使用者の【攻撃力】]個サイコロを振る。先頭に使用者の【攻撃力】をつけます。
27
+  例)4TN6
28
+ 英傑スキル/武人 必殺の剣【D】…《戦技》を使用している判定中「4」「5」の出目を出してもスペシャルが発生します。数字の後ろに【D】をつけます。
29
+  例)TN6K
30
+ 英傑スキル/武人 二刀流【T】…「攻撃」のスキルの判定中「2」の出目を出しても判定に成功となり、同じ出目のサイコロが2つ以上出ているとスペシャルが発生します。数字の後ろに【T】をつけます。
31
+  例)TN6T
32
+ 英傑スキル/カリスマ 御身のためならば【Y】…「交流」「スカウト」の判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【Y】をつけます。
33
+  例)TN6Y
34
+ 英傑スキル/弓取り 愛用の弓【A】…「攻撃」のスキルの判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【A】をつけます。
35
+  例)TN6A
36
+ 英傑スキル/ヤンキー&マイルドヤンキー その辺の物を武器に【C】…「4」の出目を出しても判定は成功になりません。数字の後ろに【C】をつけます。
37
+  例)TN6C
38
+ 英傑スキル/ヤンキー&マイルドヤンキー 熱血判定【C】…「4」の出目を出しても判定は成功になりません。数字の後ろに【C】をつけます。
39
+  例)TN6C
40
+ 英傑スキル/英傑汎用 凄腕エージェント【A】…活動フェイズの判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【A】をつけます。
41
+  例)TN6A
42
+ 数字の後ろに複数のコマンドを追加できます。
43
+  例)TN10CYA
44
+ ・ダメージ計算 xDM+y>=t
45
+  [ダメージ計算]を行う。成否と【HP】の減少量を表示する。
46
+  x: 6面ダイス数
47
+  y: 補正値(省略可能)
48
+  t: 防御力
49
+ ・各種表
50
+ 関係決定表 RELA
51
+ 平時天才軍師表 PTGS
52
+ 平時英傑表 PTHE
53
+ スカウト表 SCOU
54
+ 変調表 BDST
55
+ MESSAGETEXT
56
+
57
+ def initialize(command)
58
+ super(command)
59
+
60
+ @d66_sort_type = D66SortType::ASC
61
+ @round_type = RoundType::FLOOR
62
+ end
63
+
64
+ register_prefix('\d*TN(6|10)[ABCKSTY]*', '\d+DM')
65
+
66
+ def eval_game_system_specific_command(command)
67
+ roll_judge(command) || roll_damage(command) || roll_tables(command, self.class::TABLES)
68
+ end
69
+
70
+ private
71
+
72
+ # 行為判定
73
+ def roll_judge(command)
74
+ m = /^(\d*)TN(6|10)([ABCKSTY]*)$/.match(command)
75
+ unless m
76
+ return nil
77
+ end
78
+
79
+ # 成功となる出目
80
+ success_dices = [4, 5, 6, 7, 8, 9, 10]
81
+
82
+ # スペシャルとなる出目
83
+ special_dices = [6, 10]
84
+
85
+ # ファンブルとなる出目
86
+ fumble_dices = [1]
87
+
88
+ # 有利
89
+ advantage = m[2] == "10"
90
+
91
+ # 不調 気づかぬうちの不満
92
+ complaints = m[3].include?("C")
93
+
94
+ # 軍師スキル 〇〇サポート
95
+ support = m[3].include?("S")
96
+
97
+ # 英傑スキル/武人 煌めく刃
98
+ blade = m[3].include?("B")
99
+
100
+ # 英傑スキル/武人 必殺の剣
101
+ killer = m[3].include?("K")
102
+
103
+ # 英傑スキル/武人 二刀流
104
+ twin = m[3].include?("T")
105
+
106
+ # 英傑スキル/カリスマ 御身のためならば
107
+ you = m[3].include?("Y")
108
+
109
+ # 英傑スキル/弓取り 愛用の弓
110
+ # 英傑スキル/英傑汎用 凄腕エージェント
111
+ agent = m[3].include?("A")
112
+
113
+ # 二刀流の適用時
114
+ if twin
115
+ # 成功となる出目に2を追加
116
+ success_dices.push(2)
117
+ end
118
+
119
+ # 〇〇サポート、煌めく刃、愛用の弓、御身のためならば、凄腕エージェントいずれかの適用時
120
+ if support | blade | you | agent
121
+ # 成功となる出目に3を追加
122
+ success_dices.push(3)
123
+ end
124
+
125
+ # 煌めく刃、御身のためならば、愛用の弓、凄腕エージェントいずれかの適用時
126
+ if blade | you | agent
127
+ # スペシャルとなる出目に3を追加
128
+ special_dices.push(3)
129
+ end
130
+
131
+ # 必殺の剣の適用時
132
+ if killer
133
+ # スペシャルとなる出目に4,5を追加
134
+ special_dices.push(4)
135
+ special_dices.push(5)
136
+ end
137
+
138
+ # 気づかぬうちの不満適用時
139
+ if complaints
140
+ # 成功となる出目から4を削除
141
+ success_dices.delete(4)
142
+ end
143
+
144
+ # 英傑スキル/武人 力ずく
145
+ times = 2 + m[1].to_i
146
+ dice_size = advantage ? 10 : 6
147
+ dice_list = @randomizer.roll_barabara(times, dice_size)
148
+
149
+ texts = []
150
+ is_critical = false
151
+ is_fumble = false
152
+ is_success = false
153
+
154
+ # スペシャルとなる出目を含む、または、二刀流の適用時かつ同じ出目のサイコロが2つ以上出ている場合
155
+ if !dice_list.intersection(special_dices).empty? | (twin & (dice_list.count != dice_list.uniq.count))
156
+ # クリティカルフラグを立てる
157
+ is_critical = true
158
+ # スペシャルのシステムメッセージを追加
159
+ texts.push(translate("TensaiGunshiNiNaro.JUDGE.critical"))
160
+ special_effects = []
161
+ # 通常時の追加効果
162
+ special_effects.push(translate("TensaiGunshiNiNaro.NORMAL.critical"))
163
+ # 英傑スキル/武人 煌めく刃による追加効果
164
+ special_effects.push(translate("TensaiGunshiNiNaro.BLADE.critical")) if blade
165
+ # 英傑スキル/カリスマ 御身のためならばによる追加効果
166
+ special_effects.push(translate("TensaiGunshiNiNaro.YOU.critical")) if you
167
+ # 追加効果を結合してカッコ内に格納
168
+ texts.push("(#{special_effects.join('')})")
169
+ end
170
+
171
+ # ファンブルとなる出目を含む場合
172
+ unless dice_list.intersection(fumble_dices).empty?
173
+ # ファンブルフラグを立てる
174
+ is_fumble = true
175
+ # ファンブルのシステムメッセージを追加
176
+ texts.push(translate("TensaiGunshiNiNaro.JUDGE.fumble"))
177
+ # ファンブルの追加効果をカッコ内に格納
178
+ texts.push("(#{translate('TensaiGunshiNiNaro.NORMAL.fumble')})")
179
+ end
180
+
181
+ if dice_list.intersection(success_dices).empty?
182
+ # 成功となる出目を含まない場合
183
+ # 失敗の汎用メッセージを追加
184
+ texts.push(translate("failure"))
185
+ else
186
+ # 成功となる出目を含む場合
187
+ # 成功フラグを立てる
188
+ is_success = true
189
+ # 成功の汎用メッセージを追加
190
+ texts.push(translate("success"))
191
+ end
192
+
193
+ return Result.new.tap do |r|
194
+ # テキストを整形
195
+ r.text = "#{command} > [#{dice_list.join(',')}] > #{texts.join('')}"
196
+ # 各種成否を格納
197
+ r.condition = is_success
198
+ r.critical = is_critical
199
+ r.fumble = is_fumble
200
+ end
201
+ end
202
+
203
+ # ダメージ計算
204
+ def roll_damage(command)
205
+ parser = Command::Parser.new("DM", round_type: @round_type)
206
+ .has_prefix_number
207
+ .restrict_cmp_op_to(:>=)
208
+ parsed = parser.parse(command)
209
+ unless parsed
210
+ return nil
211
+ end
212
+
213
+ text = ''
214
+ is_success = false
215
+
216
+ # ダメージ計算
217
+ damage = @randomizer.roll_sum(parsed.prefix_number, 6) + parsed.modify_number
218
+ # HP減少量計算
219
+ dec = damage / parsed.target_number
220
+
221
+ # HP減少量の最大値は3
222
+ dec = 3 if dec > 3
223
+
224
+ if dec > 0
225
+ # HPを減らせた場合
226
+ # 成功フラグを立てる
227
+ is_success = true
228
+ # 成功メッセージを追加
229
+ text = translate("TensaiGunshiNiNaro.DAMAGE.success", damage: damage.to_s, dec: dec.to_s)
230
+ else
231
+ # 失敗メッセージを追加
232
+ text = translate("TensaiGunshiNiNaro.DAMAGE.failure", damage: damage.to_s)
233
+ end
234
+
235
+ return Result.new.tap do |r|
236
+ # テキストを整形
237
+ r.text = "#{command} > #{damage} > #{text}"
238
+ # 各種成否を格納
239
+ r.condition = is_success
240
+ end
241
+ end
242
+
243
+ class << self
244
+ private
245
+
246
+ def translate_tables(locale)
247
+ {
248
+ "RELA" => DiceTable::D66Table.from_i18n("TensaiGunshiNiNaro.table.RELA", locale),
249
+ "PTGS" => DiceTable::D66Table.from_i18n("TensaiGunshiNiNaro.table.PTGS", locale),
250
+ "PTHE" => DiceTable::D66Table.from_i18n("TensaiGunshiNiNaro.table.PTHE", locale),
251
+ "SCOU" => DiceTable::D66Table.from_i18n("TensaiGunshiNiNaro.table.SCOU", locale),
252
+ "BDST" => DiceTable::Table.from_i18n("TensaiGunshiNiNaro.table.BDST", locale),
253
+ }
254
+ end
255
+ end
256
+
257
+ TABLES = translate_tables(:ja_jp)
258
+
259
+ register_prefix(TABLES.keys)
260
+ end
261
+ end
262
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TheIndieHack < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TheIndieHack'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'The Indie Hack'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'しいんていはつく'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 cIH+a c:CL a:能力値
18
+
19
+ 例)IH: ライトダイスとダークダイスを1個ずつ振って、その結果を表示
20
+ INFO_MESSAGETEXT
21
+
22
+ register_prefix('([+-]?\d)?IH')
23
+
24
+ def eval_game_system_specific_command(command)
25
+ resolute_action(command)
26
+ end
27
+
28
+ private
29
+
30
+ # ダイス判定
31
+ # @param [String] command
32
+ # @return [Result]
33
+ def resolute_action(command)
34
+ m = /([+-]?\d)?IH([+-]\d)?/.match(command)
35
+ return nil unless m
36
+
37
+ cl = m[1].to_i
38
+ abilities = m[2].to_i
39
+
40
+ dices = @randomizer.roll_barabara(2, 6)
41
+ dice_text = dices.join(",")
42
+ dices[0] += cl
43
+ dices[1] += abilities
44
+ dice_text2 = dices.join(",")
45
+ diff = dices[1] - dices[0]
46
+ side = diff < 0 ? "ライト" : "ダーク"
47
+ side = "両" if diff == 0
48
+ if dice_text == dice_text2
49
+ output = "(IH) > #{dice_text} > #{side}#{get_success_level(diff)}"
50
+ else
51
+ output = "(#{m[1]}IH#{m[2]}) > [#{dice_text}] > #{dice_text2} > #{side}#{get_success_level(diff)}"
52
+ end
53
+ if diff > 0
54
+ return Result.success(output)
55
+ elsif diff < 0
56
+ return Result.failure(output)
57
+ else
58
+ return Result.new.tap do |result|
59
+ result.text = output
60
+ end
61
+ end
62
+ end
63
+
64
+ def get_success_level(die_difference)
65
+ case die_difference.abs
66
+ when 0
67
+ return "陣営がそれぞれ確定描写を1つ追加します"
68
+ when 1
69
+ return "陣営が確定描写を1つ追加しますが、味方によって追加されたネガティブな確定描写を1つ受けます"
70
+ when 2
71
+ return "陣営が確定描写を1つ追加します"
72
+ when 3
73
+ return "陣営が確定描写を1つ追加し、さらに場面描写を1つ追加します"
74
+ when 4
75
+ return "陣営が確定描写を1つ追加し、さらにその陣営の味方ひとりも確定描写を1つ追加します"
76
+ else
77
+ return "陣営が確定描写を2つ追加します"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end