#author("2023-11-11T07:24:35+09:00","default:post","post")
コミュニケートに関すること。

----
#contents
----
~

*コミュニケートとは [#df940707]
難しく言うと、入力された文章や、送信された文章に反応を返すこと。~
よく使われるゴーストのコミュニケートは二種類ある。~

:ユーザから話しかける|ユーザが&color(red){「コミュニケートボックス」};を使ってゴーストとやり取りをするもの。~
ボックスに文章を入力して、ゴーストが反応を返す仕組みのこと。

:ゴースト同士で会話する|こちらは同時起動中の、別のゴーストとやり取りをするもの。~
まずゴーストが別のゴーストに話しかけるところから始まり、それに応答する形になって、ゴースト同士の会話が成立する感じになる。~


**ユーザがゴーストに話しかける [#b67d3425]
ユーザがゴーストに会話用の文章を送るには、コミュニケートボックスが必要。~
このボックスを開くには、さくらスクリプトを使う。~
 \![open,communicatebox]

これを、ボックスを開きたいタイミングのところに書いておけばOK。~
「ポストと狛犬」ではメニューまわりに記述があるので、参考に。~


**ゴーストが別のゴーストに話しかける [#sb7c3b1d]
画面上にゴーストを2体以上立たせて、ゴースト同士でトークをさせる方法。~
[[特殊記号>特殊記号一覧]]の→か、[[特殊変数]]の[[$Value0>特殊変数#c272196b]]を使うと、同時に起動しているゴーストに話しかける事ができる。~

 *
 →:おはようございます。

とすると、同時起動中の別のゴーストの誰かに話しかける。~
ただし、送りたいゴーストが複数いた場合でも、対象はランダムではないので注意。~
(順序の関係で、同じゴーストを対象にし続ける)~

#br

 *
 $Value0【タブ】なる
 :おはようございます。

[[$Value0>特殊変数#c272196b]]を使うと、隣で起動している\0名を指名してゴーストに話しかける。~
いない場合はどうもならない。~
この場合は\0名「なる」に話しかける。~


**話しかけられた時の反応 [#e0b6a0dc]
話しかける時と異なり、話しかけられた場合の処理は共通していて、状況によって下のものが呼び出される。~

 *ユーザ「 
 *ゴースト名「 
 *「 
 *COMMUNICATE該当なし

上から順に、
-「ユーザから入力されたもの」
-「ゴーストの\0名から送信されたもの」
-「どっちも用」
-「どれにも該当しなかった用」

これに、反応したい文章を後ろに書く。~

 *ユーザ「 おはよう
 :おはようございます。
 
 *ポスト「 こんにちは
 :あなたもポストですか。
 
 *COMMUNICATE該当なし
 :ごめん聞き取れなかった。

という感じ。~


*テクニック [#zef25a10]

**参考リンク [#e6c373d8]
-[[王道コミュワード集>http://emily.shillest.net/specwiki/index.php?%E7%8E%8B%E9%81%93%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%AF%E3%83%BC%E3%83%89%E9%9B%86]]~
-[[王道コミュワード集>https://emily.shillest.net/specwiki/index.php?%E7%8E%8B%E9%81%93%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%AF%E3%83%BC%E3%83%89%E9%9B%86]]~
ユーザとコミュニケートを作るとき、どんな文章に反応するものを作ればいいのか悩んだ時に。~
かなりの数があるので、最初から全部作ろうとするとものすごい大変。まずは作りやすいものから手を出そう。~

#br
-[[台本コミュニケート仕様書>https://www34.atwiki.jp/ua-ks/pages/59.html]]~
ゴースト同士の会話を、片方のゴーストの辞書で全て作れるようにするため?に提唱された仕様。~
話しかける相手がその後のトークまで全部作って、相手方に喋らせる感じ。~
これをやるには、受け取る側にこの仕様に対応する共通の呪文が必要。詳しくはリンク先。~

#br
-[[レゴキチ/里々まとめ内コミュニケートについて:http://emily.shillest.net/specwiki/index.php?%E3%83%AC%E3%82%B4%E3%82%AD%E3%83%81%2F%E9%87%8C%E3%80%85%E3%81%BE%E3%81%A8%E3%82%81#q9894b10]]~
-[[「浮子屋本舗」里々MC139-3でのコミュニケートの処理仕様の詳細:http://d.hatena.ne.jp/ukiya/20080119/1200772181#seemore]]~
-[[レゴキチ/里々まとめ内コミュニケートについて>https://emily.shillest.net/specwiki/index.php?%E3%83%AC%E3%82%B4%E3%82%AD%E3%83%81%2F%E9%87%8C%E3%80%85%E3%81%BE%E3%81%A8%E3%82%81#q9894b10]]~
-[[「浮子屋本舗」里々MC139-3でのコミュニケートの処理仕様の詳細>https://ukiya.hatenadiary.org/entry/20080119/1200772181#seemore]]~
≫によるあいまい検索についてなど。

#br
-[[UKADOC Project SHIORI Event - OnCommunicate>http://ssp.shillest.net/ukadoc/manual/list_shiori_event.html#OnCommunicate]]~
-[[UKADOC Project SHIORI Event - OnCommunicate>https://ssp.shillest.net/ukadoc/manual/list_shiori_event.html#OnCommunicate]]~
後述するOnCommunicateの仕様。


**拡張 [#k8523155]
[[情報取得変数の他ゴーストとの連携>情報取得変数#if079c3d]]には、起動しているゴーストの数や、そのサーフェスを調べる事が可能。~
相手の表情に応じて話しかける内容を変えたり、\1側のゴーストの違いにより話しかける内容を変えたりする、といったテクニックが考えられる。~

話しかけたいゴーストが決まっている場合、そのゴーストが起動しているか確認するには、[[(○○の存在)>情報取得変数#if079c3d]]を使おう。~
これでポストが同時に起動していれば「*ポストと会話」へジャンプする。~
 *
 >ポストと会話【タブ】(ポストの存在)

下記の例では千郷に話しかける時に、1)墓の状態か?2)\1が魚匠か?3)それ以外(千柚、千尋、魚匠人型)か?を判断して話しかける内容を変えている。~
 *千郷と会話
 >墓石と会話【タブ】(千郷のサーフェス)==40
 >千郷と魚匠と会話【タブ】(魚匠のサーフェス)<=11
 →:こんにちは。
 
 *墓石と会話
 →:……お墓……
 
 *千郷と魚匠と会話
 →:人面魚ッ!


**入力したトークにジャンプ [#s0107af5]
デバッグとかに使える……といいなぁ。

 *ジャンプ
 :文字を入れると、そのトークにジャンプするよ♪
 \![open,inputbox,入力式ジャンプ先]
 
 *入力式ジャンプ先を教えてもらった
 >入力式ジャンプ先が空だった	!(変数「入力式ジャンプ先」の存在)
 >(入力式ジャンプ先)
 $入力式ジャンプ先	
 
 *入力式ジャンプ先が空だった
 :なんか書いてよぉ。


*仕様的なこと [#c08e1302]
里々では、だいたい以下の感じを「何の設定がなくとも」する。~
手を加えたい場合は、これを元に改造するといいかも?~
なお、*OnCommunicateを設定すると、里々が自動で行うコミュニケート動作は停止する。~

 *OnCommunicate
 ≫ユーザ「 (R1)【タブ】(compare,(R0),user)
 ≫(R0)「 (R1)
 ≫「 (R1)
 >COMMUNICATE該当なし

より厳密にバグが起こる可能性を潰しておきたいなら、compare関数からequal関数に変えたり、区切り文字をバイト値にしたり。~
処理を噛ませる場合にも使える。各自研究して。~


**反応が選ばれる仕組み [#c6cb5792]
里々は、コミュニケートの文章の一致率が一番高いものを自動で選びます。~
一致率が一緒の物が複数あった場合、ランダムに選択されます。~

計算式は、

 単語が1つ一致したらプラス10点。
 さらに、一致した単語の長さ(半角計算)÷4を加点。
 一致しない単語が1つあればマイナス1点。

で判定されます。~
5点以上のトークが存在しなければ、「*COMMUNICATE該当なし」の中から一つ選んで読みます。~

 *
 :おやつは何がいいですか?
 \![open,communicatebox]
 
 *ユーザ「 ケーキ
 :イチゴショートがありますよ!
 
 *COMMUNICATE該当なし
 :困りましたねぇ・・・。

ユーザが「ケーキ」と入力した場合、完全一致で10点+6÷4点獲得します。 

 *ユーザ「 ケーキ アイス
 :アイスケーキがありますよ!

の場合、「ケーキ」にも「アイス」にも答えてくれますが、いずれか一方は一致しないので、10点+6÷4点-1点になります。~
点数については、「れしば」で確認する事ができます。

**もうひとつの一致率計算方法 [#se691536]
里々 Mc154-1からこの機能を使うことができます。
特殊変数「コミュニケートの検索方法」に「合計文字数」を設定すると、もうひとつの計算方法でコミュニケートの計算が行われます。
 $コミュニケートの検索方法=合計文字数
デフォルトの状態は「里々」で、これを設定するともとに戻すことができます。
 $コミュニケートの検索方法=里々
この「合計文字数」計算方法は、
 一致した単語の長さ(半角計算)×10
というごく単純なものです。
「里々」の計算方法だとコミュニケートの単語にたくさんの言葉を並べた場合、ヒットしなくなってしまうことがあります。
 *ユーザ「 かわいい 可愛い きれい 綺麗 うつくしい 美しい すてき 素敵 可憐
 :えへへ。ありがと。
このようにたくさんの表現と表記を候補にした場合に「かわいい」と入力した時、
 「かわいい」一致で 10点
 文字の長さ(半角)で8÷4で 2点
 一致しない単語が8つで -8点
 合計 4点
基準の5点未満になったため「COMMUNICATE該当なし」となってしまいます。
しかし、この「合計文字数」の検索方法を使うと、
 文字の長さ×10点で 80点
 合計 80点 
ヒットしました。このようにたくさんの候補を並べた場合でも正しくヒットさせることができます。
考え方もごく単純なので扱いやすいかもしれません。

**and/if検索 [#oe309376]

上記の方法より確実に対応させる事ができる。SAORIssu.dll使用。~
出典:http://kenoglasses.nobody.jp/>絵板 ~
出典:https://kenoglasses.nobody.jp/>絵板 ~

-and検索 

入力文中のどこかに「アイス」「チョコ」「ケーキ」が入っていれば「アイスチョコケーキ」に飛ぶ(順番は問わない)。 

 *
 :おやつは何がいいですか?
 \![open,communicatebox]
 
 *ユーザ「 ケーキ
 >アイスチョコケーキ【タブ】(count,(R1),アイス)&&(count,(R1),チョコ)
 
 *アイスチョコケーキ
 :アイスチョコケーキがありますよ!

-if検索 

表記ゆれ対策。~
入力文中のどこかに「イチゴ」と「ケーキ」、又は「いちご」と「ケーキ」、又は「苺」と「ケーキ」が入っていれば「イチゴケーキ」に飛ぶ(順番は問わない)。 

 *
 :おやつは何がいいですか?
 \![open,communicatebox]
 
 *ユーザ「 ケーキ
 >イチゴケーキ【タブ】(
 count,(R1),イチゴ)||(count,(R1),いちご)||(count,(R1),苺)
 
 *イチゴケーキ
 :イチゴケーキがありますよ!

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