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

ダイスボット追加(獸ノ森) #124

Merged
merged 3 commits into from
Mar 5, 2020
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
1 change: 1 addition & 0 deletions src/configBcDice.rb
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@
Kamigakari
Kamigakari:Korean
KanColle
KemonoNoMori
KillDeathBusiness
KillDeathBusiness:Korean
KurayamiCrying
Expand Down
335 changes: 335 additions & 0 deletions src/diceBot/KemonoNoMori.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,335 @@
# -*- coding: utf-8 -*-

require 'utils/table.rb'

class KemonoNoMori < DiceBot
def initialize
super
end

def gameName
'獸ノ森'
end

def gameType
'KemonoNoMori'
end

def getHelpMessage
return <<MESSAGETEXT
・行為判定(成功度自動算出): KAx[±y]
・継続判定(成功度+1固定): KCx[±y]
x=目標値
y=目標値への修正(任意) x+y-z のように複数指定可能
例1)KA7+3 → 目標値7にプラス3の修正を加えた行為判定
例2)KC6 → 目標値6の継続判定
・罠動作判定: CTR
罠ごとに1D12を振る。12が出た場合は罠が動作し、獲物がその効果を受ける
・各種表
・大失敗表: FT
・能力値ランダム決定表: RST
・ランダム所要時間表: RTT
・ランダム消耗表: RET
・ランダム天気表: RWT
・ランダム天気持続表: RWDT
・ランダム遮蔽物表(屋外): ROMT
・ランダム遮蔽物表(屋内): RIMT
・逃走体験表: EET
・食材採集表: GFT
・水採集表: GWT
・白の魔石効果表: WST
MESSAGETEXT
end

def rollDiceCommand(command)
case command
when /KA\d[-+\d]*/
return check_1D12(command, true)
when /KC\d[-+\d]*/
return check_1D12(command, false)
when 'CTR'
return getTrapResult()
when 'EET'
return getEscapeExperienceTableResult(command)
else
return roll_tables(command, TABLES)
end
end

def check_1D12(command, is_action_judge)
debug('獸ノ森の1d12判定')
m = /K[AC](\d[-+\d]*)/.match(command)
unless m
return ''
end

# 修正込みの目標値を計算
target_total = parren_killer("(#{m[1]})").to_i
debug('target_total', target_total)

# 行為判定の成功度は [目標値の10の位の数+1]
# 継続判定の成功度は固定で+1
success_degree = is_action_judge ? target_total / 10 + 1 : 1

dice_total, = roll(1, 12)
debug('dice_total, target_total, success_degree = ', dice_total, target_total, success_degree)

if dice_total == 12
return "(1D12<=#{target_total}) > #{dice_total} > 大失敗"
elsif dice_total == 11
return "(1D12<=#{target_total}) > #{dice_total} > 大成功(成功度+#{success_degree}, 次の継続判定の目標値を10に変更)"
elsif dice_total <= target_total
return "(1D12<=#{target_total}) > #{dice_total} > 成功(成功度+#{success_degree})"
else
return "(1D12<=#{target_total}) > #{dice_total} > 失敗"
end
end

def getTrapResult()
trapCheckNumber, = roll(1, 12)

# 12が出た場合のみ罠が動作する
if trapCheckNumber == 12
chaseNumber, = roll(1, 12)
chase = nil
case chaseNumber
when 1, 2, 3, 4
chase = '小型動物'
when 5, 6, 7, 8
chase = '大型動物'
when 9, 10, 11, 12
chase = '人間の放浪者'
end
return "罠動作チェック(1D12) > #{trapCheckNumber} > 罠が動作していた! > 獲物表(#{chaseNumber}) > #{chase}が罠にかかっていた"
end

return "罠動作チェック(1D12) > #{trapCheckNumber} > 罠は動作していなかった"
end

def getEscapeExperienceTableResult(command)
escapeExperience = roll_tables(command, TABLES)
escapeDuration, = roll(1, 12)
return "#{escapeExperience} (再登場: #{escapeDuration}時間後)"
end

TABLES = {
'FT' => Table.new(
'大失敗表',
'1D12',
[
'【余裕】が3点減少する(最低0まで)',
'【余裕】が3点減少する(最低0まで)',
'【余裕】が3点減少する(最低0まで)',
'ランダムな荷物1個が落ちて行方不明になる(大失敗したエリアのアイテム調査で見つけることが可能)',
'ランダムな荷物1個が落ちて行方不明になる(大失敗したエリアのアイテム調査で見つけることが可能)',
'ランダムな荷物1個が破壊される',
'ランダムな荷物1個が破壊される',
'ランダム天気表を使用し、結果をターンの終了まで適用する',
'ランダム天気表を使用し、結果をターンの終了まで適用する',
'ランダムな準備している小道具1個が破壊される',
'着想している防具が破壊される',
'準備している武器が破壊される',
]
),
'RST' => Table.new(
'能力値ランダム決定表',
'1D12',
[
'【移動】',
'【移動】',
'【格闘】',
'【格闘】',
'【射撃】',
'【射撃】',
'【製作】',
'【製作】',
'【察知】',
'【察知】',
'【自制】',
'【自制】',
]
),
'RTT' => Table.new(
'ランダム所要時間表',
'1D12',
[
'2',
'2',
'2',
'3',
'3',
'3',
'4',
'4',
'4',
'5',
'5',
'5',
]
),
'RET' => Table.new(
'ランダム消耗表',
'1D12',
[
'0',
'0',
'0',
'1',
'1',
'1',
'2',
'2',
'2',
'4',
'4',
'4',
]
),
'RWT' => Table.new(
'ランダム天気表',
'1D12',
[
'濃霧',
'濃霧',
'大雨',
'大雨',
'雷雨',
'雷雨',
'強風',
'強風',
'酷暑',
'酷暑',
'極寒',
'極寒',
]
),
'RWDT' => Table.new(
'ランダム天気持続表',
'1D12',
[
'1ターン',
'1ターン',
'3ターン',
'3ターン',
'6ターン',
'6ターン',
'24ターン',
'24ターン',
'72ターン',
'72ターン',
'156ターン',
'156ターン',
]
),
'ROMT' => Table.new(
'ランダム遮蔽物表(屋外)',
'1D12',
[
'【藪】耐久度3,軽減値1,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【藪】耐久度3,軽減値1,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木】耐久度5,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木】耐久度5,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木】耐久度5,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【大木】耐久度7,軽減値3,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加',
'【大木】耐久度7,軽減値3,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加',
'【大木】耐久度7,軽減値3,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加',
'【岩】耐久度6,軽減値4,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加/コンタクト内で行われる格闘攻撃のダメージ+1',
'【岩】耐久度6,軽減値4,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加/コンタクト内で行われる格闘攻撃のダメージ+1',
'【岩壁】耐久度8,軽減値4,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加/コンタクト内で行われる格闘攻撃のダメージ+2',
'【岩壁】耐久度8,軽減値4,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加/コンタクト内で行われる格闘攻撃のダメージ+2',
]
),
'RIMT' => Table.new(
'ランダム遮蔽物表(屋内)',
'1D12',
[
'【木材の壁】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木材の壁】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木材の壁】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木材の壁】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加',
'【木材の扉】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1、接触判定と突撃判定に-2の修正を付加',
'【木材の扉】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1、接触判定と突撃判定に-2の修正を付加',
'【木材の扉】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1、接触判定と突撃判定に-2の修正を付加',
'【木材の扉】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1、接触判定と突撃判定に-2の修正を付加',
'【木製家具】耐久度3,軽減値2,特殊効果:コンタクト内で行われる格闘攻撃のダメージ+1',
'【木製家具】耐久度3,軽減値2,特殊効果:コンタクト内で行われる格闘攻撃のダメージ+1',
'【木製家具】耐久度3,軽減値2,特殊効果:コンタクト内で行われる格闘攻撃のダメージ+1',
'【木製家具】耐久度3,軽減値2,特殊効果:コンタクト内で行われる格闘攻撃のダメージ+1',
]
),
'EET' => Table.new(
'逃走体験表',
'1D12',
[
'【余裕】が0になる',
'【余裕】が0になる',
'【余裕】が0になる',
'任意の【絆】を合計2点減少する',
'任意の【絆】を合計2点減少する',
'任意の【絆】を合計2点減少する',
'全ての荷物を失う(逃走したエリアに配置され、調査で発見可能)',
'全ての荷物を失う(逃走したエリアに配置され、調査で発見可能)',
'全ての荷物を失う(逃走したエリアに配置され、調査で発見可能)',
'全ての武器と防具と小道具と荷物を失う(逃走したエリアに配置され、調査で発見可能)',
'全ての武器と防具と小道具と荷物を失う(逃走したエリアに配置され、調査で発見可能)',
'全ての武器と防具と小道具と荷物を失う(逃走したエリアに配置され、調査で発見可能)',
]
),
'GFT' => Table.new(
'食材採集表',
'1D12',
[
'食べられる根(栄養価:2)',
'食べられる根(栄養価:2)',
'食べられる草(栄養価:3)',
'食べられる草(栄養価:3)',
'食べられる草(栄養価:3)',
'食べられる実(栄養価:5)',
'食べられる実(栄養価:5)',
'食べられる実(栄養価:5)',
'小型動物(栄養価:10)',
'小型動物(栄養価:10)',
'大型動物(栄養価:40)',
'気持ち悪い虫(栄養価:1)',
]
),
'GWT' => Table.new(
'水採集表',
'1D12',
[
'汚水',
'汚水',
'汚水',
'汚水',
'汚水',
'汚水',
'飲料水',
'飲料水',
'飲料水',
'飲料水',
'飲料水',
'毒水',
]
),
'WST' => Table.new(
'白の魔石効果表',
'1D12',
[
'役に立たないものの色を変える',
'役に立たないものを大きくする',
'役に立たないものを小さくする',
'役に立たないものを保存する',
'役に立たないものを復元する',
'役に立たないものを召喚する',
'役に立たないものを動かす',
'役に立たないものを増やす',
'役に立たないものを貼り付ける',
'役に立たないものを作り出す',
'小型動物を召喚する',
'大型動物を召喚する',
]
),
}.freeze

setPrefixes(['K[AC]\d[-+\d]*', 'CTR'] + TABLES.keys)
end
Loading