//=============================================================================
// スキルの消費コストを拡張するプラグイン
// FTKR_ExItemConfig_IB_SkillCost.js
// プラグインNo : 31
// 作成者 : フトコロ
// 作成日 : 2017/04/30
// 最終更新日 :
// バージョン : v1.0.0
//=============================================================================
var Imported = Imported || {};
Imported.FTKR_IEP_SC = true;
var FTKR = FTKR || {};
FTKR.IEP = FTKR.IEP || {};
FTKR.IEP.SC = FTKR.IEP.SC || {};
//=============================================================================
/*:
* @plugindesc v1.0.0 スキルの消費コストを拡張するプラグイン
* @author フトコロ
*
* @param Draw All Cost
* @desc スキルのすべてのコストを表示するか。
* 0 - 表示しない, 1 - 表示する
* @default 0
*
* @param HP Cost Format
* @desc HPコストの表示内容を文字列で記述します。
* %1 - HPコスト
* @default \c[21]%1\}HP\{
*
* @param MP Cost Format
* @desc MPコストの表示内容を文字列で記述します。
* %1 - MPコスト
* @default \c[23]%1\}MP\{
*
* @param TP Cost Format
* @desc TPコストの表示内容を文字列で記述します。
* %1 - TPコスト
* @default \c[29]%1\}TP\{
*
* @help
*-----------------------------------------------------------------------------
* 概要
*-----------------------------------------------------------------------------
* 本プラグインを実装することで、スキルの消費コストをより詳細に設定できます。
*
* 本プラグインは、FTKR_ExItemConfig_ItemBasic.jsの拡張プラグインです。
*
*
*-----------------------------------------------------------------------------
* 設定方法
*-----------------------------------------------------------------------------
* 1.「プラグインマネージャー(プラグイン管理)」に、本プラグインを追加して
* ください。
*
* 2. 本プラグインには、FTKR_ExItemConfig_ItemBasic.js が必要です。
*
* 3. 本プラグインは、FTKR_SkillExpansion.jsと組み合わせて使用できません。
*
*
*-----------------------------------------------------------------------------
* 使用条件の設定
*-----------------------------------------------------------------------------
* スキルに以下のノートタグを追記することで、消費コストの設定ができます。
* 消費コストはFTKR_ExItemConfig_ItemBasic.jsのデータID毎に設定できます。
*
*
* code
*
* :データID x に対して code部の設定を登録します。
*
* [code に使用できる項目]
* Mp: eval
* :消費MPを eval で設定した値に変更します。
* Tp: eval
* :消費TPを eval で設定した値に変更します。
* Hp: eval
* :消費HPを eval で設定した値にします。
*
*
* [計算式(eval) の値について]
* 計算式(eval)は、ダメージ計算式のように、計算式を入力することで、
* 固定値以外の値を使用することができます。以下のコードを使用できます。
* a.param - 使用者のパラメータを参照します。(a.atk で使用者の攻撃力)
* s[x] - スイッチID x の状態を参照します。
* v[x] - 変数ID x の値を参照します。
* iv[x] - アイテムのセルフ変数ID x の値を参照します。(*1)
*
* (*1) セルフ変数を使用する場合は、FTKR_ItemSelfVariables.jsが必要です。
*
*
* 入力例)
* 使用者の現在MPと現在TPをすべて消費する。
* ただし、最低1は必要とする。
*
* Mp: Math.max(a.mp, 1)
* Tp: Math.max(a.tp, 1)
*
*
*
*-----------------------------------------------------------------------------
* 本プラグインのライセンスについて(License)
*-----------------------------------------------------------------------------
* 本プラグインはMITライセンスのもとで公開しています。
* This plugin is released under the MIT License.
*
* Copyright (c) 2017 Futokoro
* http://opensource.org/licenses/mit-license.php
*
*
*-----------------------------------------------------------------------------
* 変更来歴
*-----------------------------------------------------------------------------
*
* v1.0.0 - 2017/04/30 : 初版公開
*
*-----------------------------------------------------------------------------
*/
//=============================================================================
if (Imported.FTKR_IEP) {
//=============================================================================
// プラグイン パラメータ
//=============================================================================
FTKR.IEP.SC.parameters = PluginManager.parameters('FTKR_ExItemConfig_IB_SkillCost');
FTKR.IEP.SC.drawAllCost = Number(FTKR.IEP.SC.parameters['Draw All Cost'] || 0);
FTKR.IEP.SC.format = {
hpCost:String(FTKR.IEP.SC.parameters['HP Cost Format'] || ''),
mpCost:String(FTKR.IEP.SC.parameters['MP Cost Format'] || ''),
tpCost:String(FTKR.IEP.SC.parameters['TP Cost Format'] || ''),
};
//=============================================================================
// 自作関数(グローバル)
//=============================================================================
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);
});
};
//=============================================================================
// メタデータの読み取り
//=============================================================================
FTKR.IEP.SC.DatabaseLoaded = false;
FTKR.IEP.SC.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!FTKR.IEP.SC.DataManager_isDatabaseLoaded.call(this)) return false;
if (!FTKR.IEP.SC.DatabaseLoaded) {
this.iepDataCostNotetags($dataSkills);
FTKR.IEP.SC.DatabaseLoaded = true;
}
return true;
};
DataManager.iepDataCostNotetags = function(group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
this.setIepCostData(obj);
var datas = readEntrapmentCodeToTextEx(obj, ['コスト', 'COST']);
this.readIepCostMetaDatas(obj, datas);
}
};
DataManager.setIepCostData = function(obj, dataId) {
dataId = dataId || 0;
obj.iepDatas[dataId].cost = {
hp : 0,
mp : obj.mpCost,
tp : obj.tpCost,
};
};
DataManager.readIepCostMetaDatas = function(obj, metaDatas) {
for (var t = 0; t < metaDatas.length; t++) {
var dataId = Number(metaDatas[t].id);
var datas = metaDatas[t].text.split(';');
this.setIepCostData(obj, dataId);
for (var i = 0; i < datas.length; i++) {
var data = datas[i];
if (matchTexts(data, ['HP'])) {
obj.iepDatas[dataId].cost.hp = RegExp.$1;
} else if (matchTexts(data, ['MP'])) {
obj.iepDatas[dataId].cost.mp = RegExp.$1;
} else if (matchTexts(data, ['TP'])) {
obj.iepDatas[dataId].cost.tp = RegExp.$1;
}
}
}
};
//=============================================================================
// コストの取得
//=============================================================================
Game_BattlerBase.prototype.skillIepCost = function(skill, prop) {
var iepSkill = DataManager.itemIepData(skill, this);
FTKR.setGameData(this, null, skill);
return Math.max(Math.floor(FTKR.evalFormula(iepSkill.cost[prop])), 0);
};
//=============================================================================
// コストの消費処理の修正
//=============================================================================
FTKR.IEP.SC.Game_BattlerBase_canPaySkillCost = Game_BattlerBase.prototype.canPaySkillCost;
Game_BattlerBase.prototype.canPaySkillCost = function(skill) {
return this._hp >= this.skillHpCost(skill) &&
FTKR.IEP.SC.Game_BattlerBase_canPaySkillCost.call(this, skill);
};
FTKR.IEP.SC.Game_BattlerBase_paySkillCost = Game_BattlerBase.prototype.paySkillCost;
Game_BattlerBase.prototype.paySkillCost = function(skill) {
this._hp -= this.skillHpCost(skill);
FTKR.IEP.SC.Game_BattlerBase_paySkillCost.call(this, skill);
};
FTKR.IEP.SC.Game_BattlerBase_skillMpCost = Game_BattlerBase.prototype.skillMpCost;
Game_BattlerBase.prototype.skillMpCost = function(skill) {
if (skill.iepDatas) {
return this.skillIepCost(skill, 'mp') * this.mcr;
} else {
return FTKR.IEP.SC.Game_BattlerBase_skillMpCost.call(this, skill);
}
};
FTKR.IEP.SC.Game_BattlerBase_skillTpCost = Game_BattlerBase.prototype.skillTpCost;
Game_BattlerBase.prototype.skillTpCost = function(skill) {
if (skill.iepDatas) {
return this.skillIepCost(skill, 'tp');
} else {
return FTKR.IEP.SC.Game_BattlerBase_skillTpCost.call(this, skill);
}
};
Game_BattlerBase.prototype.skillHpCost = function(skill) {
return skill.iepDatas ? this.skillIepCost(skill, 'hp') : 0;
};
//=============================================================================
// スキルのコスト表示の修正
//=============================================================================
FTKR.IEP.SC.Window_SkillList_drawItem = Window_SkillList.prototype.drawItem;
Window_SkillList.prototype.drawItem = function(index) {
if (FTKR.IEP.SC.drawAllCost) {
var skill = this._data[index];
if (skill) {
var rect = this.itemRect(index);
rect.width -= this.textPadding();
this.changePaintOpacity(this.isEnabled(skill));
var len = this.drawSepSkillCost(skill, rect.x, rect.y, rect.width);
this.drawItemName(skill, rect.x, rect.y, rect.width - len);
this.changePaintOpacity(1);
}
} else {
FTKR.IEP.SC.Window_SkillList_drawItem.call(this, index);
}
};
Window_SkillList.prototype.drawSepSkillCost = function(skill, x, y, width) {
var dx = x + width - this.costWidth();
var len = this.costWidth();
var samlen = 0;
if (this._actor.skillMpCost(skill) > 0) {
var param3 = [this._actor.skillMpCost(skill)];
this.drawFormatTextEx(FTKR.IEP.SC.format.mpCost, dx, y, param3);
dx -= len;
samlen += len;
}
if (this._actor.skillTpCost(skill) > 0) {
var param2 = [this._actor.skillTpCost(skill)];
this.drawFormatTextEx(FTKR.IEP.SC.format.tpCost, dx, y, param2);
dx -= len;
samlen += len;
}
if (this._actor.skillHpCost(skill) > 0) {
var param1 = [this._actor.skillHpCost(skill)];
this.drawFormatTextEx(FTKR.IEP.SC.format.hpCost, dx, y, param1);
samlen += len;
}
return samlen;
};
// 制御文字を使えるフォーマットテキスト描画関数
Window_SkillList.prototype.drawFormatTextEx = function(fmt, x, y, params) {
var text = fmt.format(params[0], params[1], params[2], params[3], params[4]);
return this.drawTextEx(text, x, y);
};
FTKR.IEP.SC.Window_SkillList_drawSkillCost = Window_SkillList.prototype.drawSkillCost;
Window_SkillList.prototype.drawSkillCost = function(skill, x, y, width) {
if (this._actor.skillHpCost(skill) > 0) {
this.changeTextColor(this.textColor(21));
this.drawText(this._actor.skillHpCost(skill), x, y, width, 'right');
} else {
FTKR.IEP.SC.Window_SkillList_drawSkillCost.call(this, skill, x, y, width);
}
};
}//END