//============================================================================= // アイテムやスキルの基本設定を拡張するプラグイン // FTKR_ExItemConfig_ItemBasic.js // プラグインNo : 17 // 作成者 : フトコロ // 作成日 : 2017/04/14 // 最終更新日 : 2018/04/16 // バージョン : v1.1.2 //============================================================================= var Imported = Imported || {}; Imported.FTKR_IEP = true; var FTKR = FTKR || {}; FTKR.IEP = FTKR.IEP || {}; //============================================================================= /*: * @plugindesc v1.1.2 アイテムやスキルの基本設定を拡張するプラグイン * @author フトコロ * * @help *----------------------------------------------------------------------------- * 概要 *----------------------------------------------------------------------------- * 本プラグインを実装することで、アイテム(武器・防具含む)やスキルに、 * 以下の仕様を追加します。 * * 1. 事前に複数の設定(名前、アイコン、説明文)を登録し、 * ゲーム内で条件付けで表示を変えることができます。 * * 2. アイテム・武器・防具の場合、価格も設定できます。 * * 3. アイテム・スキルの場合、使用可能時も設定できます。 * * *----------------------------------------------------------------------------- * 設定方法 *----------------------------------------------------------------------------- * 1.「プラグインマネージャー(プラグイン管理)」に、本プラグインを追加して * ください。 * * 2. FTKR_ItemSelfVariables.js と併用する場合は、本プラグインは、 * FTKR_ItemSelfVariables.jsよりも下の位置になるように追加してください。 * * 3. 本プラグインは、FTKR_SkillExpansion.jsと組み合わせて使用できません。 * * *----------------------------------------------------------------------------- * 基本設定の変更 *----------------------------------------------------------------------------- * アイテム(武器・防具含む)やスキルに以下のノートタグを追記することで、 * 一つのアイテム・スキルに対して複数の基本設定を登録することができます。 * * データベース上の設定は、データID0 に登録されます。 * データID0は、他のIDの有効条件が満たない場合に適用します。 * * ********************************************************************** * 注意:データIDを追加する場合は、必ずID1 から順番に追加してください。 * ********************************************************************** * * * code * * * または * * * code * * :データID x に対して code部の設定を登録します。 * * [code部で設定できる項目] * 有効条件: 計算式 * enabled: eval * :データID x の有効条件を 計算式(eval) で設定します。 * :有効条件が複数のIDで重なった場合は、IDが大きい方を適用します。 * :有効条件を設定しない場合、常に有効になります。 * * 以下のcodeは、設定しなかった場合、データベース上の設定を適用します。 * 名前: アイテム名 * name: ITEMNAME * :アイテム・スキルの名前を'アイテム名(ITEMNAME)'に変更します。 * * アイコン: y * icon: y * :アイコンIDを y に変更します。 * * 説明: 説明文 * desc: DESCRIPTION * :アイテムの説明を'説明文(DESCRIPTION)'に変更します。 * :制御文字を使用できます。 * :二つ設定することで、説明文を2行に表示できます。 * * <アイテム・武器・防具用> * 価格: 計算式 * price: eval * :アイテムの価格を 計算式(eval) で設定した値に変更します。 * * <アイテム・スキル用> * 使用可能時: 状況 * used: CONDITION * :使用可能時の設定を'状況'に変更します。 * :'状況(CONDITION)'には以下の文字または数字を入力します。 * : 常時(0), バトル画面(1), メニュー画面(2), 使用不可(3) * * * [計算式(eval) の値について] * 計算式(eval)は、ダメージ計算式のように、計算式を入力することで、 * 固定値以外の値を使用することができます。以下のコードを使用できます。 * a.param - アクターのパラメータを参照します(スキルの場合のみ)。 * s[x] - スイッチID x の状態を参照します。 * v[x] - 変数ID x の値を参照します。 * iv[x] - アイテムのセルフ変数ID x の値を参照します。(*1) * * (*1) セルフ変数を使用する場合は、FTKR_ItemSelfVariables.jsが必要です。 * * * 入力例) * アイテムのセルフ変数ID1 が O の時にアイテムの設定を変える場合の設定。 * 鑑定イベント等を作成し、アイテムのセルフ変数ID1を 0 以外に変えると * アイテム本来の表示になります。 * * * 有効条件: !iv[1] * 名前: 何かのアイテム * アイコン: 160 * 説明: 何に使えるか不明なアイテム。 * 説明: 鑑定するまで使用できない。 * 使用可能時: 使用不可 * * * *----------------------------------------------------------------------------- * 本プラグインのライセンスについて(License) *----------------------------------------------------------------------------- * 本プラグインはMITライセンスのもとで公開しています。 * This plugin is released under the MIT License. * * Copyright (c) 2017,2018 Futokoro * http://opensource.org/licenses/mit-license.php * * *----------------------------------------------------------------------------- * 変更来歴 *----------------------------------------------------------------------------- * * v1.1.2 - 2018/04/16 : 仕様変更 * 1. 他プラグインとの競合回避のため、関数名を変更。 * * v1.1.1 - 2018/03/09 : 不具合修正 * 1. ヘルプの計算式の説明で、アクターのパラメータ参照方法の記述を修正。 * 2. アクターのパラメータを条件に設定しても説明欄に反映されない不具合を修正。 * * v1.1.0 - 2017/04/29 : 機能追加 * 1. スキルにも適用できるように変更。 * 2. FTKR_ItemSelfVariables の v1.1.0以降に対応。 * * v1.0.0 - 2017/04/14 : 初版作成 * *----------------------------------------------------------------------------- */ //============================================================================= (function(){ //============================================================================= // プラグイン パラメータ //============================================================================= FTKR.IEP.parameters = PluginManager.parameters('FTKR_ExItemConfig_ItemBasic'); //============================================================================= // 自作関数(グローバル) //============================================================================= 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')) { // console.log(regs); var data = { id:RegExp.$1, text:'' }; setMode = 'read'; } else if (matchRegs(line, regs, 'end')) { setMode = 'none'; results.push(data); } else if (setMode === 'read') { // console.log(line); data.text += line + ';'; } } return results; }; var convertTextToReg = function(text, header, footer) { header = header || ''; footer = footer || ''; return new RegExp(header + text + ':[ ]*(.+)' + footer, 'i'); }; var convertRegs = function(metacodes) { return metacodes.map(function(metacode){ return convertTextToReg(metacode); }); }; 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); }); }; //============================================================================= // メタデータの読み取り //============================================================================= var _IEP_DatabaseLoaded = false; var _IEP_DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!_IEP_DataManager_isDatabaseLoaded.call(this)) return false; if (!_IEP_DatabaseLoaded) { this.iepDataNotetags($dataItems); this.iepDataNotetags($dataWeapons); this.iepDataNotetags($dataArmors); this.iepDataNotetags($dataSkills); _IEP_DatabaseLoaded = true; } return true; }; DataManager.iepDataNotetags = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; obj.iepDatas = []; this.setIepData(obj); var datas = readEntrapmentCodeToTextEx(obj, ['基本設定', 'BASIC']); // if (datas.length) console.log(datas); this.readIepMetaDatas(obj, datas); } }; DataManager.setIepData = function(obj, dataId) { dataId = dataId || 0; if (!obj.iepDatas[dataId]) obj.iepDatas[dataId] = {}; obj.iepDatas[dataId] = { name :obj.name, iconIndex :obj.iconIndex, description :obj.description, enabled :true, }; if (obj.hasOwnProperty('price')) { obj.iepDatas[dataId].price = obj.price; } if (obj.hasOwnProperty('occasion')) { obj.iepDatas[dataId].occasion = obj.occasion; } }; DataManager.readIepMetaDatas = function(obj, metaDatas) { for (var t = 0; t < metaDatas.length; t++) { var dataId = Number(metaDatas[t].id); var datas = metaDatas[t].text.split(';'); this.setIepData(obj, dataId); var desc = ''; for (var i = 0; i < datas.length; i++) { var data = datas[i]; if (matchTexts(data, ['有効条件', 'ENABLED'])) { obj.iepDatas[dataId].enabled = RegExp.$1; } else if (matchTexts(data, ['名前', 'NAME'])) { obj.iepDatas[dataId].name = RegExp.$1; } else if (matchTexts(data, ['アイコン', 'ICON'])) { obj.iepDatas[dataId].iconIndex = Number(RegExp.$1); } else if (obj.hasOwnProperty('price') && matchTexts(data, ['価格', 'PRICE']) ) { obj.iepDatas[dataId].price = RegExp.$1; } else if (obj.hasOwnProperty('occasion') && matchTexts(data, ['使用可能時', 'USED']) ) { obj.iepDatas[dataId].occasion = this.occasion(RegExp.$1); } else if (matchTexts(data, ['説明', 'DESC'])) { desc += RegExp.$1 + '\r\n'; } } if (desc) obj.iepDatas[dataId].description = desc; } }; DataManager.occasion = function(value) { switch(value) { case '常時': case '0': return 0; case 'バトル画面': case '1': return 1; case 'メニュー画面': case '2': return 2; case '使用不可': case '3': default: return 3; } }; //============================================================================= // アイテムデータの取得 //============================================================================= DataManager.evalEnabledFormula = function(formula) { if (!formula) return true; return FTKR.evalFormula(formula); }; DataManager.itemIepData = function(item, subject, target) { FTKR.setGameData(subject, target, item); var iepDatas = item.iepDatas.filter( function(data) { return this.evalEnabledFormula(data.enabled); },this); return iepDatas.pop(); }; DataManager.itemIepPrice = function(item) { FTKR.setGameData(null, null, item); return Number(this.evalEnabledFormula(this.itemIepData(item).price)); }; Window_Base.prototype.itemIepData = function(item) { var actor = this._actor ? this._actor : null; return DataManager.itemIepData(item, actor); }; Window_Base.prototype.ftItemName = function(item) { return !!item ? this.itemIepData(item).name : ''; }; Window_Base.prototype.ftItemIcon = function(item) { return !!item ? this.itemIepData(item).iconIndex : 0; }; Window_Base.prototype.ftItemDesc = function(item) { return !!item ? this.itemIepData(item).description : ''; }; //============================================================================= // アイテムの使用可能時の修正 //============================================================================= var _IEP_Game_BattlerBase_isOccasionOk = Game_BattlerBase.prototype.isOccasionOk; Game_BattlerBase.prototype.isOccasionOk = function(item) { if (item.iepDatas) { var iepItem = DataManager.itemIepData(item, this); if ($gameParty.inBattle()) { return iepItem.occasion === 0 || iepItem.occasion === 1; } else { return iepItem.occasion === 0 || iepItem.occasion === 2; } } else { return _IEP_Game_BattlerBase_isOccasionOk.call(this, item); } }; //============================================================================= // アイテムの名前・アイコン表示の修正 //============================================================================= var _IEP_Window_Base_drawItemName = Window_Base.prototype.drawItemName; Window_Base.prototype.drawItemName = function(item, x, y, width) { width = width || 312; if (item && item.iepDatas) { var iw = Window_Base._iconWidth + 4; this.resetTextColor(); this.drawIcon(this.ftItemIcon(item), x + 2, y + 2); this.drawText(this.ftItemName(item), x + iw, y, width - iw); } else { _IEP_Window_Base_drawItemName.call(this, item, x, y, width); } }; //============================================================================= // アイテムの価格の修正 //============================================================================= Window_Base.prototype.itemIepPrice = function(item) { return DataManager.itemIepPrice(item); }; //書き換え Window_ShopBuy.prototype.makeItemList = function() { this._data = []; this._price = []; this._shopGoods.forEach(function(goods) { var item = null; switch (goods[0]) { case 0: item = $dataItems[goods[1]]; break; case 1: item = $dataWeapons[goods[1]]; break; case 2: item = $dataArmors[goods[1]]; break; } if (item) { this._data.push(item); this._price.push(goods[2] === 0 ? this.itemIepPrice(item) : goods[3]); } }, this); }; //書き換え Window_ShopSell.prototype.isEnabled = function(item) { return item && this.itemIepPrice(item) > 0; }; //書き換え Scene_Shop.prototype.sellingPrice = function() { return Math.floor(DataManager.itemIepPrice(this._item) / 2); }; //============================================================================= // アイテムの説明表示の修正 //============================================================================= var _IEP_Scene_Skill_refreshActor = Scene_Skill.prototype.refreshActor; Scene_Skill.prototype.refreshActor = function() { _IEP_Scene_Skill_refreshActor.call(this); this._helpWindow.setActor(this.actor()); }; var _IEP_Window_Help_setItem = Window_Help.prototype.setItem; Window_Help.prototype.setItem = function(item) { if (item && item.iepDatas) { this.setText(this.ftItemDesc(item)); } else { _IEP_Window_Help_setItem.call(this, item); } }; Window_Help.prototype.setActor = function(actor) { if (this._actor !== actor) { this._actor = actor; this.refresh(); } }; })();