Skip to content

Commit

Permalink
NinjaSlayer: BarabaraDiceの結果から直接出目と成功数を取得する
Browse files Browse the repository at this point in the history
直接出目と成功数を取得できるようになったので、
正規表現によるメッセージへのマッチをやめる
  • Loading branch information
ochaochaocha3 committed Dec 13, 2020
1 parent edbd54c commit 07ae345
Showing 1 changed file with 26 additions and 28 deletions.
54 changes: 26 additions & 28 deletions lib/bcdice/game_system/NinjaSlayer.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# frozen_string_literal: true

require 'bcdice/common_command/barabara_dice'
require 'bcdice/dice_table/table'

module BCDice
Expand Down Expand Up @@ -69,9 +70,6 @@ def initialize(command)
# 電子戦の正規表現
EL_RE = /\AEL(\d+)#{DIFFICULTY_RE}?\z/io.freeze

# バラバラロール結果の "(" の前までの先頭部分
B_ROLL_RESULT_HEAD_RE = /\A[^(]+/.freeze

# 回避判定のノード
EV = Struct.new(:num, :difficulty, :targetValue)
# 近接攻撃のノード
Expand Down Expand Up @@ -169,55 +167,55 @@ def parseEL(m)
# @return [String] 回避判定結果
def executeEV(ev)
command = bRollCommand(ev.num, ev.difficulty)
roll_result = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer)

rollResult = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer).text.sub(B_ROLL_RESULT_HEAD_RE, '')
return rollResult unless ev.targetValue

m = /成功数(\d+)/.match(rollResult)
raise '成功数が見つかりません' unless m
parts = [roll_result.text]

numOfSuccesses = m[1].to_i
if numOfSuccesses > ev.targetValue
return "#{rollResult} > カウンターカラテ!!"
if ev.targetValue && roll_result.success_num > ev.targetValue
parts.push("カウンターカラテ!!")
end

return rollResult
return parts.join(" > ")
end

# 近接攻撃を行う
# @param [AT] at 近接攻撃ノード
# @return [String] 近接攻撃結果
def executeAT(at)
command = bRollCommand(at.num, at.difficulty)
rollResult = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer).text.sub(B_ROLL_RESULT_HEAD_RE, '')
roll_result = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer)

values = roll_result.rands.map { |v, _| v }
num_of_max_values = values.count(6)

# バラバラロールの出目を取得する
# TODO: バラバラロールの結果として、出目を配列で取得できるようにする
m = /> (\d+(?:,\d+)*)/.match(rollResult)
values = m[1].split(',').map(&:to_i)
parts = [roll_result.text]

numOfMaxValues = values.count(6)
if num_of_max_values >= 2
parts.push("サツバツ!!")
end

return numOfMaxValues >= 2 ? "#{rollResult}サツバツ!!" : rollResult
return parts.join("")
end

# 電子戦を行う
# @param [EL] el 電子戦ノード
# @return [String] 電子戦結果
def executeEL(el)
command = bRollCommand(el.num, el.difficulty)
rollResult = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer).text.sub(B_ROLL_RESULT_HEAD_RE, '')

# バラバラロールの出目を取得する
# TODO: バラバラロールの結果として、出目を配列で取得できるようにする
m = /> (\d+(?:,\d+)*)/.match(rollResult)
values = m[1].split(',').map(&:to_i)
roll_result = BCDice::CommonCommand::BarabaraDice.eval(command, self, @randomizer)

numOfMaxValues = values.count(6)
values = roll_result.rands.map { |v, _| v }
num_of_max_values = values.count(6)
sum_of_true_values = values.count { |v| v >= el.difficulty }

sumOfTrueValues = values.count { |v| v >= el.difficulty }
if num_of_max_values >= 1
return [
"#{roll_result.text} + #{num_of_max_values}",
sum_of_true_values + num_of_max_values
].join(" > ")
end

return numOfMaxValues >= 1 ? "#{rollResult} + #{numOfMaxValues}#{sumOfTrueValues + numOfMaxValues}" : rollResult
return roll_result.text
end

# 難易度の整数値を返す
Expand Down

0 comments on commit 07ae345

Please sign in to comment.