Skip to content

Commit

Permalink
神椿市建設中。NARRATIVE を追加
Browse files Browse the repository at this point in the history
  • Loading branch information
ysakasin committed Nov 28, 2023
1 parent 6ca3489 commit a1f46b8
Show file tree
Hide file tree
Showing 3 changed files with 1,321 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/bcdice/game_system.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@
require "bcdice/game_system/JuinKansen"
require "bcdice/game_system/Kamigakari"
require "bcdice/game_system/Kamigakari_Korean"
require "bcdice/game_system/KamitsubakiCityUnderConstructionNarrative"
require "bcdice/game_system/KanColle"
require "bcdice/game_system/Karukami"
require "bcdice/game_system/KemonoNoMori"
Expand Down
251 changes: 251 additions & 0 deletions lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,251 @@
# frozen_string_literal: true

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

# ゲームシステム名
NAME = '神椿市建設中。NARRATIVE'

# ゲームシステム名の読みがな
SORT_KEY = 'かみつはきしけんせつちゆうならていふ'

# ダイスボットの使い方
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
・可組(KA)
 KA6 行動判定
 KA8 技能ロール
 KA10 特技ロール
 KA12 Aロール
・裏組(RI)
 RI6 行動判定
 RI8 技能ロール
 RI10 特技ロール
 RI12 Aロール
・羽組(HA)
 HA6 行動判定
 HA8 技能ロール
 HA10 特技ロール
 HA12 Aロール
・星組(SE)
 SE6 行動判定
 SE8 技能ロール
 SE10 特技ロール
 SE12 Aロール
・狐組(CO)
 CO6 行動判定
 CO8 技能ロール
 CO10 特技ロール
 CO12 Aロール
・GM用
 GM6 (成否判定なし)
 GM8 技能ロール
 GM10 特技ロール
 Q12 Qロール
・存在証明 EXI<=x
 存在証明の判定を行う
 x: 存在値
INFO_MESSAGE_TEXT

def eval_game_system_specific_command(command)
roll_kumi(command) || roll_existence(command)
end

private

def roll_kumi(command)
table = TABLES[command]
unless table
return nil
end

return table.roll(@randomizer)
end

class KumiDice
def initialize(items)
@items = items.freeze
end

CRITICAL = "M"
FUMBLE = "Q"

def roll(randomizer)
dice = randomizer.roll_once(@items.length)
chosen = @items[dice - 1]

fumble = chosen == FUMBLE
critical = chosen == CRITICAL

result_tail =
if fumble
"ファンブル"
elsif critical
"マジック"
elsif !chosen.empty?
"成功"
else
"失敗"
end

Result.new.tap do |r|
r.critical = critical
r.fumble = fumble
r.condition = !chosen.empty? && !r.fumble?
r.text = [
"(D#{@items.length})",
dice,
chosen.empty? ? nil : chosen,
result_tail
].compact.join(" > ")
end
end
end

class KumiD6
def initialize(success_symbol)
@success_symbol = success_symbol
end

TABLE = ["裏", "羽", "星", "狐", "可", "Q"].freeze

def roll(randomizer)
dice = randomizer.roll_once(6)
chosen = TABLE[dice - 1]

Result.new.tap do |r|
unless @success_symbol.nil?
r.fumble = chosen == "Q"
r.condition = chosen == @success_symbol
end

result_tail =
if r.fumble?
"ファンブル"
elsif r.success?
"成功"
elsif r.failure?
"失敗"
end

r.text = [
"(D6)",
dice,
chosen,
result_tail
].compact.join(" > ")
end
end
end

class QDice
def initialize(items)
@items = items.freeze
end

CRITICAL = "M"

def roll(randomizer)
dice = randomizer.roll_once(@items.length)
chosen = @items[dice - 1]

critical = chosen == CRITICAL

result_tail =
if critical
"マジック"
elsif !chosen.empty?
"成功"
else
"失敗"
end

Result.new.tap do |r|
r.critical = critical
r.condition = !chosen.empty?
r.text = [
"(D#{@items.length})",
dice.to_s,
chosen.empty? ? nil : chosen,
result_tail,
].compact.join(" > ")
end
end
end

def roll_existence(command)
m = /^EXI<=(\d+)$/.match(command)
unless m
return nil
end

target = m[1].to_i
dice = @randomizer.roll_once(20)
Result.new.tap do |r|
r.critical = dice == 1
r.fumble = dice == 20
r.condition = (dice <= target && !r.fumble?) || r.critical?

result_tail =
if r.critical?
"M > マジック"
elsif r.fumble?
"Q > ファンブル"
elsif r.success?
"成功"
else
"失敗"
end

r.text = [
"(D20<=#{target})",
dice,
result_tail
].join(" > ")
end
end

TABLES = {
"KA6" => KumiD6.new("可"),
"KA8" => KumiDice.new(["Q", "", "", "", "可", "可", "可", "M"]),
"KA10" => KumiDice.new(["Q", "", "", "可", "可", "可", "可", "可", "M", "M"]),
"KA12" => KumiDice.new(["Q", "", "", "可", "可", "可", "可", "可", "可", "可", "M", "M"]),

"RI6" => KumiD6.new("裏"),
"RI8" => KumiDice.new(["Q", "", "", "", "裏", "裏", "裏", "M"]),
"RI10" => KumiDice.new(["Q", "", "", "裏", "裏", "裏", "裏", "裏", "M", "M"]),
"RI12" => KumiDice.new(["M", "M", "裏", "裏", "裏", "裏", "裏", "裏", "裏", "", "", "Q"]),

"HA6" => KumiD6.new("羽"),
"HA8" => KumiDice.new(["Q", "", "", "", "羽", "羽", "羽", "M"]),
"HA10" => KumiDice.new(["Q", "", "", "羽", "羽", "羽", "羽", "羽", "M", "M"]),
"HA12" => KumiDice.new(["Q", "Q", "羽", "羽", "羽", "", "", "", "M", "M", "M", "M"]),

"SE6" => KumiD6.new("星"),
"SE8" => KumiDice.new(["Q", "", "", "", "星", "星", "星", "M"]),
"SE10" => KumiDice.new(["Q", "", "", "星", "星", "星", "星", "星", "M", "M"]),
"SE12" => KumiDice.new(["星", "", "星", "星", "M", "Q", "M", "星", "星", "星", "", "星"]),

"CO6" => KumiD6.new("狐"),
"CO8" => KumiDice.new(["Q", "", "", "", "狐", "狐", "狐", "M"]),
"CO10" => KumiDice.new(["Q", "", "", "狐", "狐", "狐", "狐", "狐", "M", "M"]),
"CO12" => KumiDice.new(["Q", "", "", "狐狐狐", "狐狐", "狐", "狐狐狐", "狐狐", "狐", "狐", "M", "M"]),

"GM6" => KumiD6.new(nil),
"GM8" => KumiDice.new(["Q", "", "", "", "W", "W", "W", "M"]),
"GM10" => KumiDice.new(["Q", "", "", "W", "W", "W", "W", "W", "M", "M"]),
"Q12" => QDice.new(["", "", "", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "M", "M"])
}.freeze

register_prefix("EXI", TABLES.keys)
end
end
end
Loading

0 comments on commit a1f46b8

Please sign in to comment.