LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

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

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()は何をしでかすかわからないので、気をつけようが無いですね。
対策ですが、ステートの仕様から各自個別実装しかないでしょう。
本当に不毛です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0