そずべねぐ/セーブとロードのおはなし
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
*セーブとロードのおはなし [#ob99a8ff]
ボブ「HA……HA……HA……」~
アリス「あら、ボブが力尽きてるわ。どうしたのかしら?」~
ボブ「やぁ、アリス。ちょっと華和梨におけるエントリのセー...
アリス「あ、ボブが死んだ」
というわけで、たまにはセーブとロードについてちゃんと考え...
この話は自分でミドルウェアを書こうとするような変態という...
注意:以下、ゴースト起動時や他のゴーストからの交代時、ゴ...
*目次 [#l8bde213]
#contents
*エントリを分類してみよう [#of874e6a]
まず最初にエントリを値の使われ方によって分類して、どんな...
|エントリの内容が|突発的な値の変化|ゴースト起動時の初期化...
|変化しない|-|-|タイプA|値が固定されているエントリ|
|変化する|困らない|-|タイプB|カウンタなどの作業用変数|
|~|困る|しない|タイプC|ユーザー名や好感度など|
|~|~|する|タイプD|ゴースト起動中のみ有効なフラグなど|
**タイプA [#vda66800]
OpenKEEPSにおけるトーク記述エントリの「sentence」などのよ...
おおよその場合、ほとんどのエントリがタイプAに相当するは...
値が変化しないのですからセーブもロードも不要です。
**タイプB [#v424e884]
自発トークのタイミング用のカウンタなどの作業用エントリな...
自発トークのカウンタの値がいきなりクリアされても自発トー...
そこを気にする場合、それはタイプDのエントリとなります。~
どうせ値が初期化されても大して問題がないのならセーブやロ...
**タイプC [#g8c7c426]
ユーザー名とか好感度とか常に忘れちゃいけない値です。~
これはもちろんセーブ対象となります。
**タイプD [#pba888f8]
具体的にはゴーストの起動中にセクハラしたらフラグを立てて...
一見、何も問題はなさそうですし、セーブ対象とする必要もな...
なにがどう曲者なのかはこの後で。
*ゴーストの起動時の処理とエントリの状態 [#i8c25505]
次は、セーブやロードの話において押さえておく必要があるゴ...
通常、ゴーストの起動時には栞のロードが実施されますが、SSP...
このそれぞれの起動時の動作やエントリの状態については以下...
+通常のゴースト起動(栞ロード)時
--エントリ状態は辞書ファイルに記述された通りに初期化される
--スクリプト記述ゾーンに記述されたKISが実行される
+ゴーストキャッシュからの起動時
--エントリ状態は前回終了時の値が復元される
--スクリプト記述ゾーンに記述されたKISは実行されない
descript.txtに「shiori.cache,0」と書けばゴーストキャッシ...
**おまけ:栞ロード時の動作 [#xcb30399]
ちなみに栞ロード時の処理の順番は以下の通り。
+kawarirc.kisを読む
+ファイルの先頭から読み進めて行きエントリ定義行があったら...
+KISのうちload命令があったら、その時点でload対象ファイル...
つまり、load命令以降の内容はloadで指定されたファイルの中...
*特殊な起動・終了やそれに準ずる動作について [#r9caebd5]
ここでクイズ。以下のうち、間違っているものはどれでしょう。
+栞のロードはゴースト起動時のみ実施され、栞のアンロードは...
+ゴースト終了時はかならずOnClosedやOnGhostChangingなどの...
+OnBoot、OnGhostChangedなどのゴースト起動系イベントはゴー...
答え:全部間違い。~
ということで、セーブやロードの処理を自分でなんとかしよう...
**その1:ゴースト起動中の栞のロードやアンロード [#h21fb7...
栞のロード(とアンロード)といえばエントリが初期化されス...
その契機は以下の通り。
+ネットワーク更新成功時
+shiori.dllを含むsupplimentがインストールされたとき
+SSPの拡張タグの\![reload,shiori]、\![reload,ghost]が実行...
+SSPの開発用パレットで栞やゴーストのリロードを実施したとき
他3つはそうないとはいえ、ネットワーク更新時だなんて……('A`)
**その2:終了イベントを伴わないゴースト終了 [#nf9c9359]
これはまぁ、言われてみれば「あぁ、そういえば!」というレ...
+トーク中で\![change,ghost,~]タグを実行したとき
+(OnClosedのイベントのトーク以外での)トーク中で\-でゴース...
**その3:ゴーストの起動中にゴースト起動イベントが来てし...
実は、ゴーストの起動時イベントが複数回来る場合があります。~
有名なのはOnGhostChangedでトークを返さない(SHIORI/3.0 204...
これはまぁ、ゴースト起動時に立て続けにくるので良いとして...
ここまでふまえて。
*セーブやロードの方法を考えよう [#a6f6cd14]
ようやく本題。~
ここからはエントリのタイプ別にセーブとロードの方法を考え...
**タイプAとタイプBのエントリ [#gcd78bc6]
最初に書いたとおり、これらのタイプのエントリはセーブやロ...
**タイプCのエントリのセーブとロード [#yeaefe82]
タイプCのエントリはゴーストの最初の起動時に初期化して、...
というわけで、最低限、栞アンロード時(とゴーストキャッシ...
***まずはゴーストキャッシュのことなど考えず [#uad41056]
ひとまずゴーストキャッシュのことは無視して栞アンロード時...
栞ロード時はkawarirc.kisのスクリプト記述ゾーンの最後あた...
結論からいってしまえば、あまり有名ではありませんが、華和...
というわけで、とりあえず、kawarirc.kisの末尾でロード、Sys...
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩かれた...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数)\1\s[10]\0\s[0...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数;
);
function ロード $(
load sav.txt;
);
function 初期化処理 $(
ロード;
);
初期化処理;
=end
ものすごく単純ですが、とりあえずの動作確認のためのモデル...
ゴースト起動してぽこぽこダブルクリックしてからゴーストを...
***初期値をつけよう [#y853b8ae]
上の内容でゴーストを起動すると、初回起動のときは「起動し...
それは当然の話で、セーブデータから値を読み込むのが前提な...
では、どうすればいいかといえば、セーブデータを読んだ後、...
こんな感じ。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩かれた...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数)\1\s[10]\0\s[0...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数;
);
function ロード $(
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
初期化処理;
=end
初期化処理関数の中のif文が新規に追加したところです。~
あくまでもモデルなので、実際には初期化の処理はもっとちゃ...
それはさておき、一回、sav.txtを消して起動してみてください...
***ゴーストキャッシュ対策をしよう [#y436beef]
今度はゴーストキャッシュの対策。~
ゴーストキャッシュに入って終了した後でSSPを終了させるとも...
ゴーストキャッシュから出てきた時は原則的にはロードは不要...
じゃあ、ゴーストキャッシュに入ったり、ゴーストキャッシュ...
また、栞ロードの場合とゴーストキャッシュから出てきた場合...
というわけでこんな感じ。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩かれた...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数)\1\s[10]\0\s[0...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
ロード関数の中のclearの処理と、OnCacheSuspendとOnCacheRes...
ゴーストキャッシュを有効にしてもちゃんと動くことを確認し...
タイプCのセーブとロードの話はここまで。~
タイプDのエントリを使わないということを前提とするなら、...
実際、タイプDのエントリとは無縁のゴーストも少なくないは...
**タイプDのエントリのセーブとロード [#d2c9c36f]
ネットワーク更新時などのゴースト起動中の栞リロード時にエ...
ここで考えなければならないのは、どうやって起動時のときだ...
これにはいろいろな方法があるのですが、ここでは、タイプD...
***起動時イベントの中で初期化しよう [#r2a6cd36]
というわけで、まずは最も単純な場合である、起動時イベント...
これは、OnBootイベントに対する処理の中でタイプDのエント...
モデルはこんな感じ。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: $(初期化処理2)\1\s[10]\0\s[0]起動しました。...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数; inc 叩かれた...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数 叩かれた回数.今回;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
function 初期化処理2 $(
.setstr 叩かれた回数.今回 0;
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
これでゴースト起動時のみ値を初期化し、ゴースト起動中の栞...
起動時の栞ロード~起動イベント(OnBootなど)を受信する間に...
でも、これでもちろんめでたしめでたしではないわけで。
***起動系イベント受信での初期化処理は1回だけ [#ab4b8bff]
次にOnGhostChangedなどのOnBoot以外の起動時イベントにも反...
ここで気をつけるのはOnGhostChangedなどの起動時イベントに...
したがって、タイプDのエントリの初期化処理は、各起動系イ...
その対策を入れたモデルがこちら。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
# OnBoot受信時の処理
ev.OnBoot: $(初期化処理2;entry evTalk.OnBoot;)
# OnBootのイベント応答トーク
evTalk.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩か...
# OnGhostChanged受信時の処理
ev.OnGhostChanged: $(
if $(size evTalk.OnGhostChanged) $(
初期化処理2;
entry evTalk.OnGhostChanged;
)
)
# OnBootChangedのイベント応答トーク
evTalk.OnGhostChanged: \1\s[10]\0\s[0]切り替えられました...
# 以下、これまでと同じ
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数; inc 叩かれた...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数 叩かれた回数.今回;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
function 初期化処理2 $(
.setstr 叩かれた回数.今回 0;
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
OnGhostChangedのイベントの受信時の処理の中でイベント応答...
なお、OnBootイベントに対して何もトークを返さないというは...
ここではOnGhostChangedを例としましたが、OnGhostChanged以...
というわけで、ここで特別付録、SSP起動時に送られてくる起動...
|状況|起動時に送られてくるイベントと順番|h
|初回起動時|OnFirstBoot→OnMateriaExist→OnEmbryoExist→OnNe...
|通常起動時|OnMateriaExist→OnEmbryoExist→OnNekodorifExist...
|切り替わった時|OnGhostChanged→OnMateriaExist→OnEmbryoExi...
|ゴースト削除時|OnVanished→OnGhostChanged→OnMateriaExist→...
|呼び出され時|OnGhostCalled→OnMateriaExist→OnEmbryoExist→...
イベントの種類としては、OnBoot、OnFirstBoot、OnGhostChang...
なお、上記イベントのうち、OnMateriaExistとOnEmbryoExistは...
ところが。
***OnOtherGhostVanishedとOnVanished [#a2735c35]
上に述べた各種起動時イベントですが、SSP限定において、起動...
OnOtherGhostVanished自体は起動時イベントではなく、ゴース...
これが問題になるのはOnVanishedにイベントの応答のトークが...
このとき、ゴースト起動中に起動時イベント(OnVanished)を...
じゃあ、どうするか。一番、単純な手としては、OnOtherGhostV...
で、モデルは以下の通り。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
# OnBoot受信時の処理
ev.OnBoot: $(初期化処理2;entry evTalk.OnBoot;)
# OnBootのイベント応答トーク
evTalk.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩か...
# OnGhostChanged受信時の処理
ev.OnGhostChanged: $(
if $(size evTalk.OnGhostChanged) $(
初期化処理2;
entry evTalk.OnGhostChanged;
)
)
# OnBootChangedのイベント応答トーク
evTalk.OnGhostChanged: \1\s[10]\0\s[0]切り替えられました...
# OnVanished受信時の処理
ev.OnVanished: $(
if $(size evTalk.OnVanished) $(
初期化処理2;
entry evTalk.OnVanished;
)
)
# OnVanishedのイベント応答トーク
evTalk.OnVanished: \1\s[10]\0\s[0]ゴーストが削除されまし...
# OnOtherGhostVanished受信時の処理
ev.OnOtherGhostVanished: $(entry evTalk.OnOtherGhostVani...
# OnOtherGhostVanishedのイベント応答トーク
evTalk.OnOtherGhostVanished: \1\s[10]\0\s[0]次は私の番か...
# 以下、これまでと同じ
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数; inc 叩かれた...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数 叩かれた回数.今回;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
function 初期化処理2 $(
.setstr 叩かれた回数.今回 0;
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
現在、事実上、起動時イベントが飛んでくるのはゴースト起動...
ここでは、その事実を信用し、これ以上の対策はもう考えない...
もし信用できない場合は……? パス。信用できない場合の更な...
ただOpenKEEPSがそのへんバッチリ対策しているはずなので気に...
*参考リンク [#w22888c5]
-[[らくだ屋/華和梨メモ]]
-[[らくだ屋/華和梨・自作関数集]]
-[[らくだ屋/里々から華和梨への移行ガイド・ミドルウェア使...
-[[さとー/Tips]]
-[[プログラマブル準AI 華和梨>http://kawari.sourceforge.ne...
-[[OpenKEEPS Project>http://keeps.sourceforge.jp/]]
-[[なごやか。>http://kemonomimisippo.hp.infoseek.co.jp/]]
*コメント [#k6ed7a97]
- 目指したところは現在のSSPで問題おきなきゃいいや、ぐらい...
- あと、このへんおかしいよ、とか、こういうケースが考えら...
- そういえば、raiseotherで無理やりOnBoot送りつけるなんて...
- ゴースト終了トーク中にダブルクリックでトークを潰した場...
- あ、そういえば、クラッシュに備えてユーザー名の変更やし...
#comment
終了行:
*セーブとロードのおはなし [#ob99a8ff]
ボブ「HA……HA……HA……」~
アリス「あら、ボブが力尽きてるわ。どうしたのかしら?」~
ボブ「やぁ、アリス。ちょっと華和梨におけるエントリのセー...
アリス「あ、ボブが死んだ」
というわけで、たまにはセーブとロードについてちゃんと考え...
この話は自分でミドルウェアを書こうとするような変態という...
注意:以下、ゴースト起動時や他のゴーストからの交代時、ゴ...
*目次 [#l8bde213]
#contents
*エントリを分類してみよう [#of874e6a]
まず最初にエントリを値の使われ方によって分類して、どんな...
|エントリの内容が|突発的な値の変化|ゴースト起動時の初期化...
|変化しない|-|-|タイプA|値が固定されているエントリ|
|変化する|困らない|-|タイプB|カウンタなどの作業用変数|
|~|困る|しない|タイプC|ユーザー名や好感度など|
|~|~|する|タイプD|ゴースト起動中のみ有効なフラグなど|
**タイプA [#vda66800]
OpenKEEPSにおけるトーク記述エントリの「sentence」などのよ...
おおよその場合、ほとんどのエントリがタイプAに相当するは...
値が変化しないのですからセーブもロードも不要です。
**タイプB [#v424e884]
自発トークのタイミング用のカウンタなどの作業用エントリな...
自発トークのカウンタの値がいきなりクリアされても自発トー...
そこを気にする場合、それはタイプDのエントリとなります。~
どうせ値が初期化されても大して問題がないのならセーブやロ...
**タイプC [#g8c7c426]
ユーザー名とか好感度とか常に忘れちゃいけない値です。~
これはもちろんセーブ対象となります。
**タイプD [#pba888f8]
具体的にはゴーストの起動中にセクハラしたらフラグを立てて...
一見、何も問題はなさそうですし、セーブ対象とする必要もな...
なにがどう曲者なのかはこの後で。
*ゴーストの起動時の処理とエントリの状態 [#i8c25505]
次は、セーブやロードの話において押さえておく必要があるゴ...
通常、ゴーストの起動時には栞のロードが実施されますが、SSP...
このそれぞれの起動時の動作やエントリの状態については以下...
+通常のゴースト起動(栞ロード)時
--エントリ状態は辞書ファイルに記述された通りに初期化される
--スクリプト記述ゾーンに記述されたKISが実行される
+ゴーストキャッシュからの起動時
--エントリ状態は前回終了時の値が復元される
--スクリプト記述ゾーンに記述されたKISは実行されない
descript.txtに「shiori.cache,0」と書けばゴーストキャッシ...
**おまけ:栞ロード時の動作 [#xcb30399]
ちなみに栞ロード時の処理の順番は以下の通り。
+kawarirc.kisを読む
+ファイルの先頭から読み進めて行きエントリ定義行があったら...
+KISのうちload命令があったら、その時点でload対象ファイル...
つまり、load命令以降の内容はloadで指定されたファイルの中...
*特殊な起動・終了やそれに準ずる動作について [#r9caebd5]
ここでクイズ。以下のうち、間違っているものはどれでしょう。
+栞のロードはゴースト起動時のみ実施され、栞のアンロードは...
+ゴースト終了時はかならずOnClosedやOnGhostChangingなどの...
+OnBoot、OnGhostChangedなどのゴースト起動系イベントはゴー...
答え:全部間違い。~
ということで、セーブやロードの処理を自分でなんとかしよう...
**その1:ゴースト起動中の栞のロードやアンロード [#h21fb7...
栞のロード(とアンロード)といえばエントリが初期化されス...
その契機は以下の通り。
+ネットワーク更新成功時
+shiori.dllを含むsupplimentがインストールされたとき
+SSPの拡張タグの\![reload,shiori]、\![reload,ghost]が実行...
+SSPの開発用パレットで栞やゴーストのリロードを実施したとき
他3つはそうないとはいえ、ネットワーク更新時だなんて……('A`)
**その2:終了イベントを伴わないゴースト終了 [#nf9c9359]
これはまぁ、言われてみれば「あぁ、そういえば!」というレ...
+トーク中で\![change,ghost,~]タグを実行したとき
+(OnClosedのイベントのトーク以外での)トーク中で\-でゴース...
**その3:ゴーストの起動中にゴースト起動イベントが来てし...
実は、ゴーストの起動時イベントが複数回来る場合があります。~
有名なのはOnGhostChangedでトークを返さない(SHIORI/3.0 204...
これはまぁ、ゴースト起動時に立て続けにくるので良いとして...
ここまでふまえて。
*セーブやロードの方法を考えよう [#a6f6cd14]
ようやく本題。~
ここからはエントリのタイプ別にセーブとロードの方法を考え...
**タイプAとタイプBのエントリ [#gcd78bc6]
最初に書いたとおり、これらのタイプのエントリはセーブやロ...
**タイプCのエントリのセーブとロード [#yeaefe82]
タイプCのエントリはゴーストの最初の起動時に初期化して、...
というわけで、最低限、栞アンロード時(とゴーストキャッシ...
***まずはゴーストキャッシュのことなど考えず [#uad41056]
ひとまずゴーストキャッシュのことは無視して栞アンロード時...
栞ロード時はkawarirc.kisのスクリプト記述ゾーンの最後あた...
結論からいってしまえば、あまり有名ではありませんが、華和...
というわけで、とりあえず、kawarirc.kisの末尾でロード、Sys...
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩かれた...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数)\1\s[10]\0\s[0...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数;
);
function ロード $(
load sav.txt;
);
function 初期化処理 $(
ロード;
);
初期化処理;
=end
ものすごく単純ですが、とりあえずの動作確認のためのモデル...
ゴースト起動してぽこぽこダブルクリックしてからゴーストを...
***初期値をつけよう [#y853b8ae]
上の内容でゴーストを起動すると、初回起動のときは「起動し...
それは当然の話で、セーブデータから値を読み込むのが前提な...
では、どうすればいいかといえば、セーブデータを読んだ後、...
こんな感じ。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩かれた...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数)\1\s[10]\0\s[0...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数;
);
function ロード $(
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
初期化処理;
=end
初期化処理関数の中のif文が新規に追加したところです。~
あくまでもモデルなので、実際には初期化の処理はもっとちゃ...
それはさておき、一回、sav.txtを消して起動してみてください...
***ゴーストキャッシュ対策をしよう [#y436beef]
今度はゴーストキャッシュの対策。~
ゴーストキャッシュに入って終了した後でSSPを終了させるとも...
ゴーストキャッシュから出てきた時は原則的にはロードは不要...
じゃあ、ゴーストキャッシュに入ったり、ゴーストキャッシュ...
また、栞ロードの場合とゴーストキャッシュから出てきた場合...
というわけでこんな感じ。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩かれた...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数)\1\s[10]\0\s[0...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
ロード関数の中のclearの処理と、OnCacheSuspendとOnCacheRes...
ゴーストキャッシュを有効にしてもちゃんと動くことを確認し...
タイプCのセーブとロードの話はここまで。~
タイプDのエントリを使わないということを前提とするなら、...
実際、タイプDのエントリとは無縁のゴーストも少なくないは...
**タイプDのエントリのセーブとロード [#d2c9c36f]
ネットワーク更新時などのゴースト起動中の栞リロード時にエ...
ここで考えなければならないのは、どうやって起動時のときだ...
これにはいろいろな方法があるのですが、ここでは、タイプD...
***起動時イベントの中で初期化しよう [#r2a6cd36]
というわけで、まずは最も単純な場合である、起動時イベント...
これは、OnBootイベントに対する処理の中でタイプDのエント...
モデルはこんな感じ。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
ev.OnBoot: $(初期化処理2)\1\s[10]\0\s[0]起動しました。...
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数; inc 叩かれた...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数 叩かれた回数.今回;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
function 初期化処理2 $(
.setstr 叩かれた回数.今回 0;
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
これでゴースト起動時のみ値を初期化し、ゴースト起動中の栞...
起動時の栞ロード~起動イベント(OnBootなど)を受信する間に...
でも、これでもちろんめでたしめでたしではないわけで。
***起動系イベント受信での初期化処理は1回だけ [#ab4b8bff]
次にOnGhostChangedなどのOnBoot以外の起動時イベントにも反...
ここで気をつけるのはOnGhostChangedなどの起動時イベントに...
したがって、タイプDのエントリの初期化処理は、各起動系イ...
その対策を入れたモデルがこちら。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
# OnBoot受信時の処理
ev.OnBoot: $(初期化処理2;entry evTalk.OnBoot;)
# OnBootのイベント応答トーク
evTalk.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩か...
# OnGhostChanged受信時の処理
ev.OnGhostChanged: $(
if $(size evTalk.OnGhostChanged) $(
初期化処理2;
entry evTalk.OnGhostChanged;
)
)
# OnBootChangedのイベント応答トーク
evTalk.OnGhostChanged: \1\s[10]\0\s[0]切り替えられました...
# 以下、これまでと同じ
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数; inc 叩かれた...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数 叩かれた回数.今回;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
function 初期化処理2 $(
.setstr 叩かれた回数.今回 0;
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
OnGhostChangedのイベントの受信時の処理の中でイベント応答...
なお、OnBootイベントに対して何もトークを返さないというは...
ここではOnGhostChangedを例としましたが、OnGhostChanged以...
というわけで、ここで特別付録、SSP起動時に送られてくる起動...
|状況|起動時に送られてくるイベントと順番|h
|初回起動時|OnFirstBoot→OnMateriaExist→OnEmbryoExist→OnNe...
|通常起動時|OnMateriaExist→OnEmbryoExist→OnNekodorifExist...
|切り替わった時|OnGhostChanged→OnMateriaExist→OnEmbryoExi...
|ゴースト削除時|OnVanished→OnGhostChanged→OnMateriaExist→...
|呼び出され時|OnGhostCalled→OnMateriaExist→OnEmbryoExist→...
イベントの種類としては、OnBoot、OnFirstBoot、OnGhostChang...
なお、上記イベントのうち、OnMateriaExistとOnEmbryoExistは...
ところが。
***OnOtherGhostVanishedとOnVanished [#a2735c35]
上に述べた各種起動時イベントですが、SSP限定において、起動...
OnOtherGhostVanished自体は起動時イベントではなく、ゴース...
これが問題になるのはOnVanishedにイベントの応答のトークが...
このとき、ゴースト起動中に起動時イベント(OnVanished)を...
じゃあ、どうするか。一番、単純な手としては、OnOtherGhostV...
で、モデルは以下の通り。
System.Callback.OnGET,System.Callback.OnNOTIFY: $(entry ...
# OnBoot受信時の処理
ev.OnBoot: $(初期化処理2;entry evTalk.OnBoot;)
# OnBootのイベント応答トーク
evTalk.OnBoot: \1\s[10]\0\s[0]起動しました。今まで${叩か...
# OnGhostChanged受信時の処理
ev.OnGhostChanged: $(
if $(size evTalk.OnGhostChanged) $(
初期化処理2;
entry evTalk.OnGhostChanged;
)
)
# OnBootChangedのイベント応答トーク
evTalk.OnGhostChanged: \1\s[10]\0\s[0]切り替えられました...
# OnVanished受信時の処理
ev.OnVanished: $(
if $(size evTalk.OnVanished) $(
初期化処理2;
entry evTalk.OnVanished;
)
)
# OnVanishedのイベント応答トーク
evTalk.OnVanished: \1\s[10]\0\s[0]ゴーストが削除されまし...
# OnOtherGhostVanished受信時の処理
ev.OnOtherGhostVanished: $(entry evTalk.OnOtherGhostVani...
# OnOtherGhostVanishedのイベント応答トーク
evTalk.OnOtherGhostVanished: \1\s[10]\0\s[0]次は私の番か...
# 以下、これまでと同じ
ev.OnClose: \1\s[10]\0\s[0]さようなら。\-
ev.OnGhostChanging: \1\s[10]\0\s[0]さようなら。\e
ev.OnMouseDoubleClick: $(inc 叩かれた回数; inc 叩かれた...
System.Callback.OnUnload: $(セーブ)
=kis
function セーブ $(
save "sav.txt" 叩かれた回数 叩かれた回数.今回;
);
function ロード $(
clear 叩かれた回数;
load sav.txt;
);
function 初期化処理 $(
ロード;
if $[ $(size 叩かれた回数) == 0 ] $(.setstr 叩かれた回...
);
function 初期化処理2 $(
.setstr 叩かれた回数.今回 0;
);
初期化処理;
=end
ev.OnCacheSuspend: $(セーブ)
ev.OnCacheRestore: $(初期化処理)
現在、事実上、起動時イベントが飛んでくるのはゴースト起動...
ここでは、その事実を信用し、これ以上の対策はもう考えない...
もし信用できない場合は……? パス。信用できない場合の更な...
ただOpenKEEPSがそのへんバッチリ対策しているはずなので気に...
*参考リンク [#w22888c5]
-[[らくだ屋/華和梨メモ]]
-[[らくだ屋/華和梨・自作関数集]]
-[[らくだ屋/里々から華和梨への移行ガイド・ミドルウェア使...
-[[さとー/Tips]]
-[[プログラマブル準AI 華和梨>http://kawari.sourceforge.ne...
-[[OpenKEEPS Project>http://keeps.sourceforge.jp/]]
-[[なごやか。>http://kemonomimisippo.hp.infoseek.co.jp/]]
*コメント [#k6ed7a97]
- 目指したところは現在のSSPで問題おきなきゃいいや、ぐらい...
- あと、このへんおかしいよ、とか、こういうケースが考えら...
- そういえば、raiseotherで無理やりOnBoot送りつけるなんて...
- ゴースト終了トーク中にダブルクリックでトークを潰した場...
- あ、そういえば、クラッシュに備えてユーザー名の変更やし...
#comment
ページ名: