ここでの重要なトークとは端的に言えば「一度しか流れないトーク」を指します。~
例を挙げると、初回起動トークや進行フラグを使う際のトーク、又はユーザに読ませたい重要な情報や、進行上どうしても伝えておかなければならない事を喋らせるトークです。~

----
#contents
----
~
*基本構造 [#b0b17ec0]
例えば起動時に実行させる場合、以下のようなモデルが考えられます。

 *OnBoot
 >一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
 >起動
 
 *一度しか言わないトーク
 $一度のみフラグ【タブ】見た
 :きみのためならしねる。

フラグが立っていない場合は分岐し、そうでなければ「起動」へジャンプします。~
これにさらに好感度の制約を課したり、&color(#0000ff){&&(乱数0〜4)>1};といった乱数を加えたりして条件を付けるのが一般的でしょうか。~

*イベントによるトークの中断を防ぐには [#l8ec0cd2]
ゴーストが喋っている間にも、新たにベースウェアからイベントが通知されれば、多くの場合はそちらが優先されてしまい、トークの最中にも関わらず中断してしまいます。特に、
-ダブルクリック反応(つつかれ)、ホイールクリック反応(ころくり)等
-シェルやバルーンの変更後イベント
-SAORI関連の通知
-切替指示、終了指示

といったものが行われると、折角の重要なトークが読まれずに終わってしまいます。~
これにより、シナリオやルールといったユーザに伝えるべき大事な情報を伝えないままフラグが進行してしまったり、最悪の場合はフラグ管理が進まず、その後も含めて意図通りに動かなくなる可能性もあります。~
これにより、シナリオやルールといったユーザに伝えるべき大事な情報を伝えないままフラグが進行してしまったり、最悪の場合はフラグ管理が進まず予定の進行がなされない、といった弊害が起こってしまう可能性もあります。~
ここでは、それらを防ぐ二通りの工夫(予防と保険)を紹介します。


**中断を防ぐ方法 [#b90ecc3e]
最も簡単な方法は、[[さくらスクリプト>http://ssp.shillest.net/ukadoc/manual/list_sakura_script.html]]の「タイムクリティカルセクション」「選択肢タイムアウト抑制」の二つを状況に応じて併用する事です。

:タイムクリティカルセクション|スクリプトブレークか\eまでの間、マウス系などのイベント通知を行わない。
 \t

:選択肢タイムアウト抑制|これが記述されたスクリプトでは、選択肢はタイムアウトされない。
 \*

どちらも「そのトーク中だけ」有効なさくらスクリプトです。~
まず&color(#ff0000){\t};は、ほぼこれで中断を抑止する事ができます。トークが終わるまでマウスイベントが起こらなくなり、終了指示以外のほとんどのイベントの割り込みが行われません((ゴーストの終了自体は可能です。\tのトーク再生中に終了指示がなされた場合、notifyとして終了時のスクリプトが再生されず終了となります。))。特に初回起動のトークには必須と言えるでしょう。~
選択肢タイムアウトを抑制する&color(#ff0000){\*};は、名前の通り選択肢の時間制限(タイムアウト)を撤廃するものです。\tだけではタイムアウトを防げないので、\*と併用する事で「選択肢を必ず選ばせたい」トークにする事ができます。
どちらもそのトーク中のみ有効なさくらスクリプトです。~
まず\tですが、ほぼこれで中断を抑止する事ができます。トークが終わるまでマウスイベントが起こらなくなり、終了指示以外の大半のイベントの割り込みが行われません((ゴーストの終了自体は可能です。\tのトーク再生中に終了指示がなされた場合、notifyとして終了時のスクリプトが再生されず終了となります。))。特に初回起動トークには必須と言えるでしょう。~
選択肢タイムアウトを抑制する\*は、名前の通り選択肢の時間制限(タイムアウト)を撤廃するものです。\tだけではタイムアウトを防げないので、\*と併用する事で「選択肢を必ず選ばせたい」トークにする事ができます。

なお、\*だけを使い\tを使わなかった場合、「タイムアウトはしないがマウスイベントは起こせる」状態になります。ゴーストの設定変更メニューで用いると良いかもしれません。
余談になりますが、\*だけを使い\tを使わなかった場合、「時間経過によるタイムアウトは起こらないがマウスイベントで中断させられる」状態になります。これは喋り反応を変えたりするような、設定変更セクションで用いると良い効果が得られるでしょう。~


**中断に対する保険 [#ia89088e]
上記の\t\*があればおおよそ十分ですが、万全を期したい場合には保険を仕込みます。~
たとえば、いかに\tといえども、ゴーストを終了させたり、スクリプトブレークなどの強制中断には無力です。~
ここでは、何らかの事情で終了させるなど「途中終了したケース」に備えたい場合のTIPSを紹介します。
上記の\t\*を使えばもう万全という訳ではありません。~
基本的に\tを使ったトークを中断される事は早々ありませんが、いかにタイムクリティカルセクションといえども、ゴーストを終了させたり、スクリプトブレークなどで強制的に中断させられた場合は効果がないからです。~
特に、何らかの事情でユーザが終了を指示して途中終了したケースに備えたい場合、更なる保険を仕込む事になります。

 *OnBoot
 >一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
 >起動
 
 *一度しか言わないトーク
 :\tきみのためならしねる。
 :ちなみにこれの元ネタは
 〜
 $一度のみフラグ【タブ】見た

上記例は、一度トークを見るとフラグが立って、以後はスルーされる構造となっています。~
しかし、もしこのトークを再生中にゴーストが終了した場合、''喋っているのを中断されたにも関わらずフラグが立ってしまいます''。変数処理はこのトークが呼ばれた時点で(全部喋ったかどうかに関わらず)既に実行されているからです。~
このケースでは、トークの終了と同期したタイミングで変数処理を行って対処します。
上記例はフラグが立っていなければ分岐、その先のトークを見る事でフラグを立て、以後はそのセクションに飛ばなくなる構造となっています。~
しかし、これを喋っている最中にもし終了指示がされた場合、喋っているのを中断されたにも関わらずフラグが立ってしまいます((変数処理はこのトークが選ばれた時点で(全部喋ったかどうかに関わらず)実行されます。))。これを防ぐには、トークの終了と同期したタイミングで変数処理を行うなどの保険を仕込むと良いでしょう。

 *OnBoot
 >一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
 >起動
 
 *一度しか言わないトーク
 :\tきみのためならしねる。
 :ちなみにこれの元ネタは
 〜
 \![raise,一度しか言わないトーク完了]
 
 *一度しか言わないトーク完了
 $一度のみフラグ【タブ】見た

このようにして、トークの末尾に[[さくらスクリプト>http://ssp.shillest.net/ukadoc/manual/list_sakura_script.html]]のraiseを使用し、全てが喋り終わった段階でもう一度イベントを発生させ、そこで変数処理を行うようにすれば、途中で中断された場合はフラグが立たず、次回に再び喋らせる事ができます。~
或いは、更に高度な判定を下すなら、トークの頭に別の変数フラグを立てておき、完了した変数フラグが同時に立っていなければ「ちゃんと説明できてなかったけれど〜」といった風に台詞を追加するのも手でしょうか。~
このようにして、トークの末尾に[[さくらスクリプト>http://ssp.shillest.net/ukadoc/manual/list_sakura_script.html]]のraiseを使用し、全てが喋り終わった段階で変数処理を行うようにすれば、途中で中断された場合はフラグが立たず次回起動時に再び喋らせる事ができます。~
或いは、更に高度な判定を下すなら、トークの頭に別の変数フラグを立てておき、完了した変数フラグが同時に立っていなければ「ちゃんと説明できてなかったけれど〜」といった風に台詞を追加するのも手でしょうか。

***sync関数を使う [#oc37e119]
関数処理で制御できる範囲なら、[[sync関数>内部関数#rcde9506]]も活用できます。~

 *OnBoot
 >一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
 >起動
 
 *一度しか言わないトーク
 :\tきみのためならしねる。
 :ちなみにこれの元ネタは

 (sync,set,一度のみフラグ,見た)

sync関数は里々が\![raise,]に変換して出力してくれるので、トークと同期して処理を行うことができるのです。~

**入力ボックス・コミュニケート対策 [#v9604111]
コミュニケートを始めとするinputbox系は\tを無視するイベントを発信します。~
名前入力やコミュニケートが開きっぱなしになっていた場合を想定し、該当する入力ボックスを予め閉じる[[さくらスクリプト>http://ssp.shillest.net/ukadoc/manual/list_sakura_script.html]]の使用で対策します。

 \![close,inputbox,__SYSTEM_ALL_INPUT__]
 \![close,communicatebox]
 \![close,teachbox]

とはいえこれらの入力対策が必要なケースは稀なので、中断対策には前述した保険だけあれば十分かもしれません。~
コミュニケートなど入力を頻繁に必要とする場合に検討してみて下さい。
とはいえこれらの入力対策が必要なケースは稀であり、コミュニケートなど入力を頻繁に必要とするのでなければさほど重要視はされません。前述した保険があればフラグ誤動作対策としては十分だと考える事もできるからです。~


*長文を無駄なく見せるには [#m4b4f627]
重要なトークを読ませたい場合、どうしても長文になりがちです。~
重要なトークを読ませたい場合、概して長文になりがちです。~
大半の場合、これらを一度に全部バルーンに収めるのは難しいでしょう。~
重要トークの[[ウェイト]]はできるだけ多めに取るのが基本ですが、最終的には読み手の感覚に左右されるため、状況に応じて[[さくらスクリプト>http://ssp.shillest.net/ukadoc/manual/list_sakura_script.html]]の \x 又は \x[noclear] を活用すると読みやすくなります。

 *注意トーク
 :\t果汁本来の成分が浮遊沈殿したり時間経過により液色
 が変化する事がありますが品質に問題はありません。
 容器が破損する場合がございますので、冷凍しないで
 下さい。日光の当たる場所での保存は避けて下さい。
 空容器は投げ捨てないようにご協力お願いします。
 \x[noclear]
 栄養成分表示φ(500mlあたりφ)
 エネルギー99kcal

この\xスクリプトは、全て読み終わる前に消えてしまうのを防ぐ目的で、長文の末尾に配しておくのも効果的です。

*自動アンカー対策 [#a0a140ab]
[[dicAnchor.txt>ファイル構成#h0e1c049]]で指定した自動アンカーは、重要トーク中でも該当単語が出ればアンカーがはられてしまいます。~
これによるアンカー選択でも強制的に中断することが出来てしまうため、重要トーク中はアンカーを無効化しておくと良いでしょう。~
現在アンカーを使っていないとしても、将来的に更新で追加する可能性を考えて、記述しておいた方が良いです。~
[[$今回は自動アンカー>特殊変数#qcde4eaf]]で、今回のトークのみ自動アンカーを無効化することが出来ます。~

 *一度しか言わないトーク
 $今回は自動アンカー=無効
 :\tトーク内容

*関連項目 [#e80bed24]
-[[ウェイト]]
-[[マーカー・文字装飾関連]]

*参考 [#t3f80124]
[[重要トークを確実に見てもらう>http://earlduant.blog.fc2.com/blog-entry-254.html]](外部リンク)


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