bcdice 3.10.0 → 3.12.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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/i18n/FutariSousa/ko_kr.yml +1625 -529
  4. data/i18n/Insane/ko_kr.yml +393 -258
  5. data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
  6. data/lib/bcdice/game_system/DemonSpike.rb +89 -0
  7. data/lib/bcdice/game_system/Emoklore.rb +4 -6
  8. data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
  9. data/lib/bcdice/game_system/GundamSentinel.rb +377 -0
  10. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
  11. data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
  12. data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
  13. data/lib/bcdice/game_system/MamonoScramble.rb +98 -0
  14. data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
  15. data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
  16. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +170 -0
  17. data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
  18. data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
  19. data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
  20. data/lib/bcdice/game_system/SwordWorld.rb +16 -0
  21. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
  22. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +10 -4
  23. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +173 -0
  24. data/lib/bcdice/game_system/ZombiLine.rb +115 -0
  25. data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
  26. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
  27. data/lib/bcdice/game_system/sword_world/rating_parser.rb +173 -128
  28. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
  29. data/lib/bcdice/game_system.rb +9 -0
  30. data/lib/bcdice/version.rb +1 -1
  31. metadata +13 -3
@@ -20,28 +20,28 @@ module BCDice
20
20
  스페셜/펌블/성공/실패를 판정
21
21
  ・각종표
22
22
  씬표   ST
23
-  사실은 무서운 현대 일본 씬표 HJST/광조의 20년대 씬표 MTST
24
-  암흑의 빅토리아 씬표 DVST
25
- 수식표    DT
23
+  사실은 무서운 현대 일본 장면표 HJST/광란의 20년대 장면표 MTST
24
+  빅토리아의 어둠 장면표 DVST
25
+ 형용표    DT
26
26
   본체표 BT/부위표 PT
27
27
  감정표      FT
28
28
  직업표      JT
29
- 배드엔딩표  BET
29
+ 배드엔드표  BET
30
30
  랜덤 특기 결정표 RTT
31
31
  지정특기(폭력)표  (TVT)
32
- 지정특기(감정)표  (TET)
32
+ 지정특기(정서)표  (TET)
33
33
  지정특기(지각)표  (TPT)
34
34
  지정특기(기술)표  (TST)
35
35
  지정특기(지식)표  (TKT)
36
36
  지정특기(괴이)표  (TMT)
37
- 회화 중에 발생하는 공포표(CHT)
38
- 거리에서 조우하는 공포표(VHT)
37
+ 회화 중에 생겨나는 공포표(CHT)
38
+ 거리에서 마주치는 공포표(VHT)
39
39
  갑자기 찾아오는 공포표(IHT)
40
- 폐허에서 조우하는 공포표(RHT)
41
- 야외에서 조우하는 공포표(MHT)
42
- 정보 속에 숨어 있는 공포표(LHT)
40
+ 폐허에서 마주치는 공포표(RHT)
41
+ 야외에서 마주치는 공포표(MHT)
42
+ 정보 속에 숨어있는 공포표(LHT)
43
43
  조우표 도시 (ECT) 산림 (EMT) 해변 (EAT)/반응표 RET
44
- 야근 조우하는 공포표 OHT/야근 전화표 OPT/야근 씬표 OWT
44
+ 야근 호러 스케이프 OHT/야근 전화표 OPT/야근 장면표 OWT
45
45
  회사명 결정표1 CNT1/회사명 결정표2 CNT2/회사명 결정표3 CNT3
46
46
  ・D66 다이스 있음.
47
47
  INFO_MESSAGE_TEXT
@@ -0,0 +1,251 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class KamitsubakiCityUnderConstructionNarrative < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'KamitsubakiCityUnderConstructionNarrative'
8
+
9
+ # ゲームシステム名
10
+ NAME = '神椿市建設中。NARRATIVE'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'かみつはきしけんせつちゆうならていふ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・可組(KA)
18
+  KA6 行動判定
19
+  KA8 技能ロール
20
+  KA10 特技ロール
21
+  KA12 Aロール
22
+
23
+ ・裏組(RI)
24
+  RI6 行動判定
25
+  RI8 技能ロール
26
+  RI10 特技ロール
27
+  RI12 Aロール
28
+
29
+ ・羽組(HA)
30
+  HA6 行動判定
31
+  HA8 技能ロール
32
+  HA10 特技ロール
33
+  HA12 Aロール
34
+
35
+ ・星組(SE)
36
+  SE6 行動判定
37
+  SE8 技能ロール
38
+  SE10 特技ロール
39
+  SE12 Aロール
40
+
41
+ ・狐組(CO)
42
+  CO6 行動判定
43
+  CO8 技能ロール
44
+  CO10 特技ロール
45
+  CO12 Aロール
46
+
47
+ ・GM用
48
+  GM6 (成否判定なし)
49
+  GM8 技能ロール
50
+  GM10 特技ロール
51
+  Q12 Qロール
52
+
53
+ ・存在証明 EXI<=x
54
+  存在証明の判定を行う
55
+  x: 存在値
56
+ INFO_MESSAGE_TEXT
57
+
58
+ def eval_game_system_specific_command(command)
59
+ roll_kumi(command) || roll_existence(command)
60
+ end
61
+
62
+ private
63
+
64
+ def roll_kumi(command)
65
+ table = TABLES[command]
66
+ unless table
67
+ return nil
68
+ end
69
+
70
+ return table.roll(@randomizer)
71
+ end
72
+
73
+ class KumiDice
74
+ def initialize(items)
75
+ @items = items.freeze
76
+ end
77
+
78
+ CRITICAL = "M"
79
+ FUMBLE = "Q"
80
+
81
+ def roll(randomizer)
82
+ dice = randomizer.roll_once(@items.length)
83
+ chosen = @items[dice - 1]
84
+
85
+ fumble = chosen == FUMBLE
86
+ critical = chosen == CRITICAL
87
+
88
+ result_tail =
89
+ if fumble
90
+ "ファンブル"
91
+ elsif critical
92
+ "マジック"
93
+ elsif !chosen.empty?
94
+ "成功"
95
+ else
96
+ "失敗"
97
+ end
98
+
99
+ Result.new.tap do |r|
100
+ r.critical = critical
101
+ r.fumble = fumble
102
+ r.condition = !chosen.empty? && !r.fumble?
103
+ r.text = [
104
+ "(D#{@items.length})",
105
+ dice,
106
+ chosen.empty? ? nil : chosen,
107
+ result_tail
108
+ ].compact.join(" > ")
109
+ end
110
+ end
111
+ end
112
+
113
+ class KumiD6
114
+ def initialize(success_symbol)
115
+ @success_symbol = success_symbol
116
+ end
117
+
118
+ TABLE = ["裏", "羽", "星", "狐", "可", "Q"].freeze
119
+
120
+ def roll(randomizer)
121
+ dice = randomizer.roll_once(6)
122
+ chosen = TABLE[dice - 1]
123
+
124
+ Result.new.tap do |r|
125
+ unless @success_symbol.nil?
126
+ r.fumble = chosen == "Q"
127
+ r.condition = chosen == @success_symbol
128
+ end
129
+
130
+ result_tail =
131
+ if r.fumble?
132
+ "ファンブル"
133
+ elsif r.success?
134
+ "成功"
135
+ elsif r.failure?
136
+ "失敗"
137
+ end
138
+
139
+ r.text = [
140
+ "(D6)",
141
+ dice,
142
+ chosen,
143
+ result_tail
144
+ ].compact.join(" > ")
145
+ end
146
+ end
147
+ end
148
+
149
+ class QDice
150
+ def initialize(items)
151
+ @items = items.freeze
152
+ end
153
+
154
+ CRITICAL = "M"
155
+
156
+ def roll(randomizer)
157
+ dice = randomizer.roll_once(@items.length)
158
+ chosen = @items[dice - 1]
159
+
160
+ critical = chosen == CRITICAL
161
+
162
+ result_tail =
163
+ if critical
164
+ "マジック"
165
+ elsif !chosen.empty?
166
+ "成功"
167
+ else
168
+ "失敗"
169
+ end
170
+
171
+ Result.new.tap do |r|
172
+ r.critical = critical
173
+ r.condition = !chosen.empty?
174
+ r.text = [
175
+ "(D#{@items.length})",
176
+ dice.to_s,
177
+ chosen.empty? ? nil : chosen,
178
+ result_tail,
179
+ ].compact.join(" > ")
180
+ end
181
+ end
182
+ end
183
+
184
+ def roll_existence(command)
185
+ m = /^EXI<=(\d+)$/.match(command)
186
+ unless m
187
+ return nil
188
+ end
189
+
190
+ target = m[1].to_i
191
+ dice = @randomizer.roll_once(20)
192
+ Result.new.tap do |r|
193
+ r.critical = dice == 1
194
+ r.fumble = dice == 20
195
+ r.condition = (dice <= target && !r.fumble?) || r.critical?
196
+
197
+ result_tail =
198
+ if r.critical?
199
+ "M > マジック"
200
+ elsif r.fumble?
201
+ "Q > ファンブル"
202
+ elsif r.success?
203
+ "成功"
204
+ else
205
+ "失敗"
206
+ end
207
+
208
+ r.text = [
209
+ "(D20<=#{target})",
210
+ dice,
211
+ result_tail
212
+ ].join(" > ")
213
+ end
214
+ end
215
+
216
+ TABLES = {
217
+ "KA6" => KumiD6.new("可"),
218
+ "KA8" => KumiDice.new(["Q", "", "", "", "可", "可", "可", "M"]),
219
+ "KA10" => KumiDice.new(["Q", "", "", "可", "可", "可", "可", "可", "M", "M"]),
220
+ "KA12" => KumiDice.new(["Q", "", "", "可", "可", "可", "可", "可", "可", "可", "M", "M"]),
221
+
222
+ "RI6" => KumiD6.new("裏"),
223
+ "RI8" => KumiDice.new(["Q", "", "", "", "裏", "裏", "裏", "M"]),
224
+ "RI10" => KumiDice.new(["Q", "", "", "裏", "裏", "裏", "裏", "裏", "M", "M"]),
225
+ "RI12" => KumiDice.new(["M", "M", "裏", "裏", "裏", "裏", "裏", "裏", "裏", "", "", "Q"]),
226
+
227
+ "HA6" => KumiD6.new("羽"),
228
+ "HA8" => KumiDice.new(["Q", "", "", "", "羽", "羽", "羽", "M"]),
229
+ "HA10" => KumiDice.new(["Q", "", "", "羽", "羽", "羽", "羽", "羽", "M", "M"]),
230
+ "HA12" => KumiDice.new(["Q", "Q", "羽", "羽", "羽", "", "", "", "M", "M", "M", "M"]),
231
+
232
+ "SE6" => KumiD6.new("星"),
233
+ "SE8" => KumiDice.new(["Q", "", "", "", "星", "星", "星", "M"]),
234
+ "SE10" => KumiDice.new(["Q", "", "", "星", "星", "星", "星", "星", "M", "M"]),
235
+ "SE12" => KumiDice.new(["星", "", "星", "星", "M", "Q", "M", "星", "星", "星", "", "星"]),
236
+
237
+ "CO6" => KumiD6.new("狐"),
238
+ "CO8" => KumiDice.new(["Q", "", "", "", "狐", "狐", "狐", "M"]),
239
+ "CO10" => KumiDice.new(["Q", "", "", "狐", "狐", "狐", "狐", "狐", "M", "M"]),
240
+ "CO12" => KumiDice.new(["Q", "", "", "狐狐狐", "狐狐", "狐", "狐狐狐", "狐狐", "狐", "狐", "M", "M"]),
241
+
242
+ "GM6" => KumiD6.new(nil),
243
+ "GM8" => KumiDice.new(["Q", "", "", "", "W", "W", "W", "M"]),
244
+ "GM10" => KumiDice.new(["Q", "", "", "W", "W", "W", "W", "W", "M", "M"]),
245
+ "Q12" => QDice.new(["", "", "", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "M", "M"])
246
+ }.freeze
247
+
248
+ register_prefix("EXI", TABLES.keys)
249
+ end
250
+ end
251
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class MamonoScramble < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'MamonoScramble'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'マモノスクランブル'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'まものすくらんふる'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・判定 xMS<=t
18
+  [判定]を行う。成否と[マリョク]の上昇量を表示する。
19
+  x: ダイス数
20
+  t: 能力値(目標値)
21
+
22
+ ・アクシデント表 ACC
23
+ INFO_MESSAGE_TEXT
24
+
25
+ def initialize(command)
26
+ super(command)
27
+
28
+ @sides_implicit_d = 12
29
+ @round_type = RoundType::CEIL
30
+ end
31
+
32
+ def eval_game_system_specific_command(command)
33
+ roll_ability(command) || roll_tables(command, TABLES)
34
+ end
35
+
36
+ private
37
+
38
+ def roll_ability(command)
39
+ parser = Command::Parser.new("MS", round_type: @round_type)
40
+ .has_prefix_number
41
+ .disable_modifier
42
+ .restrict_cmp_op_to(:<=)
43
+ parsed = parser.parse(command)
44
+ unless parsed
45
+ return nil
46
+ end
47
+
48
+ dice_list = @randomizer.roll_barabara(parsed.prefix_number, 12).sort
49
+ count_success = dice_list.count { |value| value <= parsed.target_number }
50
+ count_one = dice_list.count(1)
51
+ is_critical = count_one > 0
52
+ has_twelve = dice_list.include?(12)
53
+
54
+ maryoku =
55
+ if has_twelve && !is_critical
56
+ 0
57
+ else
58
+ count_success + count_one
59
+ end
60
+
61
+ sequence = [
62
+ "(#{parsed})",
63
+ "[#{dice_list.join(',')}]",
64
+ count_success > 0 ? "成功, [マリョク]が#{maryoku}上がる" : "失敗"
65
+ ]
66
+
67
+ return Result.new.tap do |r|
68
+ r.text = sequence.join(" > ")
69
+ r.condition = count_success > 0
70
+ r.critical = r.success? && is_critical
71
+ end
72
+ end
73
+
74
+ TABLES = {
75
+ "ACC" => DiceTable::Table.new(
76
+ "アクシデント表",
77
+ "1D12",
78
+ [
79
+ "思わぬ対立:[判定]で10〜12の出目を1個でも出した場合、【耐久値】を2点減らす。",
80
+ "都市の迷宮化:[判定]に【社会】を使用できない。",
81
+ "不穏な天気:特別な効果は発生しない。",
82
+ "突然の雷雨:エリアの[特性]に[雨]や[水たまり]などを足してもいい。",
83
+ "関係ない危機:[判定]に失敗したPCの【耐久値】を2点減らす。",
84
+ "からりと晴天:エリアの[特性]に[強い日光]や[日だまり]などを足してもいい。",
85
+ "謎のお祭り:[判定]で1〜3の出目を1個でも出した場合、【耐久値】を2点回復する。",
86
+ "すごい人ごみ:エリアの[特性]に[野次馬]や[観光客]などを足してもいい。",
87
+ "マリョク乱気流:[判定]に【異質】を使用できない。",
88
+ "魔術テロ事件:GMが1Dをロールする。出目が1〜3なら【身体】、出目が4〜6なら【異質】、出目が7〜9なら【社会】が[判定]で使えない。10〜12は何も起きない。",
89
+ "マリョク低気圧:[判定]に【身体】を使用できない。",
90
+ "平穏な時間:特別な効果は発生しない。",
91
+ ]
92
+ )
93
+ }.freeze
94
+
95
+ register_prefix('\d+MS', TABLES.keys)
96
+ end
97
+ end
98
+ end
@@ -13,7 +13,7 @@ module BCDice
13
13
  NAME = 'ニンジャスレイヤーTRPG'
14
14
 
15
15
  # ゲームシステム名の読みがな
16
- SORT_KEY = 'にんしやすれいやあRPG'
16
+ SORT_KEY = 'にんしやすれいやあTRPG'
17
17
 
18
18
  # ダイスボットの使い方
19
19
  HELP_MESSAGE = <<~MESSAGETEXT
@@ -38,6 +38,8 @@ module BCDice
38
38
 
39
39
  ・難易度
40
40
   KIDS=K,EASY=E,NORMAL=N,HARD=H,ULTRA HARD=UH 数字にも対応
41
+
42
+ ※上記コマンド群は『ニンジャスレイヤーTRPG コア・ルールブック』に対応していません。コア・ルールブックで遊ぶ場合には『ニンジャスレイヤーTRPG 2版』のコマンドを利用してください。
41
43
  MESSAGETEXT
42
44
 
43
45
  def initialize(command)