bcdice 3.11.0 → 3.13.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 +58 -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/arithmetic/parser.rb +4 -2
- data/lib/bcdice/base.rb +1 -1
- data/lib/bcdice/command/parser.rb +4 -2
- data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/calc/parser.rb +4 -2
- data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
- data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
- data/lib/bcdice/game_system/Alsetto.rb +2 -2
- data/lib/bcdice/game_system/AniMalus.rb +221 -0
- data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BBN.rb +1 -1
- data/lib/bcdice/game_system/BadLife.rb +3 -3
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/Chill3.rb +6 -6
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/Elric.rb +1 -1
- data/lib/bcdice/game_system/Emoklore.rb +4 -6
- data/lib/bcdice/game_system/FullFace.rb +92 -0
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
- data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
- data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
- data/lib/bcdice/game_system/Irisbane.rb +1 -1
- data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
- data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
- data/lib/bcdice/game_system/Liminal.rb +136 -0
- data/lib/bcdice/game_system/MetalHead.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
- data/lib/bcdice/game_system/NRR.rb +122 -0
- data/lib/bcdice/game_system/NSSQ.rb +1 -1
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
- data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
- data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
- data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
- data/lib/bcdice/game_system/Postman.rb +3 -3
- data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +10 -7
- data/lib/bcdice/game_system/Ryutama.rb +4 -4
- data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
- data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
- data/lib/bcdice/game_system/Siren.rb +97 -0
- data/lib/bcdice/game_system/Skynauts.rb +1 -1
- data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
- data/lib/bcdice/game_system/Strave.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/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +21 -9
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +179 -0
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
- 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 +177 -130
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
- data/lib/bcdice/game_system.rb +12 -0
- data/lib/bcdice/loader.rb +1 -1
- data/lib/bcdice/version.rb +1 -1
- metadata +32 -5
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class ArknightsFan < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = "ArknightsFan"
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = "アークナイツTRPG by Dapto"
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = "ああくないつTRPGはいたふと"
|
|
14
|
+
|
|
15
|
+
HELP_MESSAGE = <<~TEXT
|
|
16
|
+
■ 判定 (nADm>=x)
|
|
17
|
+
nDmのダイスロールをして、x 以下であれば成功。
|
|
18
|
+
出目が91以上でエラー。
|
|
19
|
+
出目が10以下でクリティカル。
|
|
20
|
+
|
|
21
|
+
■ 判定 (nABm>=x)
|
|
22
|
+
nBmのダイスロールをして、
|
|
23
|
+
x 以下であれば成功数+1。
|
|
24
|
+
出目が91以上でエラー。成功数+1。
|
|
25
|
+
出目が10以下でクリティカル。成功数-1。
|
|
26
|
+
上記による成功数をカウント。
|
|
27
|
+
|
|
28
|
+
■ 判定 (nABm>=x--役職)
|
|
29
|
+
nBmのダイスロールをして、
|
|
30
|
+
出目が x 以下であれば成功数+1。
|
|
31
|
+
出目が91以上でエラー。成功数+1。
|
|
32
|
+
出目が10以下でクリティカル。成功数-1。
|
|
33
|
+
上記による成功数をカウントした上で、以下の役職による成功数増加効果を適応。
|
|
34
|
+
狙撃(SNIPER) 成功数1以上のとき、成功数+1。
|
|
35
|
+
TEXT
|
|
36
|
+
|
|
37
|
+
register_prefix('\d*AD\d*', '\d*AB\d*', '--ADDICTION', '--WORSENING')
|
|
38
|
+
|
|
39
|
+
def eval_game_system_specific_command(command)
|
|
40
|
+
roll_ad(command) || roll_ab(command) || roll_addiction(command) || roll_worsening(command)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def roll_ad(command)
|
|
46
|
+
m = /^(\d*)AD(\d*)<=(\d+)$/.match(command)
|
|
47
|
+
return nil unless m
|
|
48
|
+
|
|
49
|
+
times = m[1]
|
|
50
|
+
sides = m[2]
|
|
51
|
+
target = m[3].to_i
|
|
52
|
+
times = !times.empty? ? times.to_i : 1
|
|
53
|
+
sides = !sides.empty? ? sides.to_i : 100
|
|
54
|
+
return roll_d(command, times, sides, target)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def roll_ab(command)
|
|
58
|
+
m = /^(\d*)AB(\d*)<=(\d+)(?:--([^\d\s]+)(0)?)?$/.match(command)
|
|
59
|
+
return nil unless m
|
|
60
|
+
|
|
61
|
+
times = m[1]
|
|
62
|
+
sides = m[2]
|
|
63
|
+
target = m[3].to_i
|
|
64
|
+
type = m[4]
|
|
65
|
+
suffix = m[5]
|
|
66
|
+
times = !times.empty? ? times.to_i : 1
|
|
67
|
+
sides = !sides.empty? ? sides.to_i : 100
|
|
68
|
+
|
|
69
|
+
if suffix || type.nil?
|
|
70
|
+
roll_b(command, times, sides, target)
|
|
71
|
+
else
|
|
72
|
+
roll_b_withtype(command, times, sides, target, type)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def roll_d(command, times, sides, target)
|
|
77
|
+
dice_list = @randomizer.roll_barabara(times, sides).sort
|
|
78
|
+
total = dice_list.sum
|
|
79
|
+
success = total <= target
|
|
80
|
+
|
|
81
|
+
crierror =
|
|
82
|
+
if total <= 10
|
|
83
|
+
"Critical"
|
|
84
|
+
elsif total >= 91
|
|
85
|
+
"Error"
|
|
86
|
+
else
|
|
87
|
+
"Neutral"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
result =
|
|
91
|
+
if success && (crierror == "Critical")
|
|
92
|
+
"クリティカル!"
|
|
93
|
+
elsif success && (crierror == "Neutral")
|
|
94
|
+
"成功"
|
|
95
|
+
elsif success && (crierror == "Error")
|
|
96
|
+
"成功"
|
|
97
|
+
elsif !success && (crierror == "Critical")
|
|
98
|
+
"失敗"
|
|
99
|
+
elsif !success && (crierror == "Neutral")
|
|
100
|
+
"失敗"
|
|
101
|
+
elsif !success && (crierror == "Error")
|
|
102
|
+
"エラー"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if times == 1
|
|
106
|
+
return "(#{command}) > #{dice_list.join(',')} > #{result}"
|
|
107
|
+
else
|
|
108
|
+
return "(#{command}) > #{total}[#{dice_list.join(',')}] > #{result}"
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def roll_b(command, times, sides, target)
|
|
113
|
+
dice_list, success_count, critical_count, error_count = process_b(times, sides, target)
|
|
114
|
+
result_count = success_count + critical_count - error_count
|
|
115
|
+
|
|
116
|
+
return "(#{command}) > [#{dice_list.join(',')}] > #{success_count}+#{critical_count}C-#{error_count}E > 成功数#{result_count}"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def roll_b_withtype(command, times, sides, target, type)
|
|
120
|
+
dice_list, success_count, critical_count, error_count = process_b(times, sides, target)
|
|
121
|
+
result_count = success_count + critical_count - error_count
|
|
122
|
+
|
|
123
|
+
type_effect =
|
|
124
|
+
if (type == "SNIPER") && (result_count > 0)
|
|
125
|
+
1
|
|
126
|
+
else
|
|
127
|
+
0
|
|
128
|
+
end
|
|
129
|
+
result_count += type_effect
|
|
130
|
+
|
|
131
|
+
return "(#{command}) > [#{dice_list.join(',')}] > #{success_count}+#{critical_count}C-#{error_count}E+#{type_effect}(#{type}) > 成功数#{result_count}"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def process_b(times, sides, target)
|
|
135
|
+
dice_list = @randomizer.roll_barabara(times, sides).sort
|
|
136
|
+
|
|
137
|
+
success_count = 0
|
|
138
|
+
critical_count = 0
|
|
139
|
+
error_count = 0
|
|
140
|
+
|
|
141
|
+
dice_list.each do |value|
|
|
142
|
+
success_count += 1 if value <= target
|
|
143
|
+
critical_count += 1 if value <= 10
|
|
144
|
+
error_count += 1 if value >= 91
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
return [dice_list, success_count, critical_count, error_count]
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
ADDICTION_TABLE = [
|
|
151
|
+
"中枢神経障害",
|
|
152
|
+
"多臓器不全",
|
|
153
|
+
"急性ストレス反応",
|
|
154
|
+
].freeze
|
|
155
|
+
|
|
156
|
+
def roll_addiction(command)
|
|
157
|
+
return nil if command != "--ADDICTION"
|
|
158
|
+
|
|
159
|
+
value = @randomizer.roll_once(3)
|
|
160
|
+
chosen = ADDICTION_TABLE[value - 1]
|
|
161
|
+
|
|
162
|
+
return "--ADDICTION > #{chosen}"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
WORSENING_TABLE = [
|
|
166
|
+
"末梢神経障害",
|
|
167
|
+
"内臓機能不全",
|
|
168
|
+
"精神症状",
|
|
169
|
+
].freeze
|
|
170
|
+
|
|
171
|
+
def roll_worsening(command)
|
|
172
|
+
return nil if command != "--WORSENING"
|
|
173
|
+
|
|
174
|
+
value = @randomizer.roll_once(3)
|
|
175
|
+
chosen = WORSENING_TABLE[value - 1]
|
|
176
|
+
elapse = @randomizer.roll_once(6) + 1
|
|
177
|
+
|
|
178
|
+
return "--WORSENING > #{chosen}: #{elapse} rounds"
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
@@ -85,7 +85,7 @@ module BCDice
|
|
|
85
85
|
totalDamage = totalSuccessCount * damage + totalCriticalCount * criticalTrigger
|
|
86
86
|
|
|
87
87
|
result += "(#{diceCount}D10\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage}"
|
|
88
|
-
result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if
|
|
88
|
+
result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
|
|
89
89
|
result += " > #{totalDamage}ダメージ"
|
|
90
90
|
else
|
|
91
91
|
result += "(#{diceCount}D10\<\=#{target}) > #{text} > 成功数:#{totalSuccessCount}"
|
|
@@ -58,7 +58,7 @@ module BCDice
|
|
|
58
58
|
fumble = 1
|
|
59
59
|
|
|
60
60
|
isStormy = (m[2] == 'GL') # 波乱万丈
|
|
61
|
-
if
|
|
61
|
+
if isStormy
|
|
62
62
|
critical -= 3
|
|
63
63
|
fumble += 1
|
|
64
64
|
end
|
|
@@ -69,7 +69,7 @@ module BCDice
|
|
|
69
69
|
critical, fumble = get_critival_fumble(critical, fumble, m[8], m[9])
|
|
70
70
|
|
|
71
71
|
target = get_value(m[11])
|
|
72
|
-
optionalText =
|
|
72
|
+
optionalText = m[13] || ''
|
|
73
73
|
|
|
74
74
|
return checkRoll(diceCount, modify, critical, fumble, target, isStormy, optionalText)
|
|
75
75
|
end
|
|
@@ -116,7 +116,7 @@ module BCDice
|
|
|
116
116
|
|
|
117
117
|
if isCritical
|
|
118
118
|
result += "成功(クリティカル)"
|
|
119
|
-
elsif
|
|
119
|
+
elsif total >= target
|
|
120
120
|
result += "成功"
|
|
121
121
|
else
|
|
122
122
|
result += "失敗"
|
|
@@ -16,7 +16,7 @@ module BCDice
|
|
|
16
16
|
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
|
17
17
|
・1D100で判定時に成否、Botchを判定
|
|
18
18
|
例)1D100<=50
|
|
19
|
-
|
|
19
|
+
(1D100<=50) > 55 > Botch
|
|
20
20
|
INFO_MESSAGE_TEXT
|
|
21
21
|
|
|
22
22
|
def result_1d100(total, dice_total, cmp_op, target)
|
|
@@ -30,21 +30,21 @@ module BCDice
|
|
|
30
30
|
if tens == ones
|
|
31
31
|
if (total > target) || (dice_total == 100) # 00は必ず失敗
|
|
32
32
|
if target > 100 # 目標値が100を超えている場合は、00を振ってもBotchにならない
|
|
33
|
-
return Result.failure("
|
|
33
|
+
return Result.failure("Failure")
|
|
34
34
|
else
|
|
35
35
|
return Result.fumble("Botch")
|
|
36
36
|
end
|
|
37
37
|
else
|
|
38
|
-
return Result.critical("
|
|
38
|
+
return Result.critical("Colossal Success")
|
|
39
39
|
end
|
|
40
40
|
elsif (total <= target) || (dice_total == 1) # 01は必ず成功
|
|
41
41
|
if total <= (target / 2)
|
|
42
|
-
return Result.success("
|
|
42
|
+
return Result.success("High Success")
|
|
43
43
|
else
|
|
44
|
-
return Result.success("
|
|
44
|
+
return Result.success("Low Success")
|
|
45
45
|
end
|
|
46
46
|
else
|
|
47
|
-
return Result.failure("
|
|
47
|
+
return Result.failure("Failure")
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
end
|
|
@@ -57,14 +57,12 @@ module BCDice
|
|
|
57
57
|
def dice_roll(num_dice, success_threshold)
|
|
58
58
|
# ダイスを振った結果を配列として取得
|
|
59
59
|
values = @randomizer.roll_barabara(num_dice, 10)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
success = values_without_critical.count { |num| num <= success_threshold }
|
|
64
|
-
fumble = values_without_critical.count { |num| num >= FUMBLE_VALUE }
|
|
60
|
+
critical = values.count(CRITICAL_VALUE)
|
|
61
|
+
success = values.count { |num| num <= success_threshold }
|
|
62
|
+
fumble = values.count(FUMBLE_VALUE)
|
|
65
63
|
|
|
66
64
|
# 成功値
|
|
67
|
-
success_value =
|
|
65
|
+
success_value = critical + success - fumble
|
|
68
66
|
result = compare_result(success_value)
|
|
69
67
|
|
|
70
68
|
result.text = "#{values} > #{success_value} > #{translate('Emoklore.success_count', count: success_value)} #{result.text}"
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class FullFace < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'FullFace'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = 'フルフェイス'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'ふるふえいす'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGETEXT
|
|
17
|
+
■判定 x+bFF<=t x:ヒート(省略時は3) b:判定修正 t:能力値
|
|
18
|
+
|
|
19
|
+
例)FF<=2: 能力値2で判定し、その結果(成功数,1の目の数,バースト)を表示。
|
|
20
|
+
6FF<=3: ヒート6,能力値3で戦闘判定し、その結果( 〃 )を表示。
|
|
21
|
+
8+2FF<=3:ヒート8,判定修正+2,能力値3で戦闘判定し、その結果( 〃 )を表示。
|
|
22
|
+
INFO_MESSAGETEXT
|
|
23
|
+
|
|
24
|
+
register_prefix('([+\d]+)*FF')
|
|
25
|
+
|
|
26
|
+
def eval_game_system_specific_command(command)
|
|
27
|
+
resolute_action(command)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
# 技能判定
|
|
33
|
+
# @param [String] command
|
|
34
|
+
# @return [Result]
|
|
35
|
+
def resolute_action(command)
|
|
36
|
+
m = /^(\d*)([+\d]+)*FF<=(\d)$/.match(command)
|
|
37
|
+
return nil unless m
|
|
38
|
+
|
|
39
|
+
heat_level = m[1].to_i
|
|
40
|
+
heat_level = 3 if heat_level == 0
|
|
41
|
+
modify = Arithmetic.eval("0#{m[2]}", @round_type)
|
|
42
|
+
status_no = m[3].to_i
|
|
43
|
+
|
|
44
|
+
dice_array = []
|
|
45
|
+
|
|
46
|
+
dice = @randomizer.roll_barabara(heat_level, 6)
|
|
47
|
+
ones = dice.count(1)
|
|
48
|
+
sixs = dice.count(6)
|
|
49
|
+
success_num = dice.count { |val| val <= status_no }
|
|
50
|
+
dice_array.push(dice.join(","))
|
|
51
|
+
|
|
52
|
+
if modify > 0
|
|
53
|
+
dice = @randomizer.roll_barabara(modify, 6)
|
|
54
|
+
ones += dice.count(1)
|
|
55
|
+
success_num += dice.count { |val| val <= status_no }
|
|
56
|
+
dice_array.push(dice.join(","))
|
|
57
|
+
end
|
|
58
|
+
ones_total = ones
|
|
59
|
+
|
|
60
|
+
while ones > 0
|
|
61
|
+
dice = @randomizer.roll_barabara(ones, 6)
|
|
62
|
+
ones = dice.count(1)
|
|
63
|
+
ones_total += ones
|
|
64
|
+
success_num += dice.count { |val| val <= status_no }
|
|
65
|
+
dice_array.push(dice.join(","))
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
return Result.new.tap do |result|
|
|
69
|
+
if sixs >= 2
|
|
70
|
+
result.fumble = true
|
|
71
|
+
result.condition = false
|
|
72
|
+
else
|
|
73
|
+
result.condition = (success_num > 0)
|
|
74
|
+
result.critical = (ones_total > 0)
|
|
75
|
+
end
|
|
76
|
+
result_txt = []
|
|
77
|
+
result_txt.push("成功度(#{success_num})")
|
|
78
|
+
result_txt.push("1の目(#{ones_total})") if ones_total > 0
|
|
79
|
+
result_txt.push("バースト") if result.fumble?
|
|
80
|
+
|
|
81
|
+
sequence = [
|
|
82
|
+
"(#{heat_level}#{Format.modifier(modify)}FF<=#{status_no})",
|
|
83
|
+
dice_array.join('+').to_s,
|
|
84
|
+
result_txt.join(',').to_s,
|
|
85
|
+
].compact
|
|
86
|
+
|
|
87
|
+
result.text = sequence.join(" > ")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -9,7 +9,7 @@ module BCDice
|
|
|
9
9
|
ID = 'FutariSousa:Korean'
|
|
10
10
|
|
|
11
11
|
# ゲームシステム名
|
|
12
|
-
NAME = '둘이서 수사
|
|
12
|
+
NAME = '둘이서 수사'
|
|
13
13
|
|
|
14
14
|
# ゲームシステム名の読みがな
|
|
15
15
|
SORT_KEY = '国際化:Korean:둘이서 수사'
|
|
@@ -17,26 +17,51 @@ module BCDice
|
|
|
17
17
|
# ダイスボットの使い方
|
|
18
18
|
HELP_MESSAGE = <<~MESSAGETEXT
|
|
19
19
|
・판정용 커맨드
|
|
20
|
-
탐정용:【DT】…10면체 주사위를 2개 굴려
|
|
21
|
-
조수용:【AS】…6면체 주사위를 2개 굴려 판정합니다.
|
|
20
|
+
탐정용:【DT】…10면체 주사위를 2개 굴려 판정합니다.『유리함』이라면【3DT】, 『불리함』이라면【1DT】를 사용합니다.
|
|
21
|
+
조수용:【AS】…6면체 주사위를 2개 굴려 판정합니다. 『유리함』이라면【3AS】, 『불리함』이라면【1AS】를 사용합니다.
|
|
22
|
+
|
|
22
23
|
・각종표
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
사건에
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
【세션 시】
|
|
25
|
+
기벽 결정 표 SHRD
|
|
26
|
+
발언 표 SHFM/수사 강행 표 SHBT/시치미 표 SHPI
|
|
27
|
+
사건에 몰두 표 SHEG/파트너와…… 표 SHWP/뭔가 하고 있음 표 SHDS
|
|
28
|
+
기상천외 표 SHFT/갑작스런 영감 표 SHIN/희노애락 표 SHEM
|
|
29
|
+
인간 모방 표 SHHE/인간 모방 실패 표 SHHF/파트너를 향한 장난 표 SHMP
|
|
30
|
+
의미심장 표 SHSB/초조함 표 SHFR/갑자기 왜그래 표 SHIS
|
|
31
|
+
억지 요구 표 SHSE/멀쩡해 보임 표 SHLM/질투에 사로잡힘 표 SHJS
|
|
32
|
+
오만한 태도 표 SHAR/비교적 가벼운 행동 표 SHRM/노 타임 표 SHNT
|
|
33
|
+
수사 방식 표 SHIM/귀족 표 SHNO/설명하지 않음 표 SHNE
|
|
34
|
+
형사 특유의 습관 표 SHHD
|
|
35
|
+
|
|
36
|
+
이벤트 표
|
|
37
|
+
현장에서 EVS/왜? EVW/협력자와 함께 EVN
|
|
38
|
+
알아서 찾아온 단서 EVC/VS용의자 EVV
|
|
39
|
+
폐쇄 공간 EVE
|
|
40
|
+
탐정 혼자 수사 EVD/조수 혼자 수사 EVA/관광 수사 EVT
|
|
41
|
+
예상치 못한 힌트 EVH/실험을 해보자 EVX/게스트 수사 EVG
|
|
42
|
+
형사 탐문 수사 EVQ/형사 대규모 수사 EVM/비밀스러운 정보 교환 EVP
|
|
43
|
+
동료들과 함께 수사 EVO/단골 가게 시추에이션 EVF/하드B 형사 액션 EVB
|
|
44
|
+
탐정을 얌전하게 만드는 수사 EVL/전통적 수사 EVZ/원시적 수사 EVR
|
|
45
|
+
|
|
46
|
+
감정 표
|
|
47
|
+
감정 표A/B FLT66・FLT10
|
|
48
|
+
마음에 드는 점 FLTL66 /마음에 안 드는 점 FLTD66
|
|
49
|
+
무작위 감정 결정 표(당친법) FLTRA
|
|
50
|
+
얼굴 부위 FLTF66/신체 부위 FLTB66/생활 습관 FLTH66
|
|
51
|
+
마음이 들뜨는 감각 FLTS66/타인에 대한 태도 FLTA66/헤비 웨이트 FLTW66
|
|
52
|
+
동료 FLTC66/부하 FLTU66/상사 FLTO66
|
|
53
|
+
수사 방식 FLTI66
|
|
54
|
+
조사 방해 요인 표 OBT 상태 이상 표 ACT 목격자 표 EWT 미제 사건 표 WMT
|
|
55
|
+
추억의 물품 결정 표 MIT 에피소드 동반 추억의 물품 결정 표 MITE
|
|
56
|
+
호칭 표A・B NCT66・NCT10
|
|
57
|
+
|
|
32
58
|
【설정】
|
|
33
|
-
|
|
34
|
-
탐정 운명의 혈통
|
|
35
|
-
조수 정의로운 사람 BGAJ
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
호칭표A・B NCT66・NCT10
|
|
59
|
+
배경 표
|
|
60
|
+
탐정 운명의 혈통 BGDD/천성적인 재능 BGDG/마니아 BGDM
|
|
61
|
+
조수 정의로운 사람 BGAJ/정열적인 사람 BGAP/말려든 사람 BGAI
|
|
62
|
+
신장 표 HT 아지트 표 BT 관계 표 GRT
|
|
63
|
+
직업 표A・B JBT66・JBT10 패션 특징 표A・B FST66・FST10
|
|
64
|
+
호불호 표A・B LDT66・LDT10
|
|
40
65
|
MESSAGETEXT
|
|
41
66
|
|
|
42
67
|
register_prefix_from_super_class()
|
|
@@ -17,12 +17,12 @@ module BCDice
|
|
|
17
17
|
・判定コマンド(nHRFx+x)
|
|
18
18
|
注意:難易度は必要成功数を表す
|
|
19
19
|
|
|
20
|
-
難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Winのチェックを行う
|
|
20
|
+
難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Win、Total Failureのチェックを行う
|
|
21
21
|
(Desperationダイスがある場合)OverreachとDespairの発生チェックを行う
|
|
22
22
|
例) (難易度)HRF(通常ダイス)+(Desperationダイス)
|
|
23
23
|
(難易度)HRF(通常ダイス)
|
|
24
24
|
|
|
25
|
-
難易度省略:成功数のカウント、判定失敗、Critical
|
|
25
|
+
難易度省略:成功数のカウント、判定失敗、Critical処理、Total Failure、(Desperationダイスがある場合)Despairチェックを行う
|
|
26
26
|
判定成功、Overreachのチェックを行わない
|
|
27
27
|
Critical Win、(Desperationダイスがある場合)Despair、Overreachのヒントを出力
|
|
28
28
|
例) HRF(通常ダイス)+(Desperationダイス)
|
|
@@ -56,6 +56,10 @@ module BCDice
|
|
|
56
56
|
|
|
57
57
|
desperaton_dice_pool = m[DESPERATION_DICE_INDEX]&.to_i
|
|
58
58
|
if desperaton_dice_pool
|
|
59
|
+
if desperaton_dice_pool > 5
|
|
60
|
+
return "Desperationダイス指定は5ダイスが最大です。"
|
|
61
|
+
end
|
|
62
|
+
|
|
59
63
|
desperaton_dice_text, desperaton_success_dice, desperaton_ten_dice, desperaton_botch_dice = make_dice_roll(desperaton_dice_pool)
|
|
60
64
|
|
|
61
65
|
ten_dice += desperaton_ten_dice
|
|
@@ -102,6 +106,9 @@ module BCDice
|
|
|
102
106
|
if desperaton_botch_dice > 0
|
|
103
107
|
return Result.fumble("#{result_text}:判定失敗! [Despair]")
|
|
104
108
|
end
|
|
109
|
+
if success_dice == 0
|
|
110
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
|
111
|
+
end
|
|
105
112
|
|
|
106
113
|
return Result.failure("#{result_text}:判定失敗!")
|
|
107
114
|
end
|
|
@@ -111,7 +118,7 @@ module BCDice
|
|
|
111
118
|
return Result.fumble("#{result_text}:判定失敗! [Despair]")
|
|
112
119
|
end
|
|
113
120
|
|
|
114
|
-
return Result.
|
|
121
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
|
115
122
|
else
|
|
116
123
|
if desperaton_botch_dice > 0
|
|
117
124
|
result_text = "#{result_text}\n 判定失敗なら [Despair]"
|
|
@@ -13,7 +13,10 @@ module BCDice
|
|
|
13
13
|
SORT_KEY = 'むけんのふあんたしあ'
|
|
14
14
|
|
|
15
15
|
# ダイスボットの使い方
|
|
16
|
-
HELP_MESSAGE =
|
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
|
17
|
+
1D20に目標値を設定した場合に、成功レベルの自動判定を行います。
|
|
18
|
+
例: 1D20<=16
|
|
19
|
+
INFO_MESSAGE_TEXT
|
|
17
20
|
|
|
18
21
|
# ゲーム別成功度判定(1d20)
|
|
19
22
|
def result_1d20(total, _dice_total, cmp_op, target)
|
|
@@ -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
|
|
@@ -37,7 +37,7 @@ module BCDice
|
|
|
37
37
|
SceneSituation, SSi
|
|
38
38
|
HELP
|
|
39
39
|
|
|
40
|
-
ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([
|
|
40
|
+
ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+-])([+\-*/()\d]+)\])?}i.freeze
|
|
41
41
|
register_prefix('AT(TACK|K)?')
|
|
42
42
|
|
|
43
43
|
def initialize(command)
|