document

初期段階


美坂はテンプレートゴーストと共に nar アーカイブとして配布されます。テンプレートゴーストは全くの無機質/無機能ながら(構造的には)完全なゴーストとして機能しており、これを実際に動作させ、同時にデータファイルを参照することにより、美坂の構造は比較的簡単に理解できます。以下の文章は、テンプレートゴーストの持つ misaka.txt というテキストファイル(美坂辞書データベースファイル)を参照しながら読まれることを前提としています。


美坂ファイルセットに添付されているテンプレートゴーストは、反応が極めてシステマチックかつ無意味であることを除けば、全てのイベントに対して正しく反応を行っています。よって、ゴーストマスタはテンプレートの必要な部分を意図する文字列に書き換えるだけで、有効なゴーストを作成することができます。それは例えば $OnBoot で「起動。」となっている部分を「起動します。」等セリフとして成立するものに変える、ということです。ゴースト作成の初期段階である「イベント一式の実装」はこの作業だけで完了します。

ゴーストのメインの動作となるランダムトークはテンプレートでは内部イベントシンボル $_OnTalk で定義されています。サンプルでは無意味な文字列が 6行定義されており、これらがランダムな間隔でランダムに発言されます。美坂において同一の状況に複数の反応を返す処理は、このように単に行を増やすだけで実現できます。これは $_OnTalk に限らず全てのイベントに言えます。例えば $OnBoot に複数の反応を持たせないなら、同じように行を増やしていけばよいわけです。

$_OnTalk シンボルとして定義されている文字列の末尾には {$ms} 等の文字列があり、これは発言されるとき $ms シンボルから文字列が拾われ、適切に置換されます。$ms というシンボルは(本来的に場所はどこでもいいのですが)ファイルの前半あたりにあり、そこには人名となる単語が複数セットされています。つまり、いわゆるどこいつレベルの「ランダムな単語を拾う」という動作を行いたい、ファイルの適当な場所で適当な名前でシンボルと単語リストを定義し、それを {$名前} として用いればよいわけです。美坂の単語辞書はこのようにして作成され、「{$ms}が笑った」のようなテンプレートを実現します。

テンプレートの単語辞書の中で、$mbou と $msmvo の定義は美坂の変数評価システムの特徴を端的に表しています。変数はあらゆる状況で、無限に、何重でもネストできます。この構造を使いこなすことで変数の定義はよりスマートで無駄のないものとなります。

次段階


ゴーストに初期段階以上のことを望む場合、単なる文字列の書き換えではなく、全体の構造を理解して動く必要が出てきます。すなわち、美坂の仕様書を参照し、テンプレートゴーストが一体何をやっているのかを正しく把握し、そして自分で考えて構文を作成しなくてはなりません。


美坂言語仕様書


テンプレートゴーストが何をしていたのかがはっきり分かれば、この段階は終了です。

最終段階


美坂には「可能な限り方言を避ける」という開発コンセプトがあり、ほとんど全てのシステムシンボルを SHIORI/2.2 で定義されたシンボルそのままの名前のまま使用し、また reference ヘッダの文字列も余計な加工をせずそのまま投げています。そのため美坂は SHIORI/2.2 について無知であると 100% のポテンシャルを発揮することができません。SHIORI/2.2 の仕様書に目を通し、どのような状況でどのようなイベントが起き、またどのような状況でどのような reference 引数がセットされるのかを理解する必要があります。これは \![raise] コマンドを使いこなすことにも繋がります。


SHIORI/2.2 仕様書


SHIORI/2.2 の構造さえ理解してしまえば SHIORI の扱いについて恐れることは何もなくなるでしょう。

対ゴーストコミュニケート


対ゴーストコミュニケートは以下の理屈で行われます。


まず、自分から話し掛ける場合は、$_OnGhostCommunicateSend をコールします。テンプレートにおけるこれらのハンドラの採用判定式は {$if ({$isghostexists(花ちゃん)})} のような論理式で記述され、この条件判定によって「存在するゴーストを探して話し掛ける」という動作を実現しています。話し掛けられる相手が見つかった場合は $to 変数に相手の名前をセットし、あとは普通にセリフを返すだけです。

自分が話し掛けられた場合は $_OnGhostCommunicateReceive をコールされます。テンプレートにおけるこれらのハンドラの採用判定式は {$if (({$sender}==花ちゃん) && ({$inlastsentence(さかな)}))} のようになっており、この条件判定によって「相手が花ちゃんでかつセリフの中に「さかな」という文字列が含まれていたらこの反応を返す」といったような動作を実現しています。これにより相手と相手のセリフに応じた適切な反応を返すことができます。


基本的な構造は以上です。反応する相手や反応内容を増加させるには、これらの条件式を増加させていけばよいわけです。

戻る