台本トーク(仮)に戻る
台本は、OnCommunicateイベントを使って各ゴーストに送信される。台本コミュニケートかどうかの判別は、次の手順で行う。
OnCommunicateイベント例:
GET SHIORI/3.0 Sender: crow ID: OnCommunicate Reference0: きぃ Reference1: \0\s[0]こんにちは。\e Reference2: ECHO/1.0 Reference3: \0\s[0]きぃちゃん、\w8こんにちは。\e SecurityLevel: local Charset: Shift_JIS
Reference2の内容が「ECHO/1.0」である場合、このOnCommunicateイベントは、台本コミュニケートによる台本送信である。Reference3は台本である。台本送信だった場合、台本コミュニケート対応ゴーストは、Reference3の内容をそのまま発話すべきである。(*1)この発話の際、Reference0に示されるゴーストを、応答Reference0に設定しなければならない。
応答例:
SHIORI/3.0 200 OK Charset: Shift_JIS Sender: ポスト Value: \0\s[0]きぃちゃん、\w8こんにちは。\e Reference0: きぃ
台本は、ゴースト間コミュニケートを使って送信する。台本コミュニケートを行う場合、次のように設定する。台本コミュニケートを行う場合、応答Reference1を「ECHO/1.0」と設定しなければならない。同時に、応答Reference2に台本の内容を設定しなければならない。
ゴースト間コミュニケート設定例:
SHIORI/3.0 200 OK Charset: Shift_JIS Sender: ポスト Value: \0\s[0]無機物っていいよね。\e Reference0: きぃ Reference1: ECHO/1.0 Reference2: \0\s[4]\1\s[10]俺に聞かれてもなー。\e
3体以上のゴーストが関係する台本トークの場合、各ゴーストへの台本送信順序管理・タイミング管理は複雑になる。そこで、さくらスクリプトを拡張し、一行で複数のゴーストのトークを記述する方法を、補助仕様として定義する。
使用例:
\0\s[0]餃\![ghost,きぃ]\0\s[0]子\![ghost]\0\s[0]の \![ghost,きぃ]\0\s[0]王\![ghost,ポスト]\0\s[5]蟲\![ghost]\0\s[4]\![ghost,きぃ]\0\s[4]\e 注: 便宜上2行に分けているが、本来はこれが1行である。
@台本コミュ識別子 ECHO/1.0 *COMMUNICATE該当なし >台本コミュニケート受信 【タブ】 (compare,(R2),(台本コミュ識別子)) >COMMUNICATE該当なし通常 *台本コミュニケート受信 $Value0 【タブ】 (R0) (R3)
#きぃへの台本コミュニケート *台本トーク $Value0 【タブ】 きぃ $Value1 【タブ】 (台本コミュ識別子) $Value2 【タブ】 (きぃ台本その1) :無機物っていいよね。 *きぃ台本その1 :(4) :(10)俺に聞かれてもなー。
*台本トーク $Value0 【タブ】 テスト $Value1 【タブ】 (台本コミュ識別子) $Value2 【タブ】 (テスト台本1) :これってアレだよね。 :またそういう危険なことを…。 *テスト台本1 :「アレ」って何だろう……。 :それは国家機密だ。消されたくなければ忘れろ。 :(4)……国家機密? :国家機密。 *テスト「 それは国家機密だ。 $Value0 【タブ】 テスト $Value1 【タブ】 (台本コミュ識別子) $Value2 【タブ】 (テスト台本2) :なんか勝手にえらいことになってる~ :……マテ。お前、知らずに言っていたのか? :ちょっと待って!本当なの!? *テスト台本2 :いつの間にあなた達、国家機密なんか知ったのよ? :お互いの製造元だからな。 :(4)……製造元? :製造元。 *テスト「 お互いの製造元だからな。 :人が作ったものだったんだ……。 私はてっきり、その辺から生えてきたんだとばかり。 :ちょっと待てコラ。
OnCommunicate
{
if reference2 == "ECHO/1.0"
{
if "\![vanishbymyself]" !_in_ reference3
{
//---拡張コミュニケート(受信)
res_reference0 = reference0
reference3
}
}
else
{
if reference0 == "user" || reference0 == "User"
{
//---- ユーザーからの話しかけ
ReplyToUser
}
else
{
//---- ゴーストからの話しかけ
ReplyToGhost
}
}
}
ScriptTalk
{
res_reference0 = "きぃ"
res_reference1 = "ECHO/1.0"
res_reference2 = KeyScriptNo1
"\0\s[0]無機物っていいよね。\e"
}
KeyScriptNo1
{
"\0\s[4]\1\s[10]俺に聞かれてもなー。\e"
}
台本コミュ識別子 : "ECHO/1.0"
event.OnCommunicate : $(
# 話し掛けてきた相手とメッセージをユーザに提示
.setstr Sender $(SReference 0);
.setstr Message $(Reference 1);
# デフォルトでは話し掛けてきた相手に自動的に返事
SendTo ${Sender};
# コミュニケートツリーから該当するトークを検索
.setstr @aistr $(
if $[ $(SReference 2) == ${台本コミュ識別子} ] $(
# 台本コミュニケートだった
.setstr EchoMessage $(SReference 3);
.setstr @null $(.get $(EntryName "TalkCommEcho"));
.pop EchoMessage;
) else $(
# 通常コミュニケートだった
CommTalk "TalkComm" $(StringNormalize ${Sender}) ${Message};
);
);
if $[ $(length ${@aistr}) != 0 ] $(
# 該当トークがあった
resetTalkcount;
.setstr kp.internaltalkflag 1;
.entry @aistr;
) else $(
# 該当無し
StopCommunicate;
#話さないならフラグは消す
.clear kp.internaltalkflag;
);
.clear Sender;
.clear Message;
)
# きぃへの台本コミュニケート
sentence : \0\s[0]無機物っていいよね。\e$(
SendTo きぃ;
setstr System.Response.Reference1 ${台本コミュ識別子};
setstr System.Response.Reference2 ${きぃ台本その1};
)
きぃ台本その1 : \0\s[4]\1\s[10]俺に聞かれてもなー。\e
3体以上のゴーストが関係する台本トークの場合、各ゴーストへの台本送信順序管理・タイミング管理は複雑になる。そこで、前述の管理機構をアプリゴーストとして独立させたのが、ゴースト「Director」である。\![ghost]タグを含むさくらスクリプトを、本ゴーストに「台本コミュニケートの台本」として送信すると、自動的に該当ゴーストへ適切な順序・タイミングで台本を送信する。複雑な台本を、あたかも通常のさくらスクリプトと同じ程度のコストで記述できるメリットがある。
sentence : \0\b[-1]\e$(
SendTo Director;
setstr System.Response.Reference1 "ECHO/1.0";
setstr System.Response.Reference2 (
\![ghost,きぃ]\0\s[0]きぃです。
\![ghost,テスト]\0\s[0]テストです。
\![ghost,ポスト]\0\s[0]三波春男でございます。
\![ghost,きぃ]\0\s[4]
\![ghost,テスト]\0\s[4]
\e
);
)
*1 Reference3の内容、キーワード、使用タグが受信したゴーストにとって不利益な場合、Reference3の内容を加工して発話すること、或いは発話しないことは許される。