Developer's Blog

UserAction Extension でオレオレスクリプトのススメ (2)

みなさん、ドラクエ 4 、やってますか?
謎の人です。こんにちわ。好きな AI は「ガンガンいこうぜ」ですよ。
前回、UserAction を記述するひとつの選択肢として Perl を提案させて頂きましたが、それ以降
「やっぱり画面周りは JavaScript で書きたいよね」
「せっかく作ったんだから、たまには公開したいかも」
という内なる声に悩まされ、眠れない毎日です。
目に触れる部分は JavaScript で記述して、JavaScript では難しいことを Perl でやって、気軽に公開/配布できればモア・ハッピー?
というわけで、本日はちょっと強引な合わせ技を。


以下、簡単な手順。

  1. ActivePerl をインストール
  2. PAR をインストール
    
    ppm install PAR
    
  3. PAR 付属のコマンド「pp」を使って Perl スクリプトを exe 化する
    
    pp --gui -o hogehoge.exe hogehoge.pl
    
  4. plugin/scripts に、js ファイルと exe ファイルを設置
  5. Sleipnir オプション >> ユーザインタフェースでメニューやマウスジェスチャに追加

最大の難関は、PAR のインストール。ややこしい話になるので詳細割愛させて頂きますが、みなさん苦労されているようですので、つまずいた方は検索してみてください。
それを乗り越えれば、後は簡単です。

  • メリット
    • Perl と JavaScript 、それぞれの得意分野で開発できます
    • 利用するだけであれば、ActivePerl 不要。ScriptEngine.ini の書き換えも不要
  • デメリット
    • exe のファイルサイズが巨大になります。。。2MB とか 3MB とか
    • 実行時、最初だけ少し時間がかかります
    • スクリプトによっては、exe 化できないものもあるようです

こんな事もできるよ、ということで、今回も最後に動作サンプルを掲載します。ご参考までに。
技術的な文章は難しいですね。次回はドラクエ 4 のレビュー。。。は叱られるので、UserAction Extension のシメとして、何か役立つ情報をご提供できれば、と思っていますよ。
ありがとうございました。
sample.js


String.prototype.escapeHTML = function() {
return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/\'/g, '&#39;');
};
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;

Copyright © 2019 Fenrir Inc. All rights reserved.