//============================================================================= // Yanfly Engine Plugins - Skill Core Extension - Skill Cost Items // YEP_X_SkillCostItems.js //============================================================================= var Imported = Imported || {}; Imported.YEP_X_SkillCostItems = true; var Yanfly = Yanfly || {}; Yanfly.SCI = Yanfly.SCI || {}; Yanfly.SCI.version = 1.03; //============================================================================= /*: * @plugindesc v1.03 技能消耗物品☁️ * @author Yanfly Engine Plugins * * @param ---全局--- * @default * * @param Cost Style * @text 费用样式 * @desc How do you want the costs to appear? * 0 - None 1 - Amount Over Icon 2 - Amount Then Icon * @default 2 * * @param Font Size * @text 字体大小 * @desc Font size used for item costs. * Default: 28 * @default 20 * * @param Amount Format * @text 数量格式 * @desc How do you wish to display the amount cost? * %1 - Need %2 - Owned * @default ×%1 * * @param Amount Y Buffer * @text Y缓冲区数量 * @desc The Y Buffer amount used to display the cost. * @default 4 * * @param ---计量表--- * @default * * @param Gauge Color 1 * @text 计量颜色1 * @desc The text color used for item gauges. * @default 13 * * @param Gauge Color 2 * @text 计量颜色2 * @desc The text color used for item gauges. * @default 5 * * @param Display Name * @text 显示名称 * @desc Display the Item Name by default for the gauge? * NO - false YES - true * @default true * * @param Text Color * @text 文本颜色 * @desc Text color of the gauge name displayed. * Default: 16 * @default 16 * * @help * ============================================================================ * Introduction * ============================================================================ * * 这个插件需要YEP_SkillCore,确保它在YEP_SkillCore下面 * * 你可以设置技能消耗物品。物品消耗将会显示下次使用技能需要的物品图标 * 和数量。物品消耗可以用这个插件来设置并且可以设置替代品 * * ============================================================================ * Notetags * ============================================================================ * * 为了能够让技能消耗物品,你需要用下面的标签 * * 技能注释: * * * * 设置消耗的物品、武器或者装备,需要数量为y。 * 如果你使用了YEP_ItemCore,独立物品不可以被消耗。 * 如果你使用了多个标签,技能需要消耗所有的东西 * * * * * 如果你想要使用物品名字取代,你可以使用这个标签。 * 技能需要x数量的物品。如果你有相同名字物品,优先使用ID最高的。 * 如果你使用了YEP_ItemCore,独立物品不可以被消耗。 * 如果你使用了多个标签,技能需要消耗所有的东西 * * 技能, 武器, 防具, 状态注释: * * * * 显示队伍拥有物品数量的物品槽。优先按照下面顺序: * 武器、装备、状态、职业、敌人 * * * * * 如果你想使用名字,可以用这个标签。显示队伍拥有物品数量的物品槽。 * 如果你有重名物品,则优先用ID最高的。优先按照下面顺序: * 武器、装备、 状态、职业、敌人 * * 主角, 技能, 武器, 防具, 状态注释: * * * * * * * 增加或者减少物品、武器或装备消耗。如果物品不被需要,则这个不会生效。 * * * * * 如果你想使用名字,则用这个标签。增加或者减少物品、武器或装备消耗。 * 如果物品不被需要,则这个不会生效。 * 如果你有重名物品,则优先用ID最高的。 * * * * * 改变物品、武器、装备消耗y%。如果物品不被需要,则不会生效。 * * * * * 如果你想使用名字,则用这个标签。改变物品、武器、装备消耗x%。 * 如果物品不被需要,则这个不会生效。 * 如果你有重名物品,则优先用ID最高的。 * * * 类型可以是物品、武器或则装备。这个让你改变消耗用的类型。 * 替代优先顺序是状态、武器、装备、职业,然后是角色 * * * * * 如果你想使用名字,则用这个标签。这个让你改变消耗用的类型。 * 替代优先顺序是状态、武器、装备、职业,然后是角色。 * 如果你有重名物品,则优先用ID最高的。 * * Item, Weapon, Armor Notetags: * * * 如果物品有显示槽,可以改变显示槽颜色 * * * 如果物品有显示槽,可以改变显示槽文本 * * * 如果物品有显示槽,可以改变显示槽文本颜色 * * ============================================================================ * Lunatic Mode - Custom Item Costs * ============================================================================ * * For those with a bit of JavaScript knowledge, you can create dynamic item * costs for your skills using the following notetags: * * Skill Notetags: * * * cost = user.level; * * Replace 'type' with either 'item', 'weapon', or 'armor' to change the type * and x as the ID of that item type. The 'cost' variable determines how much * of the required item type is needed as the cost. * * * cost = user.level; * * For those who prefer to use names instead, replace 'name' with the name of * the item to be used as the cost. The 'cost' variable determines how much * of the named item is needed as the cost. If you have multiple items in * your database with the same name, priority will be given to the item with * the highest ID in the order of items, weapons, and armors. * * ============================================================================ * Changelog * ============================================================================ * * Version 1.03: * - Lunatic Mode fail safes added. * * Version 1.02: * - Updated for RPG Maker MV version 1.1.0. * * Version 1.01: * - Fixed a bug that would display the wrong cost amount for multiple items. * - Shifted item icon cost 2 pixels down to match the skill icon Y level. * * Version 1.00: * - Finished Plugin! */ //============================================================================= if (Imported.YEP_SkillCore) { //============================================================================= // Parameter Variables //============================================================================= Yanfly.Parameters = PluginManager.parameters('YEP_X_SkillCostItems'); Yanfly.Param = Yanfly.Param || {}; Yanfly.Param.SCICostStyle = Number(Yanfly.Parameters['Cost Style']); Yanfly.Param.SCIFontSize = Number(Yanfly.Parameters['Font Size']); Yanfly.Param.SCIAmountFmt = String(Yanfly.Parameters['Amount Format']); Yanfly.Param.SCIYBuffer = Number(Yanfly.Parameters['Amount Y Buffer']); Yanfly.Param.SCIGauge1 = Number(Yanfly.Parameters['Gauge Color 1']); Yanfly.Param.SCIGauge2 = Number(Yanfly.Parameters['Gauge Color 2']); Yanfly.Param.SCIDisplayName = eval(String(Yanfly.Parameters['Display Name'])); Yanfly.Param.SCIDisplayColor = Number(Yanfly.Parameters['Text Color']); //============================================================================= // DataManager //============================================================================= Yanfly.SCI.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!Yanfly.SCI.DataManager_isDatabaseLoaded.call(this)) return false; if (!Yanfly._loaded_YEP_X_SkillCostItems) { this.processSCINotetagsI($dataItems); this.processSCINotetagsW($dataWeapons); this.processSCINotetagsA($dataArmors); this.processSCINotetags1($dataSkills); this.processSCINotetags2($dataActors); this.processSCINotetags2($dataClasses); this.processSCINotetags2($dataEnemies); this.processSCINotetags2($dataWeapons); this.processSCINotetags2($dataArmors); this.processSCINotetags2($dataStates); this.processSCINotetags3($dataItems); this.processSCINotetags3($dataWeapons); this.processSCINotetags3($dataArmors); Yanfly._loaded_YEP_X_SkillCostItems = true; } return true; }; DataManager.processSCINotetagsI = function(group) { if (Yanfly.ItemIdRef) return; Yanfly.ItemIdRef = {}; for (var n = 1; n < group.length; n++) { var obj = group[n]; if (obj.name.length <= 0) continue; Yanfly.ItemIdRef[obj.name.toUpperCase()] = n; } }; DataManager.processSCINotetagsW = function(group) { if (Yanfly.WeaponIdRef) return; Yanfly.WeaponIdRef = {}; for (var n = 1; n < group.length; n++) { var obj = group[n]; if (obj.name.length <= 0) continue; Yanfly.WeaponIdRef[obj.name.toUpperCase()] = n; } }; DataManager.processSCINotetagsA = function(group) { if (Yanfly.ArmorIdRef) return; Yanfly.ArmorIdRef = {}; for (var n = 1; n < group.length; n++) { var obj = group[n]; if (obj.name.length <= 0) continue; Yanfly.ArmorIdRef[obj.name.toUpperCase()] = n; } }; DataManager.processSCINotetags1 = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.useItemCost = []; obj.useWeaponCost = []; obj.useArmorCost = []; var evalMode = 'none'; var evalLine = ''; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(//i)) { var item = $dataItems[parseInt(RegExp.$1)]; var cost = parseInt(RegExp.$2); this.processSCIObjItemCost(obj, item, cost, ''); } else if (line.match(//i)) { var item = $dataWeapons[parseInt(RegExp.$1)]; var cost = parseInt(RegExp.$2); this.processSCIObjItemCost(obj, item, cost, ''); } else if (line.match(//i)) { var item = $dataArmors[parseInt(RegExp.$1)]; var cost = parseInt(RegExp.$2); this.processSCIObjItemCost(obj, item, cost, ''); } else if (line.match(//i)) { var cost = parseInt(RegExp.$1); var name = String(RegExp.$2).toUpperCase(); if (Yanfly.ItemIdRef[name]) { var id = Yanfly.ItemIdRef[name]; var item = $dataItems[id]; } else if (Yanfly.WeaponIdRef[name]) { var id = Yanfly.WeaponIdRef[name]; var item = $dataWeapons[id]; } else if (Yanfly.ArmorIdRef[name]) { var id = Yanfly.ArmorIdRef[name]; var item = $dataArmors[id]; } else { continue; } this.processSCIObjItemCost(obj, item, cost, ''); } else if (line.match(//i)) { evalMode = 'custom item cost'; evalLine = ''; } else if (line.match(/<\/CUSTOM ITEM[ ](\d+)[ ]COST>/i)) { var item = $dataItems[parseInt(RegExp.$1)]; this.processSCIObjItemCost(obj, item, 0, evalLine); evalMode = 'none'; evalLine = ''; } else if (line.match(//i)) { evalMode = 'custom item cost'; evalLine = ''; } else if (line.match(/<\/CUSTOM WEAPON[ ](\d+)[ ]COST>/i)) { var item = $dataWeapons[parseInt(RegExp.$1)]; this.processSCIObjItemCost(obj, item, 0, evalLine); evalMode = 'none'; evalLine = ''; } else if (line.match(//i)) { evalMode = 'custom item cost'; evalLine = ''; } else if (line.match(/<\/CUSTOM ARMOR[ ](\d+)[ ]COST>/i)) { var item = $dataArmors[parseInt(RegExp.$1)]; this.processSCIObjItemCost(obj, item, 0, evalLine); evalMode = 'none'; evalLine = ''; } else if (line.match(//i)) { evalMode = 'custom item cost'; evalLine = ''; } else if (line.match(/<\/CUSTOM ITEM COST:[ ](.*)>/i)) { var name = String(RegExp.$1).toUpperCase(); if (Yanfly.ItemIdRef[name]) { var id = Yanfly.ItemIdRef[name]; var item = $dataItems[id]; } else if (Yanfly.WeaponIdRef[name]) { var id = Yanfly.WeaponIdRef[name]; var item = $dataWeapons[id]; } else if (Yanfly.ArmorIdRef[name]) { var id = Yanfly.ArmorIdRef[name]; var item = $dataArmors[id]; } else { evalMode = 'none'; evalLine = ''; continue; } this.processSCIObjItemCost(obj, item, 0, evalLine); evalMode = 'none'; evalLine = ''; } else if (evalMode === 'custom item cost') { evalLine = evalLine + line + '\n'; } } } }; DataManager.processSCIObjItemCost = function(obj, item, cost, code) { if (!item) return; if (Imported.YEP_ItemCore && this.isIndependent(item)) return; var arr = [item.id, cost, code]; if (this.isItem(item)) { obj.useItemCost.push(arr); } else if (this.isWeapon(item)) { obj.useWeaponCost.push(arr); } else if (this.isArmor(item)) { obj.useArmorCost.push(arr); } }; DataManager.processSCINotetags2 = function(group) { var note1 = /<(?:SWAP GAUGE|gauge)[ ](\d+):[ ](.*)>/i; var note2 = /<(?:SWAP GAUGE ICON|swap gauge icon)[ ](\d+):[ ](.*)>/i; var noteR1 = //i; var noteR2 = //i; for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.itemGaugeColor1 = Yanfly.Param.SCIGauge1 obj.itemGaugeColor2 = Yanfly.Param.SCIGauge2 obj.useItemCostSet = {}; obj.useWeaponCostSet = {}; obj.useArmorCostSet = {}; obj.useItemCostRate = {}; obj.useWeaponCostRate = {}; obj.useArmorCostRate = {}; obj.replaceItemCost = {}; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(note1)) { var gauge = parseInt(RegExp.$1); var text = String(RegExp.$2).toUpperCase(); if (text.match(/(?:ITEM|WEAPON|ARMOR)[ ](\d+)/i)) { if (gauge === 1) obj.gauge1 = text; if (gauge === 2) obj.gauge2 = text; if (gauge === 3) obj.gauge3 = text; } else if (text.match(/(?:ITEM|WEAPON|ARMOR)[ ](.*)/i)) { var name = String(RegExp.$1).toUpperCase(); if (Yanfly.ItemIdRef[name]) { var id = Yanfly.ItemIdRef[name]; } else if (Yanfly.WeaponIdRef[name]) { var id = Yanfly.WeaponIdRef[name]; } else if (Yanfly.ArmorIdRef[name]) { var id = Yanfly.ArmorIdRef[name]; } var text = 'ITEM ' + id; if (gauge === 1) obj.gauge1 = text; if (gauge === 2) obj.gauge2 = text; if (gauge === 3) obj.gauge3 = text; } } else if (line.match(note2)) { var gauge = parseInt(RegExp.$1); var icon = parseInt(RegExp.$2); if (gauge === 1) obj.gaugeIcon1 = icon; if (gauge === 2) obj.gaugeIcon2 = icon; if (gauge === 3) obj.gaugeIcon3 = icon; } else if (line.match(//i)) { obj.useItemCostSet[parseInt(RegExp.$1)] = parseInt(RegExp.$2); } else if (line.match(//i)) { obj.useWeaponCostSet[parseInt(RegExp.$1)] = parseInt(RegExp.$2); } else if (line.match(//i)) { obj.useArmorCostSet[parseInt(RegExp.$1)] = parseInt(RegExp.$2); } else if (line.match(//i)) { var value = parseFloat(RegExp.$2) * 0.01; obj.useItemCostRate[parseInt(RegExp.$1)] = value; } else if (line.match(//i)) { var value = parseFloat(RegExp.$2) * 0.01; obj.useWeaponCostRate[parseInt(RegExp.$1)] = value; } else if (line.match(//i)) { var value = parseFloat(RegExp.$2) * 0.01; obj.useArmorCostRate[parseInt(RegExp.$1)] = value; } else if (line.match(//i)) { var value = parseInt(RegExp.$1); var name = String(RegExp.$2).toUpperCase(); if (Yanfly.ItemIdRef[name]) { var id = Yanfly.ItemIdRef[name]; obj.useItemCostSet[id] = value; } else if (Yanfly.WeaponIdRef[name]) { var id = Yanfly.WeaponIdRef[name]; obj.useWeaponCostSet[id] = value; } else if (Yanfly.ArmorIdRef[name]) { var id = Yanfly.ArmorIdRef[name]; obj.useArmorCostSet[id] = value; } } else if (line.match(//i)) { var value = parseFloat(RegExp.$1) * 0.01; var name = String(RegExp.$3).toUpperCase(); if (Yanfly.ItemIdRef[name]) { var id = Yanfly.ItemIdRef[name]; obj.useItemCostRate[id] = value; } else if (Yanfly.WeaponIdRef[name]) { var id = Yanfly.WeaponIdRef[name]; obj.useWeaponCostRate[id] = value; } else if (Yanfly.ArmorIdRef[name]) { var id = Yanfly.ArmorIdRef[name]; obj.useArmorCostRate[id] = value; } } else if (line.match(noteR1)) { var type1 = String(RegExp.$1).toUpperCase(); var id1 = parseInt(RegExp.$2); var type2 = String(RegExp.$3).toUpperCase(); var id2 = parseInt(RegExp.$4); if (!['ITEM', 'WEAPON', 'ARMOR'].contains(type1)) continue; if (!['ITEM', 'WEAPON', 'ARMOR'].contains(type2)) continue; obj.replaceItemCost[type1 + ' ' + id1] = type2 + ' ' + id2; } else if (line.match(noteR2)) { var name1 = String(RegExp.$1).toUpperCase(); var name2 = String(RegExp.$2).toUpperCase(); if (Yanfly.ItemIdRef[name1]) { var id = Yanfly.ItemIdRef[name1]; var type1 = 'ITEM ' + id; } else if (Yanfly.WeaponIdRef[name1]) { var id = Yanfly.WeaponIdRef[name1]; var type1 = 'WEAPON ' + id; } else if (Yanfly.ArmorIdRef[name1]) { var id = Yanfly.ArmorIdRef[name1]; var type1 = 'ARMOR ' + id; } else { continue; } if (Yanfly.ItemIdRef[name2]) { var id = Yanfly.ItemIdRef[name2]; var type2 = 'ITEM ' + id; } else if (Yanfly.WeaponIdRef[name2]) { var id = Yanfly.WeaponIdRef[name2]; var type2 = 'WEAPON ' + id; } else if (Yanfly.ArmorIdRef[name2]) { var id = Yanfly.ArmorIdRef[name2]; var type2 = 'ARMOR ' + id; } else { continue; } obj.replaceItemCost[type1] = type2; } } } }; DataManager.processSCINotetags3 = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.itemGaugeColor1 = Yanfly.Param.SCIGauge1 obj.itemGaugeColor2 = Yanfly.Param.SCIGauge2 obj.itemGaugeText = Yanfly.Param.SCIDisplayName ? obj.name : ''; obj.itemGaugeTextColor = Yanfly.Param.SCIDisplayColor; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(/<(?:ITEM GAUGE COLOR 1):[ ](\d+)>/i)) { obj.itemGaugeColor1 = parseInt(RegExp.$1); } else if (line.match(/<(?:ITEM GAUGE COLOR 2):[ ](\d+)>/i)) { obj.itemGaugeColor2 = parseInt(RegExp.$1); } else if (line.match(/<(?:ITEM GAUGE TEXT):[ ](.*)>/i)) { obj.itemGaugeText = String(RegExp.$1); } else if (line.match(/<(?:ITEM GAUGE TEXT COLOR):[ ](\d+)>/i)) { obj.itemGaugeTextColor = parseInt(RegExp.$1); } } } }; //============================================================================= // Game_BattlerBase //============================================================================= Yanfly.SCI.Game_BattlerBase_canPaySkillCost = Game_BattlerBase.prototype.canPaySkillCost; Game_BattlerBase.prototype.canPaySkillCost = function(skill) { if (!this.canPaySkillItemCost(skill)) return; return Yanfly.SCI.Game_BattlerBase_canPaySkillCost.call(this, skill); }; Game_BattlerBase.prototype.canPaySkillItemCost = function(skill) { return true; }; Game_BattlerBase.prototype.skillItemCost = function(skill) { return []; }; Game_BattlerBase.prototype.combineSkillItemCostEntries = function(array) { var objData = []; var amtData = []; for (var i = 0; i < array.length; ++i) { var obj = array[i][0]; var amt = array[i][1]; if (objData.contains(obj)) { var index = objData.indexOf(obj); amtData[index] += amt; amtData[index] = Math.floor(amtData[index]); amtData[index] = Math.max(0, amtData[index]); } else { objData.push(obj); amtData.push(amt); } } var data = []; for (var i = 0; i < objData.length; ++i) { data.push([objData[i], amtData[i]]); } return data; }; Game_BattlerBase.prototype.extractSkillItemCost = function(array, type) { var data = []; var max = array.length; for (var i = 0; i < max; ++i) { var id = array[i][0]; var cost = array[i][1]; var code = array[i][2]; if (type === 0) { var item = $dataItems[id]; } else if (type === 1) { var item = $dataWeapons[id]; } else if (type === 2) { var item = $dataArmors[id]; } else { continue; } if (!item) continue; cost = this.applySkillItemCostEval(item, cost, code); cost = this.applySkillItemCostModifier(item, cost); item = this.applySkillItemReplace(item); data.push([item, cost]); } return data; }; Game_BattlerBase.prototype.applySkillItemCostEval = function(item, cost, code) { if (code === '') return cost; var a = this; var user = this; var subject = this; var s = $gameSwitches._data; var v = $gameVariables._data; try { eval(code); } catch (e) { Yanfly.Util.displayError(e, code, 'APPLY SKILL ITEM COST ERROR'); } return cost; }; Game_BattlerBase.prototype.applySkillItemCostModifier = function(item, cost) { cost *= this.getSkillItemCostRate(item); cost += this.getSkillItemCostSet(item); return Math.floor(Math.max(0, cost)); }; Game_BattlerBase.prototype.getSkillItemCostRate = function(item) { var rate = 1; var max = this.states().length; for (var i = 0; i < max; ++i) { var state = this.states()[i]; if (!state) continue; rate *= this.getSkillItemCostObjRate(item, state); } return rate; }; Game_BattlerBase.prototype.getSkillItemCostObjRate = function(item, obj) { if (!item) return 1; if (!obj) return 1; if (DataManager.isItem(item) && obj.useItemCostRate) { return obj.useItemCostRate[item.id] || 1; } else if (DataManager.isWeapon(item) && obj.useWeaponCostRate) { return obj.useWeaponCostRate[item.id] || 1; } else if (DataManager.isArmor(item) && obj.useArmorCostRate) { return obj.useArmorCostRate[item.id] || 1; } return 1; }; Game_BattlerBase.prototype.getSkillItemCostSet = function(item) { var bonus = 0; var max = this.states().length; for (var i = 0; i < max; ++i) { var state = this.states()[i]; if (!state) continue; bonus += this.getSkillItemCostObjSet(item, state); } return bonus; }; Game_BattlerBase.prototype.getSkillItemCostObjSet = function(item, obj) { if (!item) return 0; if (!obj) return 0; if (DataManager.isItem(item) && obj.useItemCostSet) { return obj.useItemCostSet[item.id] || 0; } else if (DataManager.isWeapon(item) && obj.useWeaponCostSet) { return obj.useWeaponCostSet[item.id] || 0; } else if (DataManager.isArmor(item) && obj.useArmorCostSet) { return obj.useArmorCostSet[item.id] || 0; } return 0; }; Yanfly.SCI.Game_BattlerBase_paySkillCost = Game_BattlerBase.prototype.paySkillCost; Game_BattlerBase.prototype.paySkillCost = function(skill) { Yanfly.SCI.Game_BattlerBase_paySkillCost.call(this, skill); this.paySkillItemCost(skill); }; Game_BattlerBase.prototype.paySkillItemCost = function(skill) { var array = this.skillItemCost(skill); var max = array.length; for (var i = 0; i < max; ++i) { var item = array[i][0]; var cost = array[i][1]; this.payIndividualSkillItemCost(item, cost); } }; Game_BattlerBase.prototype.payIndividualSkillItemCost = function(item, cost) { }; Game_BattlerBase.prototype.numItems = function(item) { return $gameParty.maxItems(item); }; Game_BattlerBase.prototype.maxItems = function(item) { return $gameParty.maxItems(item); }; Game_BattlerBase.prototype.applySkillItemReplace = function(item) { var type = ''; if (DataManager.isItem(item)) type = 'ITEM ' + item.id; if (DataManager.isWeapon(item)) type = 'WEAPON ' + item.id; if (DataManager.isArmor(item)) type = 'ARMOR ' + item.id; var substitute = this.makeSkillItemReplace(type); return substitute || item; }; Game_BattlerBase.prototype.makeSkillItemReplace = function(type) { var max = this.states().length; for (var i = 0; i < max; ++i) { var state = this.states()[i]; if (state && this.hasSkillItemReplace(state, type)) { return this.getSkillItemReplace(state, type); } } return null; }; Game_BattlerBase.prototype.hasSkillItemReplace = function(obj, type) { if (obj.replaceItemCost) { return obj.replaceItemCost[type]; } return false; }; Game_BattlerBase.prototype.getSkillItemReplace = function(obj, type) { if (obj.replaceItemCost) { var text = obj.replaceItemCost[type]; if (text.match(/ITEM[ ](\d+)/i)) { return $dataItems[parseInt(RegExp.$1)]; } else if (text.match(/WEAPON[ ](\d+)/i)) { return $dataWeapons[parseInt(RegExp.$1)]; } else if (text.match(/ARMOR[ ](\d+)/i)) { return $dataArmors[parseInt(RegExp.$1)]; } } return null; }; //============================================================================= // Game_Actor //============================================================================= Game_Actor.prototype.canPaySkillItemCost = function(skill) { var array = this.skillItemCost(skill); var max = array.length; for (var i = 0; i < max; ++i) { var item = array[i][0]; var cost = array[i][1]; if (this.numItems(item) < cost) return false; } return Game_BattlerBase.prototype.canPaySkillItemCost.call(this, skill); }; Game_Actor.prototype.skillItemCost = function(skill) { var array = Game_BattlerBase.prototype.skillItemCost.call(this, skill); array = array.concat(this.extractSkillItemCost(skill.useItemCost, 0)); array = array.concat(this.extractSkillItemCost(skill.useWeaponCost, 1)); array = array.concat(this.extractSkillItemCost(skill.useArmorCost, 2)); array = this.combineSkillItemCostEntries(array); return array; }; Game_Actor.prototype.payIndividualSkillItemCost = function(item, cost) { $gameParty.loseItem(item, cost, false); }; Game_Actor.prototype.numItems = function(item) { return $gameParty.numItems(item); }; Game_Actor.prototype.maxItems = function(item) { return $gameParty.maxItems(item); }; Game_Actor.prototype.getSkillItemCostRate = function(item) { var rate = Game_Battler.prototype.getSkillItemCostRate.call(this, item); rate *= this.getSkillItemCostObjRate(item, this.actor()); rate *= this.getSkillItemCostObjRate(item, this.currentClass()); var max = this.equips().length; for (var i = 0; i < max; ++i) { var equip = this.equips()[i]; if (!equip) continue; rate *= this.getSkillItemCostObjRate(item, equip); } return rate; }; Game_Actor.prototype.getSkillItemCostSet = function(item) { var bonus = Game_Battler.prototype.getSkillItemCostSet.call(this, item); bonus += this.getSkillItemCostObjSet(item, this.actor()); bonus += this.getSkillItemCostObjSet(item, this.currentClass()); var max = this.equips().length; for (var i = 0; i < max; ++i) { var equip = this.equips()[i]; if (!equip) continue; bonus += this.getSkillItemCostObjSet(item, equip); } return bonus; }; Game_Actor.prototype.makeSkillItemReplace = function(type) { var state = Game_Battler.prototype.makeSkillItemReplace.call(this, type); if (state) return state; var max = this.equips().length; for (var i = 0; i < max; ++i) { var equip = this.equips()[i]; if (equip && this.hasSkillItemReplace(equip, type)) { return this.getSkillItemReplace(equip, type); } } if (this.hasSkillItemReplace(this.currentClass(), type)) { return this.getSkillItemReplace(this.currentClass(), type); } if (this.hasSkillItemReplace(this.actor(), type)) { return this.getSkillItemReplace(this.actor(), type); } return null; }; //============================================================================= // Window_Base //============================================================================= Yanfly.SCI.Window_Base_drawActorHp = Window_Base.prototype.drawActorHp; Window_Base.prototype.drawActorHp = function(actor, x, y, width) { if (actor.gauge1().match(/(?:ITEM|WEAPON|ARMOR)[ ](\d+)/i)) { this.drawItemGaugeSwap(actor, 1, x, y, width); } else { Yanfly.SCI.Window_Base_drawActorHp.call(this, actor, x, y, width); } }; Yanfly.SCI.Window_Base_drawActorMp = Window_Base.prototype.drawActorMp; Window_Base.prototype.drawActorMp = function(actor, x, y, width) { if (actor.gauge2().match(/(?:ITEM|WEAPON|ARMOR)[ ](\d+)/i)) { this.drawItemGaugeSwap(actor, 2, x, y, width); } else { Yanfly.SCI.Window_Base_drawActorMp.call(this, actor, x, y, width); } }; Yanfly.SCI.Window_Base_drawActorTp = Window_Base.prototype.drawActorTp; Window_Base.prototype.drawActorTp = function(actor, x, y, width) { if (actor.gauge3().match(/(?:ITEM|WEAPON|ARMOR)[ ](\d+)/i)) { this.drawItemGaugeSwap(actor, 3, x, y, width); } else { Yanfly.SCI.Window_Base_drawActorTp.call(this, actor, x, y, width); } }; Window_Base.prototype.drawItemGaugeSwap = function(actor, id, wx, wy, ww) { ww = ww || 186; if (id === 1) text = actor.gauge1(); if (id === 2) text = actor.gauge2(); if (id === 3) text = actor.gauge3(); if (text.match(/ITEM[ ](\d+)/i)) { var item = $dataItems[parseInt(RegExp.$1)]; } else if (text.match(/WEAPON[ ](\d+)/i)) { var item = $dataWeapons[parseInt(RegExp.$1)]; } else if (text.match(/ARMOR[ ](\d+)/i)) { var item = $dataArmors[parseInt(RegExp.$1)]; } var icon = item.iconIndex; if (id === 1 && actor.gaugeIcon1() > 0) icon = actor.gaugeIcon1(); if (id === 2 && actor.gaugeIcon2() > 0) icon = actor.gaugeIcon2(); if (id === 3 && actor.gaugeIcon3() > 0) icon = actor.gaugeIcon3(); this.drawItemGaugeMain(actor, item, wx, wy, ww); var iw = this.drawItemGaugeIcon(icon, wx, wy); wx += iw; ww -= iw; var size = this.contents.fontSize; this.drawItemGaugeName(actor, item, wx, wy, ww); this.contents.fontSize = size; var cur = actor.numItems(item); var max = actor.maxItems(item); var color = this.normalColor(); this.drawCurrentAndMax(cur, max, wx, wy, ww, color, color); }; Window_Base.prototype.drawItemGaugeName = function(actor, item, wx, wy, ww) { ww -= this.textWidth(Yanfly.Util.toGroup(actor.numItems(item))); ww -= this.textWidth(Yanfly.Util.toGroup(actor.maxItems(item))); ww -= this.textWidth('/'); var text = item.itemGaugeText; for (;;) { var nameWidth = this.textWidth(text); if (nameWidth > ww) { this.contents.fontSize -= 1; } else { break; } if (this.contents.fontSize < 1) break; } this.changeTextColor(this.textColor(item.itemGaugeTextColor)); this.drawText(text, wx, wy, ww); }; Window_Base.prototype.drawItemGaugeMain = function(actor, item, wx, wy, ww) { var color1 = this.textColor(item.itemGaugeColor1); var color2 = this.textColor(item.itemGaugeColor2); var rate = actor.numItems(item) / actor.maxItems(item); this.drawGauge(wx, wy, ww, rate, color1, color2); }; Window_Base.prototype.drawItemGaugeIcon = function(icon, wx, wy) { this.drawIcon(icon, wx, wy); return Window_Base._iconWidth + 4; }; //============================================================================= // Window_SkillList //============================================================================= Yanfly.SCI.Window_SkillList_drawTpCost = Window_SkillList.prototype.drawTpCost; Window_SkillList.prototype.drawTpCost = function(skill, wx, wy, dw) { dw = this.drawSkillItemCost(skill, wx, wy, dw); return Yanfly.SCI.Window_SkillList_drawTpCost.call(this, skill, wx, wy, dw); }; Window_SkillList.prototype.drawSkillItemCost = function(skill, wx, wy, dw) { if (Yanfly.Param.SCICostStyle === 0) return dw; var array = this._actor.skillItemCost(skill); var max = array.length; if (max <= 0) return dw; this.contents.fontSize = Yanfly.Param.SCIFontSize; dw -= 2; for (var i = 0; i < max; ++i) { var arr = array[max - i - 1]; var item = arr[0]; var cost = arr[1]; dw = this.drawSoloItemCost(item, cost, wx, wy, dw); } var returnWidth = dw - Yanfly.Param.SCCCostPadding; this.resetFontSettings(); return returnWidth; }; Window_SkillList.prototype.drawSoloItemCost = function(item, cost, wx, wy, dw) { var x = wx + dw - Window_Base._iconWidth; this.drawIcon(item.iconIndex, x, wy + 2); var amt1 = Yanfly.Util.toGroup(cost); var amt2 = Yanfly.Util.toGroup(this._actor.numItems(item)); var fmt = Yanfly.Param.SCIAmountFmt; var text = fmt.format(amt1, amt2); if (Yanfly.Param.SCICostStyle === 1) { var iconWidth = Window_Base._iconWidth + 4; this.drawText(text, wx, wy + Yanfly.Param.SCIYBuffer, dw, 'right'); dw -= Math.max(iconWidth, this.textWidth(text)); } else if (Yanfly.Param.SCICostStyle === 2) { var iconWidth = Window_Base._iconWidth; dw -= iconWidth; this.drawText(text, wx, wy + Yanfly.Param.SCIYBuffer, dw, 'right'); dw -= this.textWidth(text); } return dw; }; //============================================================================= // Utilities //============================================================================= Yanfly.Util = Yanfly.Util || {}; if (!Yanfly.Util.toGroup) { Yanfly.Util.toGroup = function(inVal) { return inVal; } }; Yanfly.Util.displayError = function(e, code, message) { console.log(message); console.log(code || 'NON-EXISTENT'); console.error(e); if (Utils.isNwjs() && Utils.isOptionValid('test')) { if (!require('nw.gui').Window.get().isDevToolsOpen()) { require('nw.gui').Window.get().showDevTools(); } } }; //============================================================================= // End of File //============================================================================= };