bcdice 3.10.0 → 3.12.0

Sign up to get free protection for your applications and to get access to all the features.
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)