Posted at

traitsObject()から呼ばれる関数でeval()を呼び出してはいけない。

More than 1 year has passed since last update.

特定の条件が有効な時だけ効果が発生するステートを作ろうとしたのですよ。

中身はこんなものです。


js


/*:
* @plugindesc 条件式が有効な時だけ実行されるステートです。
*
* @help
*
* メモ欄に<StateConditon:任意の式>の形式で記述を行ってください。
* ただし、>は使えません。
* 左右を入れ替えて対応してください。
* 処理負荷の関係上、戦闘中のみ判定式を使用します。
*/

(function(){
'use strict';
/**
* @param {String} expr
* @param {RPG.State} state
*/
Game_BattlerBase.prototype.evalStateCondition_MA =function(expr,state){
const a =this;
var v = $gameVariables._data;
const V=v;
const s = $gameSwitches._data;
const S =s;

return eval(expr);
};

const Game_BattlerBase_states=Game_BattlerBase.prototype.states;
Game_BattlerBase.prototype.states = function() {
const list = Game_BattlerBase_states.call(this);

if(!$gameParty.inBattle()){
return list;
}

return list.filter(function(state){
const expr = state.meta.StateConditon;
if(expr){
this.evalStateCondition_MA(expr,state)
}
return true;
},this);

};

})();


たとえば、「HPが50%以下である限り、攻撃力が倍になる」というステートを作ろうとしたとします。

この場合、ステートの処理でHPが50%以下である限りを取得しようとするとtraitObjects()が呼び出され、states()が呼び出され無限再起が発生して死にます。

なので、条件として使える式がかなり限定されます。

やるとしたら、慎重に内部の状態を調べる必要がありますが、面倒でしょうがないですね。

上記の問題を解決しても、ポールポジション問題を発生させることがあります。

ポールポジション》というのは遊戯王のカードです。

装備モンスターの攻撃力が1位である限り魔法の効果を受けないカードなのですが、装備魔法を付けただけで酷い結果になります。

フィールドの攻撃力2位のモンスターに装備魔法等を使うことで1位を追い抜いた場合、無限ループが発生してしまうのです。

もし、攻撃力が100以下なら+50するというステートを組んだとしましょう。

元々の攻撃力が80の場合、どういう結果になるでしょうか?

eval()は何をしでかすかわからないので、気をつけようが無いですね。

対策ですが、ステートの仕様から各自個別実装しかないでしょう。

本当に不毛です。