仕様考察・イベント絵の未読既読判定とCGモード

まず、NScripterで用意されている命令を確認してみる。
define節で、filelog命令を実行しておくと、(NScripterでの)グローバル変数的ににbg命令で読み込んだ画像ファイル名が記録されるようになる。
そして、ある画像ファイルを読み込んだことがあるかどうかは、fchk演算子を使って判別できる。

filelog
(中略)
bg "event01.png",1 ; イベント画像を読み込んで表示する。
(中略)
   if fchk "event01.png" mesbox "表示したことがある。","fchk"
notif fchk "event01.png" mesbox "表示したことがない。","fchk"

CGモードを作るのにこれがあるとかなり簡単になる。

              mov $thumbnail,":c;not_viewed.png"      ; デフォルトの未読画像
if fchk $file mov $thumbnail,":a;/2,0,3;thumb_"+$file ; 読み込んだことがあるなら、それぞれの既読画像に変更
lsp %thumb_sp,$thumbnail,$thumbx,$thumby              ; スプライトとして表示
cellcheckspbtn %thumb_sp,%thumb_sp                    ; スプライトが複数のセルを持っていれば、ボタン化
; 上記工程を画像の数だけ繰り返す。
; 数が多いなら、ページに分割するなどの作業が入る。

聞くだけなら、全く問題はない。しかし、「差分」の概念が加わるとまた話は変わってくる。

差分が加わるとどうなるか。

念のために確認するが、差分とは、ほぼ同じ内容だがちょっと違う一連のグラフィックのことと今回は定義する。立ち絵は広義では差分だが、通常は「表情」と呼ぶべきで、ここではイベント絵に限定する。
多少性的な例示になるが、エロゲーを作る場合、同じポーズで着衣・半裸・全裸でイベント絵の数を稼ぐ、と言うようなことはよく行われているだろう。これはグラフィッカーの都合もある。フォトショップなどで背景と人物と下着と着衣をレイヤーに分割して、イベント絵量産の省力化をするなど当たり前のように誰でもが思いつく技法である。
これら差分を別々のイベント絵とカウントして並べれば、うん、数だけはそろってきてプレイヤーも満足してくれるかも知れない。
しかし、プレイヤーの要求は年々高まるばかりである。

「おい、なんで勝手に靴下脱がしてんだ。常識的に考えて残すだろうここは」

こういう要求もあるかも知れない。かくして、グラフィッカーは様々なバージョンを作成することになる。ブラの有無、パンツの有無、靴下の有無、これで一連の素材から8枚のイベント絵が生成された。うん、悪くない。大丈夫だ問題ない。

「問題おおありだっつーの。何度も何度も同じルート通らせるな。こちとら作業したいんじゃねえんだよ」

やばい、CGモードの進捗率がなかなか上がらずプレイヤー様がお怒りになっておられる。なんとかすべえ。
そこで考えられるのがグループ化である。一連の素材から生成されるイベント絵を一つのグループとみなすことで、進捗率はグループ内のどれか一つでも既読にすれば上昇し、CGモードで実際に見る時はサブギャラリーを開いて既読の物のみを見せるようにすればよい。

要求仕様の変更

グループ全体の既読未読判定と、個々の画像の既読未読判定を別々に管理記録しなければならない。
そこで考えられるのが、グループ判定用のダミー画像を作っておく方式である。

event01base.png
これがダミー画像。1ドット×1ドットの何か適当な奴。これが読み込んであれば、CGモードの進捗率は上がる。
event01xxx.png
差分xxx
event01yyy.png
差分yyy

イベント絵の命名規則をこのようにしておき、イベント絵を表示する専用命令、eventを定義してみよう。

defsub event

*event
getparam %event_group,$event_ext ; イベントのグループ番号と差分コードを取得。
itoa $event_group,%event_group ; 数値を文字列に変換
if %envent_group<10 mov $event_group,"0"+$event_group ; 桁揃え
mov $event_group,"event"+$event_group ; ファイル名っぽく
notif fchk $event_group+"base.png" bg $event_group+"base.png",0 ; グループ判定画像を読み込んでいなければ、読み込み、既読フラグを立てておく。
bg $event_group+"_"+$event_ext+".png",0 ; 読み込むが表示はしないでおく。他にあるかも知れないので。
return

差分の応用

かつて、マイクロキャビンは「マリオネット・カンパニー」と言う超素敵なゲームを出した。KISSは、現在でも「カスタム隷奴」シリーズを出し続けている。
共通点は、ヒロインの容姿がプレイヤーの意思により変更可能であり、なおかつその変更がイベント絵全てに反映されることである。「理想の異性」を求める一面は否定できず、なればこそ「好みの容姿(や性格)」を与えられるこれらのゲームは、ある種究極のコンセプトであると言える。(コンセプトはそのままで3DグラフィックにしたTEATIMEやテックアーツ3D社も現在では存在する)
このようなシステムであった場合、イベント絵はヒロインの容姿違いも差分として吸収すべきで、差分をサブギャラリーに表示するこの方式は有効に作用するだろう。

defsub event

*event
getparam %event_group,$event_ext ; イベントのグループ番号と差分コードを取得。
itoa $event_group,%event_group ; 数値を文字列に変換
if %envent_group<10 mov $event_group,"0"+$event_group ; 桁揃え
mov $event_group,"event"+$event_group ; ファイル名っぽく
notif fchk $event_group+"base.png" bg $event_group+"base.png",0 ; グループ判定画像を読み込んでいなければ、読み込み、既読フラグを立てておく。

; この部分で、グループ番号と与えられた$event_extでイベント絵を生成する。
; グローバル変数の一つに、使った$event_extを追加しておく。これはCGモードで使われる。

return

俺メモ

で、自分がこれを完成させるとするならば、サムネイル画像も読み込んだ瞬間作成した方がいいなーと。
そうすれば、サムネイル画像の有無で既読未読判定もできるしね。