bcdice 3.2.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -3
- data/README.md +1 -1
- data/i18n/MagicaLogia/zh_hans.yml +564 -0
- data/i18n/StellarKnights/ja_jp.yml +2 -0
- data/i18n/StellarKnights/ko_kr.yml +498 -0
- data/i18n/zh_hans.yml +7 -0
- data/lib/bcdice/command/parsed.rb +11 -3
- data/lib/bcdice/command/parser.rb +179 -100
- data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
- data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
- data/lib/bcdice/game_system.rb +3 -0
- data/lib/bcdice/game_system/Amadeus.rb +110 -93
- data/lib/bcdice/game_system/AnimaAnimus.rb +15 -8
- data/lib/bcdice/game_system/BattleTech.rb +109 -28
- data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
- data/lib/bcdice/game_system/BlindMythos.rb +38 -37
- data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
- data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
- data/lib/bcdice/game_system/DeadlineHeroes.rb +9 -8
- data/lib/bcdice/game_system/DoubleCross.rb +2 -0
- data/lib/bcdice/game_system/Emoklore.rb +22 -17
- data/lib/bcdice/game_system/FutariSousa.rb +12 -10
- data/lib/bcdice/game_system/GardenOrder.rb +11 -6
- data/lib/bcdice/game_system/KemonoNoMori.rb +25 -38
- data/lib/bcdice/game_system/KurayamiCrying.rb +86 -0
- data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
- data/lib/bcdice/game_system/LogHorizon.rb +10 -7
- data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +2 -1
- data/lib/bcdice/game_system/Nechronica.rb +57 -91
- data/lib/bcdice/game_system/NinjaSlayer.rb +2 -3
- data/lib/bcdice/game_system/SRS.rb +17 -16
- data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
- data/lib/bcdice/game_system/Satasupe.rb +31 -31
- data/lib/bcdice/game_system/ScreamHighSchool.rb +3 -3
- data/lib/bcdice/game_system/Skynauts.rb +101 -140
- data/lib/bcdice/game_system/StarryDolls.rb +318 -0
- data/lib/bcdice/game_system/SteamPunkers.rb +11 -6
- data/lib/bcdice/game_system/StellarKnights.rb +28 -12
- data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
- data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
- data/lib/bcdice/game_system/TrinitySeven.rb +275 -276
- data/lib/bcdice/game_system/Utakaze.rb +52 -47
- data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
- data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
- data/lib/bcdice/version.rb +1 -1
- metadata +8 -2
@@ -128,27 +128,30 @@ module BCDice
|
|
128
128
|
dice_total = dice_list.sum()
|
129
129
|
total = dice_total + parsed.modify_number
|
130
130
|
|
131
|
+
result = result_text(dice_count, dice_list, total, parsed)
|
132
|
+
|
131
133
|
sequence = [
|
132
134
|
"(#{parsed})",
|
133
135
|
"#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(parsed.modify_number)}",
|
134
136
|
total,
|
135
|
-
|
137
|
+
result.text,
|
136
138
|
].compact
|
137
139
|
|
138
|
-
|
140
|
+
result.text = sequence.join(" > ")
|
141
|
+
result
|
139
142
|
end
|
140
143
|
|
141
144
|
def result_text(dice_count, dice_list, total, parsed)
|
142
145
|
if dice_list.count(6) >= 2
|
143
|
-
translate("LogHorizon.LH.critical")
|
146
|
+
Result.critical(translate("LogHorizon.LH.critical"))
|
144
147
|
elsif dice_list.count(1) >= dice_count
|
145
|
-
translate("LogHorizon.LH.fumble")
|
148
|
+
Result.fumble(translate("LogHorizon.LH.fumble"))
|
146
149
|
elsif parsed.cmp_op.nil?
|
147
|
-
|
150
|
+
Result.new
|
148
151
|
elsif total >= parsed.target_number
|
149
|
-
translate(
|
152
|
+
Result.success(translate("success"))
|
150
153
|
else
|
151
|
-
translate(
|
154
|
+
Result.failure(translate("failure"))
|
152
155
|
end
|
153
156
|
end
|
154
157
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bcdice/game_system/MagicaLogia"
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class MagicaLogia_SimplifiedChinese < MagicaLogia
|
8
|
+
# ゲームシステムの識別子
|
9
|
+
ID = "MagicaLogia:SimplifiedChinese"
|
10
|
+
|
11
|
+
# ゲームシステム名
|
12
|
+
NAME = "魔导书大战"
|
13
|
+
|
14
|
+
# ゲームシステム名の読みがな
|
15
|
+
SORT_KEY = "国際化:Simplified Chinese:魔导书大战"
|
16
|
+
|
17
|
+
# ダイスボットの使い方
|
18
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
19
|
+
・判定
|
20
|
+
可以判定大成功/大失败/成功/失败
|
21
|
+
・各种表
|
22
|
+
经历表 BGT/初期锚点表 DAT/命运属性表 FAT
|
23
|
+
愿望表 WIT/战利品表 PT
|
24
|
+
时间流逝表 TPT/大判时间流逝表 TPTB
|
25
|
+
事件表 AT
|
26
|
+
大失败表 FT/变调表 WT
|
27
|
+
命运转变表表 FCT
|
28
|
+
典型性灾厄 TCT/物理性灾厄 PCT/精神性灾厄 MCT/狂气性灾厄 ICT
|
29
|
+
社会性灾厄 SCT/超自然灾厄 XCT/不可思议的灾厄 WCT/喜剧性灾厄 CCT
|
30
|
+
魔法使的灾厄 MGCT
|
31
|
+
场景表 ST/大判场景表 STB
|
32
|
+
极限环境 XEST/内心世界 IWST/魔法都市 MCST
|
33
|
+
死后世界 WDST/迷宫世界 LWST
|
34
|
+
魔法书架 MBST/魔法学院 MAST/克雷德塔 TCST
|
35
|
+
平行世界 PWST/终末世界 PAST/异世界酒吧 GBST
|
36
|
+
星影 SLST/旧图书馆 OLST
|
37
|
+
世界法则追加表 WLAT/徘徊怪物表 WMT
|
38
|
+
随机领域表 RCT
|
39
|
+
随机特技表 RTT
|
40
|
+
星领域随机特技表 RTS, RTT1
|
41
|
+
兽领域随机特技表 RTB, RTT2
|
42
|
+
力领域随机特技表 RTF, RTT3
|
43
|
+
歌领域随机特技表 RTP, RTT4
|
44
|
+
梦领域随机特技表 RTD, RTT5
|
45
|
+
暗领域随机特技表 RTN, RTT6
|
46
|
+
空白秘密表 BST
|
47
|
+
宿敌表 MIT/谋略表 MOT/因缘表 MAT
|
48
|
+
奇人表 MUT/力场表 MFT/同盟表 MLT
|
49
|
+
落花表 FFT
|
50
|
+
那之后表 FLT
|
51
|
+
・可以使用D66
|
52
|
+
INFO_MESSAGE_TEXT
|
53
|
+
|
54
|
+
register_prefix_from_super_class()
|
55
|
+
|
56
|
+
def initialize(command)
|
57
|
+
super(command)
|
58
|
+
|
59
|
+
@locale = :zh_hans
|
60
|
+
end
|
61
|
+
|
62
|
+
SKILL_TABLE = translate_skill_table(:zh_hans)
|
63
|
+
TABLES = translate_tables(:zh_hans, SKILL_TABLE)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -72,7 +72,8 @@ module BCDice
|
|
72
72
|
'BUS', 'SHS', 'ASS', 'SUS', 'SCS', 'LAS', 'NES', 'COS', 'ENS', 'TOS',
|
73
73
|
'ABUS', 'ASHS', 'AASS', 'ASUS', 'ASCS', 'ALAS', 'ANES', 'ACOS', 'AENS', 'ATOS',
|
74
74
|
'SE', 'ARN', 'WEN', 'NEN', 'CEN', 'SEN', 'OEN',
|
75
|
-
'DFT'
|
75
|
+
'DFT',
|
76
|
+
'PNT', 'MLT'
|
76
77
|
)
|
77
78
|
|
78
79
|
def initialize(command)
|
@@ -17,10 +17,10 @@ module BCDice
|
|
17
17
|
# ダイスボットの使い方
|
18
18
|
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
19
19
|
・判定 (nNC+m)
|
20
|
-
ダイス数n、修正値m
|
20
|
+
ダイス数n、修正値mで判定ロールを行います(省略=1)
|
21
21
|
ダイス数が2以上の時のパーツ破損数も表示します。
|
22
22
|
・攻撃判定 (nNA+m)
|
23
|
-
ダイス数n、修正値m
|
23
|
+
ダイス数n、修正値mで攻撃判定ロールを行います(省略=1)
|
24
24
|
命中部位とダイス数が2以上の時のパーツ破損数も表示します。
|
25
25
|
|
26
26
|
表
|
@@ -37,126 +37,92 @@ module BCDice
|
|
37
37
|
@default_target_number = 6 # 目標値が空欄の時の目標値
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
def replace_text(string)
|
43
|
-
string = string.gsub(/(\d+)NC(10)?([+\-][+\-\d]+)/i) { "#{Regexp.last_match(1)}R10#{Regexp.last_match(3)}[0]" }
|
44
|
-
string = string.gsub(/(\d+)NC(10)?/i) { "#{Regexp.last_match(1)}R10[0]" }
|
45
|
-
string = string.gsub(/(\d+)NA(10)?([+\-][+\-\d]+)/i) { "#{Regexp.last_match(1)}R10#{Regexp.last_match(3)}[1]" }
|
46
|
-
string = string.gsub(/(\d+)NA(10)?/i) { "#{Regexp.last_match(1)}R10[1]" }
|
47
|
-
|
48
|
-
return string
|
40
|
+
def eval_game_system_specific_command(command)
|
41
|
+
roll_tables(command, self.class::TABLES) || nechronica_check(command)
|
49
42
|
end
|
50
43
|
|
51
|
-
|
44
|
+
def result_nd10(total, _dice_total, value_list, cmp_op, target)
|
45
|
+
# 後方互換を維持するため、1d10>=nを目標値nの1NCとして処理
|
46
|
+
if value_list.count != 1 || cmp_op != :>= || target.nil? || target == "?"
|
47
|
+
return nil
|
48
|
+
end
|
52
49
|
|
53
|
-
|
54
|
-
return roll_tables(command, self.class::TABLES) || nechronica_check(command)
|
50
|
+
result_nechronica([total], target)
|
55
51
|
end
|
56
52
|
|
57
53
|
private
|
58
54
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
elsif dice_list.count { |i| i <= 1 } == 0
|
55
|
+
def result_nechronica(value_list, target)
|
56
|
+
if value_list.max >= target
|
57
|
+
if value_list.max >= 11
|
58
|
+
Result.critical(translate("Nechronica.critical"))
|
59
|
+
else
|
60
|
+
Result.success(translate("success"))
|
61
|
+
end
|
62
|
+
elsif value_list.count { |i| i <= 1 } == 0
|
68
63
|
Result.failure(translate("failure"))
|
69
|
-
elsif
|
70
|
-
fumble = translate("Nechronica.fumble")
|
64
|
+
elsif value_list.size > 1
|
71
65
|
break_all_parts = translate("Nechronica.break_all_parts")
|
66
|
+
fumble = translate("Nechronica.fumble")
|
72
67
|
Result.fumble("#{fumble} > #{break_all_parts}")
|
73
68
|
else
|
74
69
|
Result.fumble(translate("Nechronica.fumble"))
|
75
70
|
end
|
76
71
|
end
|
77
72
|
|
78
|
-
|
79
|
-
|
73
|
+
# Rコマンドの後方互換を維持する
|
74
|
+
def r_backward_compatibility(command)
|
75
|
+
m = command.match(/^(\d)?R10([+\-\d]+)?(\[(\d+)\])?$/)
|
76
|
+
return command unless m
|
80
77
|
|
81
|
-
if
|
82
|
-
""
|
78
|
+
if m[4] == "1"
|
79
|
+
"#{m[1]}NA#{m[2]}"
|
83
80
|
else
|
84
|
-
"
|
81
|
+
"#{m[1]}NC#{m[2]}"
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
88
|
-
def nechronica_check(
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
string = Regexp.last_match(2)
|
85
|
+
def nechronica_check(command)
|
86
|
+
command = r_backward_compatibility(command)
|
87
|
+
# 歴史的経緯で10を受理する
|
88
|
+
cmd = Command::Parser.new(/N[CA](10)?/, round_type: round_type)
|
89
|
+
.enable_prefix_number.parse(command)
|
90
|
+
return nil unless cmd
|
97
91
|
|
98
|
-
|
99
|
-
|
92
|
+
dice_count = [1, cmd.prefix_number.to_i].max
|
93
|
+
modify_number = cmd.modify_number || 0
|
100
94
|
|
101
|
-
|
95
|
+
dice = @randomizer.roll_barabara(dice_count, 10).sort
|
96
|
+
dice_mod = dice.map { |i| i + modify_number }
|
97
|
+
total = dice_mod.max
|
102
98
|
|
103
|
-
|
104
|
-
mod = ArithmeticEvaluator.eval(modText)
|
99
|
+
na = get_hit_location(total) if cmd.command.start_with?("NA")
|
105
100
|
|
106
|
-
|
107
|
-
isBattleMode = (battleMode == 1)
|
108
|
-
debug("nechronica_check string", string)
|
109
|
-
debug("isBattleMode", isBattleMode)
|
101
|
+
result = result_nechronica(dice_mod, 6)
|
110
102
|
|
111
|
-
|
103
|
+
sequence = [
|
104
|
+
"(#{cmd})",
|
105
|
+
"[#{dice.join(',')}]#{Format.modifier(modify_number)}",
|
106
|
+
"#{total}[#{dice_mod.join(',')}]",
|
107
|
+
result.text,
|
108
|
+
na,
|
109
|
+
].compact
|
112
110
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
total_n = n_max + mod
|
117
|
-
|
118
|
-
output = "(#{string}) > [#{dice.join(',')}]"
|
119
|
-
if mod < 0
|
120
|
-
output += mod.to_s
|
121
|
-
elsif mod > 0
|
122
|
-
output += "+#{mod}"
|
123
|
-
end
|
124
|
-
|
125
|
-
dice.map! { |i| i + mod }
|
126
|
-
|
127
|
-
dice_str = dice.join(",")
|
128
|
-
output += " > #{total_n}[#{dice_str}]"
|
129
|
-
|
130
|
-
output += result_nd10_text(total_n, dice, diff)
|
131
|
-
|
132
|
-
if isBattleMode
|
133
|
-
hit_loc = getHitLocation(total_n)
|
134
|
-
if hit_loc != '1'
|
135
|
-
output += " > #{hit_loc}"
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
return output
|
111
|
+
result.text = sequence.join(" > ")
|
112
|
+
return result
|
140
113
|
end
|
141
114
|
|
142
|
-
def
|
143
|
-
|
144
|
-
|
145
|
-
debug("getHitLocation dice", dice)
|
146
|
-
return output if dice <= 5
|
115
|
+
def get_hit_location(value)
|
116
|
+
return nil if value <= 5
|
147
117
|
|
148
118
|
table = translate("Nechronica.hit_location.table")
|
149
|
-
|
119
|
+
text = table[(value - 6).clamp(0, 5)]
|
150
120
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
121
|
+
if value > 10
|
122
|
+
text + translate("Nechronica.hit_location.additional_damage", damage: value - 10)
|
123
|
+
else
|
124
|
+
text
|
155
125
|
end
|
156
|
-
|
157
|
-
output = table[index] + addDamage
|
158
|
-
|
159
|
-
return output
|
160
126
|
end
|
161
127
|
|
162
128
|
class << self
|
@@ -173,7 +139,7 @@ module BCDice
|
|
173
139
|
|
174
140
|
TABLES = translate_tables(:ja_jp)
|
175
141
|
|
176
|
-
register_prefix('\d
|
142
|
+
register_prefix('\d?NC', '\d?NA', '\dR10', TABLES.keys)
|
177
143
|
end
|
178
144
|
end
|
179
145
|
end
|
@@ -176,8 +176,7 @@ module BCDice
|
|
176
176
|
command = bRollCommand(at.num, at.difficulty)
|
177
177
|
roll_result = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer)
|
178
178
|
|
179
|
-
|
180
|
-
num_of_max_values = values.count(6)
|
179
|
+
num_of_max_values = roll_result.last_dice_list.count(6)
|
181
180
|
|
182
181
|
parts = [roll_result.text]
|
183
182
|
|
@@ -195,7 +194,7 @@ module BCDice
|
|
195
194
|
command = bRollCommand(el.num, el.difficulty)
|
196
195
|
roll_result = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer)
|
197
196
|
|
198
|
-
values = roll_result.
|
197
|
+
values = roll_result.last_dice_list
|
199
198
|
num_of_max_values = values.count(6)
|
200
199
|
sum_of_true_values = values.count { |v| v >= el.difficulty }
|
201
200
|
|
@@ -219,7 +219,7 @@ module BCDice
|
|
219
219
|
|
220
220
|
# 固有のダイスロールコマンドを実行する
|
221
221
|
# @param [String] command 入力されたコマンド
|
222
|
-
# @return [
|
222
|
+
# @return [Result, nil] ダイスロールコマンドの実行結果
|
223
223
|
def eval_game_system_specific_command(command)
|
224
224
|
alias_replaced_with_2d6 = replace_alias_for_srs_roll_with_2d6(command)
|
225
225
|
|
@@ -297,7 +297,7 @@ module BCDice
|
|
297
297
|
|
298
298
|
# 成功判定を実行する
|
299
299
|
# @param [SRSRollNode] srs_roll 成功判定ノード
|
300
|
-
# @return [
|
300
|
+
# @return [Result] 成功判定結果
|
301
301
|
def execute_srs_roll(srs_roll)
|
302
302
|
dice_list = @randomizer.roll_barabara(2, 6)
|
303
303
|
dice_list.sort! if @sort_add_dice
|
@@ -307,35 +307,36 @@ module BCDice
|
|
307
307
|
|
308
308
|
modified_sum = sum + srs_roll.modifier
|
309
309
|
|
310
|
+
result = compare_result(srs_roll, sum, modified_sum)
|
311
|
+
|
310
312
|
parts = [
|
311
313
|
"(#{srs_roll})",
|
312
314
|
"#{sum}[#{dice_str}]#{Format.modifier(srs_roll.modifier)}",
|
313
315
|
modified_sum,
|
314
|
-
|
316
|
+
result.text
|
315
317
|
]
|
316
318
|
|
317
|
-
|
319
|
+
result.text = parts.compact.join(' > ')
|
320
|
+
result
|
318
321
|
end
|
319
322
|
|
320
323
|
# ダイスロール結果を目標値、クリティカル値、ファンブル値と比較する
|
321
324
|
# @param [SRSRollNode] srs_roll 成功判定ノード
|
322
325
|
# @param [Integer] sum 出目の合計
|
323
326
|
# @param [Integer] modified_sum 修正後の値
|
324
|
-
# @return [
|
327
|
+
# @return [Result] 比較結果
|
325
328
|
def compare_result(srs_roll, sum, modified_sum)
|
326
329
|
if sum >= srs_roll.critical_value
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
330
|
+
Result.critical("自動成功")
|
331
|
+
elsif sum <= srs_roll.fumble_value
|
332
|
+
Result.fumble("自動失敗")
|
333
|
+
elsif srs_roll.target_value.nil?
|
334
|
+
Result.new
|
335
|
+
elsif modified_sum >= srs_roll.target_value
|
336
|
+
Result.success("成功")
|
337
|
+
else
|
338
|
+
Result.failure("失敗")
|
336
339
|
end
|
337
|
-
|
338
|
-
return nil
|
339
340
|
end
|
340
341
|
end
|
341
342
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'bcdice/base'
|
4
|
+
|
3
5
|
module BCDice
|
4
6
|
module GameSystem
|
5
7
|
class SamsaraBallad < Base
|
@@ -59,38 +61,63 @@ module BCDice
|
|
59
61
|
total = 100 if total == 0
|
60
62
|
end
|
61
63
|
|
62
|
-
|
64
|
+
result = compare(total, cmd)
|
65
|
+
|
66
|
+
result_str =
|
67
|
+
if result.failure?
|
68
|
+
"失敗"
|
69
|
+
elsif result.success?
|
70
|
+
"成功"
|
71
|
+
end
|
72
|
+
|
73
|
+
additional_str =
|
74
|
+
if result.fumble?
|
75
|
+
"ファンブル"
|
76
|
+
elsif result.critical?
|
77
|
+
"クリティカル"
|
78
|
+
end
|
63
79
|
|
64
80
|
sequence = [
|
65
81
|
"(D100#{cmd.cmp_op}#{cmd.target_number})",
|
66
82
|
places_text,
|
67
83
|
total.to_s,
|
68
|
-
|
84
|
+
result_str,
|
85
|
+
additional_str,
|
69
86
|
].compact
|
70
87
|
|
71
|
-
|
88
|
+
result.text = sequence.join(" > ")
|
89
|
+
|
90
|
+
return result
|
72
91
|
end
|
73
92
|
|
74
93
|
private
|
75
94
|
|
76
|
-
# @return [
|
77
|
-
# @return [nil]
|
95
|
+
# @return [Result]
|
78
96
|
def compare(total, cmd)
|
79
97
|
if [:<=, :<].include?(cmd.cmp_op)
|
80
98
|
if !total.send(cmd.cmp_op, cmd.target_number)
|
81
|
-
|
99
|
+
Result.failure(nil)
|
82
100
|
elsif fumble_?(total, cmd.fumble)
|
83
|
-
|
101
|
+
Result.new.tap do |r|
|
102
|
+
r.success = true
|
103
|
+
r.fumble = true
|
104
|
+
end
|
84
105
|
elsif critical_?(total, cmd.critical)
|
85
|
-
|
106
|
+
Result.critical(nil)
|
86
107
|
else
|
87
|
-
|
108
|
+
Result.success(nil)
|
88
109
|
end
|
89
110
|
elsif fumble_?(total, cmd.fumble)
|
90
111
|
# ファンブル優先
|
91
|
-
|
112
|
+
Result.new.tap do |r|
|
113
|
+
r.fumble = true
|
114
|
+
end
|
92
115
|
elsif critical_?(total, cmd.critical)
|
93
|
-
|
116
|
+
Result.new.tap do |r|
|
117
|
+
r.critical = true
|
118
|
+
end
|
119
|
+
else
|
120
|
+
Result.new
|
94
121
|
end
|
95
122
|
end
|
96
123
|
|