//============================================================================= // ステートの自動付与解除条件を設定するプラグイン // FTKR_AutoStateConditions.js // プラグインNo : 32 // 作成者 : フトコロ // 作成日 : 2017/05/02 // 最終更新日 : 2019/04/14 // バージョン : v1.0.1 //============================================================================= var Imported = Imported || {}; Imported.FTKR_ASC = true; var FTKR = FTKR || {}; FTKR.ASC = FTKR.ASC || {}; //============================================================================= /*: * @plugindesc v1.0.1 ステートの自動付与解除条件を設定するプラグイン * @author フトコロ * * @help *----------------------------------------------------------------------------- * 概要 *----------------------------------------------------------------------------- * 本プラグインを実装することで、ステートの自動付与および解除条件を追加できます。 * * 以下のタグをステートのメモ欄に記入してください。 * * ・自動付与の場合 - 条件式を満たした時に自動で付与する * * 条件式 * * * または * * * 条件式 * * * * ・自動解除の場合 - 条件式を満たした時に自動で解除する * * 条件式 * * * または * * * 条件式 * * * * [条件式(eval) の値について] * 条件式(eval)は、ダメージ計算式のように、計算式を入力することで、 * 固定値以外の値を使用することができます。以下のコードを使用できます。 * a.param - ステート付与中のキャラのパラメータを参照します。 * s[x] - スイッチID x の状態を参照します。 * v[x] - 変数ID x の値を参照します。 * * * 入力例) * スイッチID1 が ON の時にタグが有効になる。 * * s[1] * * * * [複数の条件を設定する場合] * 以下の2種類の入力例は同じ意味です。 * * 1. 縦に複数の条件式を並べる * * 条件式1 * 条件式2 * * * 1. '&&'を使用して横に複数の条件式を並べる * * 条件式1 && 条件式2 * * * *----------------------------------------------------------------------------- * 設定方法 *----------------------------------------------------------------------------- * 1.「プラグインマネージャー(プラグイン管理)」に、本プラグインを追加して * ください。 * * *----------------------------------------------------------------------------- * 本プラグインのライセンスについて(License) *----------------------------------------------------------------------------- * 本プラグインはMITライセンスのもとで公開しています。 * This plugin is released under the MIT License. * * Copyright (c) 2017 Futokoro * http://opensource.org/licenses/mit-license.php * * *----------------------------------------------------------------------------- * 変更来歴 *----------------------------------------------------------------------------- * * v1.0.1 - 2019/04/13 : 処理見直し * 1. ステートの自動付与および自動解除判定の一部処理をゲーム起動時実行に変更。 * * v1.0.0 - 2017/05/02 : 初版作成 * *----------------------------------------------------------------------------- */ //============================================================================= //============================================================================= // プラグイン パラメータ //============================================================================= FTKR.ASC.parameters = PluginManager.parameters('FTKR_AutoStateConditions'); //============================================================================= // 自作関数(グローバル) //============================================================================= FTKR.gameData = FTKR.gameData || { user :null, target :null, item :null, number :0, }; if (!FTKR.setGameData) { FTKR.setGameData = function(user, target, item, number) { FTKR.gameData = { user :user || null, target :target || null, item :item || null, number :number || 0 }; }; } if (!FTKR.evalFormula) { FTKR.evalFormula = function(formula) { var datas = FTKR.gameData; try { var s = $gameSwitches._data; var v = $gameVariables._data; var a = datas.user; var b = datas.target; var item = datas.item; var number = datas.number; if (b) var result = b.result(); var value = eval(formula); if (isNaN(value)) value = 0; return value; } catch (e) { console.error(e); return 0; } }; } //============================================================================= // 自作関数(ローカル) //============================================================================= Array.prototype.convertEntrapmentRegArray = function() { return this.map(function(str) { return { a:new RegExp('<' + str + '>', 'i'), b:new RegExp('<\/' + str + '>', 'i') }; }); }; //正規表現オブジェクトの配列とdataをテストする Array.prototype.testRegs = function(data, prop) { return this.some(function(reg) { return prop ? reg[prop].test(data) : reg.test(data); }); }; // textの形式のメタデータを読み取ってtextを返す var readEntrapmentCodeToText = function(obj, codeTitles) { notes = codeTitles.convertEntrapmentRegArray(); var notedata = obj.note.split(/[\r\n]+/); var setMode = 'none'; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (notes.testRegs(line, 'a')) { var text = ''; setMode = 'read'; } else if (notes.testRegs(line, 'b')) { setMode = 'none'; } else if (setMode === 'read') { text += line + ';'; } } return text; }; // textを条件式に使える状態に変換する var convertTextToConditions = function(text) { var result = ''; if (text) { var datas = text.split(';'); datas.forEach(function(data, i) { result += data; if (datas[i+1]) result += ')&&('; }); result = '(' + result + ')'; } return result; }; //============================================================================= // DataManager //============================================================================= var _DatabaseLoaded = false; var _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!_DataManager_isDatabaseLoaded.call(this)) return false; if (!_DatabaseLoaded) { this.ascStateNotetags($dataStates); _DatabaseLoaded = true; } return true; }; DataManager.ascStateNotetags = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; obj.asc = {}; obj.asc.add = convertTextToConditions(readEntrapmentCodeToText(obj, ['ASC_付与条件', 'ASC_ADD_CONDITIONS'])); obj.asc.remove = convertTextToConditions(readEntrapmentCodeToText(obj, ['ASC_解除条件', 'ASC_REMOMVE_CONDITIONS'])); } }; DataManager.evalRemoveStateConditions = function(obj) { var formula = obj.asc.remove; if (!formula) return false; return FTKR.evalFormula(formula); }; DataManager.evalAddStateConditions = function(obj) { var formula = obj.asc.add; if (!formula) return false; return FTKR.evalFormula(formula); }; //============================================================================= // ステートの自動付与&自動解除判定 //============================================================================= FTKR.ASC.Game_Battler_refresh = Game_Battler.prototype.refresh; Game_Battler.prototype.refresh = function() { FTKR.ASC.Game_Battler_refresh.call(this); if (this.isAlive()) { FTKR.setGameData(this); this.checkAutoAddState(); this.states().forEach( function(state) { if (DataManager.evalRemoveStateConditions(state)) { this.removeState(state.id); } },this); } }; Game_Battler.prototype.checkAutoAddState = function() { $dataStates.forEach( function(state){ if (!state) return; if (DataManager.evalAddStateConditions(state)) { if (!this.isStateAffected(state.id)) { this.addState(state.id); } } },this); };