DoubleX RMMV Action Cost Compatibility
#1
DoubleX RMMV Action Cost Compatibility

Version: v1.01b

Introduction

* Fixes DoubleX RMMV Action Cost compatibility issues

Prerequisites

* DoubleX RMMV Action Cost

Script

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

 *    ## Plugin Info                                                          
 *----------------------------------------------------------------------------
 *    # Plugin Name                                                           
 *      DoubleX RMMV Action Cost Compatibility                                
 *----------------------------------------------------------------------------
 *    # 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                                                         
 *      Plugins:                                                              
 *      1. DoubleX RMMV Action Cost                                           
 *      Abilities:                                                            
 *      1. Nothing special                                                    
 *----------------------------------------------------------------------------
 *    # Links                                                                 
 *      This plugin:                                                          
 *      1. http://pastebin.com/5DP26uff                                       
 *      Video:                                                                
 *      1. https://www.youtube.com/watch?v=TyYqBKaB-Cw                        
*      Mentioned Patreon Supporters:
*      https://www.patreon.com/posts/71738797
 *----------------------------------------------------------------------------
 *    # Author                                                                
 *      DoubleX                                                               
 *----------------------------------------------------------------------------
 *    # Changelog                                                             
 *      v1.00d(GMT 1500 11-8-2016):                                           
 *      1. Removed compatibility with DoubleX RMMV Minimalized ATB            
 *      1. In sync with the latest DoubleX RMMV Popularized ATB Core version  
 *      v1.00c(GMT 1000 5-6-2016):                                            
 *      1. Addressed more compatibility issues with                           
 *         - DoubleX RMMV Minimalized ATB                                     
 *         - DoubleX RMMV Popularized ATB Core                                
 *      v1.00b(GMT 0300 29-5-2016):                                           
 *      1. Addressed compatibility with                                       
 *         - DoubleX RMMV Minimalized ATB                                     
 *         - DoubleX RMMV Popularized ATB Core                                
 *      v1.00a(GMT 1500 22-5-2016):                                           
 *      1. 1st version of this plugin finished                                
 *============================================================================*/
/*:
 * @plugindesc Fixes DoubleX RMMV Action Cost compatibility issues
 * @author DoubleX
 *
 * @help
 *============================================================================
 *    ## Addressed Plugins                                                    
 *----------------------------------------------------------------------------
 *    # DoubleX RMMV Unison Item Config:                                      
 *      1. The action cost is the same for all unison actors                  
 *         - Reference tag: Unison Item Config Act Cost                       
 *         - Read <unison item actor act cost: costs> in DM.loadItemNotes     
 *         - Drawed the action cost in battle for each unison actor in        
 *           WIL.drawActCost and WSL.drawActCost                              
 *         - The default unison item action cost will be shown for all unison
 *           actors when outside battles                                      
 *    # DoubleX RMMV Unison Item Default:                                     
 *      1. The number of action slot reserved by unison invokees are always 1
 *         - Reference tag: Unison Item Default Invokee Act Slot Num          
 *         - Checked the action cost for each unison invokee in               
 *           GBB.canUseUnisonSkill and GBB.canUseUnisonItem as well           
 *         - Stored and restored the action cost for each unison invokee in   
 *           BM.addUnisonActors and BM.eraseUnisonActors as well              
 *    # (v1.00b+)DoubleX RMMV Popularized ATB Core:                           
 *      1. No battler can execute any action at all                           
 *         - Reference tag: PATB Act Validity                                 
 *         - Extended BattleManager.processTurn to ensure no valid actions    
 *           will be falsely regarded as invalid ones                         
 *    # (v1.00c+)DoubleX RMMV Popularized ATB Core:                           
 *      1. Battlers inputting skills/items with action cost greater than 1    
 *         remains inputable after finishing inputting all skills/items       
 *         - Reference tag: PATB Inputability                                 
 *         - Extended Game_Action.prototype.confirm_patb_item,                
 *           Scene_Battle.prototype.confirm_patb_act and added GBB.confirmAct
 *           to confirm the reserved action slots as well                     
 *============================================================================
 *    ## Notetag Info                                                         
 *----------------------------------------------------------------------------
 *    # Skill/Item Notetags:                                                  
 *      1. <unison item actor act cost: costs>                                
 *         - Sets the list of action costs needed for each of the             
 *           corresponding id of the unison actor in <unison item actors: ids>
 *           , is used to separate the mp costs in ids                        
 *           E.g.:                                                            
 *           If <unison item actors: 1> is used, then                         
 *           <unison item actor act cost: 2> means actor with id 1 needs to   
 *           use 2 action slots for using the unison skill/item               
 *           If <unison item actors: 4, 2> is used, then                      
 *           <unison item actor act cost: 2, 3> means actor with id 4 and 2   
 *           need to use 2 and 3 action slots respectively for using the      
 *           unison skill/item                                                
 *           If <unison item actors: 4, 2> is used, then                      
 *           <unison item actor act cost: 2> means actor with id 4 needs to   
 *           pay 2 action slots while that with id 2 needs to use the number  
 *           of action slots of the unison skill/item for using it            
 *============================================================================
 *    ## Plugin Call Info                                                     
 *----------------------------------------------------------------------------
 *    # Skill/Item manipulations                                              
 *      1. meta.unisonItemActorActCosts                                       
 *         - Returns the Array of action costs each needed by its             
 *           corresponding actor with id in meta.unisonItemActors to use this
 *           skill/item                                                       
 *      2. meta.unisonItemActorActCosts = [cost, cost, ...]                   
 *         - Sets the Array of of action costs each needed by its             
 *           corresponding actor with id in meta.unisonItemActors to use this
 *           skill/item                                                       
 *         - All meta.unisonItemActorActCosts changes can be saved if         
 *           DoubleX RMMV Dynamic Data is used                                
 *============================================================================
 */

var DoubleX_RMMV = DoubleX_RMMV || {};
DoubleX_RMMV['Act Cost Compatibility'] = 'v1.00d';

/*============================================================================
 *    ## Plugin Implementations                                               
 *       You need not edit this part as it's about how this plugin works      
 *----------------------------------------------------------------------------
 *    # Plugin Support Info:                                                  
 *      1. Prerequisites                                                      
 *         - Solid understanding of how DoubleX RMMV Action Cost and each     
 *           addressed plugin works                                           
 *         - Decent plugin development 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                                                          
 *----------------------------------------------------------------------------*/

if (DoubleX_RMMV['Act Cost']) {

DoubleX_RMMV.Act_Cost_Compatibility = {};

/*----------------------------------------------------------------------------*/

if (DoubleX_RMMV["PATB Core"]) { // v1.00b+

DoubleX_RMMV.Act_Cost_Compatibility["PATB Core"] = {};

(function(AC, ACCATB) {

    'use strict';

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

    BM.processTurn = BattleManager.processTurn;
    BattleManager.processTurn = function() {
        // Added to ensures battlers can use valid actions upon executing them
        this._subject.actCostInputs = -999;
        // PATB Act Validity
        BM.processTurn.apply(this, arguments);
    }; // BattleManager.processTurn

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

    // act: The action to have all its reserved action slots confirmed
    GBB.confirmAct = function(act) { // v1.00c+; New
        // Ensures all reserved action slots are confirmed as well
        var reservedActs = act.item().meta.actCost - 1;
        var lastAct = this._actions.length - this._actCostInputs - 1;
        for (var index = lastAct; index > lastAct - reservedActs; index--) {
            this._actions[index].patb_confirm = true;
        }
        // PATB Inputability
    }; // GBB.confirmAct

    ACCATB.Game_Actor = {};
    var GA = ACCATB.Game_Actor;

    GA.confirm_patb_act = Game_Actor.prototype.confirm_patb_act;
    Game_Actor.prototype.confirm_patb_act = function() {
    // v1.00c+
        GA.confirm_patb_act.apply(this, arguments);
        // Added to ensure all reserved action slots are confirmed as well
        GBB.confirmAct.call(this, this.inputtingAction());
        // PATB Inputability
    }; // Game_Actor.prototype.confirm_patb_act

})(DoubleX_RMMV.Act_Cost, DoubleX_RMMV.Act_Cost_Compatibility["PATB Core"]);

} // if DoubleX_RMMV["PATB Core"])

/*----------------------------------------------------------------------------*/

if (DoubleX_RMMV["Unison Item Default"]) {

DoubleX_RMMV.Act_Cost_Compatibility["Unison Item Default"] = {};

(function(AC, UI, ACCUI) {

    'use strict';

    var DM = UI.DataManager;
    ACCUI.DataManager = {};
    var DMACCUI = ACCUI.DataManager;

    // data: The data to have its notetags read
    DMACCUI.loadItemNotes = DM.loadItemNotes;
    DM.loadItemNotes = function(data) {
        DMACCUI.loadItemNotes(data);
        // Added to read and store values of <unison item actor act cost: costs>
        var uIAACs = data.meta.unisonItemActorActCosts = [];
        var ACs = /< *unison +item +actor +act +cost *: *(\d+(?: *, *\d+)*) *>/i;
        data.note.split(/[\r\n]+/).forEach(function(line) {
            if (line.match(ACs)) { DM.storeItemNotes(uIAACs); }
        });
        // Unison Item Config Act Cost
    }; // DM.loadItemNotes

    var BM = AC.BattleManager;
    ACCUI.BattleManager = {};
    var BMACCUI = ACCUI.BattleManager;

    BMACCUI.reserveActs = BM.reserveActs;
    BM.reserveActs = function() {
        // Rewritten to not using this function for unison skills/items
        var actor = this.actor();
        if (!actor) { return; }
        if (actor.inputtingAction().item().meta.unisonItemActors.length <= 1) {
            BMACCUI.reserveActs.apply(this, arguments);
        }
        // Unison Item Config Act Cost
    }; // BM.reserveActs

    BMACCUI.releaseReservedActs = BM.releaseReservedActs;
    BM.releaseReservedActs = function() {
        // Added to not using this function for unison skills/items
        var actor = this.actor();
        if (!actor) { return; }
        var act = actor.inputtingAction();
        if (act.item().meta.unisonItemActors.length > 1) { return act.clear(); }
        // Unison Item Config Act Cost
        BMACCUI.releaseReservedActs.apply(this, arguments);
    }; // BM.releaseReservedActs

    BM = UI.BattleManager;

    BM.addUnisonActors = function() { // Rewrite
        var actor = this.actor(), act, item;
        if (actor) { act = actor.inputtingAction(); }
        if (act) { item = act.item(); }
        if (!item || item.meta.unisonItemActors.length <= 1) { return; }
        var actorIds = item.meta.unisonItemActors;
        // Rewritten to store the action cost for each unison invokee as well
        var actSlot = [actor.index(), actor.actionInputIndex];
        var actCosts = item.meta.unisonItemActorActCosts.slice(0);
        var actorId = actor.actorId(), actCost = item.meta.actCost;
        BM.unisonActors[actSlot] = [actorIds, actCosts];
        for (var index = 0, length = actorIds.length; index < length; index++) {
            actCosts[index] = actCosts[index] || actCost;
            if (actorId === actorIds[index]) { actCosts[index] -= 1; }
            if (!actCosts[index]) { actCosts.push(actCosts[index]); }
            $gameActors.actor(actorIds[index]).actCostInputs += actCosts[index];
        }
        // Unison Item Config Act Cost
        // Unison Item Default Invokee Act Slot Num
    }; // BM.addUnisonActors

    // actor: The currently selected actor
    BM.eraseUnisonActors = function(actor) { // Rewrite
        var actors = BM.unisonActors[[actor.index(), actor.actionInputIndex]];
        if (!actors) { return; }
        BM.unisonActors[[actor.index(), actor.actionInputIndex]] = null;
        // Rewritten to address the action cost for each unison invokee as well
        var actorIds = actors[0], actCosts = actors[1];
        for (var i = 0, length = actorIds.length; i < length; i++) {
            $gameActors.actor(actorIds[i]).actCostInputs -= actCosts[i];
        }
        // Unison Item Config Act Cost
        // Unison Item Default Invokee Act Slot Num
    }; // BM.eraseUnisonActors

    BMACCUI.clearUnisonActors = BM.clearUnisonActors;
    BM.clearUnisonActors = function() {
        BMACCUI.clearUnisonActors.apply(this, arguments);
        // Added to actCostInputs for reserving action slots from invokees too
        $gameParty.movableMembers().forEach(function(mem) {
            mem.actCostInputs = -999;
        });
        // Unison Item Config Act Cost
        // Unison Item Default Invokee Act Slot Num
    }; // BM.clearUnisonActors

    var GBB = AC.Game_BattlerBase;
    ACCUI.Game_BattlerBase = {};
    var GBBACCUI = ACCUI.Game_BattlerBase;
    GBBACCUI.canReserveActs = GBB.canReserveActs;
    GBB.canReserveActs = function(item) {
        // Added to check for unison acion cost for the unison invoker as well
        if (!item) { return false; }
        if (this.isActor()) {
            var emptyActs = this._actions.filter(function(act) {
                return !act.item();
            }).length;
            var actorId = this.actorId(), actorIds = item.meta.unisonItemActors;
            var actCosts = item.meta.unisonItemActorActCosts;
            if (actorIds.length > 1) {
                for (var i = 0, length = actorIds.length; i < length; i++) {
                    if (actorId !== actorIds[i]) { continue; }
                    if (!actCosts[i]) { break; }
                    return actCosts[i] <= emptyActs - this._actCostInputs;
                }
            }
        }
        // Unison Item Config Act Cost
        return GBBACCUI.canReserveActs.apply(this, arguments);
    }; // GBB.canReserveActs

    GBB = UI.Game_BattlerBase;

    GBBACCUI.canInput = Game_BattlerBase.prototype.canInput;
    Game_BattlerBase.prototype.canInput = function() {
        // Rewritten to check if at least 1 action slot isn't reserved
        if (!GBBACCUI.canInput.apply(this, arguments)) { return false; }
        if (!this.isActor() || !$gameParty.inBattle()) { return true; }
        return this._actCostInputs < this._actions.length;
        // Unison Item Default Invokee Act Slot Num
    }; // Game_BattlerBase.prototype.canInput

    GBB.canUseUnisonSkill = function(skill) { // Rewrite
        var actor, actorIds = skill.meta.unisonItemActors;
        var inBattle = $gameParty.inBattle(), mems = $gameParty.aliveMembers();
        // Added
        var actCosts = skill.meta.unisonItemActorActCosts;
        var actCost = skill.meta.actCost;
        // Unison Item Default Invokee Act Slot Num
        var learnFlags = skill.meta.unisonItemActorLearn;
        for (var i = 0, length = actorIds.length; i < length; i++) {
            if (this.actorId() === actorIds[i]) { continue; }
            actor = mems.filter(function(m) {
                return m.index() > this.index() && m.actorId() === actorIds[i];
            }, this)[0];
            if (!actor || inBattle && !actor.canInput()) { return false; }
            if (!actor.meetsSkillConditions(skill)) { return false; }
            // Added to check if the unison invokee can pay the action cost
            if (!inBattle) { continue; }
            if (!GBB.hasEnoughActCost.call(actor, actCosts[i] || actCost)) {
                return false;
            }
            // Unison Item Default Invokee Act Slot Num
            if (learnFlags[i] && actor.skills().every(function(s) {
                return s !== skill;
            })) { return false; }
        }
        return true;
    }; // GBB.canUseUnisonSkill

    GBB.canUseUnisonItem = function(item) { // Rewrite
        if (!this.meetsItemConditions(item)) { return false; }
        var actor, actorIds = item.meta.unisonItemActors;
        var inBattle = $gameParty.inBattle(), mems = $gameParty.aliveMembers();
        // Added
        var actCosts = item.meta.unisonItemActorActCosts;
        var actCost = item.meta.actCost;
        // Unison Item Default Invokee Act Slot Num
        for (var i = 0, length = actorIds.length; i < length; i++) {
            if (this.actorId() === actorIds[i]) { continue; }
            actor = mems.filter(function(m) {
                return m.index() > this.index() && m.actorId() === actorIds[i];
            }, this)[0];
            if (!actor || inBattle && !actor.canInput()) { return false; }
            // Added to check if the unison invokee can pay the action cost
            if (!inBattle) { continue; }
            if (!GBB.hasEnoughActCost.call(actor, actCosts[i] || actCost)) {
                return false;
            }
            // Unison Item Default Invokee Act Slot Num
        }
        return true;
    }; // GBB.canUseUnisonItem

    // actCost: The number of action slots needed for the action
    GBB.hasEnoughActCost = function(actCost) { // New
        // Checks if the unison invokee has enough empty action slots
        return this._actions.length - this._actCostInputs >= actCost;
        // Unison Item Default Invokee Act Slot Num
    }; // GBB.hasEnoughActCost

    var WIL = AC.Window_ItemList;
    ACCUI.Window_ItemList = {};
    var WILACCUI = ACCUI.Window_ItemList;

    WILACCUI.drawActCost = WIL.drawActCost;
    WIL.drawActCost = function(item, x, y, width) {
        // Added to draw the act cost in battle for each unison actor
        if ($gameParty.inBattle()) {
            var actorIds = item.meta.unisonItemActors;
            if (actorIds.length > 1) {
                var actCosts = item.meta.unisonItemActorActCosts;
                var actorId = BattleManager.actor().actorId();
                for (var i = 0, length = actorIds.length; i < length; i++) {
                    if (!actCosts[i] || actorId !== actorIds[i]) { continue; }
                    return this.drawText(actCosts[i], x, y, width, 'right');
                }
            }
        }
        // Unison Item Config Act Cost
        WILACCUI.drawActCost.apply(this, arguments);
    }; // WIL.drawActCost

    var WSL = AC.Window_SkillList;
    ACCUI.Window_SkillList = {};
    var WSLACCUI = ACCUI.Window_SkillList;

    WSLACCUI.drawActCost = WSL.drawActCost;
    WSL.drawActCost = function(skill, x, y, width) {
        // Added to draw the act cost for each unison actor
        this.changeTextColor(this.normalColor());
        var actorIds = skill.meta.unisonItemActors;
        if (actorIds.length > 1) {
            var actCosts = skill.meta.unisonItemActorActCosts;
            var actorId = this._actor.actorId();
            for (var i = 0, length = actorIds.length; i < length; i++) {
                if (!actCosts[i] || actorId !== actorIds[i]) { continue; }
                return this.drawText(actCosts[i], x, y, width, 'right');
            }
        }
        // Unison Item Config Act Cost
        WSLACCUI.drawActCost.apply(this, arguments);
    }; // WSL.drawActCost

})(DoubleX_RMMV.Act_Cost, DoubleX_RMMV.Unison_Item,
   DoubleX_RMMV.Act_Cost_Compatibility["Unison Item Default"]);

} // if (DoubleX_RMMV["Unison Item Default"])

/*----------------------------------------------------------------------------*/

} else {
    alert('Place Action Cost Compatibility below Action Cost.');
} // if (DoubleX_RMMV['Act Cost'])

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

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.01b(GMT 0300 20-5-2020):
1. In sync with the latest DoubleX RMMV Action Cost version
v1.01a(GMT 0400 5-2-2020):
1. Addressed compatibility with
- Victor Engine MV - Conditional Turn Battle

v1.00d(GMT 1500 11-8-2016):
1. Removed compatibility with DoubleX RMMV Minimalized ATB
1. In sync with the latest DoubleX RMMV Popularized ATB Core version
v1.00c(GMT 1000 5-6-2016):
1. Addressed more compatibility issues with
- DoubleX RMMV Minimalized ATB
- DoubleX RMMV Popularized ATB Core                               
v1.00b(GMT 0300 29-5-2016):
1. Addressed compatibility with
- DoubleX RMMV Minimalized ATB
- DoubleX RMMV Popularized ATB Core
v1.00a(GMT 1500 22-5-2016):
1. 1st version of this script finished
My RMVXA/RMMV/RMMZ scripts/plugins:
http://rpgmaker.net/users/DoubleX/scripts/
Reply }


Messages In This Thread
DoubleX RMMV Action Cost Compatibility - by DoubleX - 05-22-2016, 04:00 PM

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,503 03-25-2022, 01:04 PM
Last Post: DoubleX
   DoubleX RMMV Status Bars Compatibility DoubleX 0 1,933 02-06-2022, 07:56 AM
Last Post: DoubleX
   DoubleX RMMV Popularized ATB Bar DoubleX 3 8,597 05-19-2021, 06:10 AM
Last Post: DoubleX
   DoubleX RMMV Skill Hotkeys DoubleX 2 6,054 02-13-2021, 04:59 AM
Last Post: DoubleX
   DoubleX RMMZ Skill Item Cooldown DoubleX 4 6,179 02-07-2021, 04:11 PM
Last Post: DoubleX
   DoubleX RMMZ Skill Item Triggers DoubleX 3 5,616 12-26-2020, 04:00 PM
Last Post: DoubleX
   DoubleX RMMZ TPBS Configurations Edit DoubleX 3 5,721 12-25-2020, 12:30 PM
Last Post: DoubleX
   DoubleX RMMV Superlative ATB DoubleX 2 4,503 12-11-2020, 02:25 PM
Last Post: DoubleX



Users browsing this thread: 1 Guest(s)