NScripterからDLLを介さずに他の言語で作られたアプリを使う。

NScripterを拡張する方法は、

  1. defsubで新しい命令をスクリプトで作る。
  2. dllを使用して特殊な処理を行う。

の二種類がある訳だが、2のdllを作成するには、C言語等の知識が必要だし、連携を考えなければならないので少々敷居が高い。
そして私はなんでもPerlで解決しようとする天下のPerlerであるからして、NScripterからPerlを使う方法を考えてみた。
と言うか、わざわざ書くほどのことでもないことだが……。

まず、NScripter

00.txt

*define
game
*start
; Perl製の外部アプリケーションに与える内容を作成する。
; 日付を連ねた文字列を作り、それに「.txt」を追加してファイル名にする。
date %0,%1,%2
add %0,2000
time %3,%4,%5
for %10=0 to 5
itoa $%10,%%10
if %%10<10 mov $%10,"0"+$%10
next
mov $6,$0+$1+$2+$3+$4+$5+".txt"
; 外部アプリケーションに与える内容を記述したメッセージファイルを作成する。
; 他に与えるべき引数があればここに記述すればいいだろう。
csvopen "nscr2perl.txt","w"
csvwrite $6
csvclose
; 外部アプリケーションを実行する。
shell "perl.pl"
; 外部アプリケーションが終了して結果を記録したファイルが出来上がるまで待つ。
fileexist %6,$6
wait 1
if %6=0 skip -2
; 後は$6の名前のファイルを読み込んで処理結果を受け取る。
end

次は、Perl

perl.pl

open ( IN, 'nscr2perl.txt' );
my $filename = <IN>;
# 他に引数があるかも知れないが今回はなし。
close ( IN );
unless ( $filename ) {
	my @t = reverse((localtime)[0..5]);
	$t[0] += 1900;
	++ $t[1];
	$filename = sprintf "%04d%02d%02d%02d%02d%02d\.txt", @t;
}
# 処理の結果を出力する。
open ( OUT, ">$filename" );
print OUT scalar localtime;
close ( OUT );

これでどうなるか。

時間はかかるが、連携はできる。
NScripterではやりにくいような計算などや、Perlのモジュールを使った特殊な処理などをやらせるのがいいだろう。
ちなみに私はNeuron-0.0.1 - - metacpan.orgのようなモジュールとの連携をさせたいと考えている。

配布する時

perlのソースはppでexeに変換してから配布するべし。
WindowsのActivePerlなら、ppが入っているので、コマンドプロンプトを起動して、Perlディレクトリの中の、site\binに移動する。そこにppがある。
コマンドプロンプトから以下のように入力する。

pp -o "(変換後のファイル名。フルパス指定)" "(ソースファイル名。フルパス指定)" -gui

最後の「-gui」オプションをつけることで、exeは窓を開かずに実行できるようになる。

注意点

Perl側で動的なロードをするようなモジュールは使わないこと。
PurePerlで記述され、できればそのモジュールもソースの中に転記してから使うのがよい。

まとめ

実行速度は望むべくもないので、ゆっくりした育成ゲームやシミュレーションなどでの使用に限られるだろう。
また、Perlでなくても別に窓を開かずに起動できるならばどんな言語でも構わないだろう。好きな言語でやればいいと思う。