Skip to content

Commit

Permalink
Merge pull request #124 from mhys5/add-dicebot-kemono
Browse files Browse the repository at this point in the history
ダイスボット追加(獸ノ森)
  • Loading branch information
ysakasin authored Mar 5, 2020
2 parents 8b73cfc + fcfce74 commit 1406fa4
Show file tree
Hide file tree
Showing 4 changed files with 712 additions and 0 deletions.
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

0 comments on commit 1406fa4

Please sign in to comment.