bcdice 3.12.0 → 3.14.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  6. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  7. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  8. data/i18n/FutariSousa/ja_jp.yml +158 -1
  9. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  10. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  11. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  12. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  13. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  14. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  15. data/i18n/en_us.yml +5 -0
  16. data/lib/bcdice/arithmetic/parser.rb +4 -2
  17. data/lib/bcdice/base.rb +1 -1
  18. data/lib/bcdice/command/parser.rb +4 -2
  19. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  20. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  21. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  22. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  23. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  24. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  25. data/lib/bcdice/dice_table/range_table.rb +24 -0
  26. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  27. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  28. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  29. data/lib/bcdice/game_system/AniMalus.rb +261 -0
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  32. data/lib/bcdice/game_system/Avandner.rb +1 -1
  33. data/lib/bcdice/game_system/BBN.rb +1 -1
  34. data/lib/bcdice/game_system/BadLife.rb +3 -3
  35. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  36. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  37. data/lib/bcdice/game_system/Chill3.rb +6 -6
  38. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  39. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  40. data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
  41. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  42. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  43. data/lib/bcdice/game_system/Elric.rb +1 -1
  44. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  45. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  46. data/lib/bcdice/game_system/FullFace.rb +121 -0
  47. data/lib/bcdice/game_system/FutariSousa.rb +88 -8
  48. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  49. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  50. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  51. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  52. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  53. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  54. data/lib/bcdice/game_system/KyokoShinshoku.rb +201 -0
  55. data/lib/bcdice/game_system/Liminal.rb +136 -0
  56. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  57. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  58. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  59. data/lib/bcdice/game_system/NRR.rb +122 -0
  60. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  61. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  62. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  63. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  64. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  65. data/lib/bcdice/game_system/Postman.rb +3 -3
  66. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +1 -1
  68. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/Siren.rb +97 -0
  71. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  72. data/lib/bcdice/game_system/SkynautsBouken.rb +45 -130
  73. data/lib/bcdice/game_system/Strave.rb +1 -1
  74. data/lib/bcdice/game_system/SwordWorld.rb +1 -1
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
  76. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  77. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  78. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  79. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  80. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  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/VampireTheMasquerade5th.rb +12 -6
  85. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  86. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
  87. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  88. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  89. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  90. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  91. data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
  92. data/lib/bcdice/game_system.rb +24 -0
  93. data/lib/bcdice/loader.rb +1 -1
  94. data/lib/bcdice/version.rb +1 -1
  95. metadata +55 -5
@@ -3,281 +3,45 @@
3
3
  module BCDice
4
4
  module GameSystem
5
5
  class CyberpunkRed < Base
6
- NIGHT_MARKET_FOODS_TABLE = DiceTable::RangeTable.new(
7
- "食品とドラッグ",
8
- "1D100",
9
- [
10
- [1..5, "缶詰 100ed(安物)"],
11
- [6..10, "パック入り食品 10ed(安物)"],
12
- [11..15, "冷凍食品 10ed(安物)"],
13
- [16..20, "穀物の袋 20ed(日用)"],
14
- [21..25, "キブルのパック 10ed(安物)"],
15
- [26..30, "プレパックの袋 20ed(日用)"],
16
- [31..35, "ストリート・ドラッグ 20ed以下"],
17
- [36..40, "低品質の酒 10ed(安物)"],
18
- [41..45, "酒 20ed(日用)"],
19
- [46..50, "高品質の酒 100ed(上等)"],
20
- [51..55, "MRE 10ed(安物)"],
21
- [56..60, "生きた鶏 50ed(程々)"],
22
- [61..65, "生きた魚 50ed(程々)"],
23
- [66..70, "生の果物 50ed(程々)"],
24
- [71..75, "生野菜 50ed(程々)"],
25
- [76..80, "根菜類 20ed(日用)"],
26
- [81..85, "生きた豚 100ed(上等)"],
27
- [86..90, "珍しい果物 100ed(上等)"],
28
- [91..95, "珍しい野菜 100ed(上等)"],
29
- [96..99, "ストリート・ドラッグ 50edちょうど"],
30
- [100, "缶詰 100ed(安物) or ストリート・ドラッグ 50edちょうど"]
31
- ]
32
- ).freeze
33
-
34
- NIGHT_MARKET_MECHANIC_TABLE = DiceTable::RangeTable.new(
35
- "個人用電子機器",
36
- "1D100",
37
- [
38
- [1..5, "エージェント 100ed(上等)"],
39
- [6..10, "プログラムおよびハードウェア 100ed以下"],
40
- [11..15, "オーディオ・レコーダー 100ed(上等)"],
41
- [16..20, "盗聴器検出器 500ed(高級)"],
42
- [21..25, "化学物質分析器 1,000ed(超高級)"],
43
- [26..30, "コンピュータ 50ed(程々)"],
44
- [31..35, "サイバーデッキ 500ed(高級)"],
45
- [36..40, "使い捨て携帯電話 50ed(程々)"],
46
- [41..45, "エレキギターその他の楽器 500ed(高級)"],
47
- [46..50, "プログラムおよびハードウェア 500edちょうど"],
48
- [51..55, "メドスキャナー 1,000ed(超高級)"],
49
- [56..60, "追跡装置 500ed(高級)"],
50
- [61..65, "無線通信機 100ed(上等)"],
51
- [66..70, "テクスキャナー 1,000ed(超高級)"],
52
- [71..75, "スマート・グラス 500ed(高級)"],
53
- [76..80, "レーダー探知機 500ed(高級)"],
54
- [81..85, "スクランブラー/ディスクランブラー 500ed(高級)"],
55
- [86..90, "通信スキャナー/音楽プレイヤー 50ed(程々)"],
56
- [91..95, "ブレインダンス・ビューア 1,000ed(超高級)"],
57
- [96..99, "ヴァーチャリティ・ゴーグル 100ed(上等)"],
58
- [100, "エージェント 100ed(上等) or ヴァーチャリティ・ゴーグル 100ed(上等)"]
59
- ]
60
- ).freeze
61
-
62
- NIGHT_MARKET_WEAPONS_TABLE = DiceTable::RangeTable.new(
63
- "武器と防具",
64
- "1D100",
65
- [
66
- [1..5, "中型拳銃 50ed(程々)"],
67
- [6..10, "大型拳銃および超大型拳銃 100ed(上等)"],
68
- [11..15, "SMG 100ed(上等)"],
69
- [16..20, "大型SMG 100ed(上等)"],
70
- [21..25, "ショットガン 500ed(高級)"],
71
- [26..30, "アサルト・ライフル 500ed(高級)"],
72
- [31..35, "スナイパー・ライフル 500ed(高級)"],
73
- [36..40, "弓およびクロスボウ 100ed(上等)"],
74
- [41..45, "グレネード・ランチャーおよびロケット・ランチャー 500ed(高級)"],
75
- [46..50, "弾薬 500ed以下"],
76
- [51..55, "GMが選んだ特殊武器1個"],
77
- [56..60, "小型近接武器 50ed(程々)"],
78
- [61..65, "中型近接武器 50ed(程々)"],
79
- [66..70, "大型近接武器 100ed(上等)"],
80
- [71..75, "超大型近接武器 100ed(上等)"],
81
- [76..80, "防具 100ed以下"],
82
- [81..85, "防具 500edちょうど"],
83
- [86..90, "防具 1,000edちょうど"],
84
- [91..95, "武器用アタッチメント 100ed以下"],
85
- [96..99, "武器用アタッチメント 500ed以上"],
86
- [100, "中型拳銃 50ed(程々) or 武器用アタッチメント 500ed以上"]
87
- ]
88
- ).freeze
89
-
90
- NIGHT_MARKET_CYBERWARE_TABLE = DiceTable::RangeTable.new(
91
- "サイバーウェア",
92
- "1D100",
93
- [
94
- [1..5, "サイバーアイ 100ed(上等)"],
95
- [6..10, "サイバー聴覚基本システム 500ed(高級)"],
96
- [11..15, "ニューラル・リンク 500ed(高級)"],
97
- [16..20, "サイバーアーム 500ed(高級)"],
98
- [21..25, "サイバーレッグ 100ed(上等)"],
99
- [26..30, "体表用サイバーウェア 1,000edちょうど"],
100
- [31..35, "体表用サイバーウェア 500ed以下"],
101
- [36..40, "体内用サイバーウェア 1,000edちょうど"],
102
- [41..45, "体内用サイバーウェア 500ed以下"],
103
- [46..50, "サイバーアイのオプション 1,000edちょうど"],
104
- [51..55, "サイバーアイのオプション 500ed以下"],
105
- [56..60, "サイバー聴覚のオプション 1,000edちょうど"],
106
- [61..65, "サイバー聴覚のオプション 500ed以下"],
107
- [66..70, "ニューラルウェアのオプション 1,000edちょうど"],
108
- [71..75, "ニューラルウェアのオプション 500ed以下"],
109
- [76..80, "サイバー四肢のオプション 1,000edちょうど"],
110
- [81..85, "サイバー四肢のオプション 500ed以下"],
111
- [86..90, "GMが選んだファッションウェア"],
112
- [91..95, "GMが選んだボーグウェア"],
113
- [96..99, "GMが選んだ任意のサイバーウェア"],
114
- [100, "サイバーアイ 100ed(上等) or GMが選んだ任意のサイバーウェア"]
115
- ]
116
- ).freeze
117
-
118
- NIGHT_MARKET_FASHION_TABLE = DiceTable::RangeTable.new(
119
- "衣料品とファッションウェア",
120
- "1D100",
121
- [
122
- [1..5, "バッグ・レディ・シック"],
123
- [6..10, "ギャング・カラー"],
124
- [11..15, "ジェネリック・シック"],
125
- [16..20, "ボヘミアン"],
126
- [21..25, "レジャーウェア"],
127
- [26..30, "ノーマッド・レザー"],
128
- [31..35, "アジア・ポップ"],
129
- [36..40, "アーバン・フラッシュ"],
130
- [41..45, "ビジネスウェア"],
131
- [46..50, "ハイ・ファッション"],
132
- [51..55, "バイオモニタ 100ed(上等)"],
133
- [56..60, "ケムスキン 100ed(上等)"],
134
- [61..65, "EMPスレッディング 10ed(安物)"],
135
- [66..70, "ライト・タトゥー 100ed(上等)"],
136
- [71..75, "シフトタクト 100ed(上等)"],
137
- [76..80, "スキンウォッチ 100ed(上等)"],
138
- [81..85, "テックヘア 100ed(上等)"],
139
- [86..90, "ジェネリック・シック"],
140
- [91..95, "レジャーウェア"],
141
- [96..99, "ギャング・カラー"],
142
- [100, "バッグ・レディ・シック or ギャング・カラー"]
143
- ]
144
- ).freeze
145
-
146
- NIGHT_MARKET_SUVIVAL_TABLE = DiceTable::RangeTable.new(
147
- "サバイバル用品",
148
- "1D100",
149
- [
150
- [1..5, "対スモッグ呼吸マスク 20ed(日用)"],
151
- [6..10, "自動制音イヤー・プロテクタ 1,000ed(超高級)"],
152
- [11..15, "双眼鏡 50ed(程々)"],
153
- [16..20, "旅行バッグ 20ed(日用)"],
154
- [21..25, "懐中電灯 20ed(日用)"],
155
- [26..30, "ダクト・テープ 20ed(日用)"],
156
- [31..35, "携帯用ベッド&寝袋 20ed(日用)"],
157
- [36..40, "鍵開けセット 20ed(日用)"],
158
- [41..45, "手錠 50ed(程々)"],
159
- [46..50, "メドテク・バッグ 100ed(上等)"],
160
- [51..55, "テント&キャンプ用品 50ed(程々)"],
161
- [56..60, "ロープ(60m) 20ed(日用)"],
162
- [61..65, "テクツール 100ed(上等)"],
163
- [66..70, "パーソナル・ケアパック 20ed(日用)"],
164
- [71..75, "放射線防護服 1,000ed(超高級)"],
165
- [76..80, "発煙筒 10ed(安物)"],
166
- [81..85, "グラップル・ガン 100ed(上等)"],
167
- [86..90, "テク・バッグ 500ed(高級)"],
168
- [91..95, "シャベルおよび斧 50ed(程々)"],
169
- [96..99, "エアハイポ 50ed(程々)"],
170
- [100, "対スモッグ呼吸マスク 20ed(日用) or エアハイポ 50ed(程々)"]
171
- ]
172
- ).freeze
173
-
174
- SCREAM_SHEET_TYPE_TABLE = DiceTable::Table.new(
175
- "スクリームシート分類",
176
- "1D6",
177
- [
178
- "国際",
179
- "全国",
180
- "州",
181
- "地方",
182
- "経済",
183
- "ゴシップ"
184
- ]
185
- ).freeze
186
-
187
- SCREAM_SHEET_A_TABLE = DiceTable::Table.new(
188
- "ヘッドラインA",
189
- "1D10",
190
- [
191
- "(企業を1つ選ぶ)",
192
- "上院議員/議員",
193
- "大統領/会長/社長",
194
- "企業/企業群",
195
- "市議会",
196
- "サイバーサイコ",
197
- "殺し屋/殺人鬼",
198
- "退治人/暴漢",
199
- "悲劇的な/不運な",
200
- "捜査員/研究員"
201
- ]
202
- ).freeze
203
-
204
- SCREAM_SHEET_B_TABLE = DiceTable::Table.new(
205
- "ヘッドラインB",
206
- "1D10",
207
- [
208
- "協力を",
209
- "シティを",
210
- "妥協を/譲歩を",
211
- "警告を",
212
- "計画を",
213
- "スキャンダルを",
214
- "女性を",
215
- "男性を",
216
- "事故を",
217
- "希望を"
218
- ]
219
- ).freeze
220
-
221
- SCREAM_SHEET_C_TABLE = DiceTable::Table.new(
222
- "ヘッドラインC",
223
- "1D10",
224
- [
225
- "提案/提供",
226
- "脅かす/危機",
227
- "妥協/譲歩",
228
- "殺害/破綻/破棄",
229
- "殺害される/中止/中断",
230
- "死亡/終了/途絶える",
231
- "賞賛/表彰/好評",
232
- "表明/発表",
233
- "判明/暴露/発覚",
234
- "継続"
235
- ]
236
- ).freeze
237
-
238
- SCREAM_SHEET_OF_TABLE = DiceTable::Table.new(
239
- "ヘッドライン助詞",
240
- "1D6",
241
- [
242
- "を",
243
- "が",
244
- "に対し",
245
- "とともに",
246
- "より",
247
- "へ向けて"
248
- ]
249
- ).freeze
250
-
251
6
  class ScreamSheetRandomizerTable
7
+ def initialize(locale:, type_table:, a_table:, of_table:, b_table:, c_table:)
8
+ @locale = locale
9
+ @type_table = type_table
10
+ @a_table = a_table
11
+ @of_table = of_table
12
+ @b_table = b_table
13
+ @c_table = c_table
14
+ end
15
+
252
16
  def roll(randomizer)
253
17
  result = ""
254
18
 
255
19
  dice = randomizer.roll_once(6)
256
- scs_type = SCREAM_SHEET_TYPE_TABLE.choice(dice)
257
- result += "#{scs_type}ニュース 『"
20
+ scs_type = @type_table.choice(dice)
21
+ result += "#{scs_type}#{I18n.translate('CyberpunkRed.news', locale: @locale, raise: true)} 『"
258
22
 
259
23
  dice = randomizer.roll_once(10)
260
- scs_val_a = SCREAM_SHEET_A_TABLE.choice(dice).body
24
+ scs_val_a = @a_table.choice(dice).body
261
25
  result += scs_val_a
262
26
 
263
27
  dice = randomizer.roll_once(6)
264
- scs_val_of = SCREAM_SHEET_OF_TABLE.choice(dice).body
28
+ scs_val_of = @of_table.choice(dice).body
265
29
  result += scs_val_of
266
30
 
267
31
  dice = randomizer.roll_once(10)
268
- scs_val_a = SCREAM_SHEET_A_TABLE.choice(dice).body
32
+ scs_val_a = @a_table.choice(dice).body
269
33
  result += scs_val_a
270
34
 
271
35
  dice = randomizer.roll_once(6)
272
- scs_val_of = SCREAM_SHEET_OF_TABLE.choice(dice).body
36
+ scs_val_of = @of_table.choice(dice).body
273
37
  result += scs_val_of
274
38
 
275
39
  dice = randomizer.roll_once(10)
276
- scs_val_b = SCREAM_SHEET_B_TABLE.choice(dice).body
40
+ scs_val_b = @b_table.choice(dice).body
277
41
  result += scs_val_b
278
42
 
279
43
  dice = randomizer.roll_once(10)
280
- scs_val_c = SCREAM_SHEET_C_TABLE.choice(dice).body
44
+ scs_val_c = @c_table.choice(dice).body
281
45
  result += scs_val_c
282
46
 
283
47
  result += "』"
@@ -286,245 +50,119 @@ module BCDice
286
50
  end
287
51
  end
288
52
 
289
- SCREAM_SHEET_RANDOM_TABLE = ScreamSheetRandomizerTable.new().freeze
290
-
291
- VENDING_MACHINE_TYPE_TABLE = DiceTable::RangeTable.new(
292
- "最寄りの自販機のタイプ",
293
- "1D6",
294
- [
295
- [1..3, "食品"],
296
- [4..5, "ファッション"],
297
- [6, "変なもの"]
298
- ]
299
- ).freeze
300
-
301
- VENDING_MACHINE_FOOD_TABLE = DiceTable::Table.new(
302
- "食品",
303
- "1D10",
304
- [
305
- "ラーメン",
306
- "ピザ",
307
- "ハンバーガー",
308
- "スマッシュ",
309
- "スシ",
310
- "暖かい肉料理",
311
- "キブルの1kgパック",
312
- "缶コーヒー",
313
- "缶ジュース",
314
- "缶入りの清涼飲料水"
315
- ]
316
- ).freeze
317
-
318
- VENDING_MACHINE_FASHION_TABLE = DiceTable::Table.new(
319
- "ファッション",
320
- "1D10",
321
- [
322
- "缶に入ったTシャツ",
323
- "性的玩具",
324
- "傘",
325
- "ネクタイ",
326
- "外科手術用マスク",
327
- "下着",
328
- "花束",
329
- "銃と弾",
330
- "ブレインダンス・チップ",
331
- "ビデオゲーム"
332
- ]
333
- ).freeze
334
-
335
- VENDING_MACHINE_STRANGE_TABLE = DiceTable::Table.new(
336
- "変なもの",
337
- "1D10",
338
- [
339
- "ペット用のカツラ",
340
- "バグ・スナック(昆虫料理)",
341
- "レタス1玉",
342
- "トビウオがまるごと入ったスープ",
343
- "人工培養シーフード",
344
- "匂いの缶詰",
345
- "生きたカブトムシ",
346
- "紙製のコスプレ衣装",
347
- "奇妙なカプセル・トイ",
348
- "使用済みのパンティ"
349
- ]
350
- ).freeze
351
-
352
- SHOP_STAFF_TABLE = DiceTable::Table.new(
353
- "店主またはレジ係",
354
- "1D6",
355
- [
356
- "母性的な老婆。客を自分の子供のように扱い、世話を焼いたり小言を言う。",
357
- "怒りっぽい年寄り。皆が嫌いで、特におまえのことが大嫌いだ。",
358
- "退屈しきったヨーギャンガー。両親の手でレジに繋がれている。",
359
- "異様になれなれしく、おまえに付きまとい続ける鬱陶しいやつ。",
360
- "露骨な薬物常用者。おまえにひらひら手を振って「もうどうにでもしてくれ……」と言う。",
361
- "理解不能な中年。何かつけておまえに文句を言おうとする。"
362
- ]
363
- ).freeze
364
-
365
- SHOP_PEOPLE_A_TABLE = DiceTable::Table.new(
366
- "変わった客その1",
367
- "1D6",
368
- [
369
- "ぶつぶつ独り言を言い続ける客。急に立ち止まっておまえをじろじろ見る。",
370
- "騒ぎ立てる迷惑な酔っぱらい。",
371
- "薬物に酔った客。彼にしか見えない何かを殴ろうと拳を振り回している。",
372
- "金欠のジョイガール/ボーイ(娼婦/男娼)。「お願いを聞いてあげるから、スマッシュをおごってくれない?」と持ちかけてくる。",
373
- "非番のローマン。すぐに食べられるものを探しており、おしゃべりをしたい雰囲気ではない。",
374
- "ストリートで襲われる不安に駆られた客。誰かに近寄られると身構える(銃を抜くかもしれない)。"
375
- ]
376
- ).freeze
377
-
378
- SHOP_PEOPLE_B_TABLE = DiceTable::Table.new(
379
- "変わった客その2",
380
- "1D6",
381
- [
382
- "この店に強盗に入る下見中のヨーギャンガー。強盗になる覚悟はまだ固まっていないようだ。",
383
- "1d6ターン後にこの店を襲う予定のギャンガー。",
384
- "店主を痛めつけて”みかじめ料”を取り立てようとする三流のギャンガー。",
385
- "かわいらしい四歳の迷子。”ママ”を探して偶然この店に入り込んだ。",
386
- "口論しながら入店したカップル。声はどんどんやかましくなる。",
387
- "場違いに高そうな服を着た金持ちのカップル。上流社会のパーティーからの帰り道に、酒を買おうとしてたまたまこの店に立ち寄った。"
388
- ]
389
- ).freeze
390
-
391
53
  class ShopPeopleTable
54
+ def initialize(locale:, staff_table:, people_a_table:, people_b_table:)
55
+ @locale = locale
56
+ @staff_table = staff_table
57
+ @people_a_table = people_a_table
58
+ @people_b_table = people_b_table
59
+ end
60
+
392
61
  def roll(randomizer)
393
- result = "おまえが立ち寄ったボデガには――"
62
+ result = I18n.translate("CyberpunkRed.ShopPeopleTableText.intro", locale: @locale, raise: true)
394
63
 
395
64
  dice = randomizer.roll_once(6)
396
- staff = SHOP_STAFF_TABLE.choice(dice).body
65
+ staff = @staff_table.choice(dice).body
397
66
  staff = staff[0..-2]
398
67
  result += staff
399
- result += "――といった店員と、"
68
+ result += I18n.translate("CyberpunkRed.ShopPeopleTableText.shop_staff", locale: @locale, raise: true)
400
69
 
401
70
  dice = randomizer.roll_once(6)
402
- people = SHOP_PEOPLE_A_TABLE.choice(dice).body
71
+ people = @people_a_table.choice(dice).body
403
72
  people = people[0..-2]
404
73
  result += people
405
- result += "――という印象の客と、"
74
+ result += I18n.translate("CyberpunkRed.ShopPeopleTableText.people_a", locale: @locale, raise: true)
406
75
 
407
76
  dice = randomizer.roll_once(6)
408
- people = SHOP_PEOPLE_B_TABLE.choice(dice).body
77
+ people = @people_b_table.choice(dice).body
409
78
  people = people[0..-2]
410
79
  result += people
411
- result += "――という感じの客がいるようだ。"
412
- result += "どうにも、嫌な予感がする。"
80
+ result += I18n.translate("CyberpunkRed.ShopPeopleTableText.people_b", locale: @locale, raise: true)
81
+ result += I18n.translate("CyberpunkRed.ShopPeopleTableText.outro", locale: @locale, raise: true)
413
82
 
414
83
  return result
415
84
  end
416
85
  end
417
86
 
418
- SHOP_PEOPLE_TABLE = ShopPeopleTable.new().freeze
419
-
420
- TABLES = {
421
- "FFD" => DiceTable::Table.new(
422
- "身体への致命的損傷",
423
- "2D6",
424
- [
425
- "片腕喪失 1本の腕が完全に失われる。おまえはその腕の手に持っていたアイテムを即座に落とす。死亡セーヴ修正値の基本値が1増える。",
426
- "片手喪失 1本の手が完全に失われる。おまえはその手に持っていたアイテムを即座に落とす。死亡セーヴ修正値の基本値が1増える。",
427
- "肺損傷 【移動】に-2(最低1)。死亡セーヴ修正値の基本値が1増える。",
428
- "肋骨損傷 おまえは1ターンに徒歩で4m(2マス)より多く移動するたび、そのターン終了時に、この致命的損傷によるボーナス・ダメージ5点を直接HPに受ける。",
429
- "片腕損傷 > 損傷した腕は使い物にならない。おまえはその腕の手に持っていたアイテムを即座に落とす。",
430
- "外傷異物 1ターンに徒歩で4m(2マス)より多く移動するたび、そのターン終了時に、この致命的損傷によるボーナス・ダメージ5点を直接HPに受ける。",
431
- "片脚損傷 【移動】に-4(最低1)。",
432
- "筋肉断裂 近接攻撃に-2。",
433
- "脊椎損傷 おまえは次のターンにアクションを行えないが、移動アクションは行える。死亡セーヴ修正値の基本値が1増える。",
434
- "指損傷 その手に関係したあらゆるアクションに-4。",
435
- "片脚喪失 > 1本の脚が完全に失われる。【移動】に-6(最低1)。死亡セーヴ修正値の基本値が1増える。"
436
- ]
437
- ),
438
- "HFD" => DiceTable::Table.new(
439
- "頭部への致命的損傷",
440
- "2D6",
441
- [
442
- "片目喪失 1個の目が完全に失われる。遠隔攻撃と視覚に関する〈知覚〉判定に-2。死亡セーヴ修正値の基本値が1増える。",
443
- "脳損傷 あらゆるアクションに-2。死亡セーヴ修正値の基本値が1増える。",
444
- "片目損傷 > 遠隔攻撃と視覚に関する〈知覚〉判定に-2。",
445
- "脳震盪 > あらゆるアクションに-2。",
446
- "顎部損傷 声を発することに関連したあらゆるアクションに-2。",
447
- "外傷異物 1ターンに徒歩で4m(2マス)より多く移動するたび、そのターン終了時に、この致命的損傷によるボーナス・ダメージ5点を直接HPに受ける。",
448
- "頚椎損傷 死亡セーヴ修正値の基本値が1増える。",
449
- "頭蓋損傷 おまえの頭部に対する狙い撃ちは、SPを貫通した後のダメージが2倍ではなく3倍になる。死亡セーヴ修正値の基本値が1増える。",
450
- "片耳損傷 1ターンに徒歩で4m(2マス)より多く移動すると、その次のターンは移動アクションを行うことができなくなる。聴覚に関する〈知覚〉判定に-2。",
451
- "気管損傷 声を発することができない。死亡セーヴ修正値の基本値が1増える。",
452
- "片耳喪失 1個の耳が完全に失われる。1ターンに徒歩で4m(2マス)より多く移動すると、その次のターンは移動アクションを行うことができなくなる。聴覚に関する〈知覚〉判定に-4。死亡セーヴ修正値の基本値が1増える。"
453
- ]
454
- ),
455
- "NCDT" => DiceTable::RangeTable.new(
456
- "ナイトシティにおける日中の遭遇",
457
- "1D100",
458
- [
459
- [1..5, "地元の警官 PCグループの半分の人数の巡回警官。P.417参照。"],
460
- [6..11, "企業の警備員 この地区をパトロールしている、企業の下級警備員。PCグループと同じ人数。P.417参照。"],
461
- [12..13, "テク PCグループの半分の人数のテク(技術者)。P.417参照。"],
462
- [14..17, "私立探偵 > 1人の私立探偵。P.417参照。"],
463
- [18..20, "企業の社員 > 現地企業の社員がタクシーを探している。人数はPCと同数。P.417参照。"],
464
- [21..27, "地元民 > この辺りに住む2人の若者。P.418参照。"],
465
- [28..32, "リクレイマー > PCは十分に装備の整ったリクレイマーの一団と出くわす。人数は団員が[PCグループの人数-2]人と、リーダーが1人だ。P.418参照。"],
466
- [33..37, "メディア > カメラとインタビュアーの2人組のメディア。特ダネを求めて1軒の建物に張り込みしている。P.418参照。"],
467
- [38..41, "私立探偵 > 1人の私立探偵。P.418参照。"],
468
- [42..46, "トラウマ・チーム > AV-4が銃撃戦の真っ只中に強行着陸し、降りて来たメディックたちが、負傷した6人ほどのギャンガーたちに応急処置を施しはじめる。P.418参照。"],
469
- [47..57, "スカヴァーズ PCと同人数の貧相で汚らしい浮浪者たちが、焼け落ちた街区近辺にある廃墟またはゴミ箱を漁っている。P.419参照。"],
470
- [58..63, "ノーマッド PCと同人数のノーマッドの一団。P.419参照。"],
471
- [64..70, "ブースターギャング ピラーニャズというブースターギャングに所属する、低レベルなストリート・パンクたち。人数はPCと同数。P.419参照。"],
472
- [71..76, "ストリート・パンク 合成麻薬飲料中毒者どもが、飲み代を稼ごうとカモを探している(人数はPCと同数)。P.419参照。"],
473
- [77..82, "狂信者 終末カルト”レコナーズ”が大挙して押し寄せてくる。P.419参照。"],
474
- [83..88, "ノーマッドのトラック 1台の壊れたトラックの周りで、スチール・ヴァロケスのノーマッドたち(人数はPCの半分;最低2人)が、何かしている。P.419参照。"],
475
- [89..94, "ブースターギャング > アイアン・サイツというギャングのメンバーたち。人数はPCと同じ。P.419参照。"],
476
- [95..100, "メジャー級の犯罪者 > PCたちは冷酷非情なヴィルシェンコ・シンジケート(ネオソビエトの犯罪組織)の大規模なシノギの現場に足を踏み入れてしまう。P.419参照。"]
477
- ]
478
- ),
479
- "NCMT" => DiceTable::RangeTable.new(
480
- "ナイトシティにおける深夜の遭遇",
481
- "1D100",
482
- [
483
- [1..10, "市警察 > PCグループの半分の人数の警察官。P.422参照。"],
484
- [11..22, "企業の警備員 > この地区をパトロールしている、企業の警備員。PCグループと同じ人数。P.422参照。"],
485
- [23..24, "私立探偵 超大型拳銃とマチェーテで武装し、軽装アーマージャックを着用した私立探偵1人。P.422参照。"],
486
- [25, "メディア カメラとインタビュアーの2人組のメディア。特ダネを求めて1軒の建物に張り込みしている。P.422参照。"],
487
- [26..29, "クローマー 地元のクロマティック・ロック・バンドの筋金入りのファンの一団。P.423参照。"],
488
- [30..39, "エッジランナー・チーム 少人数のエッジランナーのチーム。ネットランナー1人、ソロ1人、ノーマッド1人。P.423参照。"],
489
- [40..42, "トラウマ・チーム > AV-4が銃撃戦の真っ只中に強行着陸し、降りて来たメディックたちが、負傷した6人ほどのギャンガーたちに応急処置を施しはじめる。P.423参照。"],
490
- [43..45, "レンジャー > 1人のローマン(保安官)と、このローマンに任命された保安官助手が、市内に隠れている浮浪者たち(地元のギャング団員)を探している。P.423参照。"],
491
- [46..58, "ノーマッド > ワイルドマン・パックに属するノーマッドの一団。人数はPCより2人多い。P.423参照。"],
492
- [59..63, "狂信者 > ジャーン! まさかの時のインクィジェターズ異端審問! カルトのインクィジェターズが総出で押し寄せてくる。P.423参照。"],
493
- [64..73, "ストリート・パンク > ブラック・レース中毒者どもが、クスリを買うカネを欲しがっている。人数はPCより2人多い。P.423参照。"],
494
- [74, "メジャー級の犯罪者 > PCは悪名高いスカガッタリア・ファミリーの大きな仕事の真っただ中に迷い込んだ。P.423参照。"],
495
- [75..79, "ギャングの抗争 > すげえ。PCはこの地域で最大級のギャング団同士の、縄張りを賭けた全面衝突の場に居合わせちまった。P.423参照。"],
496
- [80..87, "放火魔 > この地域の誰かに恨みがある、急進的なアナーキストの集団。フレイムスロワーと斧と大型拳銃で武装しサイバードアップしたギャンガーが1名が、PCより3人少ない(最低2人)ブースターを率いている。P.424参照。"],
497
- [88..92, "ギャングの抗争 > すげえ。PCはこの地域で最大級のギャング団同士の、縄張りを賭けた全面衝突の場に居合わせちまった。P.424参照。"],
498
- [93..99, "メジャー級の犯罪者 > PCは悪名高いスカガッタリア・ファミリーの大きな仕事の真っただ中に迷い込んだ。P.424参照。"],
499
- [100, "暴れまわるサイバーサイコ > ギラギラと輝くメタル・ボディのサイバーサイコが1体。通行人がうかつに挑発し過ぎて最後のエッジを超えさせてしまったらしく、そいつに湧き上がる怒りを叩きつけている。P.424参照。"],
500
- ]
501
- ),
502
- "SCST" => SCREAM_SHEET_TYPE_TABLE,
503
- "SCSA" => SCREAM_SHEET_A_TABLE,
504
- "SCSB" => SCREAM_SHEET_B_TABLE,
505
- "SCSC" => SCREAM_SHEET_C_TABLE,
506
- "SCSR" => SCREAM_SHEET_RANDOM_TABLE,
507
- "VMCT" => VENDING_MACHINE_TYPE_TABLE,
508
- "VMCE" => VENDING_MACHINE_FOOD_TABLE,
509
- "VMCF" => VENDING_MACHINE_FASHION_TABLE,
510
- "VMCS" => VENDING_MACHINE_STRANGE_TABLE,
511
- "VMCR" => DiceTable::ChainTable.new(
512
- "最寄りの自動販売機表",
513
- "1D6",
514
- [
515
- VENDING_MACHINE_FOOD_TABLE,
516
- VENDING_MACHINE_FOOD_TABLE,
517
- VENDING_MACHINE_FOOD_TABLE,
518
- VENDING_MACHINE_FASHION_TABLE,
519
- VENDING_MACHINE_FASHION_TABLE,
520
- VENDING_MACHINE_STRANGE_TABLE
521
- ]
522
- ),
523
- "STOREA" => SHOP_STAFF_TABLE,
524
- "STOREB" => SHOP_PEOPLE_A_TABLE,
525
- "STOREC" => SHOP_PEOPLE_B_TABLE,
526
- "STORE" => SHOP_PEOPLE_TABLE
527
- }.freeze
87
+ class << self
88
+ private
89
+
90
+ def translate_tables(locale)
91
+ nigit_market_type_table = DiceTable::Table.from_i18n("CyberpunkRed.NightMarketTypeTable", locale)
92
+ night_market_foods_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.NightMarketFoodsTable", locale)
93
+ night_market_mechanic_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.NightMarketMechanicTable", locale)
94
+ night_market_weapons_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.NightMarketWeaponsTable", locale)
95
+ night_market_cyberware_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.NightMarketCyberwareTable", locale)
96
+ night_market_fashion_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.NightMarketFashionTable", locale)
97
+ night_market_suvival_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.NightMarketSuvivalTable", locale)
98
+
99
+ scream_sheet_type_table = DiceTable::Table.from_i18n("CyberpunkRed.ScreamSheetTypeTable", locale)
100
+ scream_sheet_a_table = DiceTable::Table.from_i18n("CyberpunkRed.ScreamSheetATable", locale)
101
+ scream_sheet_b_table = DiceTable::Table.from_i18n("CyberpunkRed.ScreamSheetBTable", locale)
102
+ scream_sheet_c_table = DiceTable::Table.from_i18n("CyberpunkRed.ScreamSheetCTable", locale)
103
+ scream_sheet_of_table = DiceTable::Table.from_i18n("CyberpunkRed.ScreamSheetOfTable", locale)
104
+
105
+ vending_machine_type_table = DiceTable::RangeTable.from_i18n("CyberpunkRed.VendingMachineTypeTable", locale)
106
+ vending_machine_food_table = DiceTable::Table.from_i18n("CyberpunkRed.VendingMachineFoodTable", locale)
107
+ vending_machine_fashion_table = DiceTable::Table.from_i18n("CyberpunkRed.VendingMachineFashionTable", locale)
108
+ vending_machine_strange_table = DiceTable::Table.from_i18n("CyberpunkRed.VendingMachineStrangeTable", locale)
109
+
110
+ shop_staff_table = DiceTable::Table.from_i18n("CyberpunkRed.ShopStaffTable", locale)
111
+ shop_people_a_table = DiceTable::Table.from_i18n("CyberpunkRed.ShopPeopleATable", locale)
112
+ shop_people_b_table = DiceTable::Table.from_i18n("CyberpunkRed.ShopPeopleBTable", locale)
113
+
114
+ return {
115
+ "FFD" => DiceTable::Table.from_i18n("CyberpunkRed.FrameFatalDamageTable", locale),
116
+ "HFD" => DiceTable::Table.from_i18n("CyberpunkRed.HeadFatalDamageTable", locale),
117
+ "NCDT" => DiceTable::RangeTable.from_i18n("CyberpunkRed.NightCityDaytimeEncounterTable", locale),
118
+ "NCMT" => DiceTable::RangeTable.from_i18n("CyberpunkRed.NightCityMidnightEncounterTable", locale),
119
+ "NMCT" => nigit_market_type_table,
120
+ "NMCFO" => night_market_foods_table,
121
+ "NMCME" => night_market_mechanic_table,
122
+ "NMCWE" => night_market_weapons_table,
123
+ "NMCCY" => night_market_cyberware_table,
124
+ "NMCFA" => night_market_fashion_table,
125
+ "NMCSU" => night_market_suvival_table,
126
+ "SCST" => scream_sheet_type_table,
127
+ "SCSA" => scream_sheet_a_table,
128
+ "SCSB" => scream_sheet_b_table,
129
+ "SCSC" => scream_sheet_c_table,
130
+ "SCSR" => ScreamSheetRandomizerTable.new(
131
+ locale: locale,
132
+ type_table: scream_sheet_type_table,
133
+ a_table: scream_sheet_a_table,
134
+ b_table: scream_sheet_b_table,
135
+ c_table: scream_sheet_c_table,
136
+ of_table: scream_sheet_of_table
137
+ ).freeze,
138
+ "VMCT" => vending_machine_type_table,
139
+ "VMCE" => vending_machine_food_table,
140
+ "VMCF" => vending_machine_fashion_table,
141
+ "VMCS" => vending_machine_strange_table,
142
+ "VMCR" => DiceTable::ChainTable.new(
143
+ I18n.translate("CyberpunkRed.VendingMachineTable.name", locale: locale, raise: true),
144
+ "1D6",
145
+ [
146
+ vending_machine_food_table,
147
+ vending_machine_food_table,
148
+ vending_machine_food_table,
149
+ vending_machine_fashion_table,
150
+ vending_machine_fashion_table,
151
+ vending_machine_strange_table
152
+ ]
153
+ ),
154
+ "STOREA" => shop_staff_table,
155
+ "STOREB" => shop_people_a_table,
156
+ "STOREC" => shop_people_b_table,
157
+ "STORE" => ShopPeopleTable.new(
158
+ locale: locale,
159
+ staff_table: shop_staff_table,
160
+ people_a_table: shop_people_a_table,
161
+ people_b_table: shop_people_b_table
162
+ ).freeze
163
+ }.freeze
164
+ end
165
+ end
528
166
  end
529
167
  end
530
168
  end