DoubleX RMMV Equip Prerequisites
#1
DoubleX RMMV Equip Prerequisites

Version: v1.01g

Introduction

* Lets users add various prerequisites for equipments to actors

Prerequisites

* Some Javascript coding proficiency to fully utilize this plugin

Script

Code:
/*============================================================================

 *    ## Plugin Info                                                          
 *----------------------------------------------------------------------------
 *    # Plugin Name                                                           
 *      DoubleX RMMV Equip Prerequisites                                      
 *----------------------------------------------------------------------------
 *    # Terms Of Use                                                          
 *      You shall keep this plugin's Plugin Info part's contents intact       
 *      You shalln't claim that this plugin's written by anyone other than    
 *      DoubleX or his aliases                                                
 *      None of the above applies to DoubleX or his aliases                   
 *----------------------------------------------------------------------------
 *    # Prerequisites                                                         
 *      Abilities:                                                            
 *      1. Some Javascript coding proficiency to fully utilize this plugin    
 *----------------------------------------------------------------------------
 *    # Links                                                                 
 *      This plugin:                                                          
 *      1. http://pastebin.com/6TetJ6dH                                       
*      Mentioned Patreon Supporters:
*      https://www.patreon.com/posts/71738797
 *----------------------------------------------------------------------------
 *    # Author                                                                
 *      DoubleX                                                               
 *----------------------------------------------------------------------------
 *    # Changelog                                                             
 *      v1.01g(GMT 0100 18-1-2016):                                           
 *      1. <stat req: stat, operator, val> only support battler getters       
 *      2. Fixed Number is not a function bug                                 
 *      v1.01f(GMT 0300 17-1-2016):                                           
 *      1. Fixed undefined variable req bug                                   
 *      2. Exposed this plugin's equip manipulation plugin calls              
 *      3. Increased this plugin's compactness, compatibility and readability
 *      v1.01e(GMT 1200 24-11-2015):                                          
 *      1. Fixed unsupported arrow function in ES5 bug                        
 *      2. The extended functions can be accessed by other custom plugins now
 *      3. Notetags with invalid operators will log message on console instead
 *      4. Increased this plugin's readability and robustness                 
 *      v1.01d(GMT 1600 6-11-2015):                                           
 *      1. Simplified the notetag reading mechanisms                          
 *      2. Fixed some typos                                                   
 *      v1.01c(GMT 1200 5-11-2015):                                           
 *      1. Fixed undefined this under DoubleX_RMMV.Equip_Prerequisites bug    
 *      v1.01b(GMT 0000 5-11-2015):                                           
 *      1. Fixed failing to load notetags due to nil data bug                 
 *      v1.01a(GMT 1000 4-11-2015):                                           
 *      1. Added <no weapon req: id>, <no armor req: id> and <weapon req: id>
 *         notetags                                                           
 *      2. Fixed several logic and syntax errors                              
 *      3. Increased this plugin's maintainability                            
 *      v1.00a(GMT 1300 31-10-2015):                                          
 *      1. 1st version of this plugin finished                                
 *============================================================================*/
/*:
 * @plugindesc Lets users add various prerequisites for equipments to actors
 * @author DoubleX
 *
 * @help
 *============================================================================
 *    ## Notetag Info                                                         
 *----------------------------------------------------------------------------
 *    # Equip Notetags:                                                       
 *      (v1.01a+)1. <no weapon req: id>                                       
 *         - Sets that equip to be unequippable with an equipped weapon with  
 *           id id                                                            
 *      (v1.01a+)2. <no armor req: id>                                        
 *         - Sets that equip to be unequippable with an equipped armor with id
 *           id                                                               
 *      (v1.01a+)3. <weapon req: id>                                          
 *         - Sets that equip to need an equipped weapon with id id to be      
 *           equipped                                                         
 *      4. <armor req: id>                                                    
 *         - Sets that equip to need an equipped armor with id id to be       
 *           equipped                                                         
 *      5. <stat req: stat, operator, val>                                    
 *         - Sets that equip to need the owner's stat stat to meet the        
 *           operator operator and value val to be equipped                   
 *         - stat can be any Parameter, Ex-Parameter and Sp-Parameter, hp, mp,
 *           tp and level                                                     
 *         - (Advanced)stat can also be any other battler getter name that can
 *           use operator                                                     
 *         - operator can be either l, le, e, ge, g or ne, meaning <, <=. ===,
 *           >=, > and !== respectively                                       
 *         - If val is a number, it'll be treated as a Number rather than a   
 *           String                                                           
 *      6. <var req: id, operator, val>                                       
 *         - Sets that equip to need the value of variable with id id to meet
 *           the operator operator and value val to be equipped               
 *         - operator can be either l, le, e, ge, g or ne, meaning <, <=. ===,
 *           >=, > and !== respectively                                       
 *         - If val is a number, it'll be treated as a Number rather than a   
 *           String                                                           
 *============================================================================
 *    ## Plugin Call Info                                                     
 *----------------------------------------------------------------------------
 *    # Equip manipulations                                                   
 *      1. meta.noWeaponReq                                                   
 *         - Returns the Array of ids of all equipped weapons making this     
 *           equip unequippable                                               
 *      2. meta.noWeaponReq = [id, id, id, ..., id]                           
 *         - Sets the Array of ids of all equipped weapons making this equip  
 *           unequippable                                                     
 *         - All meta.noWeaponReq changes can be saved if                     
 *           DoubleX RMMV Dynamic Data is used                                
 *      3. meta.noArmorReq                                                    
 *         - Returns the Array of ids of all equipped armors making this equip
 *           unequippable                                                     
 *      4. meta.noArmorReq = [id, id, id, ..., id]                            
 *         - Sets the Array of ids of all equipped armors making this equip   
 *           unequippable                                                     
 *         - All meta.noArmorReq changes can be saved if                      
 *           DoubleX RMMV Dynamic Data is used                                
 *      5. meta.weaponReq                                                     
 *         - Returns the Array of ids of all equipped weapons needed for this
 *           equip to be equippable                                           
 *      6. meta.weaponReq = id                                                
 *         - Sets the Array of ids of all equipped weapons needed for this    
 *           equip to be equippable                                           
 *         - All meta.weaponReq changes can be saved if                       
 *           DoubleX RMMV Dynamic Data is used                                
 *      7. meta.armorReq                                                      
 *         - Returns the Array of ids of all equipped armors needed for this  
 *           equip to be equippable                                           
 *      8. meta.armorReq = id                                                 
 *         - Sets the Array of ids of all equipped armors needed for this     
 *           equip to be equippable                                           
 *         - All meta.armorReq changes can be saved if                        
 *           DoubleX RMMV Dynamic Data is used                                
 *      9. meta.statReq                                                       
 *         - Returns the Array of all stat-operator-value triples, each in the
 *           form of [stat, operator, value], as the equip prerequisites      
 *      10. meta.statReq = [[stat, operator, value], [stat, operator, value]]
 *          - Sets the Array of all stat-operator-value triples, each in the  
 *            form of [stat, operator, value], as the equip prerequisites     
 *          - All meta.statReq changes can be saved if                        
 *            DoubleX RMMV Dynamic Data is used                               
 *      11. meta.varReq                                                       
 *          - Returns the Array of all variable-operator-value triples, each  
 *            in the form of [variable, operator, value], as the equip        
 *            prerequisites                                                   
 *      12. meta.varReq = [[variable, operator, value]]                       
 *          - Sets the Array of all variable-operator-value triples, each in  
 *            the form of [variable, operator, value], as the equip           
 *            prerequisites                                                   
 *          - All meta.varReq changes can be saved if                         
 *            DoubleX RMMV Dynamic Data is used                               
 *============================================================================
 */

"use strict";
var DoubleX_RMMV = DoubleX_RMMV || {};
DoubleX_RMMV["Equip Prerequisites"] = "v1.01g";

/*============================================================================
 *    ## Plugin Implementations                                               
 *       You need not edit this part as it's about how this plugin works      
 *----------------------------------------------------------------------------
 *    # Plugin Support Info:                                                  
 *      1. Prerequisites                                                      
 *         - Some Javascript coding proficiency to fully comprehend this      
 *           plugin                                                           
 *      2. Function documentation                                             
 *         - The 1st part describes why this function's rewritten/extended for
 *           rewritten/extended functions or what the function does for new   
 *           functions                                                        
 *         - The 2nd part describes what the arguments of the function are    
 *         - The 3rd part informs which version rewritten, extended or created
 *           this function                                                    
 *         - The 4th part informs whether the function's rewritten or new     
 *         - The 5th part informs whether the function's a real or potential  
 *           hotspot                                                          
 *         - The 6th part describes how this function works for new functions
 *           only, and describes the parts added, removed or rewritten for    
 *           rewritten or extended functions only                             
 *         Example:                                                           
 * /*----------------------------------------------------------------------
 *  *    Why rewrite/extended/What this function does                      
 *  *----------------------------------------------------------------------*/
/* // arguments: What these arguments are                                     
 * functionName = function(arguments) { // Version X+; Hotspot                
 *     // Added/Removed/Rewritten to do something/How this function works     
 *     functionContents                                                       
 *     //                                                                     
 * } // functionName                                                          
 *----------------------------------------------------------------------------*/

DoubleX_RMMV.Equip_Req = {};
(function(ER) {

    ER.DataManager = {};
    var DM = ER.DataManager;

    DM.isDatabaseLoaded = DataManager.isDatabaseLoaded;
    DataManager.isDatabaseLoaded = function() {
        // Rewritten
        return DM.isDatabaseLoaded.apply(this, arguments) && DM.loadAllNotes();
        //
    }; // DataManager.isDatabaseLoaded

    DM.loadAllNotes = function() {
        [$dataWeapons, $dataArmors].forEach(function(type) {
            type.forEach(function(data) {
                if (data) { DM.loadItemNotes(data); }
            });
        });
        return true;
    }; // DM.loadAllNotes

    // data: The data to have its notetags read
    DM.loadItemNotes = function(data) { // v1.01e+; New
        var noWeaponReq = /< *no +weapon +req *: *(\d+) *>/i;
        var noArmorReq = /< *no +armor +req *: *(\d+) *>/i;
        var weaponReq = /< *weapon +req *: *(\d+) *>/i;
        var armorReq = /< *armor +req *: *(\d+) *>/i;
        var statReq = /< *stat +req *: *(.+) *, *(\w+) *, *(\w+) *>/i;
        var varReq = /< *var +req *: *(\d+) *, *(\w+) *, *(\w+) *>/i;
        var meta = data.meta, num;
        meta.noWeaponReq = [];
        meta.noArmorReq = [];
        meta.weaponReq = [];
        meta.armorReq = [];
        meta.statReq = [];
        meta.varReq = [];
        data.note.split(/[\r\n]+/).forEach(function(line) {
            if (line.match(noWeaponReq)) {
                meta.noWeaponReq.push(+RegExp.$1);
            } else if (line.match(noArmorReq)) {
                meta.noArmorReq.push(+RegExp.$1);
            } else if (line.match(weaponReq)) {
                meta.weaponReq.push(+RegExp.$1);
            } else if (line.match(armorReq)) {
                meta.armorReq.push(+RegExp.$1);
            } else if (line.match(statReq)) {
                num = +RegExp.$3;
                if (isNaN(num)) { num = RegExp.$3; }
                meta.statReq.push([RegExp.$1, RegExp.$2, num]);
            } else if (line.match(varReq)) {
                num = +RegExp.$3;
                if (isNaN(num)) { num = RegExp.$3; }
                meta.varReq.push([+RegExp.$1, RegExp.$2, num]);
            }
        });
    }; // DM.loadItemNotes

    ER.Game_BattlerBase = {};
    var GBB = ER.Game_BattlerBase;

    GBB.canEquip = Game_BattlerBase.prototype.canEquip;
    Game_BattlerBase.prototype.canEquip = function(item) {
        // Rewritten
        if (!GBB.canEquip.apply(this, arguments)) { return false; }
        return GBB.equipReq.call(this, item);
        //
    }; // Game_BattlerBase.prototype.canEquip

    // item: The equip to be checked
    GBB.equipReq = function(item) { // New
        if (!GBB.equipReqWeapon.call(this, item.meta.noWeaponReq, false)) {
            return false;
        } else if (!GBB.equipReqArmor.call(this, item.meta.noArmorReq, false)) {
            return false;
        } else if (!GBB.equipReqWeapon.call(this, item.meta.weaponReq, true)) {
            return false;
        } else if (!GBB.equipReqArmor.call(this, item.meta.armorReq, true)) {
            return false;
        }
        if (!GBB.equipReqOperator.call(this, item.meta.statReq, "statReq")) {
            return false;
        }
        return GBB.equipReqOperator.call(this, item.meta.varReq, "varReq");
    }; // GBB.equipReq

    /* req: The item equip prerequisites
     * flag: The required to be equipped/unequippable flag
     */
    GBB.equipReqWeapon = function(req, flag) { // New
        return req.length <= 0 || flag === req.some(function(id) {
            return this.hasWeapon($dataWeapons[id]);
        }, this);
    }; // GBB.equipReqWeapon

    /* req: The item equip prerequisites
     * flag: The required to be equipped/unequippable flag
     */
    GBB.equipReqArmor = function(req, flag) { // New
        return req.length <= 0 || flag === req.some(function(id) {
            return this.hasArmor($dataArmors[id]);
        }, this);
    }; // GBB.equipReqArmor

    /* item: The equip to be checked
     * note: The notetag name
     */
    GBB.equipReqOperator = function(req, note) { // New
        if (req.length <= 0) { return true; };
        var varVal = note === "varReq";
        return req.every(function(r) {
            return GBB.equipReqEval.call(this, r, varVal);
        }, this);
    }; // GBB.equipReqOperator

    /* req: The equip prerequisite notetag value array
     * varVal: The variable id flag
     */
    GBB.equipReqEval = function(req, varVal) { // New
        // req[0] must be a battler getter name in case of stat req
        var val = varVal ? $gameVariables.value(req[0]) : this[req[0]];
        //
        switch (req[1]) {
        case "l": return val < req[2];
        case "le": return val <= req[2];
        case "e": return val === req[2];
        case "ge": return val >= req[2];
        case "g": return val > req[2];
        case "n": return val !== req[2];
        default:
            console.log("Invalid operator " + req[1] + " as notetag values");
            return true;
        }
    }; // GBB.equipReqEval

})(DoubleX_RMMV.Equip_Req);

/*============================================================================*/

FAQ

* None so far

Credits and Thanks

* None

Author's Notes

* None so far

Terms and Conditions

* You shall keep this plugin's Plugin Info part's contents intact
* You shalln't claim that this plugin's written by anyone other than DoubleX or his aliases
* None of the above applies to DoubleX or his aliases

Changelog

v1.01g(GMT 0100 18-1-2016):

1. <stat req: stat, operator, val> only support battler getters
2. Fixed Number is not a function bug
v1.01f(GMT 0300 17-1-2016):
1. Fixed undefined variable req bug
2. Exposed this plugin's equip manipulation plugin calls
3. Increased this plugin's compactness, compatibility and readability
v1.01e(GMT 1200 24-11-2015):
1. Fixed unsupported arrow function in ES5 bug
2. The extended functions can be accessed by other custom plugins now
3. Notetags with invalid operators will log message on console instead
4. Increased this plugin's readability and robustness
v1.01d(GMT 1600 6-11-2015):
1. Simplified the notetag reading mechanisms
2. Fixed some typos                                                  
v1.01c(GMT 1200 5-11-2015):
1. Fixed undefined this under DoubleX_RMMV.Equip_Prerequisites bug
v1.01b(GMT 0000 5-11-2015):
1. Fixed failing to load notetags due to nil data bug
v1.01a(GMT 1000 4-11-2015):                                           
1. Added <no weapon req: id>, <no armor req: id> and <weapon req: id> notetags                                                           
2. Fixed several logic and syntax errors                              
3. Increased this plugin's maintainability
v1.00a(GMT 1300 31-10-2015):
1. 1st version of this script finished
My RMVXA/RMMV/RMMZ scripts/plugins:
http://rpgmaker.net/users/DoubleX/scripts/
Reply }
#2
Updates
v1.01d(GMT 1600 6-11-2015):

1. Simplified the notetag reading mechanisms
2. Fixed some typos   
v1.01c(GMT 1200 5-11-2015):
1. Fixed undefined this under DoubleX_RMMV.Equip_Prerequisites bug
v1.01b(GMT 0000 5-11-2015):
1. Fixed failing to load notetags due to nil data bug
v1.01a(GMT 1000 4-11-2015):                                          
1. Added <no weapon req: id>, <no armor req: id> and <weapon req: id> notetags                                                          
2. Fixed several logic and syntax errors                              
3. Increased this plugin's maintainability
My RMVXA/RMMV/RMMZ scripts/plugins:
http://rpgmaker.net/users/DoubleX/scripts/
Reply }
#3
Updates
v1.01e(GMT 1200 24-11-2015):
1. Fixed unsupported arrow function in ES5 bug
2. The extended functions can be accessed by other custom plugins now
3. Notetags with invalid operators will log message on console instead
4. Increased this plugin's readability and robustness
My RMVXA/RMMV/RMMZ scripts/plugins:
http://rpgmaker.net/users/DoubleX/scripts/
Reply }
#4
Updates
v1.01g(GMT 0100 18-1-2016):

1. <stat req: stat, operator, val> only support battler getters
2. Fixed Number is not a function bug
v1.01f(GMT 0300 17-1-2016):
1. Fixed undefined variable req bug
2. Exposed this plugin's equip manipulation plugin calls
3. Increased this plugin's compactness, compatibility and readability
My RMVXA/RMMV/RMMZ scripts/plugins:
http://rpgmaker.net/users/DoubleX/scripts/
Reply }


Possibly Related Threads…
Thread Author Replies Views Last Post
   DoubleX RMMV Popularized ATB Compatibility DoubleX 16 23,317 12-26-2022, 06:17 AM
Last Post: DoubleX
   DoubleX RMMV Confusion Edit DoubleX 3 7,658 09-09-2022, 11:12 AM
Last Post: DoubleX
   DoubleX RMMV Popularized ATB Clock DoubleX 2 6,498 03-25-2022, 01:04 PM
Last Post: DoubleX
   DoubleX RMMV Status Bars Compatibility DoubleX 0 1,926 02-06-2022, 07:56 AM
Last Post: DoubleX
   DoubleX RMMV Popularized ATB Bar DoubleX 3 8,583 05-19-2021, 06:10 AM
Last Post: DoubleX
   DoubleX RMMV Skill Hotkeys DoubleX 2 6,032 02-13-2021, 04:59 AM
Last Post: DoubleX
   DoubleX RMMZ Skill Item Cooldown DoubleX 4 6,166 02-07-2021, 04:11 PM
Last Post: DoubleX
   DoubleX RMMZ Skill Item Triggers DoubleX 3 5,603 12-26-2020, 04:00 PM
Last Post: DoubleX
   DoubleX RMMZ TPBS Configurations Edit DoubleX 3 5,697 12-25-2020, 12:30 PM
Last Post: DoubleX
   DoubleX RMMV Superlative ATB DoubleX 2 4,483 12-11-2020, 02:25 PM
Last Post: DoubleX



Users browsing this thread: 1 Guest(s)