#contents

----
*台本コミュニケート仕様書 [#g4212d97]

**受信仕様 [#f3f41907]

台本は、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の内容をそのまま発話すべきである。((Reference3の内容、キーワード、使用タグが受信したゴーストにとって不利益な場合、Reference3の内容を加工して発話すること、或いは発話しないことは許される。))この発話の際、Reference0に示されるゴーストを、応答Reference0に設定しなければならない。

応答例:

 SHIORI/3.0 200 OK
 Charset: Shift_JIS
 Sender: ポスト
 Value: \0\s[0]きぃちゃん、\w8こんにちは。\e
 Reference0: きぃ

**送信仕様 [#l36fd368]

台本は、ゴースト間コミュニケートを使って送信する。台本コミュニケートを行う場合、次のように設定する。台本コミュニケートを行う場合、応答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

**送信補助仕様 [#y11bb723]

3体以上のゴーストが関係する台本トークの場合、各ゴーストへの台本送信順序管理・タイミング管理は複雑になる。そこで、さくらスクリプトを拡張し、一行で複数のゴーストのトークを記述する方法を、補助仕様として定義する。

***\![ghost,ゴースト名] [#j9cd0c5e]
-このタグから次の\![ghost,ゴースト名]タグまでの範囲は、「ゴースト名」で示されたゴーストのトークである。
-ここで言う「ゴースト名」は、\0側の名前を指す。
-行頭にこのタグがない場合、このタグ羅列を送信したゴースト名をAとすると、「\![ghost,A]」があると仮定して解釈する。
-行末にこのタグがない場合、最後に現れた\![ghost,ゴースト名]から行末までを範囲として解釈する。
-「\![ghost]」という略記法を解釈する。タグ羅列を送信したゴースト名をAとすると、「\![ghost,A]」と表記した場合と等価である。
-このタグの範囲内末尾に「\e」がない場合、自動的に「\e」を補完して解釈する。

使用例:
 \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行である。

*台本コミュニケート実装サンプル集 [#y2edf6f9]

**里々 [#t7102c57]

***里々における受信仕様の実装例 [#c9f6a1a9]
 @台本コミュ識別子
 ECHO/1.0
 
 
 *COMMUNICATE該当なし
 >台本コミュニケート受信 【タブ】 (compare,(R2),(台本コミュ識別子))
 >COMMUNICATE該当なし通常
 
 
 *台本コミュニケート受信
 $Value0 【タブ】 (R0)
 (R3)

***里々における送信仕様の実装例 [#e2c2ba65]
 #きぃへの台本コミュニケート
 *台本トーク
 $Value0 【タブ】 きぃ
 $Value1 【タブ】 (台本コミュ識別子)
 $Value2 【タブ】 (きぃ台本その1)
 :無機物っていいよね。
 
 
 *きぃ台本その1
 :(4)
 :(10)俺に聞かれてもなー。

***里々における現実的な送信仕様の実装例 [#d0118b05]

 *台本トーク
 $Value0 【タブ】 テスト
 $Value1 【タブ】 (台本コミュ識別子)
 $Value2 【タブ】 (テスト台本1)
 :これってアレだよね。
 :またそういう危険なことを…。
 
 
 *テスト台本1
 :「アレ」って何だろう……。
 :それは国家機密だ。消されたくなければ忘れろ。
 :(4)……国家機密?
 :国家機密。
 
 
 *テスト「 それは国家機密だ。
 $Value0 【タブ】 テスト
 $Value1 【タブ】 (台本コミュ識別子)
 $Value2 【タブ】 (テスト台本2)
 :なんか勝手にえらいことになってる~
 :……マテ。お前、知らずに言っていたのか?
 :ちょっと待って!本当なの!?
 
 
 *テスト台本2
 :いつの間にあなた達、国家機密なんか知ったのよ?
 :お互いの製造元だからな。
 :(4)……製造元?
 :製造元。
 
 
 *テスト「 お互いの製造元だからな。
 :人が作ったものだったんだ……。
 私はてっきり、その辺から生えてきたんだとばかり。
 :ちょっと待てコラ。

**文 [#nca34ec3]

***文における受信仕様の実装例 [#r766479f]
 OnCommunicate
 {
     if reference2 == "ECHO/1.0"
     {
         if "\![vanishbymyself]" !_in_ reference3
         {
             //---拡張コミュニケート(受信)
             res_reference0 = reference0
             reference3
         }
     }
     else
     {
         if reference0 == "user" || reference0 == "User"
         {
             //---- ユーザーからの話しかけ
             ReplyToUser
         }
         else
         {
             //---- ゴーストからの話しかけ
             ReplyToGhost
         }
     }
 }

***文における送信仕様の実装例 [#t89582c6]
 ScriptTalk
 {
     res_reference0 = "きぃ"
     res_reference1 = "ECHO/1.0"
     res_reference2 = KeyScriptNo1
     "\0\s[0]無機物っていいよね。\e"
 }
 
 KeyScriptNo1
 {
     "\0\s[4]\1\s[10]俺に聞かれてもなー。\e"
 }

**華和梨(OpenKEEPS) [#f2426348]

***OpenKEEPSにおける受信仕様の実装例 [#y4a4c402]
 台本コミュ識別子 : "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;
 )

***OpenKEEPSにおける送信仕様の実装例 [#w4f071ff]
 # きぃへの台本コミュニケート
 sentence : \0\s[0]無機物っていいよね。\e$(
     SendTo きぃ;
     setstr System.Response.Reference1 ${台本コミュ識別子};
     setstr System.Response.Reference2 ${きぃ台本その1};
 )
 
 きぃ台本その1 : \0\s[4]\1\s[10]俺に聞かれてもなー。\e



トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS