NScripterの実行されている環境を知る方法
大概の人は、NScripterでゲームを作るとき、実行環境としてNScripterのみを想定しているのだと思う(当たり前だ)。 しかし、例えば同人ゲームなどで、NScripterの互換環境であるONScripterも サポートしようとすると、NScripterとONScripterで処理を分けたくなることがあるかもしれない(NScripterでしか実装されていない機能を使うときとか)。 そんなときどのようにして実行環境を調べればいいのかについて解説する。
結論から言ってしまうと、getreg
命令を使えば良い。これは、レジストリの値を取得する命令だが、ONScripterは疑似的にこの機能を実現するために、一定の書式で書かれた「registry.txt」を読み込む機能を実装している。つまり、戻ってきた値によってNScripterで実行されているのか、それともONScripterで実行されているのかを知ることができるというわけだ。
registry.txt
[software\divertissement\shitootome] "exec mode"="ONScripter"
00.txt(部分)
;実行しているシステムを調べる getreg $0,"software\divertissement\shitootome","exec mode" if $0="ONScripter" mov $0,"ONScripter" ;ONScripterの時 if $0="" mov $0,"NScripter " ;NScipterの時 lsp 0,":s/20,20,4;#000000実行中の環境:"+$0,0,0
なお、このままだとgetreg
命令を解さない、ONScripter以外の互換環境もNScripterと判別されてしまうので、
より確実にNScripterのみを判別したい場合には、インストール時にレジストリに値を書き込んでおけばよい。
Tagged as: NScripter, development
NScripterでロード時にエフェクトつけたりする方法
NScripterで、ロード時に何かをやる方法といったらloadgosub
命令だと思う。でも、ロード中に「Now Loading...」みたいなのを出したかったり、ロードし終わった時にエフェクトをつけて画面を表示したいということになると、loadgosub
命令だけではうまくいかない。
NScripterはセーブデータをロードする時、完全に読み込み終わるまでの間NScripter側で保存しておいたセーブ時の画面を暫定的に表示する。つまり、セーブポイントが作成された時の画面が、「Now Loading...」となっている画面だったり真っ暗な画面だったりすればよい。
ここで問題なのは、どうやって(ユーザーに画面を見せることなく)その画面の状態でセーブポイントを作成するかである。以下、シスカマ済で、
pretextgosub *pretext_lb loadgosub *onload autosaveoff
さて、まず一番最初に思いつくのは、セーブするサブルーチンで画像を表示し、savepoint
するという方法である。
*show_save_display lsp 0,%nowloading_bg,0,0 ;※ savepoint csp 0 ;残りの処理
しかし、実はこれではロードした時に※の部分でロードされてしまい、うまくいかない。じゃあどうやるのかというと、*pretext_lbの中でやる。
*pretext_lb amsp %nowloading_bg,0,0 savepoint ;◆ amsp %nowloading_bg,1000,0 ;残りの処理
こうすることで、NScripterによる表示文頭の自動savepoint → ◆でのsavepoint → 自動saveoffとなり、うまくロード画面が表示された状態ををセーブポイントにすることができる。実は、この*pretext_lbの中でのsavepoint
をやるためにautosaveoff
していて、autosaveoff
していないと*pretext_lbの中でうまくセーブポイントを作ることができず、失敗する。
また、lsp
やvsp
を使ってロード画面の表示をコントロールすると画面の再描画が起こり、画面がちらついてしまうため、再描画を起こさないamsp
を使って画面外へと移動させることで非表示にしている。
これでロード中に任意の画像を表示できるようになったので、あとは*onloadのなかで%nowloading_bgを好きなようにいじくり回せば完成。
Tagged as: development, nscripter
NScripterのloadgameではまった
ONScripterでは全く問題なかったのだが、NScripterでセーブ/ロードを繰り返すと、表示がおかしくなるというバグに遭遇した(画像1,画像2)。発生条件がランダムで、どう直したらいいのやらと試行錯誤していたら、どうやらセーブ時に変な状態でセーブされるせいで、ロードした時におかしくなるらしいということが分かった(何でこんな簡単なことが思いつかなかったのだろう・・・)。
というわけで、define節にautosaveoffを追加したらすんなり直った。高速化のためということでsaveon/saveoffを繰り返してたらどこかでおかしくなっていたらしい。当たり前といえば当たり前だけれども、セーブ/ロード関連でバグが発生している時は、saveon/offがおかしいのが原因ということがしばしばあるので(これで引っかかった回数は数知れず)、その度に銘じ直してるはずなのだがそのことを改めて認識させられた昨日4時間でだった。
Tagged as: development, nscripter