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




基本構造

例えば起動時に実行させる場合、以下のようなモデルが考えられます。

*OnBoot
>一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
>起動

*一度しか言わないトーク
$一度のみフラグ【タブ】見た
:きみのためならしねる。

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

イベントによるトークの中断を防ぐには

ゴーストが喋っている間にも、新たにベースウェアからイベントが通知されれば、多くの場合はそちらが優先されてしまい、トークの最中にも関わらず中断してしまいます。特に、

  • ダブルクリック反応(つつかれ)、ホイールクリック反応(ころくり)等
  • シェルやバルーンの変更後イベント
  • SAORI関連の通知
  • 切替指示、終了指示

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

中断を防ぐ方法

最も簡単な方法は、さくらスクリプトの「タイムクリティカルセクション」「選択肢タイムアウト抑制」の二つを状況に応じて併用する事です。

タイムクリティカルセクション
スクリプトブレークか\eまでの間、マウス系などのイベント通知を行わない。
\t
選択肢タイムアウト抑制
これが記述されたスクリプトでは、選択肢はタイムアウトされない。
\*

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

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

中断に対する保険

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

*OnBoot
>一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
>起動

*一度しか言わないトーク
:\tきみのためならしねる。
:ちなみにこれの元ネタは
〜
$一度のみフラグ【タブ】見た

上記例はフラグが立っていなければ分岐、その先のトークを見る事でフラグを立て、以後はそのセクションに飛ばなくなる構造となっています。
しかし、これを喋っている最中にもし終了指示がされた場合、喋っているのを中断されたにも関わらずフラグが立ってしまいます*2。これを防ぐには、トークの終了と同期したタイミングで変数処理を行うなどの保険を仕込むと良いでしょう。

*OnBoot
>一度しか言わないトーク【タブ】(変数「一度のみフラグ」の存在)==0
>起動

*一度しか言わないトーク
:\tきみのためならしねる。
:ちなみにこれの元ネタは
〜
\![raise,一度しか言わないトーク完了]

*一度しか言わないトーク完了
$一度のみフラグ【タブ】見た

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

入力ボックス・コミュニケート対策

コミュニケートを始めとするinputbox系は\tを無視するイベントを発信します。
名前入力やコミュニケートが開きっぱなしになっていた場合を想定し、該当する入力ボックスを予め閉じるさくらスクリプトの使用で対策します。

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

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

長文を無駄なく見せるには

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

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

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

関連項目


*1 ゴーストの終了自体は可能です。\tのトーク再生中に終了指示がなされた場合、notifyとして終了時のスクリプトが再生されず終了となります。
*2 変数処理はこのトークが選ばれた時点で(全部喋ったかどうかに関わらず)実行されます。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-28 (水) 05:12:30 (206d)