Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

「カローン・サンクションズ」追加 #737

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
1 change: 1 addition & 0 deletions lib/bcdice/game_system.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
require "bcdice/game_system/CardRanker"
require "bcdice/game_system/CastleInGray"
require "bcdice/game_system/ChaosFlare"
require "bcdice/game_system/CharonSanctions"
require "bcdice/game_system/Chill"
require "bcdice/game_system/Chill3"
require "bcdice/game_system/CodeLayerd"
Expand Down
112 changes: 112 additions & 0 deletions lib/bcdice/game_system/CharonSanctions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# frozen_string_literal: true

module BCDice
module GameSystem
class CharonSanctions < Base
# ゲームシステムの識別子
ID = "CharonSanctions"

# ゲームシステム名
NAME = "カローン・サンクションズ"

# ゲームシステム名の読みがな
SORT_KEY = "かろおんさんくしおんす"

HELP_MESSAGE = <<~TEXT
■ 判定
nCSm>=t [判定]を行う。成功/不完全成功を判定。(p.111)
n: ダイス数
m: [難易度](省略時 4)
t: [必要成功数](省略時 1)

■ 各種表
ET 感情ワード(キャラクター)表(p.120)
RT 襲撃表(p.146)
TEXT

def eval_game_system_specific_command(command)
action_roll(command) ||
roll_tables(command, TABLES)
end

private

def action_roll(command)
parser = Command::Parser.new("CS", round_type: round_type)
.has_prefix_number
.enable_suffix_number
.disable_modifier
.restrict_cmp_op_to(nil, :>=)
cmd = parser.parse(command)
return nil unless cmd

times = cmd.prefix_number
return nil if times < 1

required = (cmd.suffix_number || 4).clamp(2, 6)
target = cmd.target_number || 1

dice_list = @randomizer.roll_barabara(times, 6)
count = dice_list.count { |i| i >= required }

result =
if count >= target
Result.success("成功")
else
Result.failure("不完全成功")
end

sequence = [
"(#{cmd})",
"(#{times}B6>=#{required}[>=#{target}])",
"[#{dice_list.join(',')}]",
"成功数:#{count}",
result.text
].compact

result.text = sequence.join(" > ")
result
end

TABLES = {
'ET' => DiceTable::D66RangeTable.new(
'感情ワード(キャラクター)表',
{
11..12 => '愛情/あなたは、対象のキャラクターに愛情を抱いています。',
13..14 => '家族/あなたは、対象のキャラクターをまるで家族のように感じています。',
15..16 => '腐れ縁/あなたは、対象のキャラクターを腐れ縁だとを感じています(または、まるで長年の腐れ縁のように気が合う相手だと感じています)。',
21..22 => '師弟/そのキャラクターとは、師弟のような関係だと感じています。',
23..24 => '好敵手/そのキャラクターを、好敵手だと感じています。',
25..26 => '親近感/あなたは、対象のキャラクターに、親近感を抱いています。',
31..32 => '友情/あなたは、対象のキャラクターに、友情を抱いています。',
33..34 => '尊敬/あなたは、対象のキャラクターを尊敬しています。',
35..36 => '庇護/あなたは、対象のキャラクターを守らなければと感じています。',
41..42 => '好感/あなたは、対象のキャラクターに好感を抱いています。',
43..44 => '興味/あなたは、対象のキャラクターに興味を抱いています。',
45..46 => '感銘/あなたは、対象のキャラクターに感銘を抱いています。',
51..52 => '畏怖/あなたは、対象のキャラクターに畏怖を抱いています。',
53..54 => '信頼/あなたは、対象のキャラクターに信頼を感じています。',
55..56 => '不信感/あなたは、対象のキャラクターに不信感を抱いています。',
61..62 => '劣等感/あなたは、対象のキャラクターの能力や容姿、実績などに対し劣等感を抱いています。',
63..64 => '後悔/あなたは対象のキャラクターを見ると、後悔の念を思い出します(かつて失った人に似ている、など)。',
65..66 => '無関心/あなたは、対象のキャラクターに対して無関心を装っています。しかし本当は無視できない存在であると感じています。',
}
),
"RT" => DiceTable::Table.new(
"襲撃表",
"1D6",
[
"概要:今回の事件の黒幕が放ったものか、それとも何かで恨みを買ったのか、裏社会の暗殺者たちが襲撃を仕掛けてくる。迎え撃つ必要がある。\n判定:2人で判定。【機敏(SR+1)】〔†射撃〕/【身体(SR+1)】〔†白兵〕\n全員が完全成功:敵の迎撃に成功した。襲撃者を放ってきた相手もしばらくは動けないだろう。【AP】+1。\n1人でも不完全成功:何とか敵を迎撃したが、手傷を負ってしまった。PC全員は【HP】を1d+[SR]点消費する。",
"概要:あまりにも目立ちすぎたせいか、自分に目を光らせている司法組織の捜査官が追ってきた。戦うわけにもいかない。誰かが囮になってうまく逃げるしかない。\n判定:1人で判定。【身体(SR+2)】〔運動〕\n全員が完全成功:うまく追手をまくことができた。しばらくは時間を稼ぐことができるだろう。【AP】+1。\n1人でも不完全成功:何とか逃げることには成功したが、体力を使い果たした。判定を行ったPCは、[調査フェイズ]終了時まで【身体】の判定で振るダイス数-1d。",
"概要:偶然、一般市民に非合法の活動をしている場面を目撃される。彼らを巻き込まないためにも、何とか誤魔化した方がいいだろう。\n判定:全員で判定。【知性(SR)】〔交渉〕\n全員が完全成功:それらしい理屈をつけて、誤魔化すことができた。機転の利いた対応に、裏社会での評価も上がる。【畏敬】+2。\n1人でも不完全成功:なんとか誤魔化せたが、相手はいまいち納得できないようだ。今後、彼らの動向にも気を配る必要があるだろう。[不完全成功]だったPCは[調査フェイズ]終了まで【知性】の判定で振るダイス数-1d。",
"概要:情報を整理しようと集まった瞬間、何者かに襲撃を受ける。出自は不明だが、裏社会の存在で間違いないだろう。迎撃の必要がある。\n判定:全員で判定。【機敏(SR)】〔†射撃〕/【身体(SR)】〔†白兵〕\n全員が完全成功:鮮やかに敵を撃退してみせた。【畏敬】+2。\n1人でも不完全成功:敵を撃退できたものの、手傷を負ってしまった。[不完全成功]だったPCは[調査フェイズ]終了まで【機敏】の判定で振るダイス数-1d。",
"概要:君の活躍に目をつけ、闇の組織が急な情報収集の仕事を依頼してきた。やむにやまれぬ事情があり、無視することもできない。急いで片付けた方がいいだろう。\n判定:2人で判定。【知性(SR+1)】〔コンピュータ〕/【機敏(SR+1)】〔操縦〕\n全員が完全成功:コンピュータやフットワークを活かし、情報を素早く手に入れた。闇社会からの評価も上がる。【畏敬】+2。\n1人でも不完全成功:仕事は成功させたものの、少し雑なものとなって相手を落胆させてしまう。【畏敬】-1。",
"概要:カローンのことを嗅ぎ回っているマスコミに、活動現場を見られてしまった。何とか言いくるめて、対処する必要がある。\n判定:1人で判定。【知性(SR+2)】〔交渉〕\n全員が完全成功:自分たちはカローンではないと言いくるめることができた。ついでに事件捜査の時間を稼ぐための偽情報をリークすることにも成功する。【AP】+1。\n1人でも不完全成功:何とか言いくるめることができたが、激しく気力を消耗してしまう。判定を行ったPCは、【EP】-1。",
]
),
}.freeze

register_prefix('\d+CS', TABLES.keys)
end
end
end
163 changes: 163 additions & 0 deletions test/data/CharonSanctions.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
[[ test ]]
game_system = "CharonSanctions"
input = "1CS"
output = "(1CS) > (1B6>=4[>=1]) > [1] > 成功数:0 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS"
output = "(2CS) > (2B6>=4[>=1]) > [2,4] > 成功数:1 > 成功"
success = true
rands = [
{ sides = 6, value = 2 },
{ sides = 6, value = 4 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "3CS"
output = "(3CS) > (3B6>=4[>=1]) > [3,1,2] > 成功数:0 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 1 },
{ sides = 6, value = 2 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS>=2"
output = "(2CS>=2) > (2B6>=4[>=2]) > [1,4] > 成功数:1 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 1 },
{ sides = 6, value = 4 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS>=2"
output = "(2CS>=2) > (2B6>=4[>=2]) > [5,4] > 成功数:2 > 成功"
success = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 4 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS2"
output = "(2CS2) > (2B6>=2[>=1]) > [1,1] > 成功数:0 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 1 },
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS2"
output = "(2CS2) > (2B6>=2[>=1]) > [1,2] > 成功数:1 > 成功"
success = true
rands = [
{ sides = 6, value = 1 },
{ sides = 6, value = 2 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS6"
output = "(2CS6) > (2B6>=6[>=1]) > [5,4] > 成功数:0 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 4 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS6"
output = "(2CS6) > (2B6>=6[>=1]) > [5,6] > 成功数:1 > 成功"
success = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 6 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS1 難易度最低値1 (p.111)"
output = "(2CS1) > (2B6>=2[>=1]) > [1,1] > 成功数:0 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 1 },
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS100 難易度最大値6 (p.111)"
output = "(2CS100) > (2B6>=6[>=1]) > [5,6] > 成功数:1 > 成功"
success = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 6 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS5>=2"
output = "(2CS5>=2) > (2B6>=5[>=2]) > [3,5] > 成功数:1 > 不完全成功"
failure = true
rands = [
{ sides = 6, value = 3 },
{ sides = 6, value = 5 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "2CS5>=2"
output = "(2CS5>=2) > (2B6>=5[>=2]) > [5,5] > 成功数:2 > 成功"
success = true
rands = [
{ sides = 6, value = 5 },
{ sides = 6, value = 5 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "ET"
output = "感情ワード(キャラクター)表(11) > 愛情/あなたは、対象のキャラクターに愛情を抱いています。"
rands = [
{ sides = 6, value = 1 },
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "ET"
output = "感情ワード(キャラクター)表(66) > 無関心/あなたは、対象のキャラクターに対して無関心を装っています。しかし本当は無視できない存在であると感じています。"
rands = [
{ sides = 6, value = 6 },
{ sides = 6, value = 6 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "RT"
output = "襲撃表(1) > 概要:今回の事件の黒幕が放ったものか、それとも何かで恨みを買ったのか、裏社会の暗殺者たちが襲撃を仕掛けてくる。迎え撃つ必要がある。\n判定:2人で判定。【機敏(SR+1)】〔†射撃〕/【身体(SR+1)】〔†白兵〕\n全員が完全成功:敵の迎撃に成功した。襲撃者を放ってきた相手もしばらくは動けないだろう。【AP】+1。\n1人でも不完全成功:何とか敵を迎撃したが、手傷を負ってしまった。PC全員は【HP】を1d+[SR]点消費する。"
rands = [
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "CharonSanctions"
input = "RT"
output = "襲撃表(6) > 概要:カローンのことを嗅ぎ回っているマスコミに、活動現場を見られてしまった。何とか言いくるめて、対処する必要がある。\n判定:1人で判定。【知性(SR+2)】〔交渉〕\n全員が完全成功:自分たちはカローンではないと言いくるめることができた。ついでに事件捜査の時間を稼ぐための偽情報をリークすることにも成功する。【AP】+1。\n1人でも不完全成功:何とか言いくるめることができたが、激しく気力を消耗してしまう。判定を行ったPCは、【EP】-1。"
rands = [
{ sides = 6, value = 6 },
]
Loading