//=============================================================================
// アイテムとスキルの使用効果を拡張するプラグイン
// FTKR_ExItemConfig_Effect.js
// プラグインNo : 19
// 作成者 : フトコロ
// 作成日 : 2017/04/14
// 最終更新日 : 2019/05/08
// バージョン : v1.2.1
//=============================================================================
var Imported = Imported || {};
Imported.FTKR_EIE = true;
var FTKR = FTKR || {};
FTKR.EIE = FTKR.EIE || {};
//=============================================================================
/*:
* @plugindesc v1.2.1 アイテムとスキルの使用効果を拡張するプラグイン
* @author フトコロ
*
* @help
*-----------------------------------------------------------------------------
* 概要
*-----------------------------------------------------------------------------
* 本プラグインを実装することで、アイテムやスキルの使用効果を
* より詳細に設定できます。
*
* 1. 使用効果の対象を変更できます。
*
* 2. 使用効果の効果量にJS計算式が使用できます。
*
* 3. 使用効果を発生させるための有効条件を設定できます。
*
*
*-----------------------------------------------------------------------------
* 設定方法
*-----------------------------------------------------------------------------
* 1.「プラグインマネージャー(プラグイン管理)」に、本プラグインを追加して
* ください。
*
* 2. 本プラグインは、FTKR_SkillExpansion.jsと組み合わせて使用できません。
*
* 3. YEP_BattleEngineCore.jsと組み合わせて使用する場合は、
* 本プラグインを、YEP_BattleEngineCore.jsよりも下に配置してください。
*
*
*-----------------------------------------------------------------------------
* 使用効果の設定
*-----------------------------------------------------------------------------
* アイテムおよびスキルのメモ欄に以下のノートタグを追記することで、
* 使用効果の設定を変更できます。
*
*
* code
*
* :使用効果のId x に対して code部で記述した設定を反映します。
* :使用効果のIDは、使用効果欄に設定した順番に上から 0, 1,...となります。
*
*
* [code に使用できる項目]
* Target: y
* 対象: y
* :使用効果の対象を、y に変えることができます。
* :y に使用できるコードは以下の通りです。
* : user or 使用者 - 使用者を対象にする
* : randomFriends or 味方ランダム - 味方からランダムで1体選択
* : randomOpponents or 敵ランダム - 敵からランダムで1体選択
*
* Value1: eval
* 内容1: 計算式
* :使用効果の内容1を 計算式(eval) で設定した値に変更します。
* :内容1は、使用効果で1つめに設定した数値です。
* : 例) HP回復の場合、% で設定する値
*
* Value2: eval
* 内容2: 計算式
* :使用効果の内容2を 計算式(eval) で設定した値に変更します。
* :内容2は、使用効果で2つめに設定した数値です。
* : 例) HP回復の場合、+ で設定する値
*
* Enabled: eval
* 有効条件: 計算式
* :対象の使用効果ID を 計算式(eval) で設定した条件で有効に
* :します。設定しない場合は、常に有効です。
* :有効になっていない場合は、効果が発生しません。
*
*
* [計算式(eval)の値について]
* 計算式は、ダメージ計算式のように、計算式を入力することで、固定値以外の値を
* 使用することができます。以下のコードを使用できます。負の値入力可。
* a.param - 使用者のパラメータを参照します。(a.atk で使用者の攻撃力)
* b.param - 対象のパラメータを参照します。(b.def で対象の防御力)
* s[x] - スイッチID x の状態を参照します。
* v[x] - 変数ID x の値を参照します。
* iv[x] - アイテムのセルフ変数ID x の値を参照します。(*1)
* result - スキル・アイテムを使用した結果を参照します。
* result.hpDamage でHPダメージ量を取得します。
*
* (*1) セルフ変数を使用する場合は、FTKR_ItemSelfVariables.jsが必要です。
*
*
* 設定例)
* 使用効果の1番目に「HP回復」を追加して、以下のタグを記入することで
* スイッチID1またはスイッチID2がONの時に、相手に与えたダメージの20%分、
* 使用者が回復する効果が発生します。
*
*
* 対象: user
* 内容1: 0
* 内容2: result.hpDamage * 0.2
* 有効条件: s[1] && s[2]
*
*
*
*-----------------------------------------------------------------------------
* 本プラグインのライセンスについて(License)
*-----------------------------------------------------------------------------
* 本プラグインはMITライセンスのもとで公開しています。
* This plugin is released under the MIT License.
*
* Copyright (c) 2017 Futokoro
* http://opensource.org/licenses/mit-license.php
*
*
*-----------------------------------------------------------------------------
* 変更来歴
*-----------------------------------------------------------------------------
*
* v1.2.1 - 2019/05/08 : 不具合修正
* 1. FTKR_ExStateEffectsの機能で追加した特徴の使用効果が正しく発動しない不具合修正。
*
* v1.2.0 - 2017/08/27 : 機能追加
* 1. コモンイベントに有効条件を設定する機能を追加。
*
* v1.1.1 - 2017/08/04 : 不要なコメント削除
*
* v1.1.0 - 2017/05/11 : 不具合修正、タグ変更、ヘルプ修正
*
* v1.0.1 - 2017/04/29 : FTKR_ItemSelfVariables の v1.1.0以降に対応
* 1. ダメージ量の参照用コードを変更。
*
* v1.0.0 - 2017/04/14 : 初版公開
*
*-----------------------------------------------------------------------------
*/
//=============================================================================
//=============================================================================
// プラグイン パラメータ
//=============================================================================
FTKR.EIE.parameters = PluginManager.parameters('FTKR_ExItemConfig_Effect');
//=============================================================================
// 自作関数(グローバル)
//=============================================================================
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;
}
};
}
//=============================================================================
// 自作関数(ローカル)
//=============================================================================
var readEntrapmentCodeToTextEx = function(obj, codeTitles) {
regs = convertEntrapmentRegArrayEx('EIC ', codeTitles);
var notedata = obj.note.split(/[\r\n]+/);
var setMode = 'none';
var results = [];
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (matchRegs(line, regs, 'start')) {
var data = {
id:RegExp.$1,
text:''
};
setMode = 'read';
} else if (matchRegs(line, regs, 'end')) {
setMode = 'none';
results.push(data);
} else if (setMode === 'read') {
data.text += line + ';';
}
}
return results;
};
var convertRegs = function(metacodes) {
return metacodes.map(function(metacode){
return new RegExp(metacode + ':[ ]*(.+)', 'i');
});
};
var convertEntrapmentRegArrayEx = function(header, codeTitles) {
return codeTitles.map(function(codeTitle) {
return {
start:new RegExp('<' + header + codeTitle + ':[ ]*(.+)>', 'i'),
end :new RegExp('<\/' + header + codeTitle + '>', 'i')
};
});
};
var matchRegs = function(data, regs, prop) {
return regs.some(function(reg){
return prop ? data.match(reg[prop]) : data.match(reg);
});
};
var matchTexts = function(data, texts, prop) {
return convertRegs(texts).some(function(reg){
return prop ? data.match(reg[prop]) : data.match(reg);
});
};
//=============================================================================
// DataManager
//=============================================================================
FTKR.EIE.DatabaseLoaded = false;
FTKR.EIE.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!FTKR.EIE.DataManager_isDatabaseLoaded.call(this)) return false;
if (!FTKR.EIE.DatabaseLoaded) {
this.eicEffectNotetags($dataSkills);
this.eicEffectNotetags($dataItems);
FTKR.EIE.DatabaseLoaded = true;
}
return true;
};
DataManager.eicEffectNotetags = function(group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
this.setEicEffectData(obj);
var datas = readEntrapmentCodeToTextEx(obj, ['使用効果', 'EFFECT']);
this.readEicEffectMetaDatas(obj, datas);
}
};
DataManager.setEicEffectData = function(obj) {
obj.effects.forEach( function(effect) {
effect.target = '';
effect.baseValue1 = effect.value1;
effect.baseValue2 = effect.value2;
effect.sepValue1 = '';
effect.sepValue2 = '';
effect.enabled = '';
});
};
DataManager.readEicEffectMetaDatas = function(obj, metaDatas) {
for (var t = 0; t < metaDatas.length; t++) {
var dataId = Number(metaDatas[t].id);
var datas = metaDatas[t].text.split(';');
for (var i = 0; i < datas.length; i++) {
var data = datas[i];
if (matchTexts(data, ['対象', 'TARGET'])) {
obj.effects[dataId].target = RegExp.$1;
} else if (matchTexts(data, ['内容1', 'VALUE1'])) {
obj.effects[dataId].sepValue1 = RegExp.$1;
} else if (matchTexts(data, ['内容2', 'VALUE2'])) {
obj.effects[dataId].sepValue2 = RegExp.$1;
} else if (matchTexts(data, ['有効条件', 'ENABLED'])) {
obj.effects[dataId].enabled = RegExp.$1;
}
}
}
};
//=============================================================================
// BattleManager
//=============================================================================
FTKR.EIE.BattleManager_invokeNormalAction = BattleManager.invokeNormalAction;
BattleManager.invokeNormalAction = function(subject, target) {
FTKR.EIE.BattleManager_invokeNormalAction.call(this, subject, target);
var effectTarget = this._action._targetSepEffect;
if(effectTarget) this._logWindow.displayActionSepResults(subject, effectTarget);
};
//=============================================================================
// Game_Action
//=============================================================================
var _EIE_Game_Action_initialize = Game_Action.prototype.initialize;
Game_Action.prototype.initialize = function(subject, forcing) {
_EIE_Game_Action_initialize.call(this, subject, forcing);
this._target = {};
this._targetSepEffect = null;
};
var _EIE_Game_Action_applyItemEffect = Game_Action.prototype.applyItemEffect;
Game_Action.prototype.applyItemEffect = function(target, effect) {
if (effect) {
target = this.changeTargetEffect(target, effect);
if (this.evalEffectEnabled(effect, target)) {
this.setSepEffectValue(effect);
_EIE_Game_Action_applyItemEffect.call(this, target, effect);
}
}
};
Game_Action.prototype.evalEffectEnabled = function(effect, target) {
FTKR.setGameData(this.subject(), target, this.item());
return !effect.enabled ? true: FTKR.evalFormula(effect.enabled);
};
Game_Action.prototype.changeTargetEffect = function(target, effect) {
this._target = target;
if (effect.target) {
switch (effect.target) {
case 'user':
case '使用者':
this._targetSepEffect = this.subject();
this._targetSepEffect.result().used = true;
return this._targetSepEffect;
case 'randomOpponents':
case '敵ランダム':
this._targetSepEffect = this.changeTargetForRandom(target.isEnemy());
this._targetSepEffect.result().used = true;
return this._targetSepEffect;
case 'randomFriends':
case '味方ランダム':
this._targetSepEffect = this.changeTargetForRandom(!target.isEnemy());
this._targetSepEffect.result().used = true;
return this._targetSepEffect;
}
}
return target;
};
Game_Action.prototype.changeTargetForRandom = function(isEnemy) {
return isEnemy ? $gameTroop.randomTarget() : $gameParty.randomTarget();
};
Game_Action.prototype.setSepEffectValue = function(effect) {
if (this.item()) {
FTKR.setGameData(this.subject(), this._target, this.item());
effect.value1 = this.setSepEffectValue1(effect);
effect.value2 = this.setSepEffectValue2(effect);
}
};
Game_Action.prototype.setSepEffectValue1 = function(effect) {
return effect.sepValue1 ? FTKR.evalFormula(effect.sepValue1) : effect.baseValue1;
};
Game_Action.prototype.setSepEffectValue2 = function(effect) {
return effect.sepValue2 ? FTKR.evalFormula(effect.sepValue2) : effect.baseValue2;
};
//書き換え
Game_Action.prototype.applyGlobal = function() {
if (Imported.YEP_BattleEngineCore && $gameParty.inBattle()) return;
this.item().effects.forEach(function(effect) {
if (effect.code === Game_Action.EFFECT_COMMON_EVENT && this.evalEffectEnabled(effect)) {
$gameTemp.reserveCommonEvent(effect.dataId);
}
}, this);
};
if (Imported.YEP_BattleEngineCore) {
BattleManager.actionActionCommonEvent = function() {
this._action.item().effects.forEach(function(effect) {
if (effect.code === Game_Action.EFFECT_COMMON_EVENT && this._action.evalEffectEnabled(effect)) {
$gameTemp.reserveCommonEvent(effect.dataId);
}
}, this);
return false;
};
}
//=============================================================================
// Window_BattleLog
//=============================================================================
Window_BattleLog.prototype.displayActionSepResults = function(subject, target) {
if (target.result().used) {
this.push('pushBaseLine');
this.displayCritical(target);
this.push('popupDamage', target);
this.displayDamage(target);
this.displayAffectedStatus(target);
this.displayFailure(target);
this.push('waitForNewLine');
this.push('popBaseLine');
}
};