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

アニマアニムスのダイスボットを追加 #221

Merged
merged 5 commits into from
Jun 26, 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
95 changes: 95 additions & 0 deletions src/diceBot/AnimaAnimus.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# -*- coding: utf-8 -*-
# frozen_string_literal: true

require 'utils/table.rb'
require 'utils/range_table'
require 'utils/ArithmeticEvaluator'

class AnimaAnimus < DiceBot
# ゲームシステムの識別子
ID = 'AnimaAnimus'

# ゲームシステム名
NAME = 'アニマアニムス'

# ゲームシステム名の読みがな
#
# 「ゲームシステム名の読みがなの設定方法」(docs/dicebot_sort_key.md)を参考にして
# 設定してください
SORT_KEY = 'あにまあにむす'

# ダイスボットの使い方
HELP_MESSAGE = <<MESSAGETEXT
・行為判定(xAN<=y±z)
 十面ダイスをx個振って判定します。達成値が算出されます(クリティカル発生時は2増加)。
 x:振るダイスの数。魂魄値や攻撃値。
 y:成功値。
 z:成功値への補正。省略可能。
 (例) 2AN<=3+1 5AN<=7
・各種表
 情報収集表 IGT/喪失表 LT
MESSAGETEXT

def initialize
super
@sendMode = 2
end

def rollDiceCommand(command)
case command
when /(\d+)AN<=(\d+([\+\-]\d+)*)/i
return check_action(Regexp.last_match)
else
return roll_tables(command, TABLES)
end
end

def check_action(match_data)
a = ArithmeticEvaluator.new()
dice_cnt = a.eval(match_data[1])
target = a.eval(match_data[2])
debug("dice_cnt", dice_cnt)
debug("target", target)

_, dice_str, = roll(dice_cnt, 10)
dice_arr = dice_str.split(',').map(&:to_i)
suc_cnt = dice_arr.count { |x| x <= target }
has_critical = dice_arr.include?(1)
result = has_critical ? suc_cnt + 2 : suc_cnt

return "(#{dice_cnt}B10<=#{target}) > #{dice_str} > #{result > 0 ? '成功' : '失敗'}(達成値:#{result})#{has_critical ? ' (クリティカル発生)' : ''}"
end

TABLES = {
'IGT' => Table.new(
'情報収集表',
'1d10',
[
'ストリートファイト/<格闘>/「俺に勝てたら教えてやるよ」情報を知る魂願者から勝負を挑まれた。生き延びるためにもこの勝負、負けるわけにはいかない。',
'追跡!/<追跡/逃走>/有益な情報を持っている人間を見つけたが、こちらの顔を見るなり逃げ出した。どうにかして捕まえなくてはならない。',
'脅し/<威圧>/ならず者たちが集まるバーにやってきた。裏社会に生きる彼らを脅せば有益な情報が手に入るはずだ。',
'インターネット/<コンピュータ>/SNSやニュースなど、インターネット上の情報を調査する。デマには騙されないようにしなくては。',
'瀕死の情報提供者/<医学>/情報を知る人物がいると聞いてやってきたら、その人物が瀕死の重傷を負っていた。なんとかして蘇生させなくては。',
'潜入捜査/<隠密>/敵対する魂願者たちのグループに潜り込んでの調査活動。リスクは高いが、有益な情報が手に入る確率は高い。',
'情報交換/<交渉>/友好的な関係にある魂願者との情報交換。うまく話を聞き出すことができるとよいが。',
'魔宴の情報屋/<調達>/魔宴の情報屋に接触して情報を聞き出すことにした。一筋縄ではいかない相手らしいが、はたして……?',
'違法調査/<犯罪>/法に触れるやり方で情報を集めることにした。ハッキング、窃盗、恐喝、どんな手段を選ぼうか。',
'聞き込み/<自我>/街ゆく人びとに聞き込みを行なう。地道な活動こそが目標にたどり着くための最短の方法だ。',
]
),
'LT' => RangeTable.new(
'喪失表',
'1d10',
[
[1..2, "存在/存在が希薄になり、知り合いや友人に自分の存在を忘れられてしまう。いずれ大切なパートナーの記憶からも消え、この世界でひとりぼっちになる。\nあなたの出自を消去すること。"],
[3..4, "記憶/自分の大切な記憶をひとつ失なう。これからは力を使うたびに記憶をひとつ失なうことになり、最後には大切なパートナーのことも思い出せなくなってしまう。\nあなたのメモリアをひとつ選択して消去すること。シナリオメモリアは選択できない。"],
[5..6, "容姿/だんだんと以前とはかけ離れた姿に変わっていく。いずれ誰も自分のことを自分だと気づかなくなるのだろう。\nあなたの特徴的な外見を失なう。内容をふさわしいものに書き換えること(特徴的な外見が美しい髪であれば醜い髪など)。"],
[7..8, "感情/喜怒哀楽の感情のうち、いずれかひとつを失なう。力を使うたびに他の感情も失っていき、最後にはただ生き残るために戦う機械となる。\nポジティブかネガティブのどちらかを選択する。選択した感情をすべてのメモリアから消去する。消去した結果、表出感情がなくなってしまった場合、残った感情を表出感情にすること。なお、新しくメモリアを取得した場合も、選んだ感情を得ることはできない。"],
[9..10, "五感/少しずつ五感が鈍くなる。今までできていたはずのことができなくなってしまう。\nあなたの特技をひとつ選択する。選択した特技に×をつけること。×が付いた技能で判定を行なうことはできず、判定を求められた場合は自動的に失敗となる。"],
]
),
}.freeze

# ダイスボットで使用するコマンドを配列で列挙する
setPrefixes(['\d+AN<=\d([\+\-]\d+)*'] + TABLES.keys)
end
139 changes: 139 additions & 0 deletions src/test/data/AnimaAnimus.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
input:
3AN<=3
output:
AnimaAnimus : (3B10<=3) > 2,3,4 > 成功(達成値:2)
rand:2/10,3/10,4/10
============================
input:
3AN<=3+1
output:
AnimaAnimus : (3B10<=4) > 2,3,4 > 成功(達成値:3)
rand:2/10,3/10,4/10
============================
input:
3AN<=1-2
output:
AnimaAnimus : (3B10<=-1) > 2,3,4 > 失敗(達成値:0)
rand:2/10,3/10,4/10
============================
input:
3AN<=1-2
output:
AnimaAnimus : (3B10<=-1) > 2,3,1 > 成功(達成値:2) (クリティカル発生)
rand:2/10,3/10,1/10
============================
input:
(3+1)AN<=3-1
output:
AnimaAnimus : (4B10<=2) > 2,3,4,4 > 成功(達成値:1)
rand:2/10,3/10,4/10,4/10
============================
input:
3AN<=3
output:
AnimaAnimus : (3B10<=3) > 1,2,5 > 成功(達成値:4) (クリティカル発生)
rand:1/10,2/10,5/10
============================
input:
3AN<=3
output:
AnimaAnimus : (3B10<=3) > 9,1,1 > 成功(達成値:4) (クリティカル発生)
rand:9/10,1/10,1/10
============================
input:
3AN<=3
output:
AnimaAnimus : (3B10<=3) > 7,6,5 > 失敗(達成値:0)
rand:7/10,6/10,5/10
============================
input:
5AN<=7
output:
AnimaAnimus : (5B10<=7) > 4,4,9,6,7 > 成功(達成値:4)
rand:4/10,4/10,9/10,6/10,7/10
============================
input:
5AN<=7
output:
AnimaAnimus : (5B10<=7) > 4,4,9,1,7 > 成功(達成値:6) (クリティカル発生)
rand:4/10,4/10,9/10,1/10,7/10
============================
input:
5AN<=7
output:
AnimaAnimus : (5B10<=7) > 4,1,9,1,7 > 成功(達成値:6) (クリティカル発生)
rand:4/10,1/10,9/10,1/10,7/10
============================
input:
5AN<=7
output:
AnimaAnimus : (5B10<=7) > 10,8,9,9,8 > 失敗(達成値:0)
rand:10/10,8/10,9/10,9/10,8/10
============================
input:
(5+1)AN<=7
output:
AnimaAnimus : (6B10<=7) > 7,3,10,9,10,3 > 成功(達成値:3)
rand:7/10,3/10,10/10,9/10,10/10,3/10
============================
input:
(5+1)AN<=7
output:
AnimaAnimus : (6B10<=7) > 9,2,1,7,8,2 > 成功(達成値:6) (クリティカル発生)
rand:9/10,2/10,1/10,7/10,8/10,2/10
============================
input:
3an<=3
output:
AnimaAnimus : (3B10<=3) > 2,3,4 > 成功(達成値:2)
rand:2/10,3/10,4/10
============================
input:
3An<=3
output:
AnimaAnimus : (3B10<=3) > 2,3,4 > 成功(達成値:2)
rand:2/10,3/10,4/10
============================
input:
3aN<=3
output:
AnimaAnimus : (3B10<=3) > 2,3,4 > 成功(達成値:2)
rand:2/10,3/10,4/10
============================
input:
S3AN<=3
output:
AnimaAnimus : (3B10<=3) > 2,3,4 > 成功(達成値:2)###secret dice###
rand:2/10,3/10,4/10
============================
input:
S(5+1)AN<=7
output:
AnimaAnimus : (6B10<=7) > 9,2,1,7,8,2 > 成功(達成値:6) (クリティカル発生)###secret dice###
rand:9/10,2/10,1/10,7/10,8/10,2/10
============================
input:
IGT
output:
AnimaAnimus : 情報収集表(3) > 脅し/<威圧>/ならず者たちが集まるバーにやってきた。裏社会に生きる彼らを脅せば有益な情報が手に入るはずだ。
rand:3/10
============================
input:
SIGT
output:
AnimaAnimus : 情報収集表(8) > 魔宴の情報屋/<調達>/魔宴の情報屋に接触して情報を聞き出すことにした。一筋縄ではいかない相手らしいが、はたして……?###secret dice###
rand:8/10
============================
input:
LT
output:
AnimaAnimus : 喪失表(6) > 容姿/だんだんと以前とはかけ離れた姿に変わっていく。いずれ誰も自分のことを自分だと気づかなくなるのだろう。
あなたの特徴的な外見を失なう。内容をふさわしいものに書き換えること(特徴的な外見が美しい髪であれば醜い髪など)。
rand:6/10
============================
input:
SLT
output:
AnimaAnimus : 喪失表(10) > 五感/少しずつ五感が鈍くなる。今までできていたはずのことができなくなってしまう。
あなたの特技をひとつ選択する。選択した特技に×をつけること。×が付いた技能で判定を行なうことはできず、判定を求められた場合は自動的に失敗となる。###secret dice###
rand:10/10