diff --git a/src/configBcDice.rb b/src/configBcDice.rb index 819428961..ba45d77fb 100644 --- a/src/configBcDice.rb +++ b/src/configBcDice.rb @@ -117,6 +117,7 @@ Kamigakari Kamigakari:Korean KanColle + KemonoNoMori KillDeathBusiness KillDeathBusiness:Korean KurayamiCrying diff --git a/src/diceBot/KemonoNoMori.rb b/src/diceBot/KemonoNoMori.rb new file mode 100644 index 000000000..6e7f04c5b --- /dev/null +++ b/src/diceBot/KemonoNoMori.rb @@ -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 < 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 diff --git a/src/test/data/KemonoNoMori.txt b/src/test/data/KemonoNoMori.txt new file mode 100644 index 000000000..982465174 --- /dev/null +++ b/src/test/data/KemonoNoMori.txt @@ -0,0 +1,372 @@ +input: +KA9 +output: +KemonoNoMori : (1D12<=9) > 1 > 成功(成功度+1) +rand:1/12 +============================ +input: +KA8+1 +output: +KemonoNoMori : (1D12<=9) > 9 > 成功(成功度+1) +rand:9/12 +============================ +input: +ka10 +output: +KemonoNoMori : (1D12<=10) > 9 > 成功(成功度+2) +rand:9/12 +============================ +input: +KA18+2-1 +output: +KemonoNoMori : (1D12<=19) > 9 > 成功(成功度+2) +rand:9/12 +============================ +input: +KA20 +output: +KemonoNoMori : (1D12<=20) > 9 > 成功(成功度+3) +rand:9/12 +============================ +input: +KA9 +output: +KemonoNoMori : (1D12<=9) > 10 > 失敗 +rand:10/12 +============================ +input: +kA9 +output: +KemonoNoMori : (1D12<=9) > 11 > 大成功(成功度+1, 次の継続判定の目標値を10に変更) +rand:11/12 +============================ +input: +ka10 +output: +KemonoNoMori : (1D12<=10) > 11 > 大成功(成功度+2, 次の継続判定の目標値を10に変更) +rand:11/12 +============================ +input: +KA19 +output: +KemonoNoMori : (1D12<=19) > 11 > 大成功(成功度+2, 次の継続判定の目標値を10に変更) +rand:11/12 +============================ +input: +SKa20 +output: +KemonoNoMori : (1D12<=20) > 11 > 大成功(成功度+3, 次の継続判定の目標値を10に変更)###secret dice### +rand:11/12 +============================ +input: +KA12 +output: +KemonoNoMori : (1D12<=12) > 12 > 大失敗 +rand:12/12 +============================ +input: +KC9 +output: +KemonoNoMori : (1D12<=9) > 1 > 成功(成功度+1) +rand:1/12 +============================ +input: +SKC8+1 +output: +KemonoNoMori : (1D12<=9) > 9 > 成功(成功度+1)###secret dice### +rand:9/12 +============================ +input: +kc10 +output: +KemonoNoMori : (1D12<=10) > 9 > 成功(成功度+1) +rand:9/12 +============================ +input: +KC18-1+2 +output: +KemonoNoMori : (1D12<=19) > 9 > 成功(成功度+1) +rand:9/12 +============================ +input: +skc17+1+1+1 +output: +KemonoNoMori : (1D12<=20) > 9 > 成功(成功度+1)###secret dice### +rand:9/12 +============================ +input: +kC9 +output: +KemonoNoMori : (1D12<=9) > 10 > 失敗 +rand:10/12 +============================ +input: +KC10 +output: +KemonoNoMori : (1D12<=10) > 11 > 大成功(成功度+1, 次の継続判定の目標値を10に変更) +rand:11/12 +============================ +input: +Kc20 +output: +KemonoNoMori : (1D12<=20) > 11 > 大成功(成功度+1, 次の継続判定の目標値を10に変更) +rand:11/12 +============================ +input: +Skc12 +output: +KemonoNoMori : (1D12<=12) > 12 > 大失敗###secret dice### +rand:12/12 +============================ +input: +CTR +output: +KemonoNoMori : 罠動作チェック(1D12) > 1 > 罠は動作していなかった +rand:1/12 +============================ +input: +ctr +output: +KemonoNoMori : 罠動作チェック(1D12) > 11 > 罠は動作していなかった +rand:11/12 +============================ +input: +SCTR +output: +KemonoNoMori : 罠動作チェック(1D12) > 5 > 罠は動作していなかった###secret dice### +rand:5/12 +============================ +input: +CTR +output: +KemonoNoMori : 罠動作チェック(1D12) > 12 > 罠が動作していた! > 獲物表(1) > 小型動物が罠にかかっていた +rand:12/12,1/12 +============================ +input: +ctr +output: +KemonoNoMori : 罠動作チェック(1D12) > 12 > 罠が動作していた! > 獲物表(12) > 人間の放浪者が罠にかかっていた +rand:12/12,12/12 +============================ +input: +sctr +output: +KemonoNoMori : 罠動作チェック(1D12) > 12 > 罠が動作していた! > 獲物表(5) > 大型動物が罠にかかっていた###secret dice### +rand:12/12,5/12 +============================ +input: +FT +output: +KemonoNoMori : 大失敗表(9) > ランダム天気表を使用し、結果をターンの終了まで適用する +rand:9/12 +============================ +input: +ft +output: +KemonoNoMori : 大失敗表(12) > 準備している武器が破壊される +rand:12/12 +============================ +input: +sFT +output: +KemonoNoMori : 大失敗表(6) > ランダムな荷物1個が破壊される###secret dice### +rand:6/12 +============================ +input: +RST +output: +KemonoNoMori : 能力値ランダム決定表(1) > 【移動】 +rand:1/12 +============================ +input: +rst +output: +KemonoNoMori : 能力値ランダム決定表(10) > 【察知】 +rand:10/12 +============================ +input: +SRST +output: +KemonoNoMori : 能力値ランダム決定表(12) > 【自制】###secret dice### +rand:12/12 +============================ +input: +RTT +output: +KemonoNoMori : ランダム所要時間表(1) > 2 +rand:1/12 +============================ +input: +rtt +output: +KemonoNoMori : ランダム所要時間表(12) > 5 +rand:12/12 +============================ +input: +SrTt +output: +KemonoNoMori : ランダム所要時間表(4) > 3###secret dice### +rand:4/12 +============================ +input: +RET +output: +KemonoNoMori : ランダム消耗表(1) > 0 +rand:1/12 +============================ +input: +ret +output: +KemonoNoMori : ランダム消耗表(12) > 4 +rand:12/12 +============================ +input: +SRET +output: +KemonoNoMori : ランダム消耗表(9) > 2###secret dice### +rand:9/12 +============================ +input: +RWT +output: +KemonoNoMori : ランダム天気表(1) > 濃霧 +rand:1/12 +============================ +input: +rwt +output: +KemonoNoMori : ランダム天気表(12) > 極寒 +rand:12/12 +============================ +input: +srwt +output: +KemonoNoMori : ランダム天気表(3) > 大雨###secret dice### +rand:3/12 +============================ +input: +RWDT +output: +KemonoNoMori : ランダム天気持続表(1) > 1ターン +rand:1/12 +============================ +input: +rwdt +output: +KemonoNoMori : ランダム天気持続表(12) > 156ターン +rand:12/12 +============================ +input: +SRWDT +output: +KemonoNoMori : ランダム天気持続表(5) > 6ターン###secret dice### +rand:5/12 +============================ +input: +ROMT +output: +KemonoNoMori : ランダム遮蔽物表(屋外)(5) > 【木】耐久度5,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加 +rand:5/12 +============================ +input: +romt +output: +KemonoNoMori : ランダム遮蔽物表(屋外)(12) > 【岩壁】耐久度8,軽減値4,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加/コンタクト内で行われる格闘攻撃のダメージ+2 +rand:12/12 +============================ +input: +sromt +output: +KemonoNoMori : ランダム遮蔽物表(屋外)(8) > 【大木】耐久度7,軽減値3,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-2の修正を付加###secret dice### +rand:8/12 +============================ +input: +RIMT +output: +KemonoNoMori : ランダム遮蔽物表(屋内)(1) > 【木材の壁】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1の修正を付加 +rand:1/12 +============================ +input: +rimt +output: +KemonoNoMori : ランダム遮蔽物表(屋内)(12) > 【木製家具】耐久度3,軽減値2,特殊効果:コンタクト内で行われる格闘攻撃のダメージ+1 +rand:12/12 +============================ +input: +SRIMT +output: +KemonoNoMori : ランダム遮蔽物表(屋内)(5) > 【木材の扉】耐久度4,軽減値2,特殊効果:コンタクト内のキャラクターに対する射撃攻撃判定に-1、接触判定と突撃判定に-2の修正を付加###secret dice### +rand:5/12 +============================ +input: +EET +output: +KemonoNoMori : 逃走体験表(5) > 任意の【絆】を合計2点減少する (再登場: 12時間後) +rand:5/12,12/12 +============================ +input: +eet +output: +KemonoNoMori : 逃走体験表(12) > 全ての武器と防具と小道具と荷物を失う(逃走したエリアに配置され、調査で発見可能) (再登場: 1時間後) +rand:12/12,1/12 +============================ +input: +sEET +output: +KemonoNoMori : 逃走体験表(2) > 【余裕】が0になる (再登場: 11時間後)###secret dice### +rand:2/12,11/12 +============================ +input: +GFT +output: +KemonoNoMori : 食材採集表(1) > 食べられる根(栄養価:2) +rand:1/12 +============================ +input: +gft +output: +KemonoNoMori : 食材採集表(12) > 気持ち悪い虫(栄養価:1) +rand:12/12 +============================ +input: +sgft +output: +KemonoNoMori : 食材採集表(3) > 食べられる草(栄養価:3)###secret dice### +rand:3/12 +============================ +input: +GWT +output: +KemonoNoMori : 水採集表(1) > 汚水 +rand:1/12 +============================ +input: +gwt +output: +KemonoNoMori : 水採集表(12) > 毒水 +rand:12/12 +============================ +input: +SGWT +output: +KemonoNoMori : 水採集表(7) > 飲料水###secret dice### +rand:7/12 +============================ +input: +WST +output: +KemonoNoMori : 白の魔石効果表(1) > 役に立たないものの色を変える +rand:1/12 +============================ +input: +wst +output: +KemonoNoMori : 白の魔石効果表(12) > 大型動物を召喚する +rand:12/12 +============================ +input: +SwsT +output: +KemonoNoMori : 白の魔石効果表(5) > 役に立たないものを復元する###secret dice### +rand:5/12 +============================ diff --git a/src/test/testDiceBotLoaders.rb b/src/test/testDiceBotLoaders.rb index 9bce739fe..2729db6bf 100644 --- a/src/test/testDiceBotLoaders.rb +++ b/src/test/testDiceBotLoaders.rb @@ -689,6 +689,10 @@ def test_Kamigakari_Korean assertDiceBotWithoutLoader('Kamigakari:Korean', 'Kamigakari_Korean') end + def test_KemonoNoMori + assertDiceBotWithoutLoader('KemonoNoMori') + end + def test_KillDeathBusiness_Korean assertDiceBotWithoutLoader('KillDeathBusiness:Korean', 'KillDeathBusiness_Korean')