特定の条件が有効な時だけ効果が発生するステートを作ろうとしたのですよ。
中身はこんなものです。
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()は何をしでかすかわからないので、気をつけようが無いですね。
対策ですが、ステートの仕様から各自個別実装しかないでしょう。
本当に不毛です。