導入
TRPG(テーブルトークロールプレイングゲーム)ってご存知でしょうか?
その名の通りテーブルトーク、つまりゲーム機は使わずに自分たちが会話していくことでストーリーが進んでいくゲームです。
そして、各キャラクターは技能値というものを持ち、ダイスによってその技能の成否を判定します。
詳しくは同期の池田さんのブログに書いてるので是非そちらも読んでみてください。
このゲームジャンルはディスプレイ等に何かを映したりしないので、その場の情景が実際には見えません。
オンラインでやる場合には、ココフォリアのようなツールを使うことで背景を映したりすることはできるのですが、それでも完全ではありません。
じゃあどうするか、マイクラで再現すればいいじゃないということです。
そして、せっかくマイクラでやるなら技能の判定もマイクラ内で完結させたいということでプラグインをJavaで作りました。
対象はクトゥルフ神話TRPGの6版です。
プラグインについて
マインクラフトに機能を追加するものとして、これまた同期の播磨さんのブログにMODとアドオンがあるという紹介がありますが、ほかにもあります。
それがプラグインです。基本的にJava版で遊ぶときに使われるのでMODとはまた別ものになります。
MODはシングルプレイ、マルチプレイを問わずに導入でき、既存のシステムに手を加えるようなものですが、
プラグインはシングルプレイでは利用できず、マルチサーバーをより便利にするものになります。
内容
このプラグインで一番重要な機能は技能の成否判定を行うこと、つまり各キャラクターが持つ基準値と生成した乱数の比較を行うことです。
データ保存
基準値と乱数の比較を行うにはまず基準値をどこかに保存しておかなければなりません。
じゃあどうやって保存するのか、このプラグインではマイクラ自体に備わっているスコアボードを使うことにしました。
もちろんsqliteのようなDBを使うこともできるのですが、そのためには別のプラグインを導入する必要があったり、ゲーム内から変更するには方法をプラグイン側で用意してやる必要があったりと、面倒だったので不採用になりました。
そして、このスコアボードというのはマイクラのゲーム内でプレイヤーについての情報(死亡回数など)を記録するものなのですが、もともとマインクラフトに実装されているコマンドで自由に追加削除することもできます。
右端の表がスコアボードです。
項目ごとに値が入っているのがわかります。
乱数生成
普通に乱数を生成するMath.randomでもいいのですが、もし乱数が大きい値、もしくは小さい値に偏ってしまうとストーリーの結末に大きな影響を与えてしまいます。
乱数の各値の確率は同様に確からしくあってほしいので、javadocに
このクラスは暗号用に強化された乱数ジェネレータ(RNG)を提供します。
強力な暗号化による乱数は、「FIPS 140-2, Security Requirements for Cryptographic Modules」のセクション4.9.1に指定されている統計的乱数生成テストに最低限適合しています。
と書かれていたSecureRandomクラスのメソッドを利用することにしました。
終わりに
これで技能の基準値の保存と乱数ができたので、成否判定が行えるようになりました。
しかし、1つ重大な欠陥があったんです。
そう、地形や建造物の再現に時間がかかりすぎてそもそも使われないという欠陥が...
かくしてこのプラグインはほとんど使われることなく、HDDの奥底に眠っているのでした。