Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 34 additions & 12 deletions lib/bcdice/game_system/FutariSousa.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ class FutariSousa < Base
    【DT6】…6面ダイスを2つ振って判定します。『有利』なら【3DT6】、『不利』なら【1DT6】を使います。
助手用:【AS】…6面ダイスを2つ振って判定します。『有利』なら【3AS】、『不利』なら【1AS】を使います。
    【AS10】…10面ダイスを2つ振って判定します。『有利』なら【3AS10】、『不利』なら【1AS10】を使います。

・目標値の変更 (>=x)
">=目標値"をつけると、成功となる出目の基準を変更します。
>=2と指定すると、2以上で成功になります。
 例)DT>=2   3AS10>=3

・スペシャル値の追加 ([x])
"[スペシャル値]"を付加することで、通常のスペシャル(出目6)に加えて、指定した数字でもスペシャルが発生するようになります。
カンマ(,)で区切って記入することで、複数の出目をスペシャルに指定することも可能です。
目標値の変更(>=)と併用する場合は、必ず目標値指定の直後に記述してください。
 例)DT[5]   AS[5,7]   DT>=2[5,7]

・各種表
【セッション時】
異常な癖決定表      SHRD/新・異常な癖決定表   SHND
Expand Down Expand Up @@ -72,12 +84,17 @@ def initialize(command)
register_prefix('(\d+)?DT(?:6)?', '(\d+)?AS(?:10)?')

def eval_game_system_specific_command(command)
if (m = /^(\d+)?DT(?:6)?$/i.match(command))
if (m = /^(\d+)?DT(?:6)?(?:>=(\d+))?(?:\[(\d+(?:,\d+)*)\])?$/i.match(command))
count = m[1]&.to_i || 2
return roll_dt(command, count)
elsif (m = /^(\d+)?AS(?:10)?$/i.match(command))
target = m[2]&.to_i
specials = m[3] ? m[3].split(',').map(&:to_i) : []
return roll_dt(command, count, target, specials)

elsif (m = /^(\d+)?AS(?:10)?(?:>=(\d+))?(?:\[(\d+(?:,\d+)*)\])?$/i.match(command))
count = m[1]&.to_i || 2
return roll_as(command, count)
target = m[2]&.to_i
specials = m[3] ? m[3].split(',').map(&:to_i) : []
return roll_as(command, count, target, specials)
end

return roll_tables(command, self.class::TABLES)
Expand All @@ -92,21 +109,24 @@ def eval_game_system_specific_command(command)
SPECIAL_DICE = 6

# 探偵用判定コマンド DT
def roll_dt(command, count)
def roll_dt(command, count, target = nil, specials = nil)
dice_list =
if command =~ /^(\d*)DT6$/i
if command =~ /^(\d*)DT6/i
@randomizer.roll_barabara(count, 6)
else
@randomizer.roll_barabara(count, 10)
end

max = dice_list.max
threshold = target || SUCCESS_THRESHOLD
special_values = ([SPECIAL_DICE] + specials).uniq

result =
if max <= 1
Result.fumble(translate("FutariSousa.DT.fumble"))
elsif dice_list.include?(SPECIAL_DICE)
elsif (dice_list & special_values).any?
Result.critical(translate("FutariSousa.DT.special"))
elsif max >= SUCCESS_THRESHOLD
elsif max >= threshold
Result.success(translate("success"))
else
Result.failure(translate("failure"))
Expand All @@ -117,21 +137,23 @@ def roll_dt(command, count)
end

# 助手用判定コマンド AS
def roll_as(command, count)
def roll_as(command, count, target = nil, specials = nil)
dice_list =
if command =~ /^(\d*)AS10$/i
if command =~ /^(\d*)AS10/i
@randomizer.roll_barabara(count, 10)
else
@randomizer.roll_barabara(count, 6)
end
max = dice_list.max
threshold = target || SUCCESS_THRESHOLD
special_values = ([SPECIAL_DICE] + specials).uniq

result =
if max <= 1
Result.fumble(translate("FutariSousa.AS.fumble"))
elsif dice_list.include?(SPECIAL_DICE)
elsif (dice_list & special_values).any?
Result.critical(translate("FutariSousa.AS.special"))
elsif max >= SUCCESS_THRESHOLD
elsif max >= threshold
Result.success(translate("FutariSousa.AS.success"))
else
Result.failure(translate("failure"))
Expand Down
143 changes: 143 additions & 0 deletions test/data/FutariSousa.toml
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,149 @@ rands = [
{ sides = 10, value = 1 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT>=2"
output = "DT>=2(2,1) > 成功"
success = true
rands = [
{ sides = 10, value = 2 },
{ sides = 10, value = 1 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT>=5"
output = "DT>=5(4,3) > 失敗"
failure = true
rands = [
{ sides = 10, value = 4 },
{ sides = 10, value = 3 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT>=2"
output = "DT>=2(1,1) > ファンブル(変調を受け、助手の心労が1点上昇)"
failure = true
fumble = true
rands = [
{ sides = 10, value = 1 },
{ sides = 10, value = 1 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT[5]"
output = "DT[5](5,3) > スペシャル(助手の余裕を1点獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 5 },
{ sides = 10, value = 3 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT[5]"
output = "DT[5](6,2) > スペシャル(助手の余裕を1点獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 6 },
{ sides = 10, value = 2 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT[5,7]"
output = "DT[5,7](7,4) > スペシャル(助手の余裕を1点獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 7 },
{ sides = 10, value = 4 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT>=2[5,7]"
output = "DT>=2[5,7](5,1) > スペシャル(助手の余裕を1点獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 5 },
{ sides = 10, value = 1 },
]

[[ test ]]
game_system = "FutariSousa"
input = "DT[5,7,9]"
output = "DT[5,7,9](9,1) > スペシャル(助手の余裕を1点獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 9 },
{ sides = 10, value = 1 },
]

[[ test ]]
game_system = "FutariSousa"
input = "3DT6>=5[4,5]"
output = "3DT6>=5[4,5](5,3,1) > スペシャル(助手の余裕を1点獲得)"
success = true
critical = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 3 },
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "FutariSousa"
input = "AS>=3"
output = "AS>=3(3,2) > 成功(余裕1点と、探偵から助手への感情を獲得)"
success = true
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 2 },
]

[[ test ]]
game_system = "FutariSousa"
input = "AS[5]"
output = "AS[5](5,2) > スペシャル(余裕2点と、探偵から助手への感情を獲得)"
success = true
critical = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 2 },
]

[[ test ]]
game_system = "FutariSousa"
input = "3AS10>=5[7,9]"
output = "3AS10>=5[7,9](9,4,2) > スペシャル(余裕2点と、探偵から助手への感情を獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 9 },
{ sides = 10, value = 4 },
{ sides = 10, value = 2 },
]

[[ test ]]
game_system = "FutariSousa"
input = "3AS10>=5[7,9,10]"
output = "3AS10>=5[7,9,10](10,4,2) > スペシャル(余裕2点と、探偵から助手への感情を獲得)"
success = true
critical = true
rands = [
{ sides = 10, value = 10 },
{ sides = 10, value = 4 },
{ sides = 10, value = 2 },
]

[[ test ]]
game_system = "FutariSousa"
input = "SHRD"
Expand Down
Loading