//=============================================================================
// アイテムとスキルの使用条件を拡張するプラグイン
// FTKR_ExItemConfig_Required.js
// プラグインNo : 21
// 作成者 : フトコロ
// 作成日 : 2017/04/14
// 最終更新日 : 2018/02/01
// バージョン : v1.0.3
//=============================================================================
var Imported = Imported || {};
Imported.FTKR_EIR = true;
var FTKR = FTKR || {};
FTKR.EIR = FTKR.EIR || {};
//=============================================================================
/*:
* @plugindesc v1.0.3 アイテムとスキルの使用条件を拡張するプラグイン
* @author フトコロ
*
* @help
*-----------------------------------------------------------------------------
* 概要
*-----------------------------------------------------------------------------
* 本プラグインを実装することで、アイテムやスキルの使用条件を
* より詳細に設定できます。
*
* 1. 必要武器を二つ以上設定できます。
*
* 2. 装備タイプを条件に設定できます。
*
* 3. 使用者の必要パラメータ等の条件を設定できます。
*
* 4. アイテムに使用条件を設定できます。
*
*
*-----------------------------------------------------------------------------
* 設定方法
*-----------------------------------------------------------------------------
* 1.「プラグインマネージャー(プラグイン管理)」に、本プラグインを追加して
* ください。
*
* 2. 本プラグインは、FTKR_SkillExpansion.jsと組み合わせて使用できません。
*
*
*-----------------------------------------------------------------------------
* 使用条件の設定
*-----------------------------------------------------------------------------
* スキルに以下のノートタグを追記することで、使用条件の設定ができます。
*
*
* code
*
*
* [code に使用できる項目]
* WtypeId: y1,y2,...
* 武器タイプID: y1,y2,...
* :必要武器の武器タイプID y1,y2,... を追加します。
*
* EtypeId: y1,y2,...
* 装備タイプID: y1,y2,...
* :スキルを使用するために、特定の装備タイプが必要になります。
* :必要装備タイプID y1,y2,... を追加します。
*
* AtypeId: y1,y2,...
* 防具タイプID: y1,y2,...
* :スキルを使用するために、特定の防具タイプが必要になります。
* :必要防具タイプID y1,y2,... を追加します。
*
* Logic: type
* 論理計算: type
* :必要武器や装備を複数設定した場合の、論理計算方法を設定します。
* :type に以下のコードを設定してください。
* : and - すべて装備する必要がある
* : or - いずれか1つ装備すればよい
* : nand- 設定した装備の組合せをしてはいけない
* : nor - いずれか1つでも装備してはいけない
* :コードで設定しない場合は、'or'を適用します。
*
* Condition: eval
* 追加条件: 計算式
* :スキルの使用条件に 計算式(eval) で設定した条件を追加します。
*
*
* [計算式(eval) の値について]
* 計算式(eval)は、ダメージ計算式のように、計算式を入力することで、
* 固定値以外の値を使用することができます。以下のコードを使用できます。
* a.param - 使用者のパラメータを参照します。(a.atk で使用者の攻撃力)
* s[x] - スイッチID x の状態を参照します。
* v[x] - 変数ID x の値を参照します。
* iv[x] - アイテムのセルフ変数ID x の値を参照します。(*1)
*
* (*1) セルフ変数を使用する場合は、FTKR_ItemSelfVariables.jsが必要です。
*
*
* 入力例)
* スキルを使用するために必要な武器を、武器タイプ1,2に設定する。
* ただし、武器タイプ1,2の両方を装備していなければならない。
* また、使用するために、LV10以上とスイッチID1がONが必要になる。
*
* 武器タイプID: 1,2
* 論理計算: and
* 追加条件: a.level >= 10 && s[1]
*
*
*
*-----------------------------------------------------------------------------
* 本プラグインのライセンスについて(License)
*-----------------------------------------------------------------------------
* 本プラグインはMITライセンスのもとで公開しています。
* This plugin is released under the MIT License.
*
* Copyright (c) 2017,2018 Futokoro
* http://opensource.org/licenses/mit-license.php
*
*
* プラグイン公開元
* https://github.com/futokoro/RPGMaker/blob/master/README.md
*
*
*-----------------------------------------------------------------------------
* 変更来歴
*-----------------------------------------------------------------------------
*
* v1.0.3 - 2018/02/01 : 機能追加
* 1. 防具タイプIDを条件に指定する機能を追加。
*
* v1.0.2 - 2018/01/31 : 不具合修正
* 1. 装備タイプを指定しても正しく動作しない不具合を修正。
*
* v1.0.1 - 2017/04/29 : FTKR_ItemSelfVariables の v1.1.0以降に対応
*
* v1.0.0 - 2017/04/14 : 初版公開
*
*-----------------------------------------------------------------------------
*/
//=============================================================================
//=============================================================================
// プラグイン パラメータ
//=============================================================================
FTKR.EIR.parameters = PluginManager.parameters('FTKR_ExItemConfig_Required');
//=============================================================================
// 自作関数(グローバル)
//=============================================================================
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;
}
};
}
//=============================================================================
// DataManager
//=============================================================================
FTKR.EIR.DatabaseLoaded = false;
FTKR.EIR.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!FTKR.EIR.DataManager_isDatabaseLoaded.call(this)) return false;
if (!FTKR.EIR.DatabaseLoaded) {
this.eicReqiredNoteTags($dataSkills);
this.eicReqiredNoteTags($dataItems);
FTKR.EIR.DatabaseLoaded = true;
}
return true;
};
DataManager.eicReqiredNoteTags = function(group) {
var note1a = /<(?:EIC 使用条件)>/i;
var note1aj = /<(?:EIC REQUIRED)>/i;
var note1b = /<\/(?:EIC 使用条件)>/i;
var note1bj = /<\/(?:EIC REQUIRED)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
var setMode = 'none';
obj.seprequired = '';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(note1a) || line.match(note1aj)) {
var text = '';
setMode = 'anydata';
} else if (note1b.test(line) || note1bj.test(line)) {
setMode = 'none';
obj.seprequired = text;
} else if (setMode === 'anydata') {
text += line + ';';
}
}
this.makeEirData(obj);
obj.seprequired = '';
}
};
DataManager.makeEirData = function(skill) {
skill.required = {
wtypeIds:[],
logic:'or',
etypeIds:[],
atypeIds:[],
condition:'',
};
if (skill.requiredWtypeId1) skill.required.wtypeIds.push(skill.requiredWtypeId1);
if (skill.requiredWtypeId2) skill.required.wtypeIds.push(skill.requiredWtypeId2);
this.setSepRequired(skill);
};
DataManager.setSepRequired = function(skill) {
var sepdata = skill.seprequired;
if (sepdata) {
var case1 = /(?:WTYPEID):[ ]*(\d+(?:\s*,\s*\d+)*)/i;
var case1j = /(?:武器タイプID):[ ]*(\d+(?:\s*,\s*\d+)*)/i;
var case2 = /(?:LOGIC):[ ]*(.+)/i;
var case2j = /(?:論理計算):[ ]*(.+)/i;
var case3 = /(?:ETYPEID):[ ]*(\d+(?:\s*,\s*\d+)*)/i;
var case3j = /(?:装備タイプID):[ ]*(\d+(?:\s*,\s*\d+)*)/i;
var case4 = /(?:CONDITION):[ ]*(.+)/i;
var case4j = /(?:追加条件):[ ]*(.+)/i;
var case5 = /(?:ATYPEID):[ ]*(\d+(?:\s*,\s*\d+)*)/i;
var case5j = /(?:防具タイプID):[ ]*(\d+(?:\s*,\s*\d+)*)/i;
var datas = sepdata.split(';');
for (var i = 0; i < datas.length; i++) {
var data = datas[i];
if (data.match(case1) || data.match(case1j)) {
var wtypeIds = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']');
skill.required.wtypeIds.addExceptForDup(wtypeIds);
} else if(data.match(case2) || data.match(case2j)) {
skill.required.logic = String(RegExp.$1);
} else if (data.match(case3) || data.match(case3j)) {
var etypeIds = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']');
etypeIds.forEach( function(etypeId) {
skill.required.etypeIds.push(etypeId);
});
} else if(data.match(case4) || data.match(case4j)) {
skill.required.condition = String(RegExp.$1);
} else if (data.match(case5) || data.match(case5j)) {
var atypeIds = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']');
atypeIds.forEach( function(atypeId) {
skill.required.atypeIds.push(atypeId);
});
}
}
}
};
//=============================================================================
// Game_Actor
//=============================================================================
//書き換え
Game_Actor.prototype.isSkillWtypeOk = function(skill) {
var sreq = skill.required;
var logicOks = sreq.wtypeIds.filter( function(item) {
return item > 0 && this.isWtypeEquipped(item);
},this);
return this.isLogicOk(sreq.wtypeIds, logicOks, sreq.logic);
};
Game_Actor.prototype.isSkillEtypeOk = function(skill) {
var sreq = skill.required;
if (!sreq.etypeIds.length) return true;
var logicOks = sreq.etypeIds.filter( function(item) {
return item && item > 0 && this.isEtypeEquipped(item);
},this);
return this.isLogicOk(sreq.etypeIds, logicOks, sreq.logic);
};
Game_Actor.prototype.isSkillAtypeOk = function(skill) {
var sreq = skill.required;
if (!sreq.atypeIds.length) return true;
var logicOks = sreq.atypeIds.filter( function(item) {
return item && item > 0 && this.isAtypeEquipped(item);
},this);
return this.isLogicOk(sreq.atypeIds, logicOks, sreq.logic);
};
Game_Actor.prototype.isLogicOk = function(items, logicOks, logic) {
switch (true) {
case (/(?:nor)/i).test(logic):
return items.length && !logicOks.length;
case (/(?:or)/i).test(logic):
return !items.length || logicOks.length;
case (/(?:nand)/i).test(logic):
return items.length !== logicOks.length;
case (/(?:and)/i).test(logic):
return items.length == logicOks.length;
}
return false;
};
Game_Actor.prototype.isEtypeEquipped = function(etypeId) {
var items = this.equips();
for (var i = 0; i < items.length ; i++) {
if (DataManager.isWeapon(items[i]) && items[i].etypeId === etypeId ) return true;
if (DataManager.isArmor(items[i]) && items[i].etypeId === etypeId ) return true;
}
return false;
};
Game_Actor.prototype.isAtypeEquipped = function(atypeId) {
var items = this.armors();
for (var i = 0; i < items.length ; i++) {
if (items[i].atypeId === atypeId ) return true;
}
return false;
};
Game_Actor.prototype.isSkillRequiredParamOk = function(skill) {
return this.evalEirFormula(skill.required.condition, skill);
};
Game_Actor.prototype.evalEirFormula = function(formula, item) {
FTKR.setGameData(this, null, item);
return !formula ? true : FTKR.evalFormula(formula);
};
//=============================================================================
// Game_BattlerBase
//=============================================================================
FTKR.EIR.Game_BattlerBase_meetsSkillConditions =
Game_BattlerBase.prototype.meetsSkillConditions;
Game_BattlerBase.prototype.meetsSkillConditions = function(skill) {
return FTKR.EIR.Game_BattlerBase_meetsSkillConditions.call(this, skill) &&
this.isSkillRequiredParamOk(skill) && this.isSkillEtypeOk(skill) && this.isSkillAtypeOk(skill);
};
Game_BattlerBase.prototype.isSkillRequiredParamOk = function(skill) {
return true;
};
Game_BattlerBase.prototype.isSkillEtypeOk = function(skill) {
return true;
};
Game_BattlerBase.prototype.isSkillAtypeOk = function(skill) {
return true;
};
FTKR.EIR.Game_BattlerBase_meetsItemConditions =
Game_BattlerBase.prototype.meetsItemConditions;
Game_BattlerBase.prototype.meetsItemConditions = function(item) {
return FTKR.EIR.Game_BattlerBase_meetsItemConditions.call(this, item) &&
this.isSkillWtypeOk(item) &&
this.isSkillRequiredParamOk(item) &&
this.isSkillEtypeOk(item) && this.isSkillAtypeOk(item);
};