bcdice 3.3.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class BeginningIdol < Base
6
+ class WorkWithChanceTable < DiceTable::D66Table
7
+ def self.from_i18n(key, locale)
8
+ table = I18n.t(key, locale: locale)
9
+ sort_type = D66SortType.const_get(table[:d66_sort_type])
10
+
11
+ new(table[:name], sort_type, table[:items], locale)
12
+ end
13
+
14
+ def initialize(name, sort_type, items, locale)
15
+ super(name, sort_type, items)
16
+ @regexp = Regexp.new(I18n.t("BeginningIdol.with_chance.regexp", locale: locale))
17
+ @off = I18n.t("BeginningIdol.with_chance.off_text", locale: locale)
18
+ end
19
+
20
+ def roll_command(randomizer, command)
21
+ m = /^LO([1-6]{1,2})?$/.match(command)
22
+ unless m
23
+ return nil
24
+ end
25
+
26
+ roll(randomizer, m[1]&.to_i)
27
+ end
28
+
29
+ def roll(randomizer, chance = nil)
30
+ chosen = super(randomizer)
31
+ unless chance
32
+ return chosen
33
+ end
34
+
35
+ m = @regexp.match(chosen.body)
36
+ if m && m[1].to_i >= chance
37
+ DiceTable::RollResult.new(chosen.table_name, chosen.value, @off)
38
+ elsif m
39
+ DiceTable::RollResult.new(chosen.table_name, chosen.value, chosen.body.sub(@regexp, ""))
40
+ else
41
+ chosen
42
+ end
43
+ end
44
+ end
45
+
46
+ class << self
47
+ private
48
+
49
+ def translate_local_work_table(locale)
50
+ WorkWithChanceTable.from_i18n("BeginningIdol.local_work", locale)
51
+ end
52
+ end
53
+
54
+ register_prefix("LO")
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,530 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
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
+ class ScreamSheetRandomizerTable
252
+ def roll(randomizer)
253
+ result = ""
254
+
255
+ dice = randomizer.roll_once(6)
256
+ scs_type = SCREAM_SHEET_TYPE_TABLE.choice(dice)
257
+ result += "#{scs_type}ニュース 『"
258
+
259
+ dice = randomizer.roll_once(10)
260
+ scs_val_a = SCREAM_SHEET_A_TABLE.choice(dice).body
261
+ result += scs_val_a
262
+
263
+ dice = randomizer.roll_once(6)
264
+ scs_val_of = SCREAM_SHEET_OF_TABLE.choice(dice).body
265
+ result += scs_val_of
266
+
267
+ dice = randomizer.roll_once(10)
268
+ scs_val_a = SCREAM_SHEET_A_TABLE.choice(dice).body
269
+ result += scs_val_a
270
+
271
+ dice = randomizer.roll_once(6)
272
+ scs_val_of = SCREAM_SHEET_OF_TABLE.choice(dice).body
273
+ result += scs_val_of
274
+
275
+ dice = randomizer.roll_once(10)
276
+ scs_val_b = SCREAM_SHEET_B_TABLE.choice(dice).body
277
+ result += scs_val_b
278
+
279
+ dice = randomizer.roll_once(10)
280
+ scs_val_c = SCREAM_SHEET_C_TABLE.choice(dice).body
281
+ result += scs_val_c
282
+
283
+ result += "』"
284
+
285
+ return result
286
+ end
287
+ end
288
+
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
+ class ShopPeopleTable
392
+ def roll(randomizer)
393
+ result = "おまえが立ち寄ったボデガには――"
394
+
395
+ dice = randomizer.roll_once(6)
396
+ staff = SHOP_STAFF_TABLE.choice(dice).body
397
+ staff = staff[0..-2]
398
+ result += staff
399
+ result += "――といった店員と、"
400
+
401
+ dice = randomizer.roll_once(6)
402
+ people = SHOP_PEOPLE_A_TABLE.choice(dice).body
403
+ people = people[0..-2]
404
+ result += people
405
+ result += "――という印象の客と、"
406
+
407
+ dice = randomizer.roll_once(6)
408
+ people = SHOP_PEOPLE_B_TABLE.choice(dice).body
409
+ people = people[0..-2]
410
+ result += people
411
+ result += "――という感じの客がいるようだ。"
412
+ result += "どうにも、嫌な予感がする。"
413
+
414
+ return result
415
+ end
416
+ end
417
+
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
528
+ end
529
+ end
530
+ end
@@ -266,7 +266,7 @@ module BCDice
266
266
  "何者かによる唐突な奇襲攻撃。未知の土地に面している領土からランダムに1つを選ぶ。[軍事レベル/敵対国数×2+険悪国数+9]の判定に成功すると返り討ちにして(1d6)MGを得る。失敗するとその領土は施設ごと失われる",
267
267
  "民の労働の結果が明らかに。[生活レベル/敵対国数×2+険悪国数+9]の判定に成功すると《予算》が自国の領土のマップ数と同じだけ増える。失敗したら《予算》が同じだけ減る",
268
268
  "民は領土を渇望していた。5MGを支払えば、隣接する未知の土地1つを領土にできる。(1d6)を振り、その数だけ通路を引くことができる。通路でつながっていない部屋は自国の領土として扱わない",
269
- "王国の子どもたちが宮廷をあなた方を見て成長する。《民》が[王国に残した《民》の数÷10+治安レベル]人増える",
269
+ "王国の子どもたちがあなた方を見て成長する。《民》が[王国に残した《民》の数÷10+治安レベル]人増える",
270
270
  "あなたの活躍を耳にした者たちがやってくる。シナリオの目的を満たしている場合、関係が良好・同盟の国の数だけ(1d6)を振り、[合計値+治安レベル]人だけ《民》が増える",
271
271
  "街の機能に異変が!?[治安レベル/敵対国数×2+険悪国数+9]の判定に成功すると、自国の好きな施設1軒を選び、その施設の隣でかつ通路がつながっている部屋に同じ種類の施設がもう1軒できる。失敗したら、自国のタイプ:部屋の施設を1軒選び、破壊する",
272
272
  "王国同士の交流が行われた。[文化レベル/敵対国数×2+険悪国数+9]の判定に成功すると、生まれ表でランダムにジョブを決めた逸材が1人増え、好きな国1つとの関係を1段階良好にする。失敗すると、自国の逸材1人を選んで失い、ランダムに決めた国1つとの関係が1段階悪化する",
@@ -166,7 +166,7 @@ module BCDice
166
166
  "唐突な奇襲。周辺階域の中からランダムに自国の領土を選び[軍事レベル/9]の判定を行う。成功すれば(1D6)MG獲得。失敗すると選ばれた領土の入口から順番に通路を辿り失われる部屋を([王国レベル+1]D6)個選ぶ。(同じ部屋は2度選べない)。失われた部屋の施設と部屋につながる道が全て破壊される。その部屋からすべての部屋がなくなり、終了フェイズで入口が1個もなければ自国の領土でなくなる。",
167
167
  "民の労働の結果が明らかに。[生活レベル/9]の判定に成功すると《予算》が自国の領土のマップ数と同じだけ増える。失敗したら《予算》が同じだけ減る。",
168
168
  "あなたの活躍を耳にした者たちがやってくる。シナリオの目的を満たしている場合、関係が良好・同盟の国の数だけ(1D6)を振り、[合計値+治安レベル]人だけ《民》が増える。",
169
- "王国の子どもたちが宮廷をあなた方を見て成長する。《民》が([王国に残した《民》の数÷10+治安レベル]D6)人増える。",
169
+ "王国の子どもたちがあなた方を見て成長する。』《民》が([王国に残した《民》の数÷10+治安レベル]D6)人増える。",
170
170
  "民は領土を渇望していた。5MGを支払えば、隣接する未知の土地1つを領土にできる。(1D6)を振り、その数だけ通路を引くことができる。通路でつながっていない部屋は自国の領土として扱わない。",
171
171
  "街の機能に異変が!? [治安レベル/9]の判定に成功すると、自国の好きな施設1軒を選び、その施設のレベルを1点上昇する。失敗したら、自国のタイプ:部屋の施設をランダムに1軒選び、破壊する。",
172
172
  "王国同士の交流が行われた。[文化レベル/9]の判定に成功すると、生まれ表でランダムにジョブを決めた逸材が1人増え、好きな国1つとの関係を1段階良好にする。失敗すると、自国の逸材1人を選んで失い、ランダムに決めた国1つとの関係が1段階悪化する。",
@@ -44,7 +44,7 @@ module BCDice
44
44
 
45
45
  def roll_with_day(day, randomizer)
46
46
  value = randomizer.roll_once(6)
47
- chosen = choise(value, day)
47
+ chosen = choice(value, day)
48
48
 
49
49
  chosen =
50
50
  if chosen.respond_to?(:roll_with_day)
@@ -63,7 +63,7 @@ module BCDice
63
63
  return result
64
64
  end
65
65
 
66
- def choise(value, day)
66
+ def choice(value, day)
67
67
  raise NotImplementedError
68
68
  end
69
69
 
@@ -73,7 +73,7 @@ module BCDice
73
73
  end
74
74
 
75
75
  class BranchByElapsedDays < BranchByDay
76
- def choise(value, day)
76
+ def choice(value, day)
77
77
  value > day ? @greater : @less_than_equal
78
78
  end
79
79
 
@@ -87,7 +87,7 @@ module BCDice
87
87
  end
88
88
 
89
89
  class BranchByDayParity < BranchByDay
90
- def choise(value, _)
90
+ def choice(value, _)
91
91
  value.odd? ? @greater : @less_than_equal
92
92
  end
93
93
 
@@ -582,7 +582,7 @@ module BCDice
582
582
  "(一人)楽しくショッピング! 〔生活〕で難易度9の判定を行う。成功すると、その成功度と同じ値だけ、〔精神点〕を回復できる。失敗すると、セッション中、この後のロマンス判定のファンブル率が2点上昇する。",
583
583
  "(一人)「…………」互いに遠慮して気まずい感じ。〔恋愛〕で難易度9の判定を行う。成功すると、この後のロマンス判定の難易度が1点減少する。失敗すると、この後のロマンス判定の難易度が2点上昇する。",
584
584
  "(場所)亜侠稼業を忘れてしまいそうなほど、充実した時間を過ごす。デートを行っているキャラクター全員は、〔精神点〕が2点回復する。",
585
- "(一人)「うーん、ここつまんないね。場所変えよっか」〔恋愛〕で難易度9の判定を行う。成功すると、この後のロマンス判定の難易度が1点減少する。失敗すると、デート参加者全員は、このエリカの遭遇表をさらに1回ずつ振らなければならない。",
585
+ "(一人)「うーん、ここつまんないね。場所変えよっか」〔恋愛〕で難易度9の判定を行う。成功すると、この後のロマンス判定の難易度が1点減少する。失敗すると、デート参加者全員は、このエリアの遭遇表をさらに1回ずつ振らなければならない。",
586
586
  "(一人)趣味の会話で盛り上がる! 〔教養〕で難易度9の判定を行う。成功すると、それ以降一度だけ、そのセッション中に行う判定の難易度を、その成功度と同じ値だけ減少することができる。失敗すると、セッション中、この場所の〔趣味〕が未修得の状態になる。",
587
587
  "(一人)「あぶない、暴れ馬だッ!」〔戦闘〕で難易度9の判定を行う。成功すると、デートの相手の好みを、自分のタイプと同じものに変更することができる。失敗すると、デートの相手は1D6点のダメージを受ける(セーブ不可)。",
588
588
  "(場所)「ようよう、綺麗なねぇちゃん、連れとるやんけ」「三下」が1D6人現れる。血戦を行うこと。",