みなさん、ドラクエ 4 、やってますか?
謎の人です。こんにちわ。好きな AI は「ガンガンいこうぜ」ですよ。
前回、UserAction を記述するひとつの選択肢として Perl を提案させて頂きましたが、それ以降
「やっぱり画面周りは JavaScript で書きたいよね」
「せっかく作ったんだから、たまには公開したいかも」
という内なる声に悩まされ、眠れない毎日です。
目に触れる部分は JavaScript で記述して、JavaScript では難しいことを Perl でやって、気軽に公開/配布できればモア・ハッピー?
というわけで、本日はちょっと強引な合わせ技を。
以下、簡単な手順。
- ActivePerl をインストール
- PAR をインストール
ppm install PAR
- PAR 付属のコマンド「pp」を使って Perl スクリプトを exe 化する
pp --gui -o hogehoge.exe hogehoge.pl
- plugin/scripts に、js ファイルと exe ファイルを設置
- Sleipnir オプション >> ユーザインタフェースでメニューやマウスジェスチャに追加
最大の難関は、PAR のインストール。ややこしい話になるので詳細割愛させて頂きますが、みなさん苦労されているようですので、つまずいた方は検索してみてください。
それを乗り越えれば、後は簡単です。
- メリット
- Perl と JavaScript 、それぞれの得意分野で開発できます
- 利用するだけであれば、ActivePerl 不要。ScriptEngine.ini の書き換えも不要
- デメリット
- exe のファイルサイズが巨大になります。。。2MB とか 3MB とか
- 実行時、最初だけ少し時間がかかります
- スクリプトによっては、exe 化できないものもあるようです
こんな事もできるよ、ということで、今回も最後に動作サンプルを掲載します。ご参考までに。
技術的な文章は難しいですね。次回はドラクエ 4 のレビュー。。。は叱られるので、UserAction Extension のシメとして、何か役立つ情報をご提供できれば、と思っていますよ。
ありがとうございました。
sample.js
String.prototype.escapeHTML = function() {
return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'"').replace(/\'/g, ''');
};
function getJsonValue() {
var json = new Object;
try {
var s = new ActiveXObject("Sleipnir.API");
var progPath = s.AppPath+'..\\plugins\\scripts';
var program = progPath+'\\sample.exe';
var w = sleipnir.CreateObject("WScript.Shell");
var stdout = w.Exec('"'+program+'"').StdOut;
var string = stdout.ReadAll();
json = eval('('+string+')');
}
catch(e) {
json.ERROR = e.number;
}
return json;
}
function somethingToDo(json) {
var str = '';
for ( key in json )
str += key.escapeHTML()+' : '+json[key].escapeHTML()+"\n";
alert(str);
}
var json = getJsonValue();
if ( json.ERROR )
alert('error: ' + json.ERROR);
else
somethingToDo(json);
sample.pl
#!perl
use strict;
use warnings;
print '{"name":"Nazo", "age":"Nazo"}';
exit;