ロートル元ゲーム開発者がツクールでゲームを作る|プラグインを作る(4)
さて、前回はコンソールにバックスラッシュだらけのデータが出力されるまで進めてきました。Perlを使ってた時もバックスラッシュってのはよく出てきたんですが、要はデータを文字列として扱う為にエスケープしてるんですね。バックスラッシュが3つくらい続いてるのは『\"』をそれぞれエスケープして『\\\"』になってたという訳です。これを元の構造体に戻さないといけません。JavaScriptには文字列を構造体に戻す為にJSON.perse()というメソッドを使います。使うんですが、どうやら今回は構造体が入れ子になっている分だけJSON.perse()を使わないといけないようです。という訳で書いてみたのがこちら。
var convertParam = function(param) {
if (param !== undefined) {
var arr = [];
JSON.parse(param).map(function(param) {
var obj = JSON.parse(param);
var obj_sub = JSON.parse(obj.List);
var arr_sub = [];
obj_sub.forEach(function(value){
var obj_sub_sub = JSON.parse(value);
arr_sub.push(obj_sub_sub);
});
obj.List = arr_sub;
arr.push(obj);
});
return arr;
}
};
何か……何かが違う気がする……。多分だけど、もっとすっきり書ける筈なんです! 車輪を再発明しまくってガッタガタになってる気がします! でもこれで動いちゃったんだよ、困ったことに! とりあえず、動いたもんはそれで良しとして改善案は後で考えることにします。んでもって、これまでリストを直接書いてた部分をプラグインパラメータで設定したリストに置き換えるようにします。
const N = 'WeightRandom';
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command == N) {
for (var i = 0, len = Fishlist.length; i < len; i++){
if (Fishlist[i].Region == args[0]) {
Fishlist[i].List.forEach (function(value) {
var k = value.ID;
var v = value.Rate;
fishes[k] = v;
});
}
}
var fish = fishing(fishes);
$gameVariables.setValue(param.getFish, fish);
}
};
うん、これも絶対おかしい。そもそも一回連想配列にしたものを更に他の連想配列に置き換えるとか無駄なループを挟んでたら、動作が遅くなるだろうが! ここで書き換えるべきなのは連想配列の方じゃなくてそれを使ってるルーチンの方だろ! でもこれで動いちゃったんだよ、困ったことに!
というところで時間切れになってしまったので、続きは次回。どこがおかしいか指摘してくださる方も募集してます、特に convertParam の方。よろしくお願いします!
コーヒー代でも投げてくれると、作者が喜びます。