Studencheskie Programmisty

Page 1 of 1: 1

NScripterの実行されている環境を知る方法

Dec 13, 2010

大概の人は、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のみを判別したい場合には、インストール時にレジストリに値を書き込んでおけばよい。

    NScripterでロード時にエフェクトつけたりする方法

    Sep 15, 2010

    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の中でうまくセーブポイントを作ることができず、失敗する。

    また、lspvspを使ってロード画面の表示をコントロールすると画面の再描画が起こり、画面がちらついてしまうため、再描画を起こさないamspを使って画面外へと移動させることで非表示にしている。

    これでロード中に任意の画像を表示できるようになったので、あとは*onloadのなかで%nowloading_bgを好きなようにいじくり回せば完成。

      NScripterのloadgameではまった

      May 27, 2010

      ONScripterでは全く問題なかったのだが、NScripterでセーブ/ロードを繰り返すと、表示がおかしくなるというバグに遭遇した(画像1,画像2)。発生条件がランダムで、どう直したらいいのやらと試行錯誤していたら、どうやらセーブ時に変な状態でセーブされるせいで、ロードした時におかしくなるらしいということが分かった(何でこんな簡単なことが思いつかなかったのだろう・・・)。

      というわけで、define節にautosaveoffを追加したらすんなり直った。高速化のためということでsaveon/saveoffを繰り返してたらどこかでおかしくなっていたらしい。当たり前といえば当たり前だけれども、セーブ/ロード関連でバグが発生している時は、saveon/offがおかしいのが原因ということがしばしばあるので(これで引っかかった回数は数知れず)、その度に銘じ直してるはずなのだがそのことを改めて認識させられた昨日4時間でだった。