bcdice 3.0.0.pre.alpha.2 → 3.0.0.pre.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +1 -0
- data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
- data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
- data/i18n/MagicaLogia/ko_kr.yml +564 -0
- data/i18n/MonotoneMuseum/ja_jp.yml +37 -1
- data/i18n/StratoShout/ja_jp.yml +4 -4
- data/i18n/StratoShout/ko_kr.yml +4 -4
- data/lib/bcdice.rb +2 -1
- data/lib/bcdice/arithmetic.rb +22 -0
- data/lib/bcdice/arithmetic/node.rb +112 -43
- data/lib/bcdice/arithmetic/parser.rb +240 -0
- data/lib/bcdice/arithmetic_evaluator.rb +5 -156
- data/lib/bcdice/base.rb +8 -1
- data/lib/bcdice/command/lexer.rb +57 -0
- data/lib/bcdice/command/parsed.rb +65 -0
- data/lib/bcdice/command/parser.rb +489 -0
- data/lib/bcdice/common_command/add_dice.rb +1 -1
- data/lib/bcdice/common_command/add_dice/node.rb +142 -69
- data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
- data/lib/bcdice/common_command/barabara_dice/node.rb +7 -1
- data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
- data/lib/bcdice/common_command/calc/node.rb +10 -1
- data/lib/bcdice/common_command/calc/parser.rb +1 -1
- data/lib/bcdice/common_command/d66_dice.rb +3 -1
- data/lib/bcdice/common_command/lexer.rb +2 -1
- data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
- data/lib/bcdice/common_command/version.rb +1 -1
- data/lib/bcdice/deprecated/checker.rb +6 -6
- data/lib/bcdice/dice_table.rb +1 -0
- data/lib/bcdice/dice_table/d66_parity_table.rb +34 -0
- data/lib/bcdice/game_system.rb +3 -0
- data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
- data/lib/bcdice/game_system/AlchemiaStruggle.rb +312 -0
- data/lib/bcdice/game_system/Alshard.rb +0 -1
- data/lib/bcdice/game_system/Amadeus.rb +1 -1
- data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
- data/lib/bcdice/game_system/BadLife.rb +1 -1
- data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -10
- data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
- data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
- data/lib/bcdice/game_system/BlindMythos.rb +12 -9
- data/lib/bcdice/game_system/BloodCrusade.rb +12 -38
- data/lib/bcdice/game_system/BloodMoon.rb +2 -2
- data/lib/bcdice/game_system/CardRanker.rb +23 -63
- data/lib/bcdice/game_system/ChaosFlare.rb +3 -3
- data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
- data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
- data/lib/bcdice/game_system/Cthulhu7th.rb +2 -2
- data/lib/bcdice/game_system/CthulhuTech.rb +0 -1
- data/lib/bcdice/game_system/DarkBlaze.rb +4 -4
- data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
- data/lib/bcdice/game_system/DoubleCross.rb +60 -93
- data/lib/bcdice/game_system/EmbryoMachine.rb +5 -5
- data/lib/bcdice/game_system/EtrianOdysseySRS.rb +0 -1
- data/lib/bcdice/game_system/FilledWith.rb +3 -3
- data/lib/bcdice/game_system/FullMetalPanic.rb +0 -1
- data/lib/bcdice/game_system/GURPS.rb +1 -1
- data/lib/bcdice/game_system/Garako.rb +3 -2
- data/lib/bcdice/game_system/GardenOrder.rb +1 -1
- data/lib/bcdice/game_system/GehennaAn.rb +3 -3
- data/lib/bcdice/game_system/Gundog.rb +1 -1
- data/lib/bcdice/game_system/GundogRevised.rb +3 -3
- data/lib/bcdice/game_system/GundogZero.rb +2 -2
- data/lib/bcdice/game_system/GurpsFW.rb +2 -5
- data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
- data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
- data/lib/bcdice/game_system/JuinKansen.rb +251 -0
- data/lib/bcdice/game_system/KanColle.rb +17 -166
- data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
- data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
- data/lib/bcdice/game_system/LogHorizon.rb +8 -8
- data/lib/bcdice/game_system/LostRoyal.rb +1 -3
- data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
- data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
- data/lib/bcdice/game_system/MeikyuDays.rb +1 -1
- data/lib/bcdice/game_system/MeikyuKingdom.rb +1 -1
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +4 -4
- data/lib/bcdice/game_system/MetallicGuardian.rb +0 -1
- data/lib/bcdice/game_system/MonotoneMuseum.rb +3 -2
- data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
- data/lib/bcdice/game_system/NSSQ.rb +2 -2
- data/lib/bcdice/game_system/Nechronica.rb +3 -3
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
- data/lib/bcdice/game_system/NinjaSlayer.rb +26 -28
- data/lib/bcdice/game_system/OracleEngine.rb +13 -17
- data/lib/bcdice/game_system/Paradiso.rb +2 -2
- data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
- data/lib/bcdice/game_system/Raisondetre.rb +1 -1
- data/lib/bcdice/game_system/RecordOfLodossWar.rb +2 -3
- data/lib/bcdice/game_system/RokumonSekai2.rb +2 -2
- data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
- data/lib/bcdice/game_system/Ryutama.rb +1 -1
- data/lib/bcdice/game_system/SRS.rb +0 -5
- data/lib/bcdice/game_system/SamsaraBallad.rb +4 -3
- data/lib/bcdice/game_system/Satasupe.rb +22 -14
- data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
- data/lib/bcdice/game_system/ShinkuuGakuen.rb +1 -1
- data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
- data/lib/bcdice/game_system/StellarKnights.rb +1 -3
- data/lib/bcdice/game_system/SterileLife.rb +1 -1
- data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
- data/lib/bcdice/game_system/StratoShout.rb +10 -36
- data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
- data/lib/bcdice/game_system/SwordWorld.rb +5 -5
- data/lib/bcdice/game_system/SwordWorld2_5.rb +1 -1
- data/lib/bcdice/game_system/TherapieSein.rb +2 -2
- data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
- data/lib/bcdice/game_system/Torg.rb +1 -1
- data/lib/bcdice/game_system/TorgEternity.rb +4 -7
- data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
- data/lib/bcdice/game_system/TunnelsAndTrolls.rb +6 -6
- data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -1
- data/lib/bcdice/game_system/Utakaze.rb +1 -1
- data/lib/bcdice/game_system/Warhammer.rb +6 -6
- data/lib/bcdice/game_system/Warhammer4.rb +9 -12
- data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
- data/lib/bcdice/normalize.rb +1 -1
- data/lib/bcdice/preprocessor.rb +12 -8
- data/lib/bcdice/randomizer.rb +12 -0
- data/lib/bcdice/repl.rb +1 -1
- data/lib/bcdice/result.rb +2 -0
- data/lib/bcdice/user_defined_dice_table.rb +26 -15
- data/lib/bcdice/version.rb +1 -1
- metadata +14 -25
- data/.editorconfig +0 -21
- data/.github/.codecov.yaml +0 -10
- data/.github/workflows/coverage.yaml +0 -21
- data/.github/workflows/lint.yaml +0 -13
- data/.github/workflows/test.yml +0 -20
- data/.gitignore +0 -14
- data/.rubocop.yml +0 -108
- data/.rubocop_todo.yml +0 -114
- data/Gemfile +0 -14
- data/ROADMAP.md +0 -30
- data/Rakefile +0 -152
- data/bcdice.gemspec +0 -29
- data/bin/repl.rb +0 -21
- data/docs/README.txt +0 -2028
- data/docs/dicebot_sort_key.md +0 -72
- data/docs/how_to_make_dicebot.md +0 -453
- data/lib/bcdice/command_parser.rb +0 -242
- data/lib/bcdice/common_command/add_dice/parser.y +0 -153
- data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
- data/lib/bcdice/common_command/calc/parser.y +0 -79
- data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
- data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
@@ -154,8 +154,8 @@ module BCDice
|
|
154
154
|
return "1D100 > #{dice}"
|
155
155
|
end
|
156
156
|
|
157
|
-
|
158
|
-
return "
|
157
|
+
if bonus_dice.abs > 100
|
158
|
+
return "ボーナス・ペナルティダイスの値は-100以上、100以下としてください"
|
159
159
|
end
|
160
160
|
|
161
161
|
total, total_list = roll_with_bonus(bonus_dice)
|
@@ -35,9 +35,9 @@ module BCDice
|
|
35
35
|
return string unless string =~ /DB/i
|
36
36
|
|
37
37
|
string = string.gsub(/DB(\d),(\d)/) { "DB#{Regexp.last_match(1)}#{Regexp.last_match(2)}" }
|
38
|
-
string = string.gsub(/DB
|
39
|
-
string = string.gsub(/DB(\d)(\d)(#(
|
40
|
-
string = string.gsub(/DB(\d)(\d)(#([
|
38
|
+
string = string.gsub(/DB@(\d)@(\d)/) { "DB#{Regexp.last_match(1)}#{Regexp.last_match(2)}" }
|
39
|
+
string = string.gsub(/DB(\d)(\d)(#(\d[+\-\d]*))/) { "3R6+#{Regexp.last_match(4)}[#{Regexp.last_match(1)},#{Regexp.last_match(2)}]" }
|
40
|
+
string = string.gsub(/DB(\d)(\d)(#([+\-\d]*))/) { "3R6#{Regexp.last_match(4)}[#{Regexp.last_match(1)},#{Regexp.last_match(2)}]" }
|
41
41
|
string = string.gsub(/DB(\d)(\d)/) { "3R6[#{Regexp.last_match(1)},#{Regexp.last_match(2)}]" }
|
42
42
|
|
43
43
|
return string
|
@@ -56,7 +56,7 @@ module BCDice
|
|
56
56
|
|
57
57
|
def check_roll(string)
|
58
58
|
string = replace_text(string)
|
59
|
-
return nil unless (m = /(^|\s)S?(3[rR]6([
|
59
|
+
return nil unless (m = /(^|\s)S?(3[rR]6([+\-\d]+)?(\[(\d+),(\d+)\])(([>=]+)(\d+))?)(\s|$)/i.match(string))
|
60
60
|
|
61
61
|
string = m[2]
|
62
62
|
mod = 0
|
@@ -55,14 +55,14 @@ module BCDice
|
|
55
55
|
|
56
56
|
# 成功判定を行う
|
57
57
|
# @param randomizer [Randomizer]
|
58
|
-
# @return [
|
58
|
+
# @return [Result] 判定結果
|
59
59
|
def execute(randomizer)
|
60
60
|
if @critical_value < 2
|
61
|
-
return "(#{@expression}) > #{translate('DoubleCross.DX.invalid_critical')}"
|
61
|
+
return Result.new("(#{@expression}) > #{translate('DoubleCross.DX.invalid_critical')}")
|
62
62
|
end
|
63
63
|
|
64
64
|
if @num < 1
|
65
|
-
return "(#{@expression}) > #{translate('DoubleCross.DX.auto_failure')}"
|
65
|
+
return Result.failure("(#{@expression}) > #{translate('DoubleCross.DX.auto_failure')}")
|
66
66
|
end
|
67
67
|
|
68
68
|
# 出目のグループの配列
|
@@ -85,7 +85,7 @@ module BCDice
|
|
85
85
|
loop_count += 1
|
86
86
|
end
|
87
87
|
|
88
|
-
return
|
88
|
+
return result(value_groups)
|
89
89
|
end
|
90
90
|
|
91
91
|
private
|
@@ -98,46 +98,51 @@ module BCDice
|
|
98
98
|
return @target_value ? "#{lhs}>=#{@target_value}" : lhs
|
99
99
|
end
|
100
100
|
|
101
|
-
#
|
101
|
+
# 判定結果を返す
|
102
102
|
# @param [Array<ValueGroup>] value_groups 出目のグループの配列
|
103
|
-
# @return [
|
104
|
-
def
|
105
|
-
|
103
|
+
# @return [Result]
|
104
|
+
def result(value_groups)
|
105
|
+
r = Result.new
|
106
|
+
|
107
|
+
r.fumble = value_groups[0].values.all?(1)
|
108
|
+
|
106
109
|
sum = value_groups.map(&:max).sum
|
107
|
-
achieved_value = fumble ? 0 : (sum + @modifier)
|
110
|
+
achieved_value = r.fumble? ? 0 : (sum + @modifier)
|
111
|
+
|
112
|
+
# ファンブルかどうかを含む達成値の表記
|
113
|
+
achieved_value_with_if_fumble =
|
114
|
+
if r.fumble?
|
115
|
+
"#{achieved_value} (#{translate('fumble')})"
|
116
|
+
else
|
117
|
+
achieved_value.to_s
|
118
|
+
end
|
108
119
|
|
109
120
|
parts = [
|
110
121
|
"(#{@expression})",
|
111
122
|
"#{value_groups.join('+')}#{@modifier_str}",
|
112
|
-
achieved_value_with_if_fumble
|
113
|
-
compare_result(achieved_value, fumble)
|
123
|
+
achieved_value_with_if_fumble
|
114
124
|
]
|
115
125
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
return nil unless @target_value
|
126
|
+
if @target_value
|
127
|
+
# 行為判定成功か?
|
128
|
+
#
|
129
|
+
# ファンブル時は自動失敗、達成値が目標値以上ならば行為判定成功
|
130
|
+
# [3rd ルールブック1 pp. 186-187]
|
131
|
+
success = !r.fumble? && (achieved_value >= @target_value)
|
132
|
+
|
133
|
+
if success
|
134
|
+
r.success = true
|
135
|
+
else
|
136
|
+
r.failure = true
|
137
|
+
end
|
138
|
+
|
139
|
+
compare_result_text = translate(success ? 'success' : 'failure')
|
140
|
+
parts.push(compare_result_text)
|
141
|
+
end
|
133
142
|
|
134
|
-
|
135
|
-
# [3rd ルールブック1 pp. 186-187]
|
136
|
-
return translate("failure") if fumble
|
143
|
+
r.text = parts.join(' > ')
|
137
144
|
|
138
|
-
|
139
|
-
# [3rd ルールブック1 p. 187]
|
140
|
-
return achieved_value >= @target_value ? translate("success") : translate("failure")
|
145
|
+
return r
|
141
146
|
end
|
142
147
|
end
|
143
148
|
|
@@ -192,22 +197,6 @@ module BCDice
|
|
192
197
|
end
|
193
198
|
end
|
194
199
|
|
195
|
-
def check_nD10(total, _dice_total, dice_list, cmp_op, target)
|
196
|
-
return '' if target == '?'
|
197
|
-
return '' unless cmp_op == :>=
|
198
|
-
|
199
|
-
result =
|
200
|
-
if dice_list.count(1) == dice_list.size
|
201
|
-
translate("fumble")
|
202
|
-
elsif total >= target
|
203
|
-
translate("success")
|
204
|
-
else
|
205
|
-
translate("failure")
|
206
|
-
end
|
207
|
-
|
208
|
-
return " > #{result}"
|
209
|
-
end
|
210
|
-
|
211
200
|
# ダイスボット固有コマンドの処理を行う
|
212
201
|
# @param [String] command コマンド
|
213
202
|
# @return [String] ダイスボット固有コマンドの結果
|
@@ -226,71 +215,49 @@ module BCDice
|
|
226
215
|
|
227
216
|
private
|
228
217
|
|
229
|
-
# OD Tool式の成功判定コマンドの正規表現
|
230
|
-
#
|
231
|
-
# キャプチャ内容は以下のとおり:
|
232
|
-
#
|
233
|
-
# 1. ダイス数
|
234
|
-
# 2. 修正値
|
235
|
-
# 3. クリティカル値
|
236
|
-
# 4. 達成値
|
237
|
-
DX_OD_TOOL_RE = /\A(\d+)DX([-+]\d+(?:[-+*]\d+)*)?@(\d+)(?:>=(\d+))?\z/io.freeze
|
238
|
-
|
239
|
-
# 疾風怒濤式の成功判定コマンドの正規表現
|
240
|
-
#
|
241
|
-
# キャプチャ内容は以下のとおり:
|
242
|
-
#
|
243
|
-
# 1. ダイス数
|
244
|
-
# 2. クリティカル値
|
245
|
-
# 3. 修正値
|
246
|
-
# 4. 達成値
|
247
|
-
DX_SHIPPU_DOTO_RE = /\A(\d+)DX(\d+)?([-+]\d+(?:[-+*]\d+)*)?(?:>=(\d+))?\z/io.freeze
|
248
|
-
|
249
218
|
# 成功判定コマンドの構文解析を行う
|
250
219
|
# @param [String] command コマンド文字列
|
251
220
|
# @return [DX, nil]
|
252
221
|
def parse_dx(command)
|
253
|
-
|
254
|
-
when DX_OD_TOOL_RE
|
255
|
-
return parse_dx_od(Regexp.last_match)
|
256
|
-
when DX_SHIPPU_DOTO_RE
|
257
|
-
return parse_dx_shippu_doto(Regexp.last_match)
|
258
|
-
end
|
259
|
-
|
260
|
-
return nil
|
222
|
+
parse_dx_od(command) || parse_dx_shippu_doto(command)
|
261
223
|
end
|
262
224
|
|
263
225
|
# OD Tool式の成功判定コマンドの正規表現マッチ情報からノードを作る
|
264
|
-
# @param [
|
226
|
+
# @param command [String]
|
265
227
|
# @return [DX]
|
266
|
-
def parse_dx_od(
|
267
|
-
|
268
|
-
|
269
|
-
|
228
|
+
def parse_dx_od(command)
|
229
|
+
parser = Command::Parser.new(/\d+DX/, round_type: round_type)
|
230
|
+
.enable_critical
|
231
|
+
.restrict_cmp_op_to(nil, :>=)
|
232
|
+
parsed = parser.parse(command)
|
233
|
+
return nil unless parsed
|
270
234
|
|
271
|
-
|
235
|
+
num = parsed.command.to_i
|
236
|
+
critical_value = parsed.critical || 10
|
272
237
|
|
273
|
-
|
238
|
+
self.class::DX.new(num, critical_value, parsed.modify_number, parsed.target_number)
|
274
239
|
end
|
275
240
|
|
276
241
|
# 疾風怒濤式の成功判定コマンドの正規表現マッチ情報からノードを作る
|
277
242
|
# @param [MatchData] m 正規表現のマッチ情報
|
278
243
|
# @return [DX]
|
279
|
-
def parse_dx_shippu_doto(
|
280
|
-
|
281
|
-
|
282
|
-
|
244
|
+
def parse_dx_shippu_doto(command)
|
245
|
+
parser = Command::Parser.new(/\d+DX\d*/, round_type: round_type)
|
246
|
+
.restrict_cmp_op_to(nil, :>=)
|
247
|
+
parsed = parser.parse(command)
|
248
|
+
return nil unless parsed
|
283
249
|
|
284
|
-
|
250
|
+
num, critical_value = parsed.command.split("DX", 2).map { |x| x&.to_i }
|
251
|
+
critical_value ||= 10
|
285
252
|
|
286
|
-
|
253
|
+
self.class::DX.new(num, critical_value, parsed.modify_number, parsed.target_number)
|
287
254
|
end
|
288
255
|
|
289
256
|
# 感情表を振る
|
290
257
|
#
|
291
258
|
# ポジティブとネガティブの両方を振って、表になっている側に○を付ける。
|
292
259
|
#
|
293
|
-
# @return [
|
260
|
+
# @return [Result]
|
294
261
|
def roll_emotion_table
|
295
262
|
pos_result = self.class::POSITIVE_EMOTION_TABLE.roll(@randomizer)
|
296
263
|
neg_result = self.class::NEGATIVE_EMOTION_TABLE.roll(@randomizer)
|
@@ -309,7 +276,7 @@ module BCDice
|
|
309
276
|
pos_neg_text.join(' - ')
|
310
277
|
]
|
311
278
|
|
312
|
-
return output_parts.join(' > ')
|
279
|
+
return Result.new(output_parts.join(' > '))
|
313
280
|
end
|
314
281
|
|
315
282
|
class << self
|
@@ -34,10 +34,10 @@ module BCDice
|
|
34
34
|
|
35
35
|
def replace_text(string)
|
36
36
|
string
|
37
|
-
.gsub(/EM(\d+)([
|
38
|
-
.gsub(/EM(\d+)([
|
39
|
-
.gsub(/EM(\d+)([
|
40
|
-
.gsub(/EM(\d+)([
|
37
|
+
.gsub(/EM(\d+)([+\-][+\-\d]+)(@(\d+))(\#(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[#{Regexp.last_match(4)},#{Regexp.last_match(6)}]" }
|
38
|
+
.gsub(/EM(\d+)([+\-][+\-\d]+)(\#(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[20,#{Regexp.last_match(4)}]" }
|
39
|
+
.gsub(/EM(\d+)([+\-][+\-\d]+)(@(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[#{Regexp.last_match(4)},2]" }
|
40
|
+
.gsub(/EM(\d+)([+\-][+\-\d]+)/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[20,2]" }
|
41
41
|
.gsub(/EM(\d+)(@(\d+))(\#(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[#{Regexp.last_match(3)},#{Regexp.last_match(5)}]" }
|
42
42
|
.gsub(/EM(\d+)(\#(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[20,#{Regexp.last_match(3)}]" }
|
43
43
|
.gsub(/EM(\d+)(@(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[#{Regexp.last_match(3)},2]" }
|
@@ -63,7 +63,7 @@ module BCDice
|
|
63
63
|
def checkRoll(string)
|
64
64
|
string = replace_text(string)
|
65
65
|
|
66
|
-
return nil unless /(^|\s)S?(2[rR]10([
|
66
|
+
return nil unless /(^|\s)S?(2[rR]10([+\-\d]+)?([>=]+(\d+))(\[(\d+),(\d+)\]))(\s|$)/i =~ string
|
67
67
|
|
68
68
|
string = Regexp.last_match(2)
|
69
69
|
diff = 0
|
@@ -140,12 +140,12 @@ module BCDice
|
|
140
140
|
crt = 4
|
141
141
|
fmb = 17
|
142
142
|
|
143
|
-
if command =~ /(\d[
|
143
|
+
if command =~ /(\d[+\-\d]*)-(\d+)FW(@(\d+))?(\#(\d+))?/i
|
144
144
|
difficultyText = Regexp.last_match(1)
|
145
145
|
diceCount = Regexp.last_match(2).to_i
|
146
146
|
crt = Regexp.last_match(4).to_i unless Regexp.last_match(3).nil?
|
147
147
|
fmb = Regexp.last_match(6).to_i unless Regexp.last_match(5).nil?
|
148
|
-
elsif command =~ /(\d+)FW(
|
148
|
+
elsif command =~ /(\d+)FW(@(\d+))?(\#(\d+))?(<=([+\-\d]*))?/i
|
149
149
|
diceCount = Regexp.last_match(1).to_i
|
150
150
|
crt = Regexp.last_match(3).to_i unless Regexp.last_match(2).nil?
|
151
151
|
fmb = Regexp.last_match(5).to_i unless Regexp.last_match(4).nil?
|
@@ -222,7 +222,7 @@ module BCDice
|
|
222
222
|
|
223
223
|
# 夢幻の迷宮財宝表
|
224
224
|
def getTresureResult(command)
|
225
|
-
return nil unless command =~ /TRS(\d+)([
|
225
|
+
return nil unless command =~ /TRS(\d+)([+\-]\d)?/
|
226
226
|
|
227
227
|
rank = Regexp.last_match(1).to_i
|
228
228
|
modify = Regexp.last_match(2).to_i
|
@@ -53,10 +53,11 @@ module BCDice
|
|
53
53
|
# @param command [String]
|
54
54
|
# @return [String, nil]
|
55
55
|
def roll_gr(command)
|
56
|
-
parser =
|
56
|
+
parser = Command::Parser.new("GR", round_type: round_type)
|
57
|
+
.enable_fumble
|
58
|
+
.restrict_cmp_op_to(:>=)
|
57
59
|
cmd = parser.parse(command)
|
58
60
|
return nil unless cmd
|
59
|
-
return nil if cmd.critical
|
60
61
|
|
61
62
|
modify_number = cmd.modify_number || 0
|
62
63
|
auto_failure_number = cmd.fumble || 1
|
@@ -32,7 +32,7 @@ module BCDice
|
|
32
32
|
|
33
33
|
def eval_game_system_specific_command(command)
|
34
34
|
case command
|
35
|
-
when %r{GO(
|
35
|
+
when %r{GO(-?\d+)(/(\d+))?(@(\d+))?}i
|
36
36
|
success_rate = Regexp.last_match(1).to_i
|
37
37
|
repeat_count = (Regexp.last_match(3) || 1).to_i
|
38
38
|
critical_border_text = Regexp.last_match(5)
|
@@ -35,9 +35,9 @@ module BCDice
|
|
35
35
|
|
36
36
|
def replace_text(string)
|
37
37
|
string
|
38
|
-
.gsub(/(\d+)GA(\d+)([
|
38
|
+
.gsub(/(\d+)GA(\d+)([+\-][+\-\d]+)/) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(3)}>=#{Regexp.last_match(2)}[1]" }
|
39
39
|
.gsub(/(\d+)GA(\d+)/) { "#{Regexp.last_match(1)}R6>=#{Regexp.last_match(2)}[1]" }
|
40
|
-
.gsub(/(\d+)G(\d+)([
|
40
|
+
.gsub(/(\d+)G(\d+)([+\-][+\-\d]+)/) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(3)}>=#{Regexp.last_match(2)}[0]" }
|
41
41
|
.gsub(/(\d+)G(\d+)/) { "#{Regexp.last_match(1)}R6>=#{Regexp.last_match(2)}[0]" }
|
42
42
|
end
|
43
43
|
|
@@ -46,7 +46,7 @@ module BCDice
|
|
46
46
|
def eval_game_system_specific_command(string)
|
47
47
|
string = replace_text(string)
|
48
48
|
|
49
|
-
unless /(^|\s)S?((\d+)[rR]6([
|
49
|
+
unless /(^|\s)S?((\d+)[rR]6([+\-\d]+)?([>=]+(\d+))(\[(\d)\]))(\s|$)/i =~ string
|
50
50
|
return nil
|
51
51
|
end
|
52
52
|
|
@@ -52,7 +52,7 @@ module BCDice
|
|
52
52
|
if dig1 <= 0
|
53
53
|
" > クリティカル(達成値20+SL)"
|
54
54
|
else
|
55
|
-
" > 成功(達成値#{
|
55
|
+
" > 成功(達成値#{dig10 + dig1}+SL)"
|
56
56
|
end
|
57
57
|
else
|
58
58
|
" > 失敗"
|
@@ -68,7 +68,7 @@ module BCDice
|
|
68
68
|
mod = 0
|
69
69
|
|
70
70
|
# ダメージペナルティ表
|
71
|
-
if /(\w)DPT([
|
71
|
+
if /(\w)DPT([+\-\d]*)/i =~ string
|
72
72
|
ttype = 'ダメージペナルティー'
|
73
73
|
head = Regexp.last_match(1)
|
74
74
|
mod = ArithmeticEvaluator.eval(Regexp.last_match(2)) if Regexp.last_match(2)
|
@@ -77,7 +77,7 @@ module BCDice
|
|
77
77
|
end
|
78
78
|
|
79
79
|
# ファンブル表
|
80
|
-
if /(\w)FT([
|
80
|
+
if /(\w)FT([+\-\d]*)/i =~ string
|
81
81
|
ttype = 'ファンブル'
|
82
82
|
head = Regexp.last_match(1)
|
83
83
|
mod = ArithmeticEvaluator.eval(Regexp.last_match(2)) if Regexp.last_match(2)
|
@@ -37,7 +37,7 @@ module BCDice
|
|
37
37
|
mod = 0
|
38
38
|
|
39
39
|
# ダメージペナルティ表
|
40
|
-
if /(\w)DPT([
|
40
|
+
if /(\w)DPT([+\-\d]*)/i =~ string
|
41
41
|
ttype = 'ダメージペナルティー'
|
42
42
|
head = Regexp.last_match(1)
|
43
43
|
mod = ArithmeticEvaluator.eval(Regexp.last_match(2)) if Regexp.last_match(2)
|
@@ -46,7 +46,7 @@ module BCDice
|
|
46
46
|
end
|
47
47
|
|
48
48
|
# ファンブル表
|
49
|
-
if /(\w)FT([
|
49
|
+
if /(\w)FT([+\-\d]*)/i =~ string
|
50
50
|
ttype = 'ファンブル'
|
51
51
|
head = Regexp.last_match(1)
|
52
52
|
mod = ArithmeticEvaluator.eval(Regexp.last_match(2)) if Regexp.last_match(2)
|