華和梨と栞ロードとゴーストキャッシュ†アリス「おかしいわ。おかしいわ。何だかとってもおかしいわ。」 目次†栞ロード/アンロードとゴーストキャッシュ†通常、ゴーストが起動/終了するとき、栞ロードと栞アンロードが発生します。 栞ロード時とゴーストキャッシュからの起動時での挙動の差†栞ロードが発生したとき、華和梨は「エントリの初期化」と「スクリプト記述ゾーンのKISの実行」を実施します。 どういうこと? ちょっとテスト†kawarirc.kis に以下のようにだけ書いてゴーストを起動します。 ほげ: 0 System.Callback.OnGET: $(.entry ev.${System.Request.ID}) ev.OnBoot: $(inc ほげ)\1\s[10]\0\s[0]${ほげ}\e ev.OnClose : \- ev.OnGhostChanging: \e まずはゴーストキャッシュを無効にして、このゴーストを起動します。 ところがゴーストキャッシュを有効にしてこのゴーストを起動してみると……。 最初の起動時こそ「1」と話しますが、他のゴーストに切り替えてすぐにもどしてみると「2」と喋り、もう一度やってみると「3」になりと、起動すればするほど喋る値、つまり、「ほげ」エントリの値が増えていきます。 どうしてこうなった?(AA略)†ゴーストキャッシュからゴーストが起動される時、「各エントリの前回終了時の状態の復元」が実施されるので、「ほげ」エントリは「0」で初期化するのではなく、前回終了時の「1」という状態を復元されてしまっているのです。 倍増するエントリ†次はこんな感じで。 System.Callback.OnGET: $(.entry ev.${System.Request.ID}) ev.OnBoot: $( load sav.txt; inc 起動回数; )\1\s[10]\0\s[0]起動回数:$(join 起動回数 ",")\e ev.OnClose : $(save sav.txt 起動回数)\- ev.OnGhostChanging: $(save sav.txt 起動回数)\e まずはゴーストキャッシュを無効にして、このゴーストを起動します。 ところがゴーストキャッシュを有効にすると……。 どうしてこうなった?(AA略)†ゴーストキャッシュからゴーストが起動される時、「各エントリの前回終了時の状態の復元」が実施されるのはさっき述べた通り。 もちろん、この状態でゴーストを終了すればセーブデータには「2,1」という2つの単語を持った状態でセーブされ、再びゴーストキャッシュから起動されたときに「起動回数」は「2,1」の状態が復元された上にOnBootイベントでさらにセーブデータの内容を追加され「2,1,2,1」となり、$(inc 起動回数)されるので「3,1,2,1」と倍増していくのです。 ゴーストキャッシュ対策†セーブデータのロードはスクリプト記述ゾーンで†一番簡単な対策はスクリプト記述ゾーンにセーブデータのロード処理を書いてしまうこと。 これはこんな感じ。 =kis load sav.txt; =end System.Callback.OnGET: $(.entry ev.${System.Request.ID}) ev.OnBoot: $(inc 起動回数;)\1\s[10]\0\s[0]起動回数:$(join 起動回数 ",")\e ev.OnClose: $(save sav.txt 起動回数)\- ev.OnGhostChanging: $(save sav.txt 起動回数)\e エントリの状態の初期化はOnCacheRestoreにも†セーブデータが増えるのはこれでいいとして、前の方に出てきた「ほげ」エントリのようにセーブ対象ではないけれど起動時に初期化したいエントリはどうしましょう。 こんな感じ。 ほげ: 0 System.Callback.OnGET: $(.entry ev.${System.Request.ID}) System.Callback.OnNOTIFY: $(.entry ev.${System.Request.ID}) ev.OnBoot: $(inc ほげ)\1\s[10]\0\s[0]${ほげ}\e ev.OnClose: \- ev.OnGhostChanging: \e ev.OnCacheRestore: $(setstr ほげ 0) どうせなら処理を共通化。 =kis function 初期化処理 $(.setstr ほげ 0); 初期化処理; =end System.Callback.OnGET, System.Callback.OnNOTIFY: $(get ev.${System.Request.ID}) ev.OnBoot: $(inc ほげ)\1\s[10]\0\s[0]${ほげ}\e ev.OnClose: \- ev.OnGhostChanging: \e ev.OnCacheRestore: $(初期化処理) これでめでたしめでたし……と思いきや。 続きはそずべねぐ/セーブとロードのおはなしで。 コメント† |