DoubleX RMMV Item Charge
#1
DoubleX RMMV Item Charge

Version: v1.00a

Introduction

* Lets you set skills/items to need turns to charge before using

Prerequisites

* Nothing special for most ordinary use cases
* Little RMMV plugin development proficiency to fully utilize this

Script

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

 *    ## Plugin Info                                                          
 *----------------------------------------------------------------------------
 *    # Plugin Name                                                           
 *      DoubleX RMMV Item Charge                                              
 *----------------------------------------------------------------------------
 *    # Introduction                                                          
 *      Suppose a battler has n action slots(that battler can input n actions
 *      in a single turn), and suppose that battler has inputted n actions,   
 *      each needing xi turns to be charged, where 1 <= i <= n, then that     
 *      battler will behave as follows:                                       
 *      1. At turn y, that battler has inputted the aforementioned n actions  
 *      2. At turn y + x1, that battler will execute the 1st inputted action  
 *      3. At turn y + x1 + x2, that battler will execute the 2nd inputted    
 *         action                                                             
 *      4. At turn y + x1 + x2 + x3, that battler will execute the 3rd        
 *         inputted action                                                    
 *      5. At turn y + x1 + x2 + x3 + ... + xi, where 1 <= i <= n, that       
 *         battler will execute the ith action                                
 *      6. At turn y + x1 + x2 + x3 + ... + xn, that battler will execute the
 *         nth action                                                         
 *      7. At turn y + x1 + x2 + x3 + ... + xn + 1, that battler will become  
 *         able to input actions again                                        
 *      If the ith action that's not executed yet is the 1st one needing      
 *      charging, the battler speed will only take the first (i - 1)th        
 *      actions' speeds into account                                          
 *      Item charging's ignored by forced actions                             
 *----------------------------------------------------------------------------
 *    # Terms Of Use                                                          
 *      1. Commercial use's always allowed and crediting me's always optional.
 *      2. You shall keep this plugin's Plugin Info part's contents intact.   
 *      3. You shalln't claim that this plugin's written by anyone other than
 *         DoubleX or my aliases. I always reserve the right to deny you from
 *         using any of my plugins anymore if you've violated this.           
 *      4. CC BY 4.0, except those conflicting with any of the above, applies
 *         to this plugin, unless you've my permissions not needing follow so.
 *      5. I always reserve the right to deny you from using this plugin      
 *         anymore if you've violated any of the above.                       
 *----------------------------------------------------------------------------
 *    # Prerequisites                                                         
 *      Abilities:                                                            
 *      1. Nothing special for most ordinary use cases                        
 *      2. Little RMMV plugin development proficiency to fully utilize this   
 *----------------------------------------------------------------------------
 *    # Links                                                                 
 *      This plugin:                                                          
 *      1. http://pastebin.com/1BBbTbZs                                       
 *      Video:                                                                
 *      1. https://www.youtube.com/watch?v=uYnDbV0qgBM                        
*      Mentioned Patreon Supporters:
*      https://www.patreon.com/posts/71738797
 *----------------------------------------------------------------------------
 *    # Author                                                                
 *      DoubleX                                                               
 *----------------------------------------------------------------------------
 *    # Changelog                                                             
 *      v1.00a(GMT 0800 28-8-2016):                                           
 *      1. 1st version of this plugin finished                                
 *============================================================================*/
/*:
 * @plugindesc Lets you set skills/items to need turns to charge before using
 * @author DoubleX
 *
 * @param isEnabled
 * @desc Sets whether this plugin will be enabled
 *       It'll be stored as a boolean, and will be regarded as true if and only
 *       if it's true
 *       Don't change this during the same battle unless you really know what
 *       you're truly foing
 *       E.g.: Setting isEnabled as false will disable this plugin
 * @default true
 *
 * @param textColor
 * @desc Sets the text color of the text showing the number of turns needed to
 *       charge the skill/item on the skill/item window
 *       It'll be stored as a Number
 *       Don't change this when it's shown to ensure proper text displays
 *       E.g.: Setting textColor as 31 will set the text color of the text
 *             showing the number of turns needed to charge the skill/item on
 *             the skill/item window as 31
 * @default 30
 *
 * @help
 * The skill/item window charging turn display can be problematic if the
 * number of turn's 1000 or above
 * The default plugin file name is DoubleX RMMV Item Charge v100a
 * If you want to change that, you must edit the value of
 * DoubleX_RMMV.Item_Charge_File, which must be done via opening this plugin
 * js file directly
 *============================================================================
 *    ## Notetag Info                                                         
 *----------------------------------------------------------------------------
 *    # Skill/Item Notetags:                                                  
 *      1. <item charge: turns>                                               
 *         - Sets the number of turns needed to charge the skill/item before  
 *           using it as turns                                                
 *         - E.g.:                                                            
 *           <item charge: 1> will set the number of turns needed to charge   
 *           the skill/item before using it as 1                              
 *         - Only the 1st notetag will be used                                
 *============================================================================
 *    ## Plugin Call Info                                                     
 *----------------------------------------------------------------------------
 *    # Configuration manipulations                                           
 *      1. $gameSystem.itemCharge.param                                       
 *         - Returns the stored value of param listed in the plugin manager   
 *         - E.g.:                                                            
 *           $gameSystem.itemCharge.textColor will return the stored value of
 *           parameter textColor shown on the plugin manager                  
 *      2. $gameSystem.itemCharge.param = val                                 
 *         - Sets the stored value of param listed in plugin manager as val   
 *         - E.g.:                                                            
 *           $gameSystem.itemCharge.isEnabled = false will set the stored     
 *           value of parameter isEnabled shown on the plugin manager as false
 *         - All $gameSystem.itemCharge.param changes will be saved           
 *    # Skill/Item notetag manipulations                                      
 *      1. meta.itemCharge                                                    
 *         - Returns the <item charge: turns> notetag value turns as a Number
 *         - E.g.:                                                            
 *           $dataSkills[1].meta.itemCharge will return the                   
 *           <item charge: turns> notetag value of skill with id 1            
 *      2. meta.itemCharge = turns                                            
 *         - Sets the <item charge: turns> notetag value turns as a Number    
 *         - E.g.:                                                            
 *           $dataItems[2].meta.itemCharge = 0 will set the                   
 *           <item charge: turns> notetag value of item with id 2 as 0        
 *         - All meta.itemCharge changes can be saved if                      
 *           DoubleX RMMV Dynamic Data is used                                
 *============================================================================
 */

var DoubleX_RMMV = DoubleX_RMMV || {};
DoubleX_RMMV['Item Charge'] = 'v1.00a';

// The plugin file name must be the same as DoubleX_RMMV.Item_Charge_File
DoubleX_RMMV.Item_Charge_File = 'DoubleX RMMV Item Charge v100a';

/*============================================================================
 *    ## Plugin Implementations                                               
 *       You need not edit this part as it's about how this plugin works      
 *----------------------------------------------------------------------------
 *    # Plugin Support Info:                                                  
 *      1. Prerequisites                                                      
 *         - Basic knowledge on the default RMMV battle flow implementations  
 *         - Some RMMV plugin development proficiency to fully comprehend this
 *----------------------------------------------------------------------------*/

DoubleX_RMMV.Is_Item_Charge_Notes_Loaded = false; // v1.00a - v1.00a

DoubleX_RMMV.Item_Charge_Params = { // v1.00a - v1.00a

    isEnabled: 'Boolean', // Marks that isEnabled is a Boolean

    textColor: 'Number', // Marks that textColor is a Number

    Boolean: function(param) { return param === 'true'; }, // Boolean

    Number: function(param) { return +param; } // Number

}; // DoubleX_RMMV.Item_Charge_Params

(function(IC) {

    'use strict';

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

    DM.isDatabaseLoaded = DataManager.isDatabaseLoaded;
    DataManager.isDatabaseLoaded = function() { // Extended; v1.00a - v1.00a
        // Rewritten to read all notetags of this plugin as well
        return DM.isDatabaseLoaded.apply(this, arguments) && DM.loadAllNotes();
        //
    }; // DataManager.isDatabaseLoaded

    /* Reads all notetags of this plugin from the database
     * Return: True
     * Functional cohesion/Message coupling/Idempotent
     */
    DM.loadAllNotes = function() { // New; v1.00a - v1.00a
        // Ensures the notetags will only be read exactly once upon game start
        if (DoubleX_RMMV.Is_Item_Charge_Notes_Loaded) return true;
        [$dataSkills, $dataItems].forEach(function(type) {
            type.forEach(function(data) { if (data) DM.loadNotes(data); });
        });
        DoubleX_RMMV.Is_Item_Charge_Notes_Loaded = true;
        //
        return true;
    }; // DM.loadAllNotes

    /* Reads all notetags of this plugin from a dataum of the database
     * (Object)datum: The datum to have its notetags of this plugin read
     * Functional cohesion/Data coupling/Idempotent
     */
    DM.loadNotes = function(datum) { // New; v1.00a - v1.00a
        var regExp = /< *item +charge *: *(\d+) *>/i;
        var lines = datum.note.split(/[\r\n]+/);
        for (var index = 0, length = lines.length; index < length; index++) {
            if (!lines[index].match(regExp)) continue;
            return datum.meta.itemCharge = +RegExp.$1;
        }
        datum.meta.itemCharge = 0; // The default's not needing charging
    }; // DM.loadNotes

    IC.BattleManager = {};
    var BM = IC.BattleManager;

    BM.processTurn = BattleManager.processTurn;
    BattleManager.processTurn = function() { // Rewritten; v1.00a - v1.00a
        var subject = this._subject;
        var action = subject.currentAction();
        // Rewritten to stop executing actions upon reaching a charging one
        var isEnabled = $gameSystem.itemCharge.isEnabled;
        if (action && (!isEnabled || action.itemCharge <= 0)) {
            action.prepare();
            if (action.isValid()) {
                this.startAction();
            }
            subject.removeCurrentAction();
        } else {
            subject.onAllActionsEnd();
            this.refreshStatus();
            this._logWindow.displayAutoAffectedStatus(subject);
            this._logWindow.displayCurrentState(subject);
            this._logWindow.displayRegeneration(subject);
            this._subject = this.getNextSubject();
        }
        //
    }; // BattleManager.processTurn

    IC.Game_System = {};
    var GS = IC.Game_System;

    /*------------------------------------------------------------------------
     *    New public instance variable                                        
     *------------------------------------------------------------------------*/
    // itemCharge: The container of all parameters shown on the plugin manger

    GS.initialize = Game_System.prototype.initialize;
    Game_System.prototype.initialize = function() { // Extended; v1.00a - v1.00a
        GS.initialize.apply(this, arguments);
        GS.initializeItemCharge.call(this); // Added
    }; // Game_System.prototype.initialize

    /* Initializes all parameters of this plugin shown on the plugin manager
     * Functional cohesion/Message coupling/Idempotent
     */
    GS.initializeItemCharge = function() { // New; v1.00a - v1.00a
        this.itemCharge = {};
        var params = PluginManager.parameters(DoubleX_RMMV.Item_Charge_File);
        var ICP = DoubleX_RMMV.Item_Charge_Params;
        Object.keys(params).forEach(function(param) {
            this.itemCharge[param] = ICP[ICP[param]](params[param]);
        }, this);
    }; // GS.initializeItemCharge

    IC.Game_Action = {};
    var GA = IC.Game_Action;

    /*------------------------------------------------------------------------
     *    New public instance variable                                        
     *------------------------------------------------------------------------*/
    // itemCharge: The number of remaining turns for the action to be charged

    GA.initialize = Game_Action.prototype.initialize;
    Game_Action.prototype.initialize = function(subject, forcing) {
    // Extended; v1.00a - v1.00a
        GA.initialize.apply(this, arguments);
        this.itemCharge = 0; // Added
    }; // Game_Action.prototype.initialize

    GA.clear = Game_Action.prototype.clear;
    Game_Action.prototype.clear = function() { // Extended; v1.00a - v1.00a
        GA.clear.apply(this, arguments);
        this.itemCharge = 0; // Added
    }; // Game_Action.prototype.clear

    GA.setSkill = Game_Action.prototype.setSkill;
    Game_Action.prototype.setSkill = function(skillId) {
    // Extended; v1.00a - v1.00a
        GA.setSkill.apply(this, arguments);
        // Added to mark the number of turns needed to charge this action
        if (!this._forcing) this.itemCharge = this.item().meta.itemCharge;
        //
    }; // Game_Action.prototype.setSkill

    GA.setItem = Game_Action.prototype.setItem;
    Game_Action.prototype.setItem = function(itemId) {
    // Extended; v1.00a - v1.00a
        GA.setItem.apply(this, arguments);
        // Added to mark the number of turns needed to charge this action
        if (!this._forcing)this.itemCharge = this.item().meta.itemCharge;
        //
    }; // Game_Action.prototype.setItem

    IC.Game_Battler = {};
    var GB = IC.Game_Battler;

    GB.makeSpeed = Game_Battler.prototype.makeSpeed;
    Game_Battler.prototype.makeSpeed = function() {
    // Extended; v1.00a - v1.00a
        // Rewritten
        if (!$gameSystem.itemCharge.isEnabled) {
            return GB.makeSpeed.apply(this, arguments);
        }
        this._speed = Math.min.apply(null, GB.makeItemChargeSpeed.call(this));
        this._speed = this._speed || 0;
        //
    };
    // Game_Battler.prototype.makeSpeed

    /* Collects speed from 1st act to the one right before the one having charge
     * Return: An array of Numbers each being the speed of a collected action
     * Functional cohesion/Message coupling
     */
    GB.makeItemChargeSpeed = function() { // New; v1.00a - v1.00a
        var act, length = this._actions.length, speeds = [];
        for (var index = 0; index < length; index++) {
            act = this._actions[index];
            if (!act) continue;
            if (act.itemCharge > 0) return speeds;
            speeds.push(act.speed());
        }
        return speeds;
    }; // GB.makeItemChargeSpeed

    /* Removes all actions before the 1st charging one and updates its turn
     * Functional cohesion/Message coupling
     */
    GB.updateItemCharge = function() { // New; v1.00a - v1.00a
        var act;
        for (var i = 0, length = this._actions.length; i < length; i++) {
            act = this._actions[i];
            if (act && act.itemCharge > 0) return act.itemCharge -= 1;
            this._actions.shift();
        }
    }; // GB.updateItemCharge

    IC.Game_Actor = {};
    var GActor = IC.Game_Actor;

    /*------------------------------------------------------------------------
     *    New private instance variable                                       
     *------------------------------------------------------------------------*/
    // _hasItemCharge: Whether the actor's charging skills/items

    GActor.initMembers = Game_Actor.prototype.initMembers;
    Game_Actor.prototype.initMembers = function() {
    // Extended; v1.00a - v1.00a
        GActor.initMembers.apply(this, arguments);
        this._hasItemCharge = false; // Added
    };
    // Game_Actor.prototype.initMembers

    GActor.makeActions = Game_Actor.prototype.makeActions;
    Game_Actor.prototype.makeActions = function() { // Extended; v1.00a - 1.00a
        // Added to stop making new actions when there are still charging ones
        if (!$gameSystem.itemCharge.isEnabled) {
            return GActor.makeActions.apply(this, arguments);
        }
        if (BattleManager._surprise) return;
        GB.updateItemCharge.call(this);
        this._hasItemCharge = this._actions.length > 0;
        if (this._hasItemCharge) return ;
        //
        GActor.makeActions.apply(this, arguments);
    }; // Game_Actor.prototype.makeActions

    /* Checks whether this actor isn't also charging skills/items
     * Functional cohesion/Message coupling/Referentially transparent
     */
    Game_Actor.prototype.canInput = function() { // New; v1.00a - v1.00a
        // Ensures this plugin works with those having state changes in canInput
        if (!Game_BattlerBase.prototype.canInput.call(this)) return false;
        return !$gameSystem.itemCharge.isEnabled || !this._hasItemCharge;
        //
    }; // Game_Actor.prototype.canInput

    IC.Game_Enemy = {};
    var GE = IC.Game_Enemy;

    GE.makeActions = Game_Enemy.prototype.makeActions;
    Game_Enemy.prototype.makeActions = function() { // Extended; v1.00a - 1.00a
        // Added to stop making new actions when there are still charging ones
        if (!$gameSystem.itemCharge.isEnabled) {
            return GE.makeActions.apply(this, arguments);
        }
        if (BattleManager._preemptive) return;
        GB.updateItemCharge.call(this);
        if (this._actions.length > 0) return ;
        //
        GE.makeActions.apply(this, arguments);
    }; // Game_Enemy.prototype.makeActions

    IC.Window_ItemList = {};
    var WIL = IC.Window_ItemList;

    WIL.drawItem = Window_ItemList.prototype.drawItem;
    Window_ItemList.prototype.drawItem = function(index) {
    // Extended; v1.00a - v1.00a
        WIL.drawItem.apply(this, arguments);
        // Added to draw the number of turns need to charge the item as well
        if (!$gameSystem.itemCharge.isEnabled) return;
        var item = this._data[index];
        if (!item || item.meta.itemCharge <= 0) return;
        var r = this.itemRect(index);
        r.x -= WSL.costWidth.apply(this, arguments);
        r.width -= this.textPadding();
        WIL.drawItemCharge.call(this, item.meta.itemCharge, r.x, r.y, r.width);
        //
    }; // Window_ItemList.prototype.drawItem

    WIL.numberWidth = Window_ItemList.prototype.numberWidth;
    Window_ItemList.prototype.numberWidth = function() {
    // Rewritten; v1.00a - v1.00a
        // Added
        if ($gameSystem.itemCharge.isEnabled) {
            return WIL.numberWidth.apply(this, arguments) * 2;
        }
        //
        return WIL.numberWidth.apply(this, arguments);
    }; // Window_ItemList.prototype.numberWidth

    /* Draws the number of turns needed to charge the item on the item window
     * (Number)turns: The number of turns needed to charge the item
     * (Number)x; The x position of the text drawn
     * (Number)y; The y position of the text drawn
     * (Number)width: The max width of the text drawn
     * Functional cohesion/Data coupling/Idempotent
     */
    WIL.drawItemCharge = function(turns, x, y, width) { // New; v1.00a - v1.00a
        this.changeTextColor(this.textColor($gameSystem.itemCharge.textColor));
        this.drawText(turns, x, y, width, 'right');
        this.resetTextColor();
    }; // WIL.drawItemCharge

    IC.Window_SkillList = {};
    var WSL = IC.Window_SkillList;

    WSL.drawItem = Window_SkillList.prototype.drawItem;
    Window_SkillList.prototype.drawItem = function(index) {
    // Extended; v1.00a - v1.00a
        WSL.drawItem.apply(this, arguments);
        // Added to draw the number of turns needed to charge the skill as well
        if (!$gameSystem.itemCharge.isEnabled) return;
        var skill = this._data[index];
        if (!skill || skill.meta.itemCharge <= 0) return;
        var r = this.itemRect(index);
        r.x -= WSL.costWidth.apply(this, arguments);
        r.width -= this.textPadding();
        WSL.drawItemCharge.call(this, skill.meta.itemCharge, r.x, r.y, r.width);
        //
    }; // Window_SkillList.prototype.drawItem

    WSL.costWidth = Window_SkillList.prototype.costWidth;
    Window_SkillList.prototype.costWidth = function() {
    // Rewritten; v1.00a - v1.00a
        // Added
        if ($gameSystem.itemCharge.isEnabled) {
            return WSL.costWidth.apply(this, arguments) + this.textWidth('000');
        }
        //
        return WSL.costWidth.apply(this, arguments);
    }; // Window_SkillList.prototype.costWidth

    /* Draws the number of turns needed to charge the skill on the skill window
     * (Number)turns: The number of turns needed to charge the item
     * (Number)x; The x position of the text drawn
     * (Number)y; The y position of the text drawn
     * (Number)width: The max width of the text drawn
     * Functional cohesion/Data coupling/Idempotent
     */
    WSL.drawItemCharge = function(turns, x, y, width) { // New; v1.00a - v1.00a
        this.changeTextColor(this.textColor($gameSystem.itemCharge.textColor));
        this.drawText(turns, x, y, width, 'right');
    }; // WSL.drawItemCharge

})(DoubleX_RMMV.Item_Charge = {});

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

Video



FAQ

* None so far

Credits and Thanks

* None

Author's Notes

* None so far

Terms and Conditions

* Commercial use's always allowed and crediting me's always optional.
* 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 my aliases. I always reserve the right to deny you from using any of my plugins anymore if you've violated this.
* CC BY 4.0, except those conflicting with any of the above, applies to this plugin, unless you've my permissions not needing follow so.
* I always reserve the right to deny you from using this plugin anymore if you've violated any of the above.

Changelog

v1.00a(GMT 0800 28-8-2016):
1. 1st version of this script finished
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,342 12-26-2022, 06:17 AM
Last Post: DoubleX
   DoubleX RMMV Confusion Edit DoubleX 3 7,668 09-09-2022, 11:12 AM
Last Post: DoubleX
   DoubleX RMMV Popularized ATB Clock DoubleX 2 6,501 03-25-2022, 01:04 PM
Last Post: DoubleX
   DoubleX RMMV Status Bars Compatibility DoubleX 0 1,929 02-06-2022, 07:56 AM
Last Post: DoubleX
   DoubleX RMMV Popularized ATB Bar DoubleX 3 8,595 05-19-2021, 06:10 AM
Last Post: DoubleX
   DoubleX RMMV Skill Hotkeys DoubleX 2 6,039 02-13-2021, 04:59 AM
Last Post: DoubleX
   DoubleX RMMZ Skill Item Cooldown DoubleX 4 6,175 02-07-2021, 04:11 PM
Last Post: DoubleX
   DoubleX RMMZ Skill Item Triggers DoubleX 3 5,612 12-26-2020, 04:00 PM
Last Post: DoubleX
   DoubleX RMMZ TPBS Configurations Edit DoubleX 3 5,706 12-25-2020, 12:30 PM
Last Post: DoubleX
   DoubleX RMMV Superlative ATB DoubleX 2 4,491 12-11-2020, 02:25 PM
Last Post: DoubleX



Users browsing this thread: 1 Guest(s)