Edited at

自作ツールでもBone&Carsを動かしたい!

More than 3 years have passed since last update.


はじめに

自作TRPGオンセツールOnset!にBCDiceを導入したので、それのまとめです


Bone&Carsって?

詳しくはここ

自分の知る限り、一番いい感じなTRPGダイスシステムです

対応してるゲームも多いですし、かといって重いわけでもなく

某どどんとふに入っているものと同じなのでコマンドも認知度(?)が高く、すべてのTRPGダイスボットはこれでいい気もします

(海外製TRPGとかはさすがに知りませんが...)


具体的にどうするか

使用言語はRubyで、元はIRCのダイスボットです

なので、自作ツールではおそらく使わないであろう部分もあります

自分は普段Rubyを書かないんですが、そんな自分でも普通に自作ツールに組み込めました


まずはRubyで軽いラッパーを書く

src/が本体です

その中のbcdiceCore.rbが基礎で、その中に定義されてるBCDiceクラスとBCDiceMakerクラスを継承して書いていく形でやるといい感じだと思います

自分のOnset!はBCDiceをCGIとしてPHPから呼び出す感じで組み込んだので、その一例を載せておきます

#!/usr/bin/ruby -Ku

#--*-coding:utf-8-*--

$LOAD_PATH << File.dirname(__FILE__)

require 'cgi'
require 'bcdiceCore.rb'
require 'configBcDice.rb'

class OnsetBCDiceMaker < BCDiceMaker

def newBcDice
bcdice = OnsetBCDice.new(self, @cardTrader, @diceBot, @counterInfos, @tableFileData)
return bcdice
end
end

class OnsetBCDice < BCDice

def setNick(nick)
@nick_e = nick
end
end

puts "Content-Type: text/plain\n\n"

cgi = CGI.new();
params = cgi.params

if(params['list'][0] == "1")
$allGameTypes.each do |var|
puts var + "\n"
end
exit
end

unless($allGameTypes.include?(params['sys'][0]) || params['sys'][0] == 'None')
puts 'error'
exit
end

if(params['sys'][0] == nil)
params['sys'][0] == "None"
end

bcmaker = OnsetBCDiceMaker.new
bcdice = bcmaker.newBcDice()

bcdice.setGameByTitle(params['sys'][0])
bcdice.setMessage(params['text'][0])
bcdice.setNick('onset')
hoge, foo = bcdice.dice_command

puts hoge

はい、少しずつ見ていきましょう


クラスを継承

まずBCDiceを継承(上のコードはBCDiceMakerが先に定義されてますが...)

ここでsetNickメソッドを追加します

BCDice内の@nick_e変数に値を入れるコードで、一応これがなくても動く(未検証)と思いますが、入れておくに越したことは無いと思います

また、ダイス側の機能で追加したいものがあるとここで入れとくといいと思います

次に、BCDiceMakerの継承

これはnewBCDiceメソッドをオーバーライドして、自前でBCDiceを継承して書いたクラスを呼び出すように変更します

BCDiceのコンストラクタの引数はbcdiceCore.rbを見て、元と同じようにするのが無難と思います


実際に処理を呼び出す順番

まず、BCDiceMakerを継承した自前クラスのインスタンスを作成

そして、そこからnewBCDiceをしてBCDiceを継承した自前クラスのインスタンスを作ります

bcmaker = OnsetBCDiceMaker.new

bcdice = bcmaker.newBcDice()

そしてゲームシステム、ニックネーム、テキストを入力し、dice_commandメソッドを実行します

bcdice.setGameByTitle("ゲームタイトル")

bcdice.setMessage("チャット/テキスト")
bcdice.setNick("ニックネーム")
hoge, foo = bcdice.dice_command

setGameByTitleの引数ですが、これはconfigBcDice.rb内の$allGameTypesで定義されている文字を渡すといいです

(ゲームタイトルの略称、例えばクトゥルフ→CoCでも呼び出せますが、無難に定義されているものを使ったほうがいいと思います)

このとき、dice_commandメソッドは返り値の一つ目にダイス結果のテキストを、二つ目に秘話かどうか(bool)が入ります

(Onset!は秘話機能に対応していないので、二つ目の返り値は使っていません)

一つ目の返り値に入るダイス結果のテキストのフォーマットは、

ニックネーム: (ダイスコマンド) > ダイス結果 > 失敗/成功

といった感じで返ってきます

その他機能を追加したりしたいときはBCDiceを継承した自前クラスに書いたりオーバーライドしたりするか、実際に自作ツールのほうにラッパーを書くかをしたらいい感じになると思います


まとめると


  1. BCDice、BCDiceMakerを継承していい感じにする

  2. ゲームタイトル、ニックネーム、テキストをセットしてdice_commandメソッドを実行する

  3. 出てきた返り値をいい感じにする


おまけ

Onset!の使用言語内訳をみるとわかりますが、PHPがメインのはずなのにrubyがおよそ99%を占めています

(容量もそれなりにかさみます)

?「何度タイムリープしたって、1%の壁は超えられない!」

すべては「運命石の扉シュタインズゲート」の選択のままに

エル・プサイ・コングルゥ

なんにせよ、ダイスコマンドは統一されたほうがいいと思うので、これを機にBCDiceが広まればいいなぁと思います。