起動と終了に関するTIPS。
ポストと狛犬では、概ね以下のように記述されています。
*OnFirstBoot >初回 *OnBoot >起動 *OnClose >終了 *OnGhostChanged >他のゴーストから変更 *OnGhostChanging >他のゴーストへ変更
これにより、「*初回」「*起動」「*終了」といったトークが動作するようになります。
*OnBoot :いっちばーん。
*OnFirstBoot :はじめまして。
*OnGhostChanged :(R0)さんから交代しました。
*OnGhostChanged :(R0)さんに呼び出されました。
*OnGhostChanging :(R0)さんに交代します。
*OnClose :おつかれさまでした。
そのゴーストが初めて起動した時に呼ばれる、OnFirstBootイベントに記述します。
前述したとおり、ポストと狛犬では「初回」という名前のトークにジャンプさせています。
名前を変えても構いませんし、処理を追加したりするのもいいでしょう。
*OnFirstBoot >初回 *初回 :(0)はじめましてだね。よろしく。
一度バニッシュ(アンインストール)された後、再びインストール後の初回起動では、Reference0に情報が追加されています。活用すると以下のような事もできます。
*OnFirstBoot >消され経験あり初回【タブ】(R0)>0 >初回 *消され経験あり初回 :(8)一度消したくせに、また来たの?
初回起動ではゴーストの取り扱いや状況といった基本的な説明を行うことが多いでしょう。
しかし、初回起動といえども扱いは普通のトークと同じです。
そのままではマウス反応などの新たなイベントで上書きされてしまう状態のため、誤操作で本体をクリックしてしまったり、SSPを終了させてしまった場合、説明を十分にできないまま次の段階へ進んでしまうといったことが有り得ます。
OnFirstBootは、一度でも起動したら、以後アンインストールするまで二度と発生しないためです。
初回起動でユーザーの名前まで覚えさせるゴーストも多いですから、それもスキップされてしまいます。
*OnFirstBoot >初回 *OnBoot >初回【タブ】(変数「初回イベントを完遂」の存在) >起動 *初回 :\t(0)はじめまして。 ... #中略 ... では(ユーザ名)さん、よろしくお願いします。\x \![raise,初回イベント完了] *初回イベント完了 $初回イベントを完遂【タブ】1
この例では「初回」トークを再生中にはマウス反応が起こらず、
また、このトークが終わる前にSSPを終了した場合、次に起動した時も「初回」トークが流れます。
ポイントはトークごとにさくらスクリプトの \t を追加しておくこと。
このスクリプトを冒頭で宣言しておくだけで、そのトークが流れている間はマウス反応などが起こらなくなります。
そして最後に \x \![raise,イベント名] を使うことで、イベントが終わったタイミングでフラグを立てます。
(\xはバルーンをクリックするまで一時停止、\![raise]は実行したタイミングで新たなイベントを上書き発生させます。)
上の例は中途半端に終了したとき「さっきのはなかったことにしてもう一度初回トーク」という挙動です。
そこでさらに発展させて、初回の最中に終了された時に専用のトークを使ってフォローをする方法も紹介。
OnBootに少し手を加え、新たに中断された時のためのトークを追加します。
*OnFirstBoot >初回 *OnBoot >初回に中断された【タブ】(変数「初回イベントを完遂」の存在)==0 >起動
*初回に中断された :\tちょっとー。まだ説明が終わってないんですけど! まあいいや、もう一度説明するよ? ... #中略 ... では(ユーザ名)さん、よろしくお願いします。\x \![raise,初回イベント完了]
こうすると、「OnFirstBootは経験済みだけど初回イベントが完了していない」時の処理になります。
*OnBoot >起動 *起動 >深夜に起動【タブ】(現在時)<4 >早朝に起動【タブ】(現在時)<6 >朝に起動【タブ】(現在時)<10 >昼に起動【タブ】(現在時)<16 >夕方に起動【タブ】(現在時)<18 >夜に起動【タブ】(現在時)<23 >深夜に起動 *深夜に起動 :夜中だよ・・・ *早朝に起動 :ずいぶん早起きだね・・・ *朝に起動 :おはよー *昼に起動 :こんちはー *夕方に起動 :ちわーっス *夜に起動 :こんばんわー
こんな感じで記述を。
時間帯の区切りを変えたり細かくしたりいろいろできます。
同じように、終了トークも時間帯によって変えられます。
頻繁に使うのであれば、
@時間帯 (iflist、(現在時)<、4、深夜、6、早朝、10、朝、 16、昼、18、夕方、23、夜、深夜)
の二行を追加した上で、
*起動 >(時間帯)に起動
とすると、それぞれの時間帯に飛ぶので楽です。
*起動 >休日の場合【タブ】(現在曜日)==土||(現在曜日)==日 >午前中に起動【タブ】(現在時)<12 >午後に起動 *休日の場合 >休日の午前中【タブ】(現在時)<12 :きょうは休日です。 *休日の午前中 :やすみの日くらいゆっくり寝かせてたもれ。
*OnBoot $第○週=(when,(現在日)%7,(現在日)÷7+1,(現在日)÷7) $第○何曜日 第(第○週)(現在曜日)曜日 >(現在月)月(第○何曜日) >起動 *1月第2月曜日 :今日は成人の日です。 *5月第2日曜日 :今日は母の日です。 *7月第3月曜日 :今日は海の日です。
上記のように記述をすると、何月の第○何曜日にイベントを起こすことができます。 また、
*OnBoot (第○週取得) $第○何曜日 第(第○週)(現在曜日)曜日 >起動 *1月第2月曜日 :今日は成人の日です。 *5月第2日曜日 :今日は母の日です。 *7月第3月曜日 :今日は海の日です。 @第○週取得 (when,(現在日)%7,(set,第○週,(現在日)÷7+1),(set,第○週,(現在日)÷7))
のように記述することもできます。
ただし、このときには第○週の数値が半角になるので注意が必要です。
正常に動くかどうか確かめたい時はPC内蔵時計の時刻を変更しましょう。
正確な日数を算出できます。「○○日ぶりですね」といったトークも可能。
@ユリウス日 (calc, 365*(ユリウス日要素)+(ユリウス日要素)/4 +3059*((if,(A1)>2,-2,10)+(A1))/100 +(ユリウス日要素)/400 -(ユリウス日要素)/100 +(A2)+1721089) @ユリウス日要素 ((A0)-(if,(A1)>2,0,1))
*起動 $終了日からの経過日数=(call,ユリウス日,(現在年),(現在月),(現在日))-(終了ユリウス日) >一年以上経ってから起動【タブ】(終了日からの経過日数)>=365 >一月以上経ってから起動【タブ】(終了日からの経過日数)>=30 :こんにちは。 *一月以上経ってから起動 :こんにちは、お久しぶりです。 *一年以上経ってから起動 :お久しぶりです。私の事覚えてます? *OnSatoriClose $終了ユリウス日【タブ】(call,ユリウス日,(現在年),(現在月),(現在日))
#satori_conf.txtに存在する「*初期化」に1行追加 *初期化 $終了ユリウス日【タブ】(call,ユリウス日,(現在年),(現在月),(現在日))
この(ユリウス日)は24倍後に(現在時)を足す事で時間を、さらに60倍+(現在分)としていく事で最大秒単位まで経過時間を算出する事ができます。
ただし、ユリウス日は元の数値が大きいため、分以上に細かい単位を得ようとすると計算がオーバーフローします。防ぐには適宜2450000くらいをあらかじめ引くなどが有効です。
ユリウス日同様、正確な日数を算出出来ます。
ユリウス日は「秒」の差まで計算出来ますが、こちらは「日」の差しか計算できません。
@グレゴリオ暦での経過日数 (calc, 365*(A0)+(A0)/4-(A0)/100+(A0)/400 +306*(calc,(A1)+1)/10+(A2)-428)
*OnSatoriLoad $終了日からの経過日数=(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))-(終了日)
*起動 >一年以上経ってから起動【タブ】(終了日からの経過日数)>=365 >一月以上経ってから起動【タブ】(終了日からの経過日数)>=30 :こんにちは。
*OnSatoriClose $終了日=(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))
#satori_conf.txtに存在する「*初期化」に1行追加 *初期化 $終了日=(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))
SAORIを使う方はこちら。
「time_check.dll」というSAORIを使います。(入手先 → 梨野)
あらかじめ「saori」フォルダにtime_check.dllを入れ、satori_conf.txtの「@SAORI」項目に
time_check,saori/time_check.dll
の一行を追加しておいてください。
*起動 $終了から経過日数=(time_check、how_many_days、(終了年)、(終了月)、(終了日))*-1 >一年以上経ってから起動【タブ】(終了から経過日数)>=365 >一月以上経ってから起動【タブ】(終了から経過日数)>=30 :こんにちは。 *一月以上経ってから起動 :こんにちは。 (終了日からの経過日数)日ぶりですね。 *一年以上経ってから起動 $終了日からの経過年数=(終了日からの経過日数)/365 :(終了日からの経過年数)年ぶりですね。 私の事覚えてます? *OnSatoriClose $終了年【タブ】(現在年) $終了月【タブ】(現在月) $終了日【タブ】(現在日)
現在日から過去の日に向かって数えているためhow_many_daysで取得される数値の先頭に「-」が付いています。
「*」は掛け算、「/」は割り算。
「術師の隠れ里」さんの ユリウス日の計算スクリプト (ssu.dllのcalc使用)を使用しても同じ事ができます。
正月やバレンタインなど様々な行事に対応した起動イベントがありますが、そういうトークは1回で十分!って人向け。2回目以降は通常起動、又は通常交代します。
*OnBoot >(現在月)月(現在日)日【タブ】(現在年)(現在月)(現在日)!=(イベント年月日) >起動 *OnGhostChanged >(現在月)月(現在日)日【タブ】(現在年)(現在月)(現在日)!=(イベント年月日) >他のゴーストから変更 *起動 :こんにちは。 *他のゴーストから変更 :おつかれさまでした。 :あとは任せな。 *4月1日 $イベント年月日【タブ】(現在年)(現在月)(現在日) :うそつきました。
来年になってもちゃんと起動イベントトークします。
起動/終了方法のうち、里々独自の起動/終了イベントです。
里々独自内部イベントで、
栞としての起動処理(セーブデータ読み込みetc)が終わった直後、里々自身が呼びます。
OnBoot/OnGhostChangedより先、起動時には必ず呼ばれますので、OnBoot/OnGhostChangedで同じ初期化が必要な場合、そちらで行わずにOnSatoriBootで行えば一箇所でできてしまうわけです。追加修正も一元管理できるので便利です。
※SSPでキャッシュが発生した場合など、必ずしも呼ばれるとは限りません。一元管理する場合は下記の起動・終了・呼出・交代時に発生するイベントまとめ(SSP調べ)を参照し、漏れがないように充分注意して下さい。
OnSatoriBoot中でトークが書かれた場合、里々はいったんそれを保存しておいて、OnBoot/OnGhostChangedが呼ばれた時、OnBoot/OnGhostChangedを呼ばずに、保存しておいたトークを優先します。
以下の例では、好感度を0にセットし、OnBoot/OnGhostChangedを無視して「こんにちは。」をトークします。
*OnSatoriBoot $好感度=0 :こんにちは。
easyballoonのorusubanなどでは、こちらを使うと便利です。
*OnSatoriBoot (bln,change,ただいま起動中です。)
ロード直後に呼ばれます。
OnSatoriBootとの違いは、ここで何かを返しても一切使用されないという事です。
ここでトークを入力しても、OnBoot/OnGhostChangedのトークは潰されません。
(追記)起動時以外に呼ばれることもあります。
OnSatoriBootと対になるイベントです。
OnSatoriClose中でトークが書かれた場合、里々はいったんそれを保存しておいて、OnClose/OnGhostChangingが呼ばれた時、OnClose/OnGhostChangingを呼ばずに、保存しておいたトークを優先します。
栞としての最終処理の直前、里々自身がコールします。 ここでトークを返しても使われることはありません。
各イベント詳細はリファレンスサイトや当ページ参考にして下さい。
SSPには起動中にゴーストキャッシュという機能が働いており、SSPを終了するまで個別のゴーストの一時データを破棄せずに保管しています。
このゴーストキャッシュが使われた時は通常起動時とイベント発生パターンが異なるので、フェーズ1のイベントを使用する場合注意が必要です。(特に前回終了状況に対して対応トークを正確に行おうとする場合や、終了時間を扱うような場合)
起動指示 ↓ | |||
(キャッシュ有) | (キャッシュ無) | ||
OnCacheRestore | OnSatoriLoad | ||
↓ | |||
OnSatoriBoot | |||
↓ | |||
OnInitialize | |||
↓ | |||
(通常起動) | (初回起動) | (呼出) | (交替) |
OnBoot | OnFirstBoot※1 | OnGhostCalled※1 | OnGhostChanged※1 |
※1記述がない場合はOnBootが呼ばれる
終了指示 ↓ | |||
(\-を実行して終了) | (SSPも同時に終了) | (ゴーストのみ終了) | (ゴースト交替) |
OnCacheSuspend※2 | OnCloseAll | OnSatoriClose | OnSatoriClose |
↓ | ↓ | ↓ | |
OnSatoriClose | OnClose | OnGhostChanging | |
↓ | ↓ | ↓ | |
OnClose | OnCacheSuspend※2 | OnCacheSuspend※2※3 | |
↓ | |||
(SSPも同時に終了) | (ゴーストのみ終了/交替) | ||
OnDestroy | なし | ||
↓ | |||
OnSatoriUnload |
※2ゴーストキャッシュが有効な場合のみ
※3自分自身に交替した場合は発生しない
OnGhostCalling → OnGhostCallComplete
初回起動時には、\0側のキャラクターは右、\1側のキャラクターは左に表示されます。
しかし、シェルの向きの関係などで、左側にメインキャラクターを持っていきたい時もあるでしょう。
他にも、デフォルトを始めとした多くのバルーンは\0側が大きく\1側が小さい、右クリックメニューは\0側に設定を始めとした多くの項目がある等、それぞれの差異から初期位置の入れ替えをしたいケースがあると思います。
そんな時は、さくらスクリプトのmoveを使ってみましょう。
\![move,座標X,座標Y,移動にかかる時間ms,目標物,目標物オプション...]
タグの簡単な説明はこうなります。
単純に初期位置を入れ替えたいだけなら以下のようにすればOK。
*OnFirstBoot \0\![move,-200,0,0,screen,right,bottom]\1\![move,-650,0,0,screen,right,bottom] >初回
上のさくらスクリプトを簡単に説明すると、
という意味になります。
数値は大雑把なので、テストは納得いくまで行って下さい。
SSPのプロパティシステムを使うと、\0と\1の初期位置を完全に入れ替えることもできます。
ただし、ディスプレイの情報は環境依存(=個人個人で設定が固有)のため、あるユーザのところでだけ動かないなどが起こりえます。
ある程度さくらスクリプトを理解している方向け。
*OnFirstBoot \![get,property,OnChangePosition,currentghost.scope(0).x,currentghost.scope(0).y,φ currentghost.scope(1).x,currentghost.scope(1).y]
*OnChangePosition \0\![move,(R2),(R3),0,primaryscreen,left.top,center.bottom]φ \1\![move,(R0),(R1),0,primaryscreen,left.top,center.bottom]φ (初回)