//============================================================================= // Yanfly Engine Plugins - Item Core Extension - Item Requirements // YEP_X_ItemRequirements.js //============================================================================= var Imported = Imported || {}; Imported.YEP_X_ItemRequirements = true; var Yanfly = Yanfly || {}; Yanfly.ItemReq = Yanfly.ItemReq || {}; Yanfly.ItemReq.version = 1.01; //============================================================================= /*: * @plugindesc v1.01 物品使用限制★ * @author Yanfly Engine Plugins * * @help * ============================================================================ * 导言 * ============================================================================ * * 这个插件需要YEP\u ItemCore。确保此插件位于 * 是的,插件列表中有ItemCore。 * * 在RPG Maker MV中,默认情况下物品只有一些限制, * 不管他们是否能在战场上使用,或者永远不会使用。没有 * 您可以设置的任何其他条件,这些条件将决定 * 项目可以使用,也不能使用。这个插件提供了更多的方法来限制项目 * 使用基于开关、变量、使用它们的参与者、类、状态 * 要求,等等。 * * ============================================================================ * 便签 * ============================================================================ * * 使用以下NoteTag强制项目的要求,然后才可以 * 被使用。 * * 项目注释标签: * * * condition * condition * * - 将“条件”替换为所需的条件设置。您可以在notetag中插入任意数量的 * 条件。必须满足所有条件才能使用该物品。下面列出可以使用的可能条件。 * * --- * * 条件: * * --- * * Eval: code * - 将“code”替换为要对其运行检查以启用该项的JavaScript代码。 * 如果检查返回false,则无论其他条件如何,该项都将被禁用。 * * 示例: * Eval: $gameActors.actor(1).name() === 'Harold' * Eval: $gameActors.leader().name() !== 'Ralph' * * --- * * Actor: x * Actor: x, x, x * - 需要参与者ID“x”才能使用该项。如果参与者不是使用所述项目的人, * 则该项目被禁用,并且无论其他条件如何都不能使用。 * * Not Actor: x * Not Actor: x, x, x * - 要求使用该项的参与者不是参与者ID“x”。如果参与者的ID与列出的 * “x”之一匹配,则该项将被禁用,并且无论其他条件如何,都无法使用。 * * 例如: * Actor: 1 * Actor: 2, 3, 4, 5, 6 * Not Actor: 7 * Not Actor: 8, 9, 10 * * --- * * Armor: x * Armor: x, x, x * - 要求演员特别装备防具ID“x”来使用物品。如果使用多个“x”, * 演员可以装备其中任何一个。如果演员没有装备护甲“x”, * 那么该物品将被禁用,并且无论其他条件如何都不能使用。 * * Not Armor: x * Not Armor: x, x, x * - 要求演员没有装备护甲ID“x”来使用该物品。 * 如果使用了多个“x”,则演员不能装备其中任何一个。 * 如果演员装备了护甲“x”,那么该物品将被禁用, * 并且无论其他条件如何都不能使用。 * * 例如: * Armor: 1 * Armor: 2, 3, 4, 5, 6 * Not Armor: 7 * Not Armor: 8, 9, 10 * * --- * * Class: x * Class: x, x, x * - 需要ID为“x”的类才能使用该项。如果参与者的类与项要求不匹配, * 则该项将被禁用,并且无论其他条件如何都不能使用。 * * Not Class: x * Not Class: x, x, x * - 要求使用该项的参与者不是类ID“x”。如果参与者的类ID与列出的 * “x”之一匹配,则该项将被禁用,并且无论其他条件如何,都无法使用。 * * 例如: * Class: 1 * Class: 2, 3, 4, 5, 6 * Not Class: 7 * Not Class: 8, 9, 10 * * --- * * Subclass: x * Subclass: x, x, x * - 需要YEP\u X\u Subclass.js * - 需要子类ID“x”才能使用该项。如果参与者的类与项要求不匹配, * 则该项将被禁用,并且无论其他条件如何都不能使用。 * * Not Subclass: x * Not Subclass: x, x, x * - Requires YEP_X_Subclass.js * - 要求使用项的参与者不是子类ID“x”。如果参与者的子类ID与列出的 * “x”之一匹配,则该项将被禁用,并且无论其他条件如何,都无法使用。 * * 例如: * Subclass: 1 * Subclass: 2, 3, 4, 5, 6 * Not Subclass: 7 * Not Subclass: 8, 9, 10 * * --- * * Either Class: x * Either Class: x, x, x * - Requires YEP_X_Subclass.js * - Requires YEP_X_Subclass.js * - 参与者的主类或子类ID必须与“x”匹配。如果其中至少有一个匹配, * 则条件通过。否则,条件失败,项目被禁用,无论其他条件如何,都无法使用。 * * Neither Class: x * Neither Class: x, x, x * - Requires YEP_X_Subclass.js * - Requires YEP_X_Subclass.js * - 参与者的主类或子类ID必须与“x”不匹配。如果其中至少有一个匹配, * 则条件失败,并且该项被禁用,并且无论其他条件如何,都无法使用。 * * 例如: * Either Class: 1 * Either Class: 2, 3, 4, 5, 6 * Neither Class: 7 * Neither Class: 8, 9, 10 * * --- * * State: x * State: x, x, x * - 要求使用该项的参与者受状态“x”的影响。如果使用多个“x”, * 则参与者可能会受到其中任何一个的影响。如果参与者不受状态“x”的影响, * 则条件将失败,并且该项将被禁用,并且无论其他条件如何,都无法使用。 * * Not State: x * Not State: x, x, x * - 要求使用该项的参与者不受状态“x”的影响。如果使用了多个“x”, * 则参与者不会受到其中任何一个的影响。如果参与者不受状态“x”的影响, * 则条件将失败,并且该项将被禁用,并且无论其他条件如何,都无法使用。 * * 例如: * State: 10 * State: 11, 12, 13, 14, 15 * Not State: 16 * Not Stage: 17, 18, 19, 20 * * --- * * Switch Off: x * Switch Off: x, x, x * - 需要关闭开关x才能使用该项目。如果开关打开,则该项目被禁用,无论 * 其他条件如何,都无法使用。 * * 例如: * Switch Off: 1 * Switch Off: 2, 3, 4, 5, 6 * * --- * * Switch On: x * Switch On: x, x, x * - 需要先打开开关x,然后才能使用该项。 * 如果开关关闭,则该项目将被禁用,并且无论其他条件如何,都无法使用。 * * 例如: * Switch On: 1 * Switch On: 2, 3, 4, 5, 6 * * --- * * Variable x eval * - 检查变量x。将“x”替换为整数值,“eval”替换为要对其运行的代码检查。 * * 例如: * Variable 1 >= 5 * Variable 2 < 6 * Variable 3 === 7 * Variable 4 !== 8 * * --- * * Weapon: x * Weapon: x, x, x * - 要求演员特别装备武器ID“x”来使用物品。如果使用多个“x”,演员可以 * 装备其中任何一个。如果演员没有装备武器“x”,那么该物品将被禁用, * 并且无论其他条件如何都不能使用。 * * Not Weapon: x * Not Weapon: x, x, x * - 要求演员没有装备武器ID“x”来使用物品。 * 如果使用了多个“x”,则演员不能装备其中任何一个。 * 如果演员装备了武器“x”,那么该物品将被禁用,并且 * 无论其他条件如何都不能使用。 * * 例如: * Weapon: 1 * Weapon: 2, 3, 4, 5, 6 * Not Weapon: 7 * Not Weapon: 8, 9, 10 * * --- * * Weapon Type: x * Weapon Type: x, x, x * - 要求演员装备“x”型武器。如果使用多个“x”,演员可以装备 * 任何一种“x”武器。如果参与者没有匹配的武器类型,那么该物品 * 将被禁用,并且无论其他条件如何都不能使用。 * * Not Weapon Type: x * Not Weapon Type: x, x, x * - 要求演员没有装备“x”型武器。如果使用了多个“x”,演员就不能 * 装备任何“x”类武器。如果参与者确实拥有匹配的武器类型,那么该物品 * 将被禁用,并且无论其他条件如何都不能使用。 * * 例如: * Weapon Type: 1 * Weapon Type: 2, 3, 4, 5, 6 * Not Weapon Type: 7 * Not Weapon Type: 8, 9, 10 * * ============================================================================ * 疯狂模式-自定义启用要求 * ============================================================================ * * For those with JavaScript experience, you can create your own custom * requirements for whether or not items can be used using the following * notetag setup: * * Item Notetags: * * * condition = battler.level >= item.price; * * - The 'condition' variable will determine whether or not the item will be * enabled/disabled. If the 'condition' variable returns true, then the item * is enabled provided all other conditions (if any) are also met. Otherwise, * the item is disabled and cannot be used. The 'battler' variable will refer * to the battler using the item. The 'item' variable will refer to the item * being checked. * * ============================================================================ * Changelog * ============================================================================ * * Version 1.01: * - Updated for RPG Maker MV version 1.5.0. * * Version 1.00: * - Finished Plugin! */ //============================================================================= if (Imported.YEP_ItemCore) { //============================================================================= // DataManager //============================================================================= Yanfly.ItemReq.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!Yanfly.ItemReq.DataManager_isDatabaseLoaded.call(this)) return false; if (!Yanfly._loaded_YEP_X_ItemRequirements) { this.processItemRequirementsNotetags1($dataItems); Yanfly._loaded_YEP_X_ItemRequirements = true; } return true; }; DataManager.processItemRequirementsNotetags1 = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.itemRequirements = []; var evalMode = 'none'; obj.customItemRequirements = ''; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(//i)) { evalMode = 'enable requirements'; } else if (line.match(/<\/ENABLE (?:REQUIREMENT|REQUIREMENTS)>/i)) { evalMode = 'none'; } else if (evalMode === 'enable requirements') { obj.itemRequirements.push(line); } else if (line.match(//i)) { evalMode = 'custom enable requirements'; } else if (line.match(/<\/CUSTOM ENABLE (?:REQUIREMENT|REQUIREMENTS)>/i)) { evalMode = 'none'; } else if (evalMode === 'custom enable requirements') { obj.customItemRequirements += line + '\n'; } } } }; //============================================================================= // Game_BattlerBase //============================================================================= Yanfly.ItemReq.Game_BattlerBase_mIC = Game_BattlerBase.prototype.meetsItemConditions; Game_BattlerBase.prototype.meetsItemConditions = function(item) { if (!Yanfly.ItemReq.Game_BattlerBase_mIC.call(this, item)) { return false; } return ItemManager.meetsUsableItemRequirements(item, this); }; //============================================================================= // Game_Actor //============================================================================= Game_Actor.prototype.isAtypeEquipped = function(atypeId) { return this.armors().some(function(armor) { return armor.atypeId === atypeId; }); }; //============================================================================= // ItemManager //============================================================================= ItemManager.meetsUsableItemRequirements = function(item, battler) { if (!item) return false; if (!item.itemRequirements) { var baseItem = DataManager.getBaseItem(item); item.itemRequirements = JsonEx.makeDeepCopy(baseItem.itemRequirements); } var length = item.itemRequirements.length; if ($gameParty.inBattle()) var battler = this.battleSubject() || battler; for (var i = 0; i < length; ++i) { var line = item.itemRequirements[i]; if (!line) continue; if (!this.checkUsableItemRequirement(line, item, battler)) return false; } if (item.customItemRequirements && item.customItemRequirements.length >= 1) { if (!this.checkCustomUsableItemRequirement(item, battler)) return false; } return true; }; ItemManager.battleSubject = function() { return BattleManager.actor() || BattleManager._subject; }; ItemManager.checkUsableItemRequirement = function(line, item, battler) { // EVAL if (line.match(/EVAL:(.*)/i)) { var code = String(RegExp.$1); return this.usableItemRequirementEval(code); } // NOT ACTOR if (line.match(/NOT ACTOR:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementActor(data, battler, false); } // ACTOR if (line.match(/ACTOR:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementActor(data, battler, true); } // NOT ARMOR TYPE if (line.match(/NOT ARMOR TYPE:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementAtype(data, battler, false); } // ARMOR TYPE if (line.match(/ARMOR TYPE:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementAtype(data, battler, true); } // NOT ARMOR if (line.match(/NOT ARMOR:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementArmor(data, battler, false); } // ARMOR if (line.match(/ARMOR:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementArmor(data, battler, true); } if (Imported.YEP_X_Subclass) { // NOT SUBCLASS if (line.match(/NOT SUBCLASS:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementSubclass(data, battler, false); } // SUBCLASS if (line.match(/SUBCLASS:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementSubclass(data, battler, true); } // EITHER CLASS if (line.match(/EITHER CLASS:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementDuoClass(data, battler, true); } // NEITHER CLASS if (line.match(/NEITHER CLASS:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementDuoClass(data, battler, false); } } // NOT CLASS if (line.match(/NOT CLASS:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementClass(data, battler, false); } // CLASS if (line.match(/CLASS:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementClass(data, battler, true); } // NOT STATE if (line.match(/NOT STATE:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementState(data, battler, false); } // STATE if (line.match(/STATE:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementState(data, battler, true); } // NOT WEAPON TYPE if (line.match(/NOT WEAPON TYPE:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementWtype(data, battler, false); } // WEAPON TYPE if (line.match(/WEAPON TYPE:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementWtype(data, battler, true); } // NOT WEAPON if (line.match(/NOT WEAPON:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementWeapon(data, battler, false); } // WEAPON if (line.match(/WEAPON:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementWeapon(data, battler, true); } // SWITCH OFF if (line.match(/SWITCH OFF:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementSwitch(data, false); } // SWITCH ON if (line.match(/SWITCH ON:(.*)/i)) { var data = String(RegExp.$1); return this.usableItemRequirementSwitch(data, true); } // VARIABLE if (line.match(/VARIABLE[ ](\d+)[ ](.*)/i)) { var variableId = parseInt(RegExp.$1); var code = String(RegExp.$2); return this.usableItemRequirementVariable(variableId, code); } return true; }; ItemManager.usableItemRequirementEval = function(code) { var value = false; try { eval(code); } catch (e) { Yanfly.Util.displayError(e, code, 'CUSTOM ITEM USE EVAL CODE ERROR'); } return value; }; ItemManager.usableItemRequirementActor = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var actorId = parseInt(array[i].trim()); if (battler.actorId() === actorId) return condition; } return !condition; }; ItemManager.usableItemRequirementClass = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var classId = parseInt(array[i].trim()); if (battler._classId === classId) return condition; } return !condition; }; ItemManager.usableItemRequirementDuoClass = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var classId = parseInt(array[i].trim()); var subclassId = parseInt(array[i].trim()); if (battler._classId === classId || battler._subclassId === subclassId) { return condition; } } return !condition; }; ItemManager.usableItemRequirementSubclass = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var subclassId = parseInt(array[i].trim()); if (battler._subclassId === subclassId) return condition; } return !condition; }; ItemManager.usableItemRequirementState = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var stateId = parseInt(array[i].trim()); var state = $dataStates[stateId]; if (battler.states().contains(state)) return condition; } return !condition; }; ItemManager.usableItemRequirementWtype = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var id = parseInt(array[i].trim()); if (battler.isWtypeEquipped(id)) return condition; } return !condition; }; ItemManager.usableItemRequirementWeapon = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var id = parseInt(array[i].trim()); var equip = $dataWeapons[id]; if (battler.hasWeapon(equip)) return condition; } return !condition; }; ItemManager.usableItemRequirementAtype = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var id = parseInt(array[i].trim()); if (battler.isAtypeEquipped(id)) return condition; } return !condition; }; ItemManager.usableItemRequirementArmor = function(data, battler, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var id = parseInt(array[i].trim()); var equip = $dataArmors[id]; if (battler.hasArmor(equip)) return condition; } return !condition; }; ItemManager.usableItemRequirementSwitch = function(data, condition) { var array = data.split(','); var length = array.length; for (var i = 0; i < length; ++i) { var switchId = parseInt(array[i].trim()); if ($gameSwitches.value(switchId) !== condition) return false; } return true; }; ItemManager.usableItemRequirementVariable = function(variableId, code) { return eval('$gameVariables.value(variableId) ' + code); }; ItemManager.checkCustomUsableItemRequirement = function(item, battler) { var condition = false; var user = battler; var a = battler; var b = battler; var target = battler; var subject = battler; var s = $gameSwitches._data; var v = $gameVariables._data; var code = item.customItemRequirements; try { eval(code); } catch (e) { Yanfly.Util.displayError(e, code, 'CUSTOM ITEM USE REQUIREMENT CODE ERROR'); } return condition; }; //============================================================================= // Utilities //============================================================================= Yanfly.Util = Yanfly.Util || {}; 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 //============================================================================= } else { var text = '================================================================\n'; text += 'YEP_X_ItemRequirements requires YEP_ItemCore to be at the '; text += 'latest version to run properly.\n\nPlease go to www.yanfly.moe and '; text += 'update to the latest version for the YEP_ItemCore plugin.\n'; text += '================================================================\n'; console.log(text); require('nw.gui').Window.get().showDevTools(); } // // Imported.YEP_ItemCore