このページはCOOL ONLINE終了に伴いO-Show様の許可を得て作成したBinary Heavenのミラーサイトです
[TOP] [Profile] [NScripter] [BBS] [Links]
実践編 No.2
暗号化とアーカイブ化
■概要■
完成したスクリプトの中身を見えないようにする「暗号化」と、
画像・音楽などをひとまとめにする「アーカイブ化」についての話。


使用命令:

「nsa」(追加命令一覧.txt)
「nsadir」(追加命令一覧.txt)

「avi」(マニュアル 表示・演奏系 E)
「mpegplay」(追加命令一覧.txt)
ゲームの完成後

ゲームが完成したら、何らかの形で配布したり頒布したりするでしょう。
その場合、ゲームのデータはどのようにしておくべきでしょうか。

もしスクリプトを「00.txt」などの形のままで渡してしまったら、もちろんそれでもプレイは可能ですが、スクリプトをプレイヤーが覗けてしまうことになります。

スクリプトにはシナリオも書かれているので、これでは非常にまずいです。

また、画像データや音楽データなども、閲覧可能な形式でそのまま渡してしまうと、同様にプレイヤーがそれを見ることができてしまうことになります。


よって、ゲーム制作時のフォルダの構成とは別に、「配布・頒布用のデータの構成」をしなくてはいけなくなります。

具体的には、スクリプトは「暗号化」を、他のデータは「アーカイブ化」をします。



スクリプトの暗号化

スクリプトの暗号化は、非常に簡単です。

NScripterには専用のスクリプト暗号化ツールが同梱されているため、それを使用すれば自動で暗号化してくれます。


ダウンロードしたNScripterのフォルダ中の「ツール」フォルダに、「nscmake.exe」というプログラムが入っていると思います。

スクリプトが用意できたら、それをダブルクリックしてみてください。

まず、「フォルダの参照」というダイアログが開いたと思います。それと同時に黒いウィンドウ(DOSプロンプト)が開いたと思いますが、そちらは気にしないで放っておいてください。

「フォルダの参照」ダイアログでは、その名の通り暗号化するスクリプトが入っているフォルダを指定することになります。なぜフォルダを指定するかというと、複数あるスクリプトファイルを一度に処理して一つの暗号化ファイルにまとめてしまうからです。


指定できたら、「OK」をクリックして次に進んでください。そうすると次は、暗号化されたスクリプトファイルである「nscript.dat」の保存先を聞いてきます。

これも好きなところを指定して、「保存」をクリックしてください。その時点で、スクリプトの暗号化が開始されます。


今度は、先ほど放っておいた黒いウィンドウの方に目を向けてみてください。「xx.txtを処理しています。」と表示されて、さほど時間がかからずに「完了しました。何かキーを押してください。」と出るはずです。

これでもう暗号化は終わりました。黒いウィンドウを閉じるには、Enterキー、あるいはCtrl+Cキーを押します。(Ctrl+CはDOSプロンプトでのプログラム終了の手順らしいです。コピーでは無いんですね。)


暗号化された「nscript.dat」は、nscr.exeと同じフォルダに置くと、「00.txt〜」と同じ効果を発揮します。よって、配布・頒布する際には「00.txt〜」は必要なくなり、プレイヤーに見ることができないnscript.datの方を配布・頒布すればよいことになります。


ちなみに、「nscript.dat」と「00.txt〜」がnscr.exeと同じフォルダに同時に存在していると、「00.txt〜」の方を読みに行ってしまいます。



データのアーカイブ化

スクリプト以外でゲームに使われているその他のデータは、ほとんど全てアーカイブ化を行います。(アーカイブ化してはいけないファイルは、後述します)

アーカイブ化も、専用のツールが同梱されており簡単に行うことができます。


NScripterでは、アーカイブ化の手段が幾つかありましたが、現在では「nsa形式」によるアーカイブ化がメジャーな方法です。

nsa形式では、BMPファイルは圧縮され、それ以外のWAVEやJPEG、MP3などのデータは圧縮されません。

BMPはある程度小さくなり、劣化せず、またアーカイブからのデータの解凍(読み出し)のパフォーマンスも良いため、BMPはわざわざJPEGにしたりせず、BMPのままアーカイブ化するのが良いでしょう。ただし、圧縮率はJPEGの方がいいですから、場合によってはJPEGを選択することも良いと思います。

(余談ですが、アーカイブ化と圧縮は別ものです。圧縮されないアーカイブ化もあります。アーカイブ化はデータをまとめるのが主な目的です)


※注意
アーカイブ化するファイルのファイル名は、全て半角にしてください。
NScripter自体が全角のファイルを許可していないので普通そのようなファイルを使ってはいないはずですが、うっかり余計な全角の名前のファイルを含めてしまうと、エラーが起きて正常にアーカイブ化できなくなってしまいます。



アーカイブ化の手順

それでは、実際の手順を見ていきましょう。

ここでは、例として以下のようなフォルダ構成でゲームを制作していたとします。


・フォルダ構成(ゲーム制作時)

フォルダ構成−ゲーム制作時


・nscript.dat(元は00.txt)の中身


*define

	nsa

	game

*start

	bg "image\haikei.bmp",1

	テストスクリプトです。@
	アーカイブ化テスト。\

end


「test」というフォルダの中に「nscr.exe」「nscript.dat」「cursor0.bmp」「cursor1.bmp」と「image」フォルダがあり、さらに「image」フォルダの中に「haikei.bmp」があるという構成です。


これを最終的に、次のような配布・頒布用の構成にします。


・フォルダ構成(配布・頒布時)

フォルダ構成−配布・頒布時

「arc.nsa」というのがアーカイブ化されたファイルです。



構成がわかったところで、ツールを使ってアーカイブ化してみましょう。アーカイブ化のツールはスクリプト暗号化のツールと同じ場所にある、「nsaarc.exe」というプログラムです。

これをダブルクリックすると、スクリプト暗号化の時と同じように「フォルダの参照」ダイアログと黒いウィンドウ(DOSプロンプト)が表示されます。


まずは黒いウィンドウではなく、「フォルダの参照」ダイアログを見てください。

ここでは「アーカイブにするフォルダの選択」をするわけですが、これはスクリプト暗号化の時のように「スクリプトが入っているフォルダ」を単純に選択するわけではありません。

それは、nsa形式が「フォルダ付き圧縮」という仕組みをとっており、ゲーム制作時のフォルダ構成をアーカイブファイル一つだけで再現することが可能だからです。

例として上の方で紹介しているフォルダ構成では、「cursor0.bmp」とimageフォルダに入っている「haikei.bmp」は別のフォルダにあるわけですが、「フォルダ付き圧縮」ではそのようなフォルダの違いをそのまま再現してくれるということです。

なぜそのようなことに気を配っているかというと、「"image\haikei.bmp"」というように「フォルダ構成を前提として」スクリプトの中にファイルの指定を書き込んでいるため、アーカイブ化後も実質的にそれと同じような構成になっているのが望ましいからです。

それゆえ、構成が再現できるようにフォルダの指定をしなければなりません。


では、この場合どのフォルダを指定すればよいのでしょうか。

そのヒントとなるのは、「指定したフォルダにnscr.exeがあるとみなされて、アーカイブが構成される」という事実です。

なぜnscr.exeがあるか否かが指標になるかというと、NScripterのスクリプト中でのファイル指定方法は全てnscr.exeから見た位置だからです。


だから、この場合最も簡単なのは「test」フォルダを指定することです。しかし、そう指定すると「nscr.exe」や「nscript.dat」までもアーカイブに含まれてしまいます。

もちろん、アーカイブの中からnscr.exeやnscript.datを利用するわけではないので動作に問題は無いのですが、少し気持ちが悪いことになります。

よって、一旦nscr.exeやnscript.datを別の場所に移動させてから「test」フォルダを指定し、アーカイブ化させると良いでしょう。


話をツールの方に戻します。

フォルダを指定すると、今度は作成されるアーカイブの保存先を聞いてきます。

適当な所を指定すると、アーカイブ化の作業が開始されます。ここでは、BMPが圧縮されるため、ファイルがたくさんある場合は少し時間がかかります。進行具合は黒いウィンドウに表示されるので、眺めつつ待ちましょう。

終了すると「何かキーを押してください」と出るので、適当なキーを押してください。(スクリプト暗号化の時と違ってEnterキー以外でも大丈夫です)



アーカイブを利用するには

さて、これでアーカイブファイルである「arc.nsa」が作成されました。

これを利用するためには、注意点が二つあります。

まず一つは、arc.nsaはnscr.exeと同じフォルダに置かなければなりません。
(ただしこれは、命令で変更することもできます。後述。)

もう一つは、nsa命令をdefine節に書かなければならないということです。



*define

	nsa

	game

*start


気をつけて欲しいのは、この命令は*defineの直後に書くべきだということです。

なぜならば、*define節の中でも何かしらファイルを指定するような命令を書く場合があり、その命令の時点でnsa命令が入っていないと、アーカイブからファイルを読むことができずにエラーになってしまうからです。



また、nsa形式のアーカイブは、「arc.nsa」という名前だけではなく、「arc1.nsa」〜「arc9.nsa」という名前でも利用することができます。

利点としては、アーカイブをいくつかに分けることでアーカイブ化しなおす場合の手間を減らす(ファイルが追加される度に全部一度にやるのではなく、追加されるファイルが属するアーカイブだけアーカイブ化しなおす)ことや、追加パッチにしやすいということなどが挙げられます。

もし各アーカイブに同じ名前のファイル(構成位置も)があった場合、arc.nsaにあるファイルが最も優先されて読み込まれ、次にarc1.nsa、arc2.nsa…と続きます。

※注意
アーカイブのファイル名は、続き数字になっていなければいけません。
(ただし、arc.nsaの次が、arc1.nsaです)
例えば、arc.nsaが無いのにarc1.nsaがあったり、途中の数字を飛ばしていたりすると、そこから先のアーカイブをNScripterは読み込んでくれません。

これは、アーカイブ内に同じ名前・同じ構成位置のファイルがあった場合にarc.nsaが最も優先されるからという理由で、一番後ろであるarc9.nsaからアーカイブを用意するということはできないということです。
そういう利用方法をしたいのならば、新アーカイブを作る度にそれをarc.nsaにして、今までのアーカイブをリネームして後ろにずらすことになります。


ちなみに、アーカイブの中にあるファイルと名前も構成位置も同じファイルを直置き(アーカイブ化せずに置く)した場合、直置きファイルの方が優先されて読み込まれます。



arc.nsaの置く位置を変更する

先ほどarc.nsaはnscr.exeと同じフォルダに置くと言いましたが、それをnsadir命令で変更することができます。



*define

	nsa

	nsadir "arcfile"

	game

*start


上記の例では、nscr.exeがあるフォルダの中に「arcfile」というフォルダを作成し、その中にarc.nsaを入れても、同様に動作するということを表しています。


ちなみにこの命令はarc.nsaの置ける位置を変更するだけなので、アーカイブ化時に指定するフォルダを間違えた場合などに、その階層を調整する目的に使用することはできません。

例えば、上の方の例で言うとtestフォルダを指定せずにimageフォルダを指定しまった場合に、「nsadir image」としてimageフォルダ内にアーカイブを置いてもエラーがでます。その場合nscr.exeから見れば、アーカイブ内のhaikei.bmpはnscr.exeと同じフォルダにあるファイルということになるからです。



アーカイブ化できないファイル1

便利なアーカイブ化ですが、アーカイブ化できないファイルもあります。
まず一つは、AVIやMPEGなどのムービーファイルです。

これらのファイルは、アーカイブに含めてしまうと再生できなくなってしまいます。


こればかりは、生のファイルのまま置いておくほかありません。

オープニングムービー程度はWebで公開したり、ゲーム開始時にすぐ見るので問題は無いでしょうが、ゲームの途中で使われるムービーだったり、エンディングムービーだったりすると少々やっかいです。


そこで、ムービーをプレイヤーに見られないように誤魔化す方法をお教えします。

それは、拡張子を変更するという方法です。


実を言うと、avi命令もmpegplay命令も、拡張子が「.avi」や「.mpeg」以外だったとしても、中身がちゃんとAVIやMPEGファイルだった場合は再生が可能という仕様になっています。

例えば、「end.mpeg」というファイルを「file.dat」という名前に変更したとしましょう。

その場合、


	mpegplay "file.dat",0

このように書いても、再生はされるのです。


「拡張子が違えば、プレイヤーは気付かないだろう」という期待を前提にしているので、この方法は完全に見られないようになるわけではありません。拡張子を変えるだけで普通のデータになってしまうからです。

しかし、やはり他に手の打ちようがないのならば、こうするか、ムービーを使うのをやめるしかないでしょう。



アーカイブ化できないファイル2

もう一つアーカイブ化できないファイルがあります。
それは拡張子が「.dll」のDLLファイルです。

DLLはNScripterに特殊な機能を追加したり、再生可能なファイルを増やしたりするものです。もし使用しているのならば、アーカイブには含めず、nscr.exeと同じ場所にそのまま置いておきましょう。



アーカイブ化できないファイル3

上記二種類以外にも、アーカイブ化できないファイルがあります。
それはBGMに使用する場合の大きなWAVEファイルです。

NScripterは、アーカイブから音声ファイルを再生する場合に、指定されたファイル全体を一旦アーカイブから読み出します。その後読み出されたデータを利用してストリーミングなどの再生を行うわけです。

よって、大きな音声ファイルをアーカイブから再生しようとすると、この読み出しの処理が挟まれて、再生まで気になるほどの遅延が発生することになります(小さなファイルなら問題はありません)。これは最近の高速なマシンでも解消されないほどの遅延です。

これは、アーカイブファイル全体の大きさとは全く関係ありません。アーカイブを複数にわけたとしても、音声ファイル1ファイルの全体を読み出すのですから、処理量は変わりません。


…というように、以前は説明していましたが、現在ではこの問題は「nsogg.dll」のおかげで解消されています。「nsogg.dll」を使うと、大きなPCMファイル(WAVEファイル)をbgm命令でアーカイブから再生する時、その場でストリーミング再生するようになるからです。

といっても、「nsogg.dll」を使えばoggのストリーミング再生にも対応するため、WAVEファイルをBGMに使う意義は薄れたように思います。

なお、「nsogg.dll」については「初級編 No.12 音を鳴らす」に書かれています。
■総括■
完成後に戸惑うことがないように、しっかりやり方を把握しておきましょう。

   前へ   NScripterのIndexへ