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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -0
- data/i18n/FutariSousa/ko_kr.yml +1625 -529
- data/i18n/Insane/ko_kr.yml +393 -258
- data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
- data/lib/bcdice/game_system/DemonSpike.rb +89 -0
- data/lib/bcdice/game_system/Emoklore.rb +4 -6
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
- data/lib/bcdice/game_system/GundamSentinel.rb +377 -0
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
- data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
- data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
- data/lib/bcdice/game_system/MamonoScramble.rb +98 -0
- data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
- data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +170 -0
- data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
- data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
- data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +16 -0
- data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +10 -4
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +173 -0
- data/lib/bcdice/game_system/ZombiLine.rb +115 -0
- data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +173 -128
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
- data/lib/bcdice/game_system.rb +9 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +13 -3
@@ -20,28 +20,28 @@ module BCDice
|
|
20
20
|
스페셜/펌블/성공/실패를 판정
|
21
21
|
・각종표
|
22
22
|
씬표 ST
|
23
|
-
사실은 무서운 현대 일본
|
24
|
-
|
25
|
-
|
23
|
+
사실은 무서운 현대 일본 장면표 HJST/광란의 20년대 장면표 MTST
|
24
|
+
빅토리아의 어둠 장면표 DVST
|
25
|
+
형용표 DT
|
26
26
|
본체표 BT/부위표 PT
|
27
27
|
감정표 FT
|
28
28
|
직업표 JT
|
29
|
-
|
29
|
+
배드엔드표 BET
|
30
30
|
랜덤 특기 결정표 RTT
|
31
31
|
지정특기(폭력)표 (TVT)
|
32
|
-
지정특기(
|
32
|
+
지정특기(정서)표 (TET)
|
33
33
|
지정특기(지각)표 (TPT)
|
34
34
|
지정특기(기술)표 (TST)
|
35
35
|
지정특기(지식)표 (TKT)
|
36
36
|
지정특기(괴이)표 (TMT)
|
37
|
-
회화 중에
|
38
|
-
거리에서
|
37
|
+
회화 중에 생겨나는 공포표(CHT)
|
38
|
+
거리에서 마주치는 공포표(VHT)
|
39
39
|
갑자기 찾아오는 공포표(IHT)
|
40
|
-
폐허에서
|
41
|
-
야외에서
|
42
|
-
정보 속에
|
40
|
+
폐허에서 마주치는 공포표(RHT)
|
41
|
+
야외에서 마주치는 공포표(MHT)
|
42
|
+
정보 속에 숨어있는 공포표(LHT)
|
43
43
|
조우표 도시 (ECT) 산림 (EMT) 해변 (EAT)/반응표 RET
|
44
|
-
야근
|
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 = 'にんしやすれいやあ
|
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)
|