bcdice 3.12.0 → 3.14.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 +72 -0
- data/i18n/Arianrhod/ko_kr.yml +3 -0
- data/i18n/Cthulhu/en_us.yml +11 -0
- data/i18n/CyberpunkRed/ja_jp.yml +389 -0
- data/i18n/FinalFantasyXIV/en_us.yml +4 -0
- data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
- data/i18n/FutariSousa/ja_jp.yml +158 -1
- data/i18n/KizunaBullet/ja_jp.yml +653 -0
- data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
- data/i18n/SkynautsBouken/ja_jp.yml +114 -0
- data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
- data/i18n/UnsungDuet/ja_jp.yml +62 -0
- data/i18n/UnsungDuet/ko_kr.yml +62 -0
- data/i18n/en_us.yml +5 -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/dice_table/range_table.rb +24 -0
- data/lib/bcdice/game_system/Agnostos.rb +248 -0
- 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 +261 -0
- data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -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/BlackJacket.rb +244 -0
- data/lib/bcdice/game_system/Chill3.rb +6 -6
- data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
- data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
- data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/DivineCharger.rb +841 -0
- data/lib/bcdice/game_system/Elric.rb +1 -1
- data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
- data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
- data/lib/bcdice/game_system/FullFace.rb +121 -0
- data/lib/bcdice/game_system/FutariSousa.rb +88 -8
- data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
- data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
- data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
- data/lib/bcdice/game_system/Irisbane.rb +1 -1
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
- data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
- data/lib/bcdice/game_system/KyokoShinshoku.rb +201 -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/MonotoneMuseum.rb +14 -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/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 +1 -1
- data/lib/bcdice/game_system/Ryutama.rb +4 -4
- data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -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 +45 -130
- data/lib/bcdice/game_system/Strave.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +1 -1
- data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
- data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
- data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
- data/lib/bcdice/game_system/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
- data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
- data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
- data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
- data/lib/bcdice/game_system/Utakaze.rb +55 -2
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +12 -6
- data/lib/bcdice/game_system/Warhammer4.rb +124 -3
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
- data/lib/bcdice/game_system/Yotabana.rb +62 -0
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
- data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
- data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
- data/lib/bcdice/game_system.rb +24 -0
- data/lib/bcdice/loader.rb +1 -1
- data/lib/bcdice/version.rb +1 -1
- metadata +55 -5
@@ -0,0 +1,248 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class Agnostos < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = "Agnostos"
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = "アグノストス"
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = "あくのすとす"
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
17
|
+
■ 行為判定
|
18
|
+
CDx>=t
|
19
|
+
x: コンディションレベル(A~E もしくは 5~1)
|
20
|
+
t: 目標値
|
21
|
+
の成否とコンディションの変動量を判定します。
|
22
|
+
|
23
|
+
■ 心拍のコンディションチェック
|
24
|
+
HCDx
|
25
|
+
x: コンディションレベル(C+, B+, A, B-, C-, もしくは 5~1)
|
26
|
+
酸素の消費量、コンディションの変動量、気絶したかを判定します。
|
27
|
+
|
28
|
+
■ 必殺技
|
29
|
+
xSPy
|
30
|
+
x: メインコンディション(A~E もしくは 5~1)
|
31
|
+
y: サブコンディション(A~E もしくは 5~1)
|
32
|
+
必殺技のダメージ量を判定します。
|
33
|
+
MESSAGETEXT
|
34
|
+
|
35
|
+
register_prefix('CD', 'HCD', '[A-E1-5]SP[A-E1-5]')
|
36
|
+
|
37
|
+
def eval_game_system_specific_command(command)
|
38
|
+
condition_roll(command) || heart_condition_roll(command) || special_roll(command)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# コンディションチェック
|
44
|
+
def condition_roll(command)
|
45
|
+
parser = Command::Parser.new(/CD[A-E1-5]/, round_type: @round_type).disable_modifier.restrict_cmp_op_to(:>=)
|
46
|
+
parsed = parser.parse(command)
|
47
|
+
unless parsed
|
48
|
+
return nil
|
49
|
+
end
|
50
|
+
|
51
|
+
condition_level = to_condition_level(parsed.command[-1])
|
52
|
+
sides = to_sides(condition_level)
|
53
|
+
value = @randomizer.roll_once(sides)
|
54
|
+
|
55
|
+
Result.new.tap do |r|
|
56
|
+
r.critical = critical?(sides, value)
|
57
|
+
r.fumble = fumble?(sides, value)
|
58
|
+
r.condition = value >= parsed.target_number
|
59
|
+
|
60
|
+
r.text = [
|
61
|
+
"(CD#{condition_level}>=#{parsed.target_number})",
|
62
|
+
"(1D#{sides}>=#{parsed.target_number})",
|
63
|
+
value.to_s(),
|
64
|
+
r.success? ? "成功" : "失敗",
|
65
|
+
condition_change(sides, value),
|
66
|
+
].join(" > ")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_condition_level(char)
|
71
|
+
case char
|
72
|
+
when "5"
|
73
|
+
"A"
|
74
|
+
when "4"
|
75
|
+
"B"
|
76
|
+
when "3"
|
77
|
+
"C"
|
78
|
+
when "2"
|
79
|
+
"D"
|
80
|
+
when "1"
|
81
|
+
"E"
|
82
|
+
else
|
83
|
+
char
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def to_sides(condition)
|
88
|
+
case condition
|
89
|
+
when "A"
|
90
|
+
12
|
91
|
+
when "B"
|
92
|
+
10
|
93
|
+
when "C"
|
94
|
+
8
|
95
|
+
when "D"
|
96
|
+
6
|
97
|
+
else # "E"
|
98
|
+
4
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def condition_change(sides, value)
|
103
|
+
if critical?(sides, value)
|
104
|
+
"コンディション:2段階上昇(クリティカル)"
|
105
|
+
elsif fumble?(sides, value)
|
106
|
+
"コンディション:2段階下降(ファンブル)"
|
107
|
+
elsif sides != 12 && sides - value <= 1
|
108
|
+
"コンディション:1段階上昇"
|
109
|
+
elsif sides == 12 && value <= 6
|
110
|
+
"コンディション:1段階下降"
|
111
|
+
elsif sides == 10 && value <= 3
|
112
|
+
"コンディション:1段階下降"
|
113
|
+
elsif sides == 8 && value <= 2
|
114
|
+
"コンディション:1段階下降"
|
115
|
+
else
|
116
|
+
"コンディション:変動なし"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def critical?(sides, value)
|
121
|
+
sides != 12 && sides == value
|
122
|
+
end
|
123
|
+
|
124
|
+
def fumble?(sides, value)
|
125
|
+
sides != 4 && value == 1
|
126
|
+
end
|
127
|
+
|
128
|
+
# 心拍のコンディションチェック
|
129
|
+
def heart_condition_roll(command)
|
130
|
+
m = /^HCD([A1-5]|[BC][+-])$/.match(command)
|
131
|
+
unless m
|
132
|
+
return nil
|
133
|
+
end
|
134
|
+
|
135
|
+
suffix = m[1]
|
136
|
+
condition_level = to_heart_condition_level(suffix)
|
137
|
+
sides = to_heart_sides(condition_level)
|
138
|
+
value = @randomizer.roll_once(sides)
|
139
|
+
|
140
|
+
Result.new.tap do |r|
|
141
|
+
r.critical = critical?(sides, value)
|
142
|
+
r.fumble = fumble?(sides, value)
|
143
|
+
|
144
|
+
r.text = [
|
145
|
+
"(HCD#{condition_level})",
|
146
|
+
"(1D#{sides})",
|
147
|
+
value.to_s(),
|
148
|
+
heart_condition_change(sides, value),
|
149
|
+
].join(" > ")
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def to_heart_condition_level(char)
|
154
|
+
case char
|
155
|
+
when "5"
|
156
|
+
"C+"
|
157
|
+
when "4"
|
158
|
+
"B+"
|
159
|
+
when "3"
|
160
|
+
"A"
|
161
|
+
when "2"
|
162
|
+
"B-"
|
163
|
+
when "1"
|
164
|
+
"C-"
|
165
|
+
else
|
166
|
+
char
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def to_heart_sides(condition)
|
171
|
+
case condition
|
172
|
+
when "C+"
|
173
|
+
12
|
174
|
+
when "B+"
|
175
|
+
10
|
176
|
+
when "A"
|
177
|
+
8
|
178
|
+
when "B-"
|
179
|
+
6
|
180
|
+
else # "C-"
|
181
|
+
4
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def fainted?(sides, value)
|
186
|
+
case sides
|
187
|
+
when 12
|
188
|
+
value >= 7
|
189
|
+
when 10
|
190
|
+
value >= 10
|
191
|
+
when 8
|
192
|
+
false
|
193
|
+
when 6
|
194
|
+
value <= 1
|
195
|
+
else # 4
|
196
|
+
value <= 2
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def heart_condition_change(sides, value)
|
201
|
+
if fainted?(sides, value)
|
202
|
+
"気絶"
|
203
|
+
else
|
204
|
+
condition_change(sides, value)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
# 必殺技
|
209
|
+
def special_roll(command)
|
210
|
+
m = /^([A-E1-5])SP([A-E1-5])$/.match(command)
|
211
|
+
unless m
|
212
|
+
return nil
|
213
|
+
end
|
214
|
+
|
215
|
+
times_conditon_level = to_condition_level(m[1])
|
216
|
+
sides_conditon_level = to_condition_level(m[2])
|
217
|
+
|
218
|
+
times = to_times(times_conditon_level)
|
219
|
+
sides = to_sides(sides_conditon_level)
|
220
|
+
|
221
|
+
dice_list = @randomizer.roll_barabara(times, sides)
|
222
|
+
value = dice_list.sum()
|
223
|
+
|
224
|
+
return [
|
225
|
+
"(#{times_conditon_level}SP#{sides_conditon_level})",
|
226
|
+
"(#{times}D#{sides})",
|
227
|
+
"#{value}[#{dice_list.join(',')}]",
|
228
|
+
value.to_s(),
|
229
|
+
].join(" > ")
|
230
|
+
end
|
231
|
+
|
232
|
+
def to_times(condition)
|
233
|
+
case condition
|
234
|
+
when "A"
|
235
|
+
5
|
236
|
+
when "B"
|
237
|
+
4
|
238
|
+
when "C"
|
239
|
+
3
|
240
|
+
when "D"
|
241
|
+
2
|
242
|
+
else # "E"
|
243
|
+
1
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
@@ -102,7 +102,7 @@ module BCDice
|
|
102
102
|
totalDamage = totalSuccessCount * damage + totalCriticalCount * criticalTrigger
|
103
103
|
|
104
104
|
result += "(#{diceCount}D10\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage}"
|
105
|
-
result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if
|
105
|
+
result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
|
106
106
|
result += " > #{totalDamage}ダメージ"
|
107
107
|
else
|
108
108
|
result += "(#{diceCount}D10\<\=#{target}) > #{text} > 成功数:#{totalSuccessCount}"
|
@@ -50,7 +50,7 @@ module BCDice
|
|
50
50
|
if command =~ /(\d+)AL(C|G)?(\d+)?((x|\*)(\d+))?$/i
|
51
51
|
rapid = Regexp.last_match(1).to_i
|
52
52
|
isCritical = Regexp.last_match(2).nil?
|
53
|
-
if
|
53
|
+
if isCritical
|
54
54
|
criticalNumber = 1
|
55
55
|
else
|
56
56
|
if Regexp.last_match(2) == "G"
|
@@ -98,7 +98,7 @@ module BCDice
|
|
98
98
|
text += "+" unless text.empty?
|
99
99
|
text += "#{successCount}[#{diceText}]"
|
100
100
|
|
101
|
-
break unless
|
101
|
+
break unless isCritical
|
102
102
|
|
103
103
|
rollCount = criticalCount
|
104
104
|
end
|
@@ -0,0 +1,261 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class AniMalus < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'AniMalus'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = 'アニマラス'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'あにまらす'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGETEXT
|
17
|
+
■ステータスのダイス判定 n[+-b]AM<=t,x n:能力値 b:修正値(省略可能) t:成功値 x:必要成功数
|
18
|
+
例)3AM<=2,1: ダイスを3個振って、成功値2,必要成功数1で判定。その結果(成功数,成功・失敗,クリティカル,ファンブル)を表示
|
19
|
+
|
20
|
+
■探索技能のダイス判定 [+-b]AI<=t,x t:探索技能レベル b:修正値(省略可能) x:必要成功数
|
21
|
+
例)AI<=3,1: ダイスを3個振って、探索技能レベル3,必要成功数1で判定。その結果(成功数,成功・失敗,クリティカル,ファンブル)を表示
|
22
|
+
|
23
|
+
■攻撃判定 [+-b]AA<=t t:戦闘技能レベル b:修正値(省略可能)
|
24
|
+
例)AA<=3: ダイスを3個振って、戦闘技能レベル3で判定。その結果(成功・失敗,ダメージ,クリティカル,ファンブル)を表示
|
25
|
+
|
26
|
+
■防御判定 [+-b]AG=t t:攻撃技能レベル b:修正値(省略可能)
|
27
|
+
例)AG=2: ダイスを3個振って、攻撃技能レベル2で判定。その結果(成功・失敗,ダメージ軽減,クリティカル,ファンブル)を表示
|
28
|
+
|
29
|
+
■回避判定 [+-b]AD=t t:攻撃技能レベル b:修正値(省略可能)
|
30
|
+
例)AD=3: ダイスを1個振って、攻撃技能レベル3で判定。その結果(成功・失敗)を表示
|
31
|
+
INFO_MESSAGETEXT
|
32
|
+
|
33
|
+
register_prefix('[-+\d]*A[MIAGD]')
|
34
|
+
|
35
|
+
def initialize(command)
|
36
|
+
super(command)
|
37
|
+
|
38
|
+
@sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
|
39
|
+
end
|
40
|
+
|
41
|
+
def eval_game_system_specific_command(command)
|
42
|
+
resolute_action(command) ||
|
43
|
+
resolute_investigation(command) ||
|
44
|
+
resolute_attacking(command) ||
|
45
|
+
resolute_guarding(command) ||
|
46
|
+
resolute_dodging(command)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def with_symbol(number)
|
52
|
+
if number == 0
|
53
|
+
return ""
|
54
|
+
elsif number > 0
|
55
|
+
return "+#{number}"
|
56
|
+
else
|
57
|
+
return number.to_s
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# ステータスの判定
|
62
|
+
# @param [String] command
|
63
|
+
# @return [Result]
|
64
|
+
def resolute_action(command)
|
65
|
+
m = /^(\d+)([-+]\d+)?AM<=(\d+),(\d)$/.match(command)
|
66
|
+
return nil unless m
|
67
|
+
|
68
|
+
num_dice = m[1].to_i
|
69
|
+
num_bonus = m[2].to_i
|
70
|
+
num_target = m[3].to_i
|
71
|
+
num_success = m[4].to_i
|
72
|
+
|
73
|
+
dice = @randomizer.roll_barabara(num_dice + num_bonus, 6).sort
|
74
|
+
dice_text = dice.join(",")
|
75
|
+
success_num = dice.count { |val| val <= num_target }
|
76
|
+
is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
|
77
|
+
is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
|
78
|
+
|
79
|
+
return Result.new.tap do |result|
|
80
|
+
result.critical = is_critical
|
81
|
+
result.fumble = is_fumble
|
82
|
+
result.condition = (success_num >= num_success)
|
83
|
+
|
84
|
+
sequence = [
|
85
|
+
"(#{num_dice}#{with_symbol(num_bonus)}AM<=#{num_target},#{num_success})",
|
86
|
+
dice_text,
|
87
|
+
"成功数#{success_num}",
|
88
|
+
if result.success?
|
89
|
+
"成功"
|
90
|
+
else
|
91
|
+
"失敗"
|
92
|
+
end
|
93
|
+
].compact
|
94
|
+
sequence.push("クリティカル") if result.critical?
|
95
|
+
sequence.push("ファンブル") if result.fumble?
|
96
|
+
|
97
|
+
result.text = sequence.join(" > ")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# 探索技能の判定
|
102
|
+
# @param [String] command
|
103
|
+
# @return [Result]
|
104
|
+
def resolute_investigation(command)
|
105
|
+
m = /^([-+]\d+)?AI<=(\d+),(\d)$/.match(command)
|
106
|
+
return nil unless m
|
107
|
+
|
108
|
+
num_bonus = m[1].to_i
|
109
|
+
num_target = m[2].to_i
|
110
|
+
num_success = m[3].to_i
|
111
|
+
|
112
|
+
dice = @randomizer.roll_barabara(3 + num_bonus, 6).sort
|
113
|
+
dice_text = dice.join(",")
|
114
|
+
success_num = dice.count { |val| val <= num_target }
|
115
|
+
is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
|
116
|
+
is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
|
117
|
+
|
118
|
+
return Result.new.tap do |result|
|
119
|
+
result.critical = is_critical
|
120
|
+
result.fumble = is_fumble
|
121
|
+
result.condition = (success_num >= num_success)
|
122
|
+
|
123
|
+
sequence = [
|
124
|
+
"(#{with_symbol(num_bonus)}AI<=#{num_target},#{num_success})",
|
125
|
+
dice_text,
|
126
|
+
"成功数#{success_num}",
|
127
|
+
if result.success?
|
128
|
+
"成功"
|
129
|
+
else
|
130
|
+
"失敗"
|
131
|
+
end
|
132
|
+
].compact
|
133
|
+
sequence.push("クリティカル") if result.critical?
|
134
|
+
sequence.push("ファンブル") if result.fumble?
|
135
|
+
|
136
|
+
result.text = sequence.join(" > ")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# 攻撃技能の判定
|
141
|
+
# @param [String] command
|
142
|
+
# @return [Result]
|
143
|
+
def resolute_attacking(command)
|
144
|
+
m = /^([-+]\d+)?AA<=(\d+)$/.match(command)
|
145
|
+
return nil unless m
|
146
|
+
|
147
|
+
num_bonus = m[1].to_i
|
148
|
+
num_target = m[2].to_i
|
149
|
+
|
150
|
+
dice = @randomizer.roll_barabara(3 + num_bonus, 6).sort
|
151
|
+
dice_text = dice.join(",")
|
152
|
+
success_num = dice.count { |val| val <= num_target }
|
153
|
+
is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
|
154
|
+
is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
|
155
|
+
|
156
|
+
damage1 = dice.max
|
157
|
+
damage2 = dice.max
|
158
|
+
(1..num_target).each do |idx|
|
159
|
+
if dice.count(idx) > 1
|
160
|
+
now_damage = damage1 + 3 * (dice.count(idx) - 1)
|
161
|
+
damage2 = now_damage if damage2 < now_damage
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
return Result.new.tap do |result|
|
166
|
+
result.critical = is_critical
|
167
|
+
result.fumble = is_fumble
|
168
|
+
result.condition = (success_num > 0)
|
169
|
+
|
170
|
+
sequence = [
|
171
|
+
"(#{with_symbol(num_bonus)}AA<=#{num_target})",
|
172
|
+
dice_text,
|
173
|
+
"成功数#{success_num}",
|
174
|
+
if result.success?
|
175
|
+
"成功"
|
176
|
+
else
|
177
|
+
"失敗"
|
178
|
+
end
|
179
|
+
].compact
|
180
|
+
if result.success?
|
181
|
+
sequence.push("最大ダメージ(#{damage2})")
|
182
|
+
end
|
183
|
+
sequence.push("クリティカル") if result.critical?
|
184
|
+
sequence.push("ファンブル") if result.fumble?
|
185
|
+
|
186
|
+
result.text = sequence.join(" > ")
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
# 防御技能の判定
|
191
|
+
# @param [String] command
|
192
|
+
# @return [Result]
|
193
|
+
def resolute_guarding(command)
|
194
|
+
m = /^([-+]\d+)?AG=(\d+)$/.match(command)
|
195
|
+
return nil unless m
|
196
|
+
|
197
|
+
num_bonus = m[1].to_i
|
198
|
+
num_target = m[2].to_i
|
199
|
+
|
200
|
+
dice = @randomizer.roll_barabara(3 + num_bonus, 6).sort
|
201
|
+
dice_text = dice.join(",")
|
202
|
+
success_num = dice.count(num_target)
|
203
|
+
is_critical = dice.include?(1) && dice.include?(2) && dice.include?(3)
|
204
|
+
is_fumble = dice.include?(4) && dice.include?(5) && dice.include?(6)
|
205
|
+
|
206
|
+
return Result.new.tap do |result|
|
207
|
+
result.critical = is_critical
|
208
|
+
result.fumble = is_fumble
|
209
|
+
result.condition = (success_num > 0)
|
210
|
+
|
211
|
+
sequence = [
|
212
|
+
"(#{with_symbol(num_bonus)}AG=#{num_target})",
|
213
|
+
dice_text,
|
214
|
+
"成功数#{success_num}",
|
215
|
+
if result.success?
|
216
|
+
"成功 > ダメージ軽減(#{success_num * 2})"
|
217
|
+
else
|
218
|
+
"失敗"
|
219
|
+
end
|
220
|
+
].compact
|
221
|
+
sequence.push("クリティカル") if result.critical?
|
222
|
+
sequence.push("ファンブル") if result.fumble?
|
223
|
+
|
224
|
+
result.text = sequence.join(" > ")
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# 回避技能の判定
|
229
|
+
# @param [String] command
|
230
|
+
# @return [Result]
|
231
|
+
def resolute_dodging(command)
|
232
|
+
m = /^([-+]\d+)?AD=(\d+)$/.match(command)
|
233
|
+
return nil unless m
|
234
|
+
|
235
|
+
num_bonus = m[1].to_i
|
236
|
+
num_target = m[2].to_i
|
237
|
+
|
238
|
+
dice = @randomizer.roll_barabara(1 + num_bonus, 6)
|
239
|
+
dice_text = dice.join(",")
|
240
|
+
success_num = dice.count(num_target)
|
241
|
+
|
242
|
+
return Result.new.tap do |result|
|
243
|
+
result.condition = (success_num > 0)
|
244
|
+
|
245
|
+
sequence = [
|
246
|
+
"(#{with_symbol(num_bonus)}AD=#{num_target})",
|
247
|
+
dice_text,
|
248
|
+
"成功数#{success_num}",
|
249
|
+
if result.success?
|
250
|
+
"成功(ダメージ無効)"
|
251
|
+
else
|
252
|
+
"失敗"
|
253
|
+
end
|
254
|
+
].compact
|
255
|
+
|
256
|
+
result.text = sequence.join(" > ")
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class Arianrhod_Korean < Arianrhod
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'Arianrhod:Korean'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = '아리안로드RPG'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = '国際化:Korean:아리안로드RPG'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
17
|
+
・크리티컬, 펌블의 자동판정을 행합니다.(크리티컬 시의 추가 대미지도 표시됩니다)
|
18
|
+
・D66 다이스 있음
|
19
|
+
INFO_MESSAGE_TEXT
|
20
|
+
|
21
|
+
def initialize(command)
|
22
|
+
super(command)
|
23
|
+
|
24
|
+
@locale = :ko_kr
|
25
|
+
end
|
26
|
+
|
27
|
+
register_prefix_from_super_class()
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|