#contents

Category:[[仕様メモ]]
-----
*これは何? [#j0da0022]
華和梨用ミドルウェア「OpenKEEPS」を開発する際に得られた、ゴースト開発に関わる戦訓をメモする場所。ここに書かれている事柄は、全てOpenKEEPSに反映済みである。

*ゴーストの起動/終了 [#u33b99c7]
**起動系 [#yb43904c]
+起動イベントが来る前に、何種類かのイベントが来ることがある。本来はNOTIFYで来るべきだが、「GETで来て、Reference内でNOTIFY的状況か否か通知」という、困ったイベントが重要イベントに存在する(OnSecondChangeなど)。文脈的には、起動イベント前にこれらのイベントで発話するのは変なので、回避すること。
+終了イベント/起動イベントを経ずに、ゴースト起動完了するケースがある。以下のケース。
++\![reload,shiori]タグ使用時
++SSPの開発用メニューを使って、SHIORIを再起動する時
++ネットワーク更新に成功して、ゴーストが再起動する時
+SHIORIの1回のLOAD/UNLOADセッションの間に、意味上での「ゴーストの起動/終了」が複数回ありうる。SSPのゴーストキャッシュ使用時。パラメータファイルセーブの際、問題が起き易いので気をつけること。
+複数の本体を同一フォルダにインストールした状態では、特定本体ソフトでは初回起動済みでも、別本体ソフトでは一回も起動していない場合がありうる。初回起動時にパラメータの初期化を行う実装だと、別本体ソフトでゴーストを初起動した際に、パラメータファイルが再初期化される。「アンインストールもされてないのに複数の初回起動」は、ゴーストから見た文脈的に変である上、パラメータの再初期化は育成系ゴーストにとって致命的である。このケースには必ず対策すること。
+SSPは、OnGhostCalled系の複数のゴーストが同時起動した場合専用イベントに反応がないと、それに対応するOnBootといった通常イベントを再コールする。ミドルウェアは、こうした複数回同種のイベントが来ることを想定しておくこと。(例:起動回数カウントをミドルウェア内でやっている場合、ダブルカウントしうる。)
+最近のPCは十分高速なため、ゴーストがすぐ起動完了する。つまり、OnGhostCallingの直後にOnGhostCallCompleteが来るかのように見える。OnGhostCallingである程度の長さのトークを話せるよう、以下の対策が望ましい。
++OnGhostCallCompleteイベント時にStatusヘッダが「talking」であれば、OnGhostCallingのトークをしゃべっている途中であると推定できる。この時、OnGhostCallCompleteのトークを話さない。
++その後、OnSecondChangeイベントでStatusヘッダが「talking」でなくなるのを待つ。
++Statusヘッダが「Talking」でなくなったら、OnGhostCallCompleteのトーク内容をOnSecondChangeで話す
+SSPでは、OnVanishedイベントは起動中に他のゴーストが消滅した場合も発生する。他の本体ソフトウェアと同じように、ゴースト起動時のみと考えると誤動作の原因になる。
+OnUpdateCompleteイベントでReference0が「none」ではない場合、実質的に起動イベントとしてみなすこと。SAORIの初期化などでSHIORI LOADでは行えない内容は、必ずこのイベントでも実行のこと。

**終了系 [#seee4411]
+OnCloseイベントでは、いきなり\-を入れるとトークが末尾で切れたかのように見える。
\-の前に適当なウェイトを入れること。
+通常トーク内で\-、\![change,ghost]、\![reload,shiori]、\![reload,ghost]を使うと、OnCloseもOnGhostChangingも発生せずにゴーストが終了する。また、SSPのゴーストキャッシュが有効時には、ゴーストが終了したら必ずSHIORIがUNLOADされるわけではない。パラメータのセーブタイミングは、上記を考慮して決定のこと。
+MATERIAの場合、OnUpdateReady以降のOnUpdate系イベントは、いつその直後にゴーストの再起動があってもおかしくない。パラメータファイルのセーブは、OnUpdateReadyで行っておくのが一番安全である。

*通常イベント [#k391a53d]
**OnSurfaceChange [#yf2e9474]
+MATERIAでは同イベントが発生しない。MATERIAでもSSTPを含めた、ゴーストの「今」のサーフィス状態を知りたい場合、以下のような工夫が必要。
++OnTranslateイベント時、最終的に返す予定のさくらスクリプト文字列を、タグごとに分解する
++\s[]タグがあったらサーフィス番号を取り出し、その直前の\0/\1/\p[2]…等、どのキャラクタのサーフィスか決定する。
++各キャラクタの一番最後のサーフィス番号が見つかったら、それをOnSurfaceChangeの代用情報として使う。

*華和梨固有 [#f39750e0]
+ミドルウェアは、仮にユーザによって組み込みコマンドが上書き定義されても意図通り動くべきである。従って、コマンド名はピリオド前置で書く。

-----
*コメント [#r9770df4]
#comment

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