Skip to content
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 @@ -298,6 +298,7 @@
require "bcdice/game_system/Warhammer4"
require "bcdice/game_system/WerewolfTheApocalypse5th"
require "bcdice/game_system/WitchQuest"
require "bcdice/game_system/WorldEndScrapyard"
require "bcdice/game_system/WorldOfDarkness"
require "bcdice/game_system/WorldsEndFrontline"
require "bcdice/game_system/YankeeMustDie"
Expand Down
333 changes: 333 additions & 0 deletions lib/bcdice/game_system/WorldEndScrapyard.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,333 @@
# frozen_string_literal: true

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

# ゲームシステム名
NAME = 'World End scrapyard'

# ゲームシステム名の読みがな
SORT_KEY = 'わあるとえんとすくらつふやあと'

# ダイスボットの使い方
HELP_MESSAGE = <<~INFO_MESSAGETEXT
■判定 WES<=t t:成功率({能力値}+{悪運})
能力値は(筋力・敏捷・器用・知識・魅力)のいずれか。
成功・失敗・差分値を表示する。

例)WES<=20+10:能力値20,悪運10で判定し、その結果を表示する。
WES<=30: 悪運30で判定し、その結果を表示する。

■各種表
・《変異表》 HEN HENC(任意選択,RoCのC)
・《発掘表》 HAK HAKC( 同上 )
・《PC/NPC関係性表》 KAN
・《シナリオの目的表》 MOK
・《シナリオの場所表》 BAS
・《登場NPC表》 TOJ
・《探索表》 TANx+b (x:レベル,1~5 b:修正+5)
INFO_MESSAGETEXT

register_prefix("WES", "HEN", "HAK", "KAN", "MOK", "BAS", "TOJ", "TAN")

def initialize(command)
super(command)

@round_type = RoundType::CEIL
end

def eval_game_system_specific_command(command)
resolute_action(command) ||
roll_roc_table(command) ||
roll_search_table(command) ||
roll_tables(command, TABLES)
end

private

# 技能判定
# @param [String] command
# @return [Result]
def resolute_action(command)
m = /^WES<=((\d+)([+]\d+)?)/.match(command)
return nil unless m

target =
if m[1].empty?
nil
else
Arithmetic.eval(m[1], @round_type)
end

if target.nil?
return nil
end

dice = @randomizer.roll_once(100)

return Result.new.tap do |result|
result.condition = (dice <= target)
diff = target - dice

sequence = [
"(WES<=#{target})",
dice.to_s,
result.success? ? "成功" : "失敗",
"差分値#{diff}"
].compact

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

# 変異表
VARIATION_TABLE = [
"0:[回復不能]状態になります。",
"1:[異形]状態になります。",
"2:[大型]状態になります([小柄]状態だった場合でも)",
"3: 特に効果はありませんが『外見』を自由に変更させても構いません。",
"4:《悪運》以外の《能力値》を【2つ】を『ランダム』で選んで、その《能力値》の数値を入れ替えます。",
"5:《悪運》以外の《能力値》を【2つ】を『任意』で選んで、その《能力値》の数値を入れ替えます。",
"6: 特に効果はありません。",
"7:[小柄]状態になります([大型]状態だった場合でも)",
"8:《悪運》以外の《能力値》【5つ】の数値を【10点単位】で再分配します。",
"9:[異形]状態を打ち消します。",
].freeze

# 発掘表
EXCAVATION_TABLE = [
"0: なにも発見できなかった。",
"1:《悪運》を【レベル×3点】減少させる。",
"2: なにも発見できなかった。",
"3:《悪運》を【レベル×3点】上昇させる。",
"4: 何かの『物資・材料?』を発見する(内容はGM/PCで相談する)",
"5:《煙草》3本分、または《弾薬》3発分のどちらか【1つ】を得る。",
"6: 壊れた『日用品?』を発見する(内容はGM/PCの相談で決める)",
"7:《消費アイテム》をランダムで【1つ】を得る。",
"8: 壊れた『家具類?』を発見する(内容はGM/PCの相談で決める)",
"9:《装備アイテム》をランダムで【1つ】を得る。",
].freeze

# 探索表
SEARCH_TABLE = [
"06:エネミー:レベル1『スカベンジャー』PC数×1体と遭遇する。",
"07:なにもなし。",
"08:エネミー:レベル1『下水ネズミの群れ』PC数×2体と遭遇する。",
"09:なにもなし。",
"10:《対抗判定:魅力/成功率35》を行い、勝利時に《発掘表》を1回振る。",
"11:なにもなし。",
"12:《行為判定:魅力》の成功時、次回《探索表》の結果に【+5】を加える。",
"13:なにもなし。",
"14:《悪運》を【PCのレベル×3点】上昇させる。",
"15:行商人から【1レベル】までの《消費/装備アイテム》を交換・購入できる。",
"16:エネミー:レベル2『粗暴な自警団』PC数×1体と遭遇する。",
"17:なにもなし。",
"18:エネミー:レベル2『バイオゾンビ』PC数×2体と遭遇する。",
"19:なにもなし。",
"20:《対抗判定:知識/成功率40》を行い、勝利時に《発掘表》を1回振る。",
"21:なにもなし。",
"22:《行為判定:知識》の成功時、次回《探索表》の結果に【+5】を加える。",
"23:なにもなし。",
"24:《悪運》を【PCのレベル×3点】上昇させる。",
"25:行商人から【3レベル】までの《消費/装備アイテム》を交換・購入できる。",
"26:エネミー:レベル3『ピットスパイダー』PC数×1体と遭遇する。",
"27:なにもなし。",
"28:エネミー:レベル3『バイオグール』PC数×2体と遭遇する。",
"29:なにもなし。",
"30:《対抗判定:器用/成功率45》を行い、勝利時に《発掘表》を1回振る。",
"31:なにもなし。",
"32:《行為判定:器用》の成功時、次回《探索表》の結果に【+5】を加える。",
"33:なにもなし。",
"34:《悪運》を【PCのレベル×3点】上昇させる。",
"35:行商人から【5レベル】までの《消費/装備アイテム》を交換・購入できる。",
"36:エネミー:レベル4『暴走オートマトン』PC数×1体と遭遇する。",
"37:なにもなし。",
"38:エネミー:レベル4『ネクロソルジャー』PC数×2体と遭遇する。",
"39:なにもなし。",
"40:《対抗判定:敏捷/成功率50》を行い、勝利時に《発掘表》を1回振る。",
].freeze

def roll_roc_table(command)
m = /^(HEN|HAK)(C)?/.match(command)
return nil unless m

sequence = []
result_text = ""
cmd = m[1]

target_table = []
case cmd
when "HEN"
sequence.push("変異表")
target_table = VARIATION_TABLE
when "HAK"
sequence.push("発掘表")
target_table = EXCAVATION_TABLE
end

if m[2].nil?
result_text = target_table[@randomizer.roll_once(10) - 1]
else
roc_table_all = []
[0..9].each do |i|
roc_table_all.push(target_table[i])
end
result_text = roc_table_all.join("\n")
end

return Result.new.tap do |result|
sequence.push(result_text)
result.text = sequence.join(" > ")
end
end

def roll_search_table(command)
m = /^(TAN)([1-5])([+]5)?/.match(command)
return nil unless m

sequence = ["探索表"]
level = m[2].to_i
mod =
if m[3].nil?
0
else
Arithmetic.eval(m[3], @round_type)
end
idx = level * 5 + @randomizer.roll_once(10) + mod
result_text = SEARCH_TABLE[idx - 6]

return Result.new.tap do |result|
sequence.push(result_text)
result.text = sequence.join(" > ")
end
end
TABLES = {
"KAN" => DiceTable::RangeTable.new(
"PC/NPC関係性表",
"1D10",
[
[1, '物心付いた時からの長い幼馴染'],
[2..3, '旅立った頃からの始まりの仲間'],
[4..5, 'なにかどうしようもない腐れ縁'],
[6..7, '既に互いの腕を信用できる同志'],
[8..9, '未だ相手を良く知らない同業者'],
[10, 'いま出会ったばかりの仕事相手'],
]
),
"MOK" => DiceTable::RangeTable.new(
"シナリオの目的表",
"1D100",
[
[1..6, '目的の物品を入手する'],
[7..12, '目的の情報を入手する'],
[13..18, '目的の人物と接触する'],
[19..24, '目的の人物を防衛する'],
[25..30, '目的の人物を救出する'],
[31..37, '場所を調査・探索する'],
[38..44, '場所を通過・突破する'],
[45..51, '場所を制圧・破壊する'],
[52..58, '場所から脱出する'],
[59..65, '場所を防衛する'],
[66..73, '敵目標を討伐する'],
[74..80, '敵目標を捕獲する'],
[81..87, '敵目標と和解する'],
[88..94, '敵目標を追跡する'],
[95..99, '敵目標から逃走する'],
[100, 'その他(GMの裁量で決めて良い)'],
]
),
"BAS" => DiceTable::RangeTable.new(
"シナリオの場所表",
"1D100",
[
[1..7, '小規模コミュニティ〈シヴィラツィオ〉が主体。'],
[8..9, '小規模コミュニティ〈ペルディトゥス〉小種族区分が混在している。'],
[10, '小規模コミュニティ〈ペルディトゥス:トロウル〉が主体。'],
[11, '小規模コミュニティ〈ペルディトゥス:オーガ〉が主体。'],
[12, '小規模コミュニティ〈ペルディトゥス:ゴブ〉が主体。'],
[13, '小規模コミュニティ〈ペルディトゥス:アドラー〉が主体。'],
[14, '小規模コミュニティ〈ペルディトゥス:ドヴェルク〉が主体。'],
[15..19, '小規模コミュニティ〈フラグメンテ・マキナ〉が主体。'],
[20..24, '小規模コミュニティ〈サバイバーズ〉が主体。'],
[25..29, '小規模コミュニティ〈チルドレンズ〉が主体。'],
[30..35, '大規模コミュニティ(すべての種族が混在している)'],
[36..38, '廃墟〈シヴィラツィオ〉の住居跡など。'],
[39..41, '廃墟〈ペルディトゥス〉の森林や洞窟。'],
[42..44, '廃墟〈フラグメンテ・マキナ〉の機械施設。'],
[45..47, '廃墟〈サバイバーズ〉のバラックやキャンプ跡。'],
[48..50, '廃墟〈チルドレンズ〉のスラム跡や下水道など。'],
[51, '遺跡《テックレベル》2(神域の神殿など)'],
[52..56, '遺跡《テックレベル》3(古代の城塞など)'],
[57..64, '遺跡《テックレベル》5(廃ビルや研究所など)'],
[65..69, '遺跡《テックレベル》7(壊れた軌道エレベータなど)'],
[70, '遺跡《テックレベル》8(墜された恒星間宇宙艦など)'],
[71..80, '荒野'],
[81..86, '森林'],
[87..92, '沼沢'],
[93..99, '汚染領域(放射能や高密度魔力や生物汚染で汚染されている)'],
[100, 'その他(GMの裁量で決めて良い)'],
]
),
"TOJ" => DiceTable::RangeTable.new(
"登場NPC表",
"1D100",
[
[1..2, '勇敢な小動物(子犬など)'],
[3..4, '温厚な乗輓用生物(ロバなど)'],
[5..6, '何もかも諦めた無気力な孤児'],
[7..8, '汚染で奇病を抱える賢い子供'],
[9..10, 'トラウマで言葉を失った無口な子供'],
[11..12, '暴力しか知らない戦闘狂の野生少年'],
[13..14, '昔の歌を歌い続ける夢見がちな少女'],
[15..16, '仲間を守るために戦う熱血漢の少年'],
[17..18, '物資を溜め込む利己主義な銭ゲバ少女'],
[19..20, '盗みが得意で小生意気なスラムの少年'],
[21..22, '人を裏切ることに躊躇しない狡猾な少女'],
[23..24, '機械いじりが得意な天才メカニック少年'],
[25..26, '大人を信用せず一人で生き延びる孤独な少女'],
[27..28, '早く大人にならざるを得なかった冷徹な少年兵'],
[29..30, '過去の文明に憧れ、古い本を読み漁る知識少女'],
[31..32, '復讐に燃える元軍人'],
[33..34, '薬物中毒の荒くれ戦士'],
[35..36, '冷酷だが仲間思いの傭兵'],
[37..38, '汚染地帯に潜む孤独な狩人'],
[39..40, 'カルト教団の狂信な宣教師'],
[41..42, '医術を独学で身につけた流れ者'],
[43..44, '金儲けと裏切りが得意な詐欺師'],
[45..46, '植物栽培に没頭する農業主義者'],
[47..48, '家族を探し続ける高潔な放浪者'],
[49..50, '話題を売りさばく胡散臭い情報屋'],
[51..52, 'コミュニティを守る厳格すぎる保安官'],
[53..54, '機械やロボットを操る天才エンジニア'],
[55..56, '奴隷売買を生業とする冷血な奴隷商人'],
[57..58, '倫理を失ったマッドサイエンティスト'],
[59..60, 'ロックで人々を鼓舞する放浪の演奏者'],
[61..62, '酒とギャンブルに溺れる自暴自棄な中年'],
[63..64, '汚染地帯を探索するトレジャーハンター'],
[65..66, '美しい外見で人を操るサイコパスな美女'],
[67..68, '過去の罪に苛まれる贖罪意識の強い戦士'],
[69..70, 'コミュニティ周辺を操る豪腕フィクサー'],
[71..72, '戦争の記憶を引きずる老兵'],
[73..74, '何も信じず虚無的な哲学者'],
[75..76, '権力欲が強く独裁的な集落支配者'],
[77..78, '過去の文明の知識を伝える語り部'],
[79..80, '薬草や民間療法に詳しい薬師の老婆'],
[81..82, '隠し物資を山ほど持つ強欲な蓄財家'],
[83..84, '落ちぶれたかつてのカリスマ的預言者'],
[85..86, '最後の正義を信じる老いた保安官代理'],
[87..88, 'コミュニティの厳しくも公正な指導者'],
[89..90, '疲れ果てたが諦めきれない不屈の老婆'],
[91..92, '汚染に体を蝕まれながらも戦う頑固親父'],
[93..94, '最高の銃を作る頑固なガンスミスの職人'],
[95..96, '交易路を熟知した熟練のキャラバン隊長'],
[97..98, '情報データベースの無機質な対話型AI'],
[99..100, '古い時空に存在していた高慢な魔法知性'],
]
),
}.freeze
end
end
end
Loading
Loading