そもそもの話

そもそもSHIORIを使ってゴーストを書くというのはどういうことか、
ちょっと簡単に書いてみます。
ゴーストを作っている方ならいまさら、だと思いますが、
ちょっと探した感じではMateriaの資料以外、あまり解説が見当たらなかったので。


全ては次のような流れにそって動いてる単純なシクミなのです。


まず、1秒時間が経過したり、メニューを表示したり、
ユーザがマウスで触ったり、他のゴーストから話しかけられたり、
とにかく「何か」が起きた時に、本体からSHIORIに次のような文字列が渡されます。
ここでは、Handが伏儀さんから話しかけられた場合を例にとってみます。

GET SHIORI/3.0
ID: OnCommunicate
Charset: Shift_JIS
Age: 0
SecurityLevel: local
Reference0: 伏儀
Reference1: \1\s[10]\0\s[3]ひょっとしてどなたか目に見えない方が(後略)


ここで ID とあるのは、「何が起きたか」を示しており、「イベント」と呼ばれています。
Reference0とか1とかいうのは、そのIDに応じた追加の情報を示しています。
ここでは ID が OnCommunicate なので、Ref.0 には話しかけてきたゴースト名が、
Ref.1 には話しかけてきた台詞が入っていますが、ID が違えば入っている情報も違います。


さて、SHIORIにできるのは、この文字列に対して、同じような
フォーマットの文字列を返すことだけ、です。
多くのSHIORIは、SHIORIの辞書を書く人が楽できるように、与えられた文字列を
分解して変数に格納してくれたり、トークを書けば後の部分は自動で組み立てて
くれたりします。


例えば里々の場合は、(R0)といった変数にReferenceの内容が入るようです。
この場合は(R0)に「伏儀」と入っているはず。


で、Handの中でごしゃごしゃと処理をして、本体に返されるのが次の文字列です。

SHIORI/3.0 200 OK
Sender: AYA
Charset: Shift_JIS
Value: \v\1\s[10]\0\s[6]んん〜?\w9\nどうした、\w5俺はここに居るぜ?
Reference0: 伏儀


この中で、Value: というのが、「そのイベントに対するSHIORIの応答」になります。
殆どの場合、この Value: というのがトークの内容になり、本体はここからさくら
スクリプトを読み取って、書かれたとおりに喋ったりします。


Ref.0は、コミュニケートをする場合だけSHIORIから本体に返されるもので、
Ref.0がコミュニケート先のゴースト名を示します。


Value: にどうやって値を入れるのか、Ref. にどうやって値を入れるのか、
というのは、SHIORI毎に異なります。
例えば里々の場合は、トーク内容が Value: に入り、Value0 という変数に
何か入れると、それが Ref.0 に入るようです。


本体は、この応答を読み取って、Handに喋らせますが、同時に、Ref.0 で伏儀さんが
指定されているので、伏儀さんの SHIORIに対して OnCommunicate を送ってくれます。


コミュの場合、こうやって連鎖していくわけですが、
コミュに限らず、ゴーストの辞書に書いたあらゆることは、全てこの
「本体からイベントを貰って応答を返す」というシクミに則って動いています。
SAORIコールは例外)


AYAが「レイヤーが薄い」と言われるのは、この「本体から貰った文字列をばらして変数
に格納したり、ゴーストの辞書から本体への応答を組み立てたり」の部分自体が、AYAスクリプト
で記述されているためで(aya_shiori3.dicがそれです)、つまりゴースト側で出来ること、
ゴースト側でやっていること、は全てゴースト辞書を書くデベロパに解放されている状態なわけです。


SSPの開発パレットで、SHIORIのログを取得できるので、見てみると面白いです。
(但しログ取得したまま立たせっぱなしにすると凄いサイズになるので注意)