Skip to content

Commit

Permalink
Merge pull request #314 from bcdice/new_result_checker
Browse files Browse the repository at this point in the history
AddDiceで判定の成否を返すようにする
  • Loading branch information
ysakasin authored Dec 12, 2020
2 parents ea276c1 + be0005b commit 318ee9b
Show file tree
Hide file tree
Showing 80 changed files with 338 additions and 1,303 deletions.
72 changes: 34 additions & 38 deletions lib/bcdice/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
require "bcdice/translate"
require "bcdice/result"
require "bcdice/command_parser"
require "bcdice/deprecated/checker"

module BCDice
class Base
Expand Down Expand Up @@ -68,6 +69,7 @@ def eval(command)
end

include Translate
include Deprecated::Checker

def initialize(command)
@raw_input = command
Expand Down Expand Up @@ -187,35 +189,40 @@ def change_text(string)
# @param rand_results [Array<CommonCommand::AddDice::Randomizer::RandResult>] ダイスの一覧
# @param cmp_op [Symbol] 比較演算子
# @param target [Integer, String] 目標値の整数か'?'
# @return [String]
# @return [Result, nil]
def check_result(total, rand_results, cmp_op, target)
ret = check_result_legacy(total, rand_results, cmp_op, target)
return ret if ret

sides_list = rand_results.map(&:sides)
value_list = rand_results.map(&:value)
dice_total = value_list.sum()

ret =
case sides_list
when [100]
check_1D100(total, dice_total, cmp_op, target)
result_1d100(total, dice_total, cmp_op, target)
when [20]
check_1D20(total, dice_total, cmp_op, target)
result_1d20(total, dice_total, cmp_op, target)
when [6, 6]
check_2D6(total, dice_total, value_list, cmp_op, target)
result_2d6(total, dice_total, value_list, cmp_op, target)
end

return ret unless ret.nil? || ret.empty?
return nil if ret == Result.nothing
return ret if ret

ret =
case sides_list.uniq
when [10]
check_nD10(total, dice_total, value_list, cmp_op, target)
result_nd10(total, dice_total, value_list, cmp_op, target)
when [6]
check_nD6(total, dice_total, value_list, cmp_op, target)
result_nd6(total, dice_total, value_list, cmp_op, target)
end

return ret unless ret.nil? || ret.empty?
return nil if ret == Result.nothing
return ret if ret

check_nDx(total, cmp_op, target)
return result_ndx(total, cmp_op, target)
end

# シャドウラン用グリッチ判定
Expand Down Expand Up @@ -267,42 +274,31 @@ def dice_command(command)
# @return [String, nil]
def eval_game_system_specific_command(command); end

# 成功か失敗かを文字列で返す
# 成功か失敗か返す
#
# @param (see #check_result)
# @return [String]
def check_nDx(total, cmp_op, target)
result =
if target.is_a?(String)
translate("failure")
elsif total.send(cmp_op, target)
translate("success")
else
translate("failure")
end

return " > #{result}"
# @param total [Integer]
# @param cmp_op [Symbol]
# @param target [Number]
# @return [Result]
def result_ndx(total, cmp_op, target)
if target.is_a?(String)
nil
elsif total.send(cmp_op, target)
Result.success(translate("success"))
else
Result.failure(translate("failure"))
end
end

# @param (see #check_result)
# @return [nil]
def check_1D100(total, dice_total, cmp_op, target); end
def result_1d100(total, dice_total, cmp_op, target); end

# @param (see #check_result)
# @return [nil]
def check_1D20(total, dice_total, cmp_op, target); end
def result_1d20(total, dice_total, cmp_op, target); end

# @param (see #check_result)
# @return [nil]
def check_nD10(total, dice_total, dice_list, cmp_op, target); end
def result_nd10(total, dice_total, value_list, cmp_op, target); end

# @param (see #check_result)
# @return [nil]
def check_2D6(total, dice_total, dice_list, cmp_op, target); end
def result_2d6(total, dice_total, value_list, cmp_op, target); end

# @param (see #check_result)
# @return [nil]
def check_nD6(total, dice_total, dice_list, cmp_op, target); end
def result_nd6(total, dice_total, value_list, cmp_op, target); end

def get_table_by_2d6(table)
get_table_by_nD6(table, 2)
Expand Down
29 changes: 18 additions & 11 deletions lib/bcdice/common_command/add_dice/node.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,21 +53,28 @@ def eval(game_system, randomizer)
randomizer = Randomizer.new(randomizer, game_system)
total = @lhs.eval(randomizer)

output =
if randomizer.rand_results.size <= 1 && @lhs.is_a?(Node::DiceRoll)
"(#{self}) > #{total}"
else
"(#{self}) > #{@lhs.output}#{total}"
interrim_expr =
unless randomizer.rand_results.size <= 1 && @lhs.is_a?(Node::DiceRoll)
@lhs.output
end

if @cmp_op
rhs = @rhs.eval(nil)
output += game_system.check_result(total, randomizer.rand_results, @cmp_op, rhs)
end
result =
if @cmp_op
rhs = @rhs.eval(nil)
game_system.check_result(total, randomizer.rand_results, @cmp_op, rhs)
end
result ||= Result.new

sequence = [
"(#{self})",
interrim_expr,
total,
result&.text
].compact

Result.new.tap do |r|
result.tap do |r|
r.secret = @secret
r.text = output
r.text = sequence.join(" > ")
end
end

Expand Down
78 changes: 78 additions & 0 deletions lib/bcdice/deprecated/checker.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# frozen_string_literal: true

module BCDice
module Deprecated
# 2D6などの特定の加算ダイスの結果をゲームシステムごとにカスタマイズするための
# @deprecate Base#result_2d6 等を利用してください
module Checker
private

# @param total [Integer] コマンド合計値
# @param rand_results [Array<CommonCommand::AddDice::Randomizer::RandResult>] ダイスの一覧
# @param cmp_op [Symbol] 比較演算子
# @param target [Integer, String] 目標値の整数か'?'
# @return [Result, nil]
def check_result_legacy(total, rand_results, cmp_op, target)
sides_list = rand_results.map(&:sides)
value_list = rand_results.map(&:value)
dice_total = value_list.sum()

ret =
case sides_list
when [100]
check_1D100(total, dice_total, cmp_op, target)
when [20]
check_1D20(total, dice_total, cmp_op, target)
when [6, 6]
check_2D6(total, dice_total, value_list, cmp_op, target)
end

return Result.new(ret.delete_prefix(" > ")) unless ret.nil? || ret.empty?

ret =
case sides_list.uniq
when [10]
check_nD10(total, dice_total, value_list, cmp_op, target)
when [6]
check_nD6(total, dice_total, value_list, cmp_op, target)
end

return Result.new(ret.delete_prefix(" > ")) unless ret.nil? || ret.empty?

return nil
end

# @param total [Integer]
# @param dice_total [Integer]
# @param cmp_op [Symbol]
# @param target
# @return [String, nil]
# @deprecate Base#result_1d100 を使ってください
def check_1D100(total, dice_total, cmp_op, target); end

# @param (see #check_1D100)
# @return [String, nil]
# @deprecate Base#result_1d20 を使ってください
def check_1D20(total, dice_total, cmp_op, target); end

# @param total [Integer]
# @param dice_total [Integer]
# @param dice_list [Array<Integer>]
# @param cmp_op [Symbol]
# @param target
# @return [String, nil]
# @deprecate Base#result_nd10 を使ってください
def check_nD10(total, dice_total, dice_list, cmp_op, target); end

# @param (see #check_nD10)
# @return [String, nil]
# @deprecate Base#result_2d6 を使ってください
def check_2D6(total, dice_total, dice_list, cmp_op, target); end

# @param (see #check_nD10)
# @return [String, nil]
# @deprecate Base#result_nd6 を使ってください
def check_nD6(total, dice_total, dice_list, cmp_op, target); end
end
end
end
2 changes: 1 addition & 1 deletion lib/bcdice/game_system/HarnMaster.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def check_1D100(total, _dice_total, cmp_op, target)
return '' unless cmp_op == :<=

result = getCheckResult(total, target)
return "> #{result}"
return " #{result}"
end

def getCheckResult(total, diff)
Expand Down
12 changes: 6 additions & 6 deletions lib/bcdice/game_system/SwordWorld.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,17 @@ def getRatingCommandStrings
"cmCM"
end

def check_2D6(total, dice_total, _dice_list, cmp_op, target)
def result_2d6(total, dice_total, _dice_list, cmp_op, target)
if dice_total >= 12
" > 自動的成功"
Result.critical("自動的成功")
elsif dice_total <= 2
" > 自動的失敗"
Result.fumble("自動的失敗")
elsif cmp_op != :>= || target == "?"
''
nil
elsif total >= target
" > 成功"
Result.success("成功")
else
" > 失敗"
Result.failure("失敗")
end
end

Expand Down
20 changes: 20 additions & 0 deletions lib/bcdice/result.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,26 @@ def failure(text)
r.failure = true
end
end

def critical(text)
new.tap do |r|
r.text = text
r.critical = true
r.success = true
end
end

def fumble(text)
new.tap do |r|
r.text = text
r.fumble = true
r.failure = true
end
end

def nothing
:nothing
end
end

def initialize(text = nil)
Expand Down
2 changes: 1 addition & 1 deletion test/data/Arianrhod.toml
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ rands = [
[[ test ]]
game_system = "Arianrhod"
input = "3D6>=? 目標値?でバグらない"
output = "(3D6>=?) > 9[3,3,3] > 9 > 失敗"
output = "(3D6>=?) > 9[3,3,3] > 9"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 3 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/BeginningIdol.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2205,7 +2205,7 @@ rands = [
[[ test ]]
game_system = "BeginningIdol"
input = "3D6>=? 目標値?でバグらない"
output = "(3D6>=?) > 9[3,3,3] > 9 > 失敗"
output = "(3D6>=?) > 9[3,3,3] > 9"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 3 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/BeginningIdol_Korean.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2167,7 +2167,7 @@ rands = [
[[ test ]]
game_system = "BeginningIdol:Korean"
input = "3D6>=? 目標値?でバグらない"
output = "(3D6>=?) > 9[3,3,3] > 9 > 失敗"
output = "(3D6>=?) > 9[3,3,3] > 9"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 3 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/BloodCrusade.toml
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ rands = [
[[ test ]]
game_system = "BloodCrusade"
input = "2D6>=? 目標値?でバグらない"
output = "(2D6>=?) > 7[3,4] > 7 > 失敗"
output = "(2D6>=?) > 7[3,4] > 7"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 4 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/BloodMoon.toml
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ rands = []
[[ test ]]
game_system = "BloodMoon"
input = "2D6>=? 目標値?でバグらない"
output = "(2D6>=?) > 7[3,4] > 7 > 失敗"
output = "(2D6>=?) > 7[3,4] > 7"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 4 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/CardRanker.toml
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ rands = [
[[ test ]]
game_system = "CardRanker"
input = "2D6>=? 目標値?でバグらない"
output = "(2D6>=?) > 7[3,4] > 7 > 失敗"
output = "(2D6>=?) > 7[3,4] > 7"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 4 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/ChaosFlare.toml
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ rands = [
[[ test ]]
game_system = "ChaosFlare"
input = "2D6>=? 目標値?でバグらない"
output = "(2D6>=?) > 7[3,4] > 7 > 失敗"
output = "(2D6>=?) > 7[3,4] > 7"
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 4 },
Expand Down
2 changes: 1 addition & 1 deletion test/data/Chill.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2934,7 +2934,7 @@ rands = [
[[ test ]]
game_system = "Chill"
input = "1D100>=? 目標値?でバグらない"
output = "(1D100>=?) > 42 > 失敗"
output = "(1D100>=?) > 42"
rands = [
{ sides = 100, value = 42 },
]
2 changes: 1 addition & 1 deletion test/data/Chill3.toml
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ rands = [
[[ test ]]
game_system = "Chill3"
input = "1D100>=? 目標値?でバグらない"
output = "(1D100>=?) > 42 > 失敗"
output = "(1D100>=?) > 42"
rands = [
{ sides = 100, value = 42 },
]
Loading

0 comments on commit 318ee9b

Please sign in to comment.